为了在车辆中提供空闲时间段,车库模式使系统保持清醒,以便可以执行受空闲限制的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_IMMEDIATELY
或SLEEP_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());
调试车库模式
调试车库模式:- 要启用与车库模式相关的日志记录类别:
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