为确保硬件和软件组件(如显示、音频和语音交互)根据需要有选择地打开和关闭,AAOS 提供了电源策略,该策略由硬件和软件组件的一组预期电源打开和关闭状态组成. VHAL 或系统特权供应商服务可以在 Android 电源状态转换或满足他们等待的条件时应用新的电源策略。
在 Wait for VHAL 和 On 状态下允许应用电源策略。在关机准备中,车库模式正在运行,不应受到电源状态变化的干扰。虽然无法应用常规电源策略,但在 Shutdown Prepare 中应用了一种特殊的电源策略,即名为“无用户交互”的系统电源策略。
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
电源策略组
在电源策略组中指定的电源状态转换时自动应用默认电源策略。供应商可以为 Wait For VHAL、On 和 Wait for VHAL Finish (Deep Sleep Entry or Shutdown Start) 定义默认电源策略。
系统电源策略
AAOS 只支持一种系统电源策略,即“无用户交互”。当设备进入静音模式或车库模式时,将应用系统电源策略。
下表列出了系统电源策略中每个组件的行为。实施者可以覆盖系统电源策略中的蓝牙、NFC 和可信设备检测。覆盖应用在/vendor/etc/power_policy.xml
中。
成分 | 电源状态 | 可配置 |
---|---|---|
声音的 | 离开 | 不 |
媒体 | 离开 | 不 |
显示主 | 离开 | 不 |
显示集群 | 离开 | 不 |
显示前排乘客 | 离开 | 不 |
显示后排乘客 | 离开 | 不 |
蓝牙 | 离开 | 是的 |
无线上网 | 上 | 不 |
手机 | 上 | 不 |
以太网 | 上 | 不 |
投影 | 离开 | 不 |
近场通信 | 离开 | 是的 |
输入 | 离开 | 不 |
语音交互 | 离开 | 不 |
视觉交互 | 离开 | 不 |
可信设备检测 | 上 | 是的 |
地点 | 离开 | 不 |
麦克风 | 离开 | 不 |
中央处理器 | 上 | 不 |
与 VHAL 的交互
运行在系统层的汽车电源策略守护进程订阅了两个属性来监听来自VHAL的请求:
-
POWER_POLICY_REQ
,VHAL 将电源策略 ID 写入此属性。 -
POWER_POLICY_GROUP_REQ
,VHAL 将电源策略组 ID 写入此属性。
系统中的当前电源策略可以由 VHAL 以外的模块更改。在这种情况下,汽车电源策略守护程序会更新CURRENT_POWER_POLICY
属性以将更改通知给 VHAL。
与本机进程交互
如前所述,car power policy daemon运行在system层,在power policy management方面,与运行在framework层的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
注册电源策略更改侦听器。