车库模式可以为汽车提供空闲时间,方法是让系统保持唤醒状态,直到 JobSchedulerJobScheduler
中受空闲性约束的作业可以执行为止。
什么是车库模式?
在手机等联网设备上,用户依靠该系统来使设备保持稳定、最新和优化状态。为了达到这种状态,Android 平台提供了一个空闲时间窗口,在该时段内,应用可以在用户不与设备互动时执行任务。如果用户长时间(超过 60 分钟)未轻触手机且屏幕关闭,则该手机被视为处于空闲状态。与手机不同,当汽车不在使用时,系统便会处于关闭状态,因此汽车不存在空闲时间窗口。车库模式可确保汽车有空闲时间。
当用户关闭汽车引擎时,系统会进入车库模式。当汽车处于车库模式时,系统电源仍处于接通状态,显示屏会关闭,且系统会执行 JobScheduler 队列中的空闲作业。如需实现车库模式,请参阅下文的设备实现指南。
设备实现指南
如需激活车库模式,在关闭车辆时,车载 HAL (VHAL) 必须发送 AP_POWER_STATE_REQ
,状态设为 SHUTDOWN_PREPARE
,同时参数设置为 SHUTDOWN_ONLY
或 CAN_SLEEP
。
要使状态 SHUTDOWN_PREPARE
有效,VHAL 必须为 AP_POWER_STATE_REQ
命令指定两个参数(状态参数和附加参数)。这使设备能够进入车库模式,该模式会检测 JobSchedulerJobScheduler
中的预定作业,并防止系统在作业完成之前挂起或关闭。
设备实现如何连接到 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