一、CarPower介绍
在Android Automotive OS (AAOS)中,CarPower负责车载电源的原理,它一面同libsusped交互控制AP(应用处理器,也就是Soc)的电源状态,一方面通过VehicleHAL与MCU通信接收和发送电源相关指令。其中CarPowerManagementService作为CarService的子服务,负责调用HAL层(VehicleHAL)实现具体功能,而CarPowerManagement作为客户端接口由APP调用,如下为CarPower的Block图:
CarPower重要的状态如下:
CpmsState:
状态 | 值 | 含义 |
---|---|---|
WAIT_FOR_VHAL | 0 | 表示 Android 的电源状态已启动,但等待VHAL发出启动主要功能的信号。 |
ON | 1 | 表示系统的电源状态处于ON状态。 |
SHUTDOWN_PREPARE | 2 | 示系统正在准备关机或挂起的电源状态。应用程序应清理并准备挂起。 |
WAIT_FOR_FINISH | 3 | AAOS 通知 VHAL 它可以关闭。车载微控制器单元 (VMCU) 应将系统芯片 (SoC) 置于深度休眠模式,并断开 AP 的电源。然后,AAOS 进入 STR 状态,但不执行任何代码。 |
SUSPEND | 4 | 车辆和 AP 断电,不执行任何代码,AP/RAM 仍然通电。 |
SIMULATE_SLEEP | 5 | - |
SIMULATE_HIBERNATION | 7 | - |
对应的状态迁移图如下:
CarPowerManager State:
状态 | 值 | 含义 |
---|---|---|
STATE_INVALID | 0 | 表示当前电源状态的电源状态不可用、未知或无效。 |
STATE_WAIT_FOR_VHAL | 1 | 表示 Android 的电源状态已启动,但等待VHAL发出启动主要功能的信号。 |
STATE_SUSPEND_ENTER | 2 | 表示系统进入深度睡眠(挂起到 RAM)的电源状态。 |
STATE_SUSPEND_EXIT | 3 | 表示系统从挂起中唤醒的电源状态。 |
STATE_SHUTDOWN_ENTER | 5 | 表示系统进入关机状态的电源状态。 |
STATE_ON | 6 | 表示系统的电源状态处于ON状态。 |
STATE_SHUTDOWN_PREPARE | 7 | 表示系统正在准备关机或挂起的电源状态。应用程序应清理并准备挂起。 |
STATE_SHUTDOWN_CANCELLED | 8 | 表示关机的电源状态被取消,恢复正常状态。 |
STATE_HIBERNATION_ENTER | 9 | 表示系统进入休眠(挂起到磁盘)状态的电源状态。 |
STATE_HIBERNATION_EXIT | 10 | 表示系统从休眠状态唤醒的电源状态。 |
STATE_PRE_SHUTDOWN_PREPARE | 11 | 表示系统关机的电源状态已启动,但输出组件(如显示器)仍处于打开状态。在此状态下,可以显示显示设备即将关闭的 UI。 |
STATE_POST_SUSPEND_ENTER | 12 | 电源状态表示汽车电源管理服务和VHAL完成处理以进入深度睡眠并且设备即将进入睡眠状态。 |
STATE_POST_SHUTDOWN_ENTER | 13 | 电源状态表示汽车电源管理服务和VHAL完成处理以关闭并且设备即将关闭电源。 |
STATE_POST_HIBERNATION_ENTER | 14 | 电源状态表示汽车电源管理服务和VHAL完成处理以进入休眠状态并且设备即将休眠。 |
ShutdownType:
ShutdownType | 值 | 含义 |
SHUTDOWN_TYPE_UNDEFINED | 0 | 未知 |
SHUTDOWN_TYPE_POWER_OFF | 1 | Power Off |
SHUTDOWN_TYPE_DEEP_SLEEP | 2 | Deep Sleep |
SHUTDOWN_TYPE_HIBERNATION | 3 | - |
二、CarPower相关类
如下为CarPower类图:
1、CarPower相关
CarPowerManager
CarPowerManager用于管理车辆的电源状态,它提供了一组API来监听和控制车辆的电源状态变化。与其他的CarService中的服务不同, 除了提供了java类的接口CarPowerManager以外, CarPowerManagementService还有对应的C++类的接口, 类名同样也叫CarPowerManager。
增加 C++类的接口主要是为了向一些使用 C++编写的服务提供CarPowerManager相关的功能. 帮助其管理电源的状态. 在接口的定义和功能上面, 无论是java 还是 C++的 CarPowerManager都是一样的, 他们都对应于同一个CarPowerManagerService。
CarPowerManager代码位于:
packages/services/Car/car-lib/src/android/car/hardware/power/CarPropertyManager.java
packages/services/Car/car-lib/native/CarPowerManager/CarPropertyManager.cpp
packages/services/Car/car-lib/native/include/CarPropertyManager.h
CarPowerManager的定义:
public class CarPowerManager extends CarManagerBase {}
class CarPowerManager : public android::RefBase {}
CarPowerManagementService
CarPowerManagementService为CarPowerManager的服务端,负责处理CarPowerManager的请求和调用CarPowerManager注册的回调,内部使用状态机管理电源状态,底层通过libsusped和VehicleHAL执行具体功能。
CarPowerManagementService代码位于:
packages/services/Car/service/src/com/android/car/power/CarPowerManagementService.java
CarPowerManagementService的定义:
public class CarPowerManagementService extends ICarPower.Stub implements
CarServiceBase, PowerHalService.PowerEventListener {}
PowerHalService
PowerHalService用于管理车辆电源的硬件抽象层服务。它充当了车辆电压与底层HAL之间的接口,通过HAL进行交互,实现对车辆电源的控制,主要方法包括:
void setListener(PowerEventListener listener):Sets the event listener to receive Vehicle's power events.
void sendWaitForVhal():Send WaitForVhal message to VHAL
void sendSleepEntry(int wakeupTimeSec):Send SleepEntry message to VHAL
void sendSleepExit():Send SleepExit message to VHAL
void sendHibernationEntry(int wakeupTimeSec):Sends HibernationEntry message to VHAL
void sendHibernationExit() :Sends HibernationExit message to VHAL
void sendShutdownPostpone(int postponeTimeMs):Send Shutdown Postpone message to VHAL
void sendShutdownStart(int wakeupTimeSec):Send Shutdown Start message to VHAL
void sendOn() :Send On message to VHAL
void sendShutdownPrepare():Send Shutdown Prepare message to VHAL
void sendShutdownCancel() :Send Shutdown Cancel message to VHAL
void sendDisplayBrightness(int brightness) :Sets the display brightness for the vehicle.brightness value from 0 to 100.
PowerState getCurrentPowerState():representing the current power state for the vehicle.
PowerHalService代码位于:
packages/services/Car/service/src/com/android/car/hal/PowerHalService.java
PowerHalService的定义:
public class PowerHalService extends HalServiceBase {}
PowerComponentHandler
PowerComponentHandler是管理系统中电源组件的类。创建与电源组件对应的电源组件调解器并将其注册到此类。电源组件调解器封装了通电/关机功能。
PowerComponentHandler代码位于:
packages/services/Car/service/src/com/android/car/power/PowerComponentHandler.java
PowerComponentHandler的定义:
public final class PowerComponentHandler {}
ICarPower
ICarPower是一个AIDL接口,CarPowerManagementService实现这个接口,CarPowerManager通过调用ICarPower接口与CarPowerManagementService交互。
ICarPower代码位于:
packages/services/Car/car-lib/src/android/car/hardware/power/ICarPower.aidl
ICarPower的定义:
interface ICarPower {}
ICarPowerStateListener
ICarPowerStateListener是一个AIDL接口,CarPowerManagementService实现这个接口,CarPowerManager通过调用ICarPower接口与CarPowerManagementService交互。
ICarPowerStateListener代码位于:
packages/services/Car/car-lib/src/android/car/hardware/power/ICarPowerStateListener.aidl
ICarPowerStateListener的定义:
interface ICarPowerStateListener{}
2、CarPowerPolicy相关
CarPowerPolicy
CarPowerPolicy是汽车电源策略定义的类。
CarPowerPolicy代码位于:
packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerPolicy.aidl
packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerPolicy.java
packages/services/Car/car-lib/native/CarPowerManager/CarPowerPolicy.cpp
packages/services/Car/car-lib/native/include/CarPowerPolicy.h
CarPowerPolicy的定义:
public final class CarPowerPolicy implements Parcelable {}
class CarPowerPolicy : public android::Parcelable {}
CarPowerPolicyFilter
CarPowerPolicyFilter用于筛选以接收侦听器感兴趣的电源策略更改。
CarPowerPolicyFilter代码位于:
packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerPolicyFilter.aidl
packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerPolicyFilter.java
packages/services/Car/car-lib/native/CarPowerManager/CarPowerPolicyFilter.cpp
packages/services/Car/car-lib/native/include/CarPowerPolicyFilter.h
CarPowerPolicyFilter的定义:
public final class CarPowerPolicyFilter implements Parcelable {}
class CarPowerPolicyFilter : public android::Parcelable {}
CarPowerPolicyServer
CarPowerPolicyServer实现了ISilentModeChangeHandler和ICarPowerPolicyServer.aidl,它会在 Android 框架控制设备之前处理电源策略请求和静默模式。
CarPowerPolicyServer代码位于:
packages/services/Car/cpp/powerpolicy/server/src/CarPowerPolicyServer.cpp
packages/services/Car/cpp/powerpolicy/server/src/CarPowerPolicyServer.h
CarPowerPolicyServer的定义:
class CarPowerPolicyServer final :
public ISilentModeChangeHandler,
public ::aidl::android::frameworks::automotive::powerpolicy::BnCarPowerPolicyServer {}
ICarPowerPolicyListener
ICarPowerPolicyListener代码位于:
packages/services/Car/car-lib/src/android/car/hardware/power/ICarPowerPolicyListener.aidl
ICarPowerPolicyListener的定义:
interface ICarPowerPolicyListener {}
三、CarPowerManager API
1、JAVA Api
void requestShutdownOnNextSuspend() :请求电源管理器在下次有机会时关闭而不是挂起
@CarPowerState int getPowerState():获取Power状态
void setListener(@NonNull @CallbackExecutor Executor executor, @NonNull CarPowerStateListener listener):设置监听器
void setListenerWithCompletion(@NonNull @CallbackExecutor Executor executor, @NonNull CarPowerStateListenerWithCompletion listener):设置监听器
void clearListener() :清除监听器
CarPowerPolicy getCurrentPowerPolicy() :获取当前电源策略
void applyPowerPolicy(@NonNull String policyId) :应用电源策略
void setPowerPolicyGroup(@NonNull String policyGroupId) :设置电源策略组
void addPowerPolicyListener(@NonNull @CallbackExecutor Executor executor, @NonNull CarPowerPolicyFilter filter, @NonNull CarPowerPolicyListener listener):设置电源策略监听
void removePowerPolicyListener(@NonNull CarPowerPolicyListener listener) :删除电源策略监听
2、C++ Api
int setListener(Listener listener):设置监听器
int clearListener():清除监听器
int requestShutdownOnNextSuspend():请求电源管理器在下次有机会时关闭而不是挂起
四、CarPower流程分析
CarPowerManagementService启动流程分析
Android13 CarPowerManagementService启动流程分析-CSDN博客
CarPowerManager setListener流程分析
Android13 CarPowerManager setListener流程分析-CSDN博客
CarPowerManagementService onApPowerStateChange流程分析
Android13 CarPowerManagementService onApPowerStateChange流程分析-CSDN博客