本文仅为工作中对AAOS电源管理的学习笔记,不作为教程或其他用途,存在对官方文档的大量摘抄和个人理解,如有错误烦请指出。

前注:本文由notion创作,由于Markdown对某些效果的实现略繁琐,因此如有需要请移步至原文,系列地址:Notion Share

车库模式是为AAOS提供空闲时间,以完成受空闲限制的任务调度器(JobScheduler)中的任务(即满足public JobInfo.Builder setRequiresDeviceIdle (boolean requiresDeviceIdle)requiresDeviceIdle值为真的任务)

一般,在手机中,Android提供一个闲时窗口状态,当用户一段时间没有对手机进行操作时(一般为60分钟或更长时间),手机将会被认为进入了空闲状态,在空闲状态下系统将会进行基础的维护、更新以及优化等任务。然而与手机不同,汽车不使用时,将会挂起或关闭,所以汽车将没有空闲状态。为了解决这个问题,AAOS引入了车库模式,确保系统存在空闲时间。

一般,当车辆关闭时,会先进入车库模式,在车库模式下,电源会被打开,显示屏不会亮起,并自动执行JobScheduler中的任务。

车库模式的使用

如果想进入车库模式,则汽车关闭时,VHAL必须发送AP_POWER_STATE_REQ信号,且状态参数(参数1)为SHUTDOWN_PREPARE,同时,附加参数(参数2)需要为SHUTDOWN_ONLYCAN_SLEEP。具体状态转换流程见《AAOS电源(1):概览与电源系统》的状态转换图。

连接到Android框架

构建运行方法

//通过继承JobService编写任务
public class MyGarageModeJob extends JobService { ... }

Context context = ...;
int jobId = ...;

//通过任务服务类创建ComponentName(组件名,用于启动服务或活动)
ComponentName myGarageModeJobName = new componentName(context,
                                                      MyGarageModeJob.class);

//创建任务状态描述
JobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName)
                    .setRequiresDeviceIdle(true);

// 设置任务状态描述,下行为一个演示demo,即任务需要网络状态为免费网络
infoBuilder.setRequiredNetworkType(NetworkType.NETWORK_TYPE_UNMETERED);

//创建任务实例
JobScheduler jobScheduler = (JobScheduler) context
                    .getSystemService(Context.JOB_SCHEDULER_SERVICE);

//通过任务调度设置任务
jobScheduler.schedule(infoBuilder.build());

调试车库模式

  1. 启动车库模式的日志记录

    adb shell stop
    adb shell setprop log.tag.GarageMode VERBOSE
    adb shell setprop log.tag.Finsky VERBOSE
    adb shell setprop log.tag.CAR.POWER VERBOSE
    adb shell setprop log.tag.JobScheduler.Connectivity VERBOSE
    adb shell start
  2. 车库模式正在启动的日志

    GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE
    GarageMode: [GarageMode]: Entering GarageMode
    GarageMode: [Controller]: Sending broadcast with action: com.android.server.jobscheduler.GARAGE_MODE_ON
  3. 车库模式启动完成的日志

    [GarageMode]: GarageMode was canceled

    [GarageMode]: GarageMode completed normally
  4. 电源状态日志

    CAR.POWER: starting shutdown prepare without Garage Mode
    GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE
    GarageMode: [GarageMode]: Entering GarageMode
    CAR.POWER: send shutdown prepare
    CAR.POWER: setPowerState=SHUTDOWN_PREPARE(7) param=0

注:以上仅为输出日志,是否进入车库模式取决于车辆的电源状态迁移流程。

本篇内容为原创内容,采用CC BY-NC-SA 4.0协议许可
2022-07-26 22:57
UtopiaXC
于大连


尽管如此,世界依旧美丽