车库模式是为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
    

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