车库模式

为了在车辆中提供空闲时间段,车库模式会使系统保持唤醒状态,以便可以执行 JobScheduler 中受空闲约束的作业。

什么是车库模式?

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

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

设备实现指南

要激活车库模式,在关闭车辆时,车辆 HAL (VHAL) 必须发送 AP_POWER_STATE_REQ,并将状态 SHUTDOWN_PREPARE 的参数设置为 SHUTDOWN_ONLYCAN_SLEEP

为了使状态 SHUTDOWN_PREPARE 生效,VHAL 必须为 AP_POWER_STATE_REQ 命令指定两个参数(状态和附加参数)。这使设备能够进入车库模式,从而检测 JobScheduler 中的计划作业,并阻止系统在作业完成之前继续进入暂停或关机状态。

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

对于车库模式,框架会请求 VHAL 延长关机时间,直到超出所需时长或所有作业都已执行完毕,届时系统会关机。在 CDD 中定义的特定情况下,设备实现可以提前关闭系统。如需详细了解 Android 兼容性要求,请参阅 Android 兼容性定义文档 (CDD)

如果 VHAL 必须在车库模式完成之前关闭系统,则 VHAL 可以发出 SHUTDOWN_PREPARE,并将参数设置为 SHUTDOWN_IMMEDIATELYSLEEP_IMMEDIATELY。设备实现可在特定情况下使用此功能,通常是在保持系统运行所需的资源不可用时。例如,当电池电量不足时。

Garage mode

图 1. 车库模式流程

应用开发者如何使用车库模式?

应用和服务不直接与车库模式互动。相反,应用会在 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