车库模式

为了在车辆中提供空闲时间段,车库模式使系统保持清醒,以便可以执行受空闲限制的JobScheduler中的作业。

什么是车库模式?

在手机等连接设备上,用户依靠系统来确保设备稳定、最新和优化。为了实现这种状态,Android 平台提供了一个空闲时间窗口,在此期间应用程序可以在用户不与设备交互时执行任务。当用户长时间(60 分钟或更长时间)不触摸手机并且屏幕关闭时,手机被认为处于空闲状态。与电话不同的是,当汽车不使用时,它会关闭,这意味着汽车没有空闲时间窗口。车库模式确保车内的空闲时间。

当用户关闭汽车时,系统进入车库模式。当汽车处于车库模式时,系统会打开电源,显示屏会关闭,并且会执行 JobScheduler 队列中的空闲作业。要实施车库模式,请参阅下面的设备实施指南

设备实施指南

要激活车库模式,在关闭车辆时,车辆 HAL ( AP_POWER_STATE_REQ ) 必须发送状态为SHUTDOWN_PREPARE且参数设置为SHUTDOWN_ONLY或 CAN_SLEEP 的CAN_SLEEP

为了使状态SHUTDOWN_PREPARE有效,VHAL 必须为AP_POWER_STATE_REQ命令指定两个参数(状态和附加参数)。这使设备能够进入车库模式,该模式检测JobScheduler中的计划作业并防止系统继续挂起或关闭,直到作业完成。

设备实现如何连接到 Android 框架?

对于车库模式,框架请求 VHAL 延长关闭时间,直到超过所需的持续时间或所有作业都已执行,此时系统将关闭。在 CDD 中定义的特定情况下,设备实现可以更快地关闭系统。 (有关 Android 兼容性要求的详细信息,请参阅 Android兼容性定义文档 (CDD) 。)如果 VHAL 必须在车库模式完成之前关闭系统,则 VHAL 可以发出SHUTDOWN_PREPARE参数设置为SHUTDOWN_IMMEDIATELYSLEEP_IMMEDIATELY 。设备实现只能在特定情况下使用它,通常是在保持系统运行所需的资源不可用时。例如,当电池容量不足时。

车库模式

应用程序开发人员如何使用车库模式?

应用程序和服务不直接与车库模式交互。相反,应用程序在JobScheduler中安排作业。那些受空闲限制的作业在车库模式期间执行。

以下代码显示了如何安排作业在车库模式下运行:

public class MyGarageModeJob extends JobService { ... }

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

ComponentName myGarageModeJobName = new componentName(context,
                                                      MyGarageModeJob.class);

JobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName)
                    .setRequiresDeviceIdle(true);

// Example of an optional constraint:
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. 查看 logcat 输出以指示车库模式正在启动:
    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. 要确定指示车库模式已完成(已取消或已完成)的 logcat 输出:
    [GarageMode]: GarageMode was canceled
    
    [GarageMode]: GarageMode completed normally
    

    车库模式取决于车辆的电源状态,如上所述。

  4. 查看 logcat 输出以指示输入了正确的电源状态:
    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