车库模式

为了给车辆提供空闲时间,车库模式会让系统保持 这样工作 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 兼容性要求,请参阅 兼容性定义文档 (CDD)

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

车库模式

图 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