电源政策

为了确保根据需要选择性地开启和关闭硬件和软件组件(例如屏幕、音频和语音互动),AAOS 提供了电源政策,其中包含针对硬件和软件组件的一组预期电源开启和关闭状态。VHAL(即系统特权供应商服务)可以在 Android 电源状态转换时或其正在等待的条件达到时应用新的电源政策。

在“等待 VHAL”和“开启”状态下,可以应用电源政策(有时会受到一些限制)。在“关闭准备”状态下,车库模式运行,不应受电源状态更改的干扰。虽然在“关闭准备”状态下无法应用常规电源政策,但此时会应用一项特殊的电源政策,即名为“没有用户互动”的系统电源政策。

AAOS 电源状态

AAOS 设备遵循以下电源状态图:

AAOS 电源状态图

图 1. AAOS 电源状态图

下面介绍了每种电源状态:

说明
  • 不会向应用处理器 (AP)、内存和外围设备实际供电。
等待 VHAL
  • 当司机与车辆互动(例如,通过打开车门进行互动)时,VMCU 会向 AP、内存和外围设备供电。
  • AAOS 从三种状态(“关闭”“挂起到 RAM [STR]”“等待 VHAL 完成”)之一转换,然后进入“等待 VHAL”状态,在该状态下,它会等待与 VHAL 进行协调。
  • VHAL 指示 AAOS 进入“开启”状态。在此状态下,AAOS 完全运行并与司机互动。
  • 屏幕由电源政策控制,而不是由适用于其他设备类型的 Android 屏幕开启/关闭调用控制。
关闭准备
  • 当司机停止驾驶后,VHAL 指示 AAOS 进入“关闭准备”状态。 在此状态下,屏幕和音频处于关闭状态,AAOS 不会与司机互动。Android 系统仍在运行,可以更新应用和 Android 系统。当更新(如有)完成后,Android 系统会进入“等待 VHAL 完成”状态。
等待 VHAL 完成
  • AAOS 通知 VHAL 它可以关闭。车载微控制器单元 (VMCU) 应将系统芯片 (SoC) 置于深度休眠模式,并断开 AP 的电源。然后,AAOS 进入 STR 状态,但不执行任何代码。
  • 如果 VHAL 未完成而司机返回,车机 (HU) 应直接转换为“等待 VHAL”。
挂起到 RAM (STR)
  • 车辆和 AP 断电,不执行任何代码,AP RAM 仍然通电。
挂起到磁盘 (STD)
  • 车辆和 AP 关闭,不执行任何代码,处理器和 AP RAM 没有通电。

电源政策是如何定义的?

实现人员在 /vendor/etc/automotive/power_policy.xml 中定义电源政策,该文件用于如下用途:

  • 定义电源政策。
  • 定义电源政策组,其中包括默认电源政策,并在电源状态转换时自动应用。
  • 替换系统电源政策。

电源政策

电源政策包含一组预期的硬件和软件组件电源状态。 在电源政策中,AAOS 支持以下组件:

AUDIO
MEDIA
DISPLAY
BLUETOOTH
WIFI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

供应商还可以定义自己的自定义电源组件,以便与电源政策搭配使用。在与电源政策相同的 XML 文件中定义自定义电源组件,如以下示例所示:

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

电源政策组

电源状态转换时自动应用的默认电源政策在电源政策组中指定。供应商可以定义以下状态的默认电源政策:“等待 VHAL”“开启”和“等待 VHAL 完成”(进入深度休眠或开始关闭)。

系统电源政策

AAOS 支持两项系统电源政策,即没有用户互动挂起准备。系统电源政策在设备进入静音模式、车库模式、挂起到 RAM 或挂起到磁盘时应用。

下表列出了系统电源政策中每种组件的行为。实现人员可以在无用户互动系统电源政策中替换蓝牙、NFC 和可信设备检测。替换在 /vendor/etc/power_policy.xml 中应用。

无用户互动

无用户互动系统电源政策的行为在下表中定义:

组件 电源状态 可配置
音频
媒体
显示屏
蓝牙
Wifi
移动网络
以太网
投影
NFC
输入
Google 助理
用户互动
针对用户登录的可信设备检测
位置信息
麦克风
CPU

挂起准备

挂起准备系统电源政策的行为在下表中定义:

组件 电源状态 是否可由 OEM 配置
音频
媒体
显示屏
蓝牙
Wifi
移动网络
以太网
投影
NFC
输入
Google 助理
用户互动
针对用户登录的可信设备检测
位置信息
麦克风
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.
     * @throws IllegalStateException if the current policy is not set.
     */
    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.
     * @throws IllegalArgumentException if the componentId is invalid.
     */
    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.
     * @throws IllegalArgumentException if the callback is already registered.
     * @throws IllegalStateException if the callback is dead.
     */
    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.
     * @throws IllegalArgumentException if the callback is not registered.
     */
    void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);

    /**
     * Applies the power policy.
     *
     * 

{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *

{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }

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 注册一个电源政策更改监听器。