为了确保根据需要选择性地开启和关闭硬件和软件组件(例如屏幕、音频和语音互动),AAOS 提供了电源政策,其中包含针对硬件和软件组件的一组预期电源开启和关闭状态。VHAL(即系统特权供应商服务)可以在 Android 电源状态转换时或其正在等待的条件达到时应用新的电源政策。
在“等待 VHAL”和“开启”状态下,可以应用电源政策。在“关闭准备”状态下,车库模式运行,不应受电源状态更改的干扰。虽然在“关闭准备”状态下无法应用常规电源政策,但此时会应用一项特殊的电源政策,即名为“没有用户互动”的系统电源政策。
AAOS 电源状态
AAOS 设备遵循以下电源状态图:
图 1. AAOS 电源状态图
下面介绍了每种电源状态:
值 | 说明 |
---|---|
关闭 | 不会向应用处理器 (AP)、内存和外围设备实际供电。 |
等待 VHAL |
|
开启 |
|
关闭准备 |
|
等待 VHAL 完成 |
|
挂起到 RAM (STR) | 车辆和 AP 断电,不执行任何代码,AP RAM 仍然通电。 |
软件架构
电源政策的架构如下图所示,其定义请见下一个部分:
图 2. 电源政策架构
电源政策是如何定义的?
实现人员在 /vendor/etc/automotive/power_policy.xml
中定义电源政策,该文件用于如下用途:
- 定义电源政策。
- 定义电源政策组,其中包括默认电源政策,并在电源状态转换时自动应用。
- 替换系统电源政策。
电源政策
电源政策是一组预期的硬件和软件组件电源状态。在电源政策中,AAOS 支持以下组件:
AUDIO
MEDIA
DISPLAY_MAIN
DISPLAY_CLUSTER
DISPLAY_FRONT_PASSENGER
DISPLAY_REAR_PASSENGER
BLUETOOTH
WIFI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU
电源政策组
电源状态转换时自动应用的默认电源政策在电源政策组中指定。供应商可以定义以下状态的默认电源政策:“等待 VHAL”、“开启”和“等待 VHAL 完成”(进入深度休眠或开始关闭)。
系统电源政策
AAOS 仅支持一项系统电源政策,即“没有用户互动”。系统电源政策在设备进入“静默模式”或“车库模式”时应用。
下表列出了系统电源政策中每种组件的行为。实现人员可以替换系统电源政策中的蓝牙、NFC 和可信设备检测。替换在 /vendor/etc/power_policy.xml
中应用。
组件 | 电源状态 | 可配置 |
---|---|---|
音频 | 关闭 | 否 |
媒体 | 关闭 | 否 |
主屏幕 | 关闭 | 否 |
仪表板屏幕 | 关闭 | 否 |
前排乘客屏幕 | 关闭 | 否 |
后排乘客屏幕 | 关闭 | 否 |
蓝牙 | 关闭 | 是 |
Wi-Fi 网络 | 开启 | 否 |
移动网络 | 开启 | 否 |
以太网 | 开启 | 否 |
投影 | 关闭 | 否 |
NFC | 关闭 | 是 |
输入 | 关闭 | 否 |
语音互动 | 关闭 | 否 |
视觉互动 | 关闭 | 否 |
可信设备检测 | 开启 | 是 |
位置信息 | 关闭 | 否 |
麦克风 | 关闭 | 否 |
CPU | 开启 | 否 |
与 VHAL 交互
在系统层中运行的汽车电源政策守护程序通过订阅两个属性来监听 VHAL 发出的请求:
POWER_POLICY_REQ
,VHAL 将电源政策 ID 写入此属性。POWER_POLICY_GROUP_REQ
,VHAL 将电源政策组 ID 写入此属性。
除 VHAL 外的其他模块可以更改系统中的当前电源政策。在这种情况下,汽车电源政策守护程序会更新 CURRENT_POWER_POLICY
属性,以向 VHAL 通知此更改。
与原生进程交互
如上所述,汽车电源政策守护程序在系统层运行,就电源政策管理而言,其提供的功能与框架层中运行的 CPMS 几乎相同。此外,假设汽车电源政策守护程序与 CPMS 完全同步。
汽车电源政策守护程序会导出 AIDL 接口供 HAL 和其他原生进程使用。当新的电源政策更改时,这些进程会收到通知。换言之,届时每个进程都必须更改其电源状态。
ICarPowerPolicyServer.aidl
package android.frameworks.automotive.powerpolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter; import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback; import android.frameworks.automotive.powerpolicy.PowerComponent; /** * ICarPowerPolicyServer is an interface implemented by the power policy daemon. * VHAL changes the power policy and the power policy daemon notifies the change to registered * subscribers. When subscribing to policy changes, a filter can be specified so that the registered * callbacks can listen only to a specific power component's change. */ @VintfStability interface ICarPowerPolicyServer { /** * Gets the current power policy. */ CarPowerPolicy getCurrentPowerPolicy(); /** * Gets whether the power component is turned on or off. * * @param componentId Power component ID defined in PowerComponent.aidl to check power state. * @return True if the component's power state is on. */ boolean getPowerComponentState(in PowerComponent componentId); /** * Subscribes to power policy change. * Notification is sent to the registered callback when the power policy changes and the power * state of the components which the callback is interested in changes. * * @param callback Callback that is invoked when the power policy changes. * @param filter The list of components which the callback is interested in. */ void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback, in CarPowerPolicyFilter filter); /** * Unsubscribes from power policy change. * * @param callback Callback that doesn't want to receive power policy change. */ void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback); }
ICarPowerPolicyChangeCallback.aidl
package android.frameworks.automotive.powerpolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicy; /** * ICarPowerPolicyChangeCallback is notified when a power policy changes. */ @VintfStability oneway interface ICarPowerPolicyChangeCallback { /** * Called when a power policy is fully changed. * * @param policy The current policy. */ void onPolicyChanged(in CarPowerPolicy policy); }
与 Java 模块交互
CarPowerManager
提供了用于进行电源政策管理的方法:
- 获取当前电源政策
- 获取当前电源政策组
- 应用新的电源政策
- 设置新的电源政策组
只有系统特权模块才能使用这些方法。希望在应用电源政策时收到通知的模块可向 CarPowerManager
注册一个电源政策更改监听器。