车库模式

车库模式可以为汽车提供空闲时间,方法是让系统保持唤醒状态,直到 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。设备实现仅在特定情况下可以使用此方法,通常是在使系统保持运行所需的资源不可用时,例如,当电池电量不足时。

车库模式

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

应用和服务不会直接与车库模式交互,而是由应用在 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