为了在车辆中提供空闲时间段,车库模式会使系统保持唤醒状态,以便可以执行 JobScheduler
中受空闲约束的作业。
什么是车库模式?
在手机等联网设备上,用户依靠系统来确保设备稳定、最新且经过优化。为了实现这一状态,Android 平台提供了一个空闲时间窗口,应用可以在用户不与设备互动时在此期间执行任务。当用户长时间(60 分钟或更长时间)不触摸手机且屏幕关闭时,手机被认为是空闲状态。与手机不同,汽车在不使用时会关闭,这意味着汽车没有空闲时间窗口。车库模式可确保汽车处于空闲状态。
当用户关闭汽车时,系统会进入车库模式。当汽车处于车库模式时,系统会通电,显示屏会关闭,并且 JobScheduler
队列中的空闲作业会执行。如需实现车库模式,请参阅设备实现指南。
设备实现指南
要激活车库模式,在关闭车辆时,车辆 HAL (VHAL) 必须发送 AP_POWER_STATE_REQ
,并将状态 SHUTDOWN_PREPARE
的参数设置为 SHUTDOWN_ONLY
或 CAN_SLEEP
。
为了使状态 SHUTDOWN_PREPARE
生效,VHAL 必须为 AP_POWER_STATE_REQ
命令指定两个参数(状态和附加参数)。这使设备能够进入车库模式,从而检测 JobScheduler
中的计划作业,并阻止系统在作业完成之前继续进入暂停或关机状态。
设备实现如何连接到 Android 框架?
对于车库模式,框架会请求 VHAL 延长关机时间,直到超出所需时长或所有作业都已执行完毕,届时系统会关机。在 CDD 中定义的特定情况下,设备实现可以提前关闭系统。如需详细了解 Android 兼容性要求,请参阅 Android 兼容性定义文档 (CDD)。
如果 VHAL 必须在车库模式完成之前关闭系统,则 VHAL 可以发出 SHUTDOWN_PREPARE
,并将参数设置为 SHUTDOWN_IMMEDIATELY
或 SLEEP_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());
调试车库模式
要调试车库模式- 要启用与车库模式相关的日志记录类别
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
- 要查看指示车库模式正在启动的 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
- 要确定指示车库模式已完成(已取消或已完成)的 logcat 输出
或[GarageMode]: GarageMode was canceled
[GarageMode]: GarageMode completed normally
车库模式取决于车辆的电源状态,如上文所述。
- 查看 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