為支援車輛專屬的電源管理功能,Android 提供 CarPowerManagementService 服務和 CarPowerManager 介面。
狀態轉換是由車輛主控單元 (VMCU) 觸發。如要與 VMCU 通訊,整合人員必須實作多個元件。整合人員負責與車輛硬體抽象層 (VHAL) 和核心實作項目整合,也負責停用喚醒來源,並確保不會無限期延後關機。
術語
本文會使用下列術語:
系統設計
本節說明 AAOS 如何表示應用程式處理器的電源狀態,以及哪些模組會實作電源管理系統。這份資料也說明這些模組如何共同運作,以及狀態轉換通常如何發生。
車輛電源狀態機器
AAOS 會使用狀態機器表示 AP 的電源狀態。狀態機提供下列狀態:

圖 1. 車輛電源狀態機器。
最常見的轉換會以藍色醒目顯示。這些是狀態和常見轉換:
- 暫停至 RAM。車輛和 SoC 關閉,沒有執行任何程式碼。SoC RAM 維持供電。
- 等待 VHAL。當駕駛人與車輛互動時 (例如開啟車門),VMCU 會為 SoC 供電。AAOS 會從暫停至 RAM 狀態恢復,並進入「等待 VHAL」狀態,等待與 VHAL 協調。
- 開啟:VHAL 會告知 AAOS 進入「開啟」狀態。在這個狀態下,AAOS 會全面運作並與駕駛人互動。
- 準備關機。駕駛人結束駕駛後,VHAL 會告知 AAOS 進入準備關機狀態。在此狀態下,螢幕和音訊會關閉,AAOS 也不會與駕駛人互動。Android 系統仍會執行,並可更新應用程式和 Android 系統。完成更新 (如有) 後,Android 系統會進入「等待 VHAL 完成」狀態。
- 等待 VHAL 完成。此時,AAOS 會通知 VHAL 準備關機。VMCU 預計會將 SoC 置於深層睡眠狀態,並從應用程式處理器移除電源。AAOS 隨後會進入「暫停至 RAM」狀態,但不會執行任何程式碼。
電源管理模組
電源管理系統包含下列模組:
| 模組名稱 | 說明 |
|---|---|
| CarPowerManager | Java 或 C++ API。 |
| CarPowerManagementService | 協調電源狀態轉換,並將電源政策管理作業委派給 CarPowerPolicyDaemon。 |
| CarPowerPolicyDaemon | 管理電源政策,並與原生電源政策用戶端通訊。 |
| 車用 HAL | VMCU 的介面。 |
| 核心 | 暫停至 RAM 或磁碟的實作項目。 |
深層睡眠/休眠功能 (將 Android 暫停至 RAM/磁碟) 是在核心中實作。這項功能會以特殊檔案的形式向使用者空間公開,該檔案位於 /sys/power/state。只要將 mem 或 disk 寫入這個檔案,即可暫停 AAOS。
CPMS 會與其他服務和 HAL 協調電源狀態,CPMS 會實作上述狀態機器,並在發生電源狀態轉換時,向每個觀察器傳送通知。這項服務也會使用 VHAL 將訊息傳送至硬體。
CPPD 是電源政策的資訊來源,負責管理裝置生命週期內的電源政策,並將電源政策變更通知 CPMS、VHAL 和其他原生監聽器。CPMS 會將電源政策變更要求委派給 CPPD。
CPMS 會讀取及寫入與電源狀態相關的 VHAL 屬性 (例如 AP_POWER_STATE_REQ 和 AP_POWER_STATE_REPORT),藉此與 VMCU 通訊。應用程式可以使用 CPM 中定義的介面監控電源狀態變化。應用程式也可以透過這個介面註冊電源政策監聽器。這個 Java API 會使用 @SystemApi 和 @hide 註解,因此只有具備權限的應用程式才能使用。下圖說明這些模組、應用程式和服務之間的關係:

圖 2. 電源元件參考圖。
訊息序列
前一節說明瞭構成電源管理系統的模組。本節將使用「進入深層睡眠」和「退出深層睡眠」範例,說明模組和應用程式的通訊方式:
進入深層睡眠
只有 VMCU 可以啟動深層睡眠。啟動深層睡眠後,VMCU 會透過 VHAL 將通知傳送至 CPMS。CPMS 會將狀態變更為 SHUTDOWN PREPARE,並透過呼叫 onStateChanged() 方法,將這項狀態轉換廣播給所有觀察者 (監控 CPMS 的應用程式和服務),其中包含 CPM 提供的新狀態 ID。
CPM 會在應用程式/服務和 CPMS 之間進行中介。應用程式/服務的 onStateChanged() 方法會在 CPM 的 onStateChanged() 方法中同步叫用。大多數應用程式和服務都必須完成準備作業,才能從這項呼叫傳回。特權服務可在傳回 PRE_SHUTDOWN_PREPARE、SUSPEND_ENTER、POST_SUSPEND_ENTER 後,繼續以非同步方式準備。在本例中,準備完成時,具備權限的服務應在提供的 CompletablePowerStateChangeFuture 物件上呼叫 complete()。請注意,SHUTDOWN_PREPARE不允許非同步準備。在將 DEEP_SLEEP_ENTRY 傳送至 VHAL 之前,CPMS 會定期將關機延後要求傳送至 VHAL。
所有 CPM 物件完成關機準備後,CPMS 會將 AP_POWER_STATE_REPORT 傳送至 VHAL,然後 VHAL 會通知 VMCU,AP 已準備好暫停。CPMS 也會呼叫其暫停方法,暫停核心。
上述順序如下圖所示:

圖 3. 進入深層睡眠。
CPM 提供的程式設計介面
本節說明 CPM 為系統應用程式和服務提供的 Java API。這個 API 可讓系統軟體執行下列作業:
- 監控 AP 的電源狀態變化。
- 套用電源政策。
請按照下列步驟呼叫 CPM 提供的 API:
- 如要取得 CPM 執行個體,請呼叫 Car API。
- 呼叫在步驟 1 中建立的物件上適當的方法。
建立 CarPowerManager 物件
如要建立 CPM 物件,請呼叫 Car 物件的 getCarManager() 方法。這個方法是建立 CPM 物件的 Facade。請指定 android.car.Car.POWER_SERVICE 做為引數,建立 CPM 物件。
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener 和註冊
系統應用程式和服務可以實作 CarPowerManager.CarPowerStateListener,接收電源狀態變更通知。這個介面定義了一個方法 onStateChanged(),這是 CPMS 電源狀態變更時會叫用的回呼函式。以下範例定義了實作介面的新匿名類別:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
如要指示這個監聽器物件監控電源狀態轉換,請建立新的執行緒,並向 CPM 物件註冊監聽器和這個執行緒:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
電源狀態變更時,系統會使用代表新電源狀態的值,叫用接聽程式物件的 onStateChanged() 方法。實際值與電源狀態之間的關聯定義於 CarPowerManager,如下表所示:
| 名稱 | 說明 |
|---|---|
| STATE_ON | 輸入開啟狀態。系統運作正常。 |
| STATE_SHUTDOWN_CANCELLED | 系統會取消關機,並將電源狀態恢復為正常狀態。 |
| STATE_SHUTDOWN_ENTER | 應用程式應會清除資料並準備關機。 |
| STATE_POST_SHUTDOWN_ENTER | 關機準備作業已完成,VMCU 隨時可以關機。輸入關機狀態。 |
| STATE_PRE_SHUTDOWN_PREPARE | 系統已要求關機程序,但 CPMS 尚未啟動程序。螢幕和音訊仍處於開啟狀態 |
| STATE_SHUTDOWN_PREPARE | 車庫模式可能會在這段期間執行。 |
| STATE_SUSPEND_ENTER | 應用程式應清理資料,並準備好暫停至 RAM。 |
| STATE_POST_SUSPEND_ENTER | 暫停至 RAM 的準備作業已完成,VMCU 已準備好暫停至 RAM。進入暫停狀態。 |
| STATE_SUSPEND_EXIT | 從暫停狀態喚醒,或從已取消的暫停狀態繼續。 |
| STATE_HIBERNATION_ENTER | 應用程式應會清理資料,並準備進入休眠狀態。 |
| STATE_POST_HIBERNATION_ENTER | 休眠準備作業已完成,VMCU 已可進入休眠狀態。 |
| STATE_HIBERNATION_EXIT | 從休眠狀態喚醒,或從已取消的休眠狀態恢復。 |
| STATE_WAIT_FOR_VHAL | 系統正在啟動,但會等待與 VHAL 建立通訊,再進入 ON 狀態。 |
取消註冊 CarPowerStateListener
如要取消註冊向 CPM 註冊的所有接聽器物件,請呼叫 clearListener 方法:
powerManager.clearListener();
在 Android 實作中整合系統
整合人員負責下列事項:
- 實作核心介面,暫停 Android。
- 實作 VHAL 函式,以:
- 將暫停或關機的啟動程序從車輛傳播至 Android。
- 從 Android 裝置傳送關機準備就緒訊息給車輛。
- 透過 Linux 核心介面啟動 Android 關機或暫停程序。
- 請確保裝置處於暫停狀態時,所有喚醒來源都已停用。
- 確保應用程式能快速關閉,以免無限期延後關機程序。
- 請確保 BSP 會根據電源政策開啟 (或關閉) 裝置元件,以免阻礙暫停或休眠
核心介面:/sys/power/state
當應用程式或服務將 mem (暫停至 RAM) 或 disk (暫停至磁碟) 寫入 /sys/power/state 的檔案時,AAOS 會將裝置置於暫停模式。整合人員必須提供監控這個檔案的函式,並將 Linux 設為暫停電源狀態。這項函式可能會將 GPIO 傳送至 VMCU,通知 VMCU 裝置已完全關機。整合人員也負責移除 VHAL 將最終訊息傳送至 VMCU,以及系統進入暫停或關機模式之間的任何競爭條件。
VHAL 責任
VHAL 可在車輛網路和 Android 之間提供介面。VHAL:
- 將車輛發出的暫停或關機要求傳播至 Android。
- 從 Android 傳送關機準備就緒訊息至車輛。
- 透過 Linux 核心介面啟動 Android 的關機或暫停程序。
當 CPMS 通知 VHAL 準備關機時,VHAL 會將關機準備就緒訊息傳送至 VMCU。通常,UART、SPI 和 USB 等晶片上周邊裝置會傳輸訊息。訊息傳送完畢後,CPMS 會呼叫核心指令,暫停或關閉裝置。在此之前,VHAL 或 BSP 可能會切換 GPIO,指示 VMCU 可以安全地從裝置移除電源。
VHAL 必須支援下列屬性,透過 VHAL 控制電源管理:
| 名稱 | 說明 |
|---|---|
| AP_POWER_STATE_REPORT | Android 會使用 VehicleApPowerStateReport 列舉值,透過這項屬性向 VMCU 回報狀態轉換。 |
| AP_POWER_STATE_REQ | VMCU 會使用這項屬性,透過 VehicleApPowerStateReq 列舉值,指示 Android 轉換至不同的電源狀態。 |
AP_POWER_STATE_REPORT
使用這項屬性回報 Android 目前的電源管理狀態。這項屬性包含兩個整數:
int32Values[0]:目前狀態的 VehicleApPowerStateReport 列舉。int32Values[1]:延後、休眠或關機的時間 (以毫秒為單位)。這個值的意義取決於第一個值。
第一個值可採用下列其中一個值。VehicleApPowerStateReport.aidl 包含更具體的說明,這些說明會儲存在 hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle 中。
| 值名稱 | 說明 | 第二個值 |
|---|---|---|
| WAIT_FOR_VHAL | AP 正在啟動,需要與 VHAL 建立通訊。 | |
| DEEP_SLEEP_ENTRY | AP 即將進入深層睡眠狀態。VMCU 應在第二個值指定的時間過後,重新開啟 AP。 | 必須設定 |
| DEEP_SLEEP_EXIT | AP 正在退出深層睡眠狀態。 | |
| HIBERNATION_ENTRY | AP 即將進入休眠狀態。VMCU 應在第二個值指定的時間過後,重新開啟 AP。 | 必須設定 |
| HIBERNATION_EXIT | AP 正在結束休眠狀態。 | |
| SHUTDOWN_POSTPONE | Android 尚未準備好關機。VMCU 應等待第二個值指定的時間,再關閉 AP。Android 可能會發出額外的 SHUTDOWN_POSTPONE 報告,要求延後關機。 | 必須設定 |
| SHUTDOWN_PREPARE | Android 正在準備關機。 | 必須設定 |
| SHUTDOWN_START | AP 即將關機。VMCU 應在第二個值指定的時間過後,重新開啟 AP。(VMCU 不必支援定時開啟功能)。 | 必須設定 |
| SHUTDOWN_CANCELLED | Android 停止準備關機,並繼續執行 WAIT_FOR_VHAL。 | |
| 開啟 | Android 運作正常。 |
狀態可以自主設定,也可以透過 VMCU 回應要求。
AP_POWER_STATE_REQ
VMCU 會傳送這項屬性,將 Android 轉換為不同的電源狀態,並包含兩個整數:
int32Values[0]:VehicleApPowerStateReq列舉值,代表要轉換的新狀態。int32Values[1]:VehicleApPowerStateShutdownParam列舉值。這個值只會針對SHUTDOWN_PREPARE訊息傳送,並將所含選項傳輸至 Android。
第一個整數值代表 Android 要轉換的新狀態。語意定義於 VehicleApPowerStateReq.aidl,如下所示:
| 值名稱 | 說明 |
|---|---|
| 開啟 | AP 應會開始全面運作。 |
| SHUTDOWN_PREPARE | AP 應準備關機。第二個值表示 AP 是否可延後關機,以及 AP 應預期關機或進入深層睡眠。 |
| CANCEL_SHUTDOWN | AP 應停止準備關機,並準備開機。 |
| 已完成 | AP 現在會關機或暫停運作。 |
VehicleApPowerStateShutdownParam 是在 VehicleApPowerStateShutdownParam.aidl 中定義的。這個列舉包含下列元素:
| 值名稱 | 說明 |
|---|---|
| CAN_SLEEP | AP 可以進入深層睡眠,不必完全關機。可延期。 |
| CAN_HIBERNATE | AP 可以進入休眠狀態,而不是完全關機。可延期。 |
| SHUTDOWN_ONLY | AP 應關機。允許延後,但不允許進入深層睡眠。 |
| SLEEP_IMMEDIATELY | AP 可能會進入深層睡眠,但必須立即進入睡眠或關機,不得延後。 |
| HIBERNATE_IMMEDIATELY | AP 可能會進入暫停至磁碟狀態,但必須立即休眠或關機,不得延後。 |
| SHUTDOWN_IMMEDIATELY | AP 必須立即關機,不得延後或進入深層休眠。 |
喚醒來源
裝置處於暫停模式時,整合人員必須停用適當的喚醒來源。常見的喚醒來源包括心跳、數據機、Wi-Fi 和藍牙。唯一有效的喚醒來源必須是 VMCU 的中斷,才能喚醒 SoC。這項假設的前提是 VMCU 可以監聽數據機,以接收遠端喚醒事件 (例如遠端啟動引擎)。如果這項功能推送至 AP,則必須新增另一個喚醒來源,才能為數據機提供服務。
應用程式
原始設備製造商必須謹慎編寫應用程式,確保應用程式能快速關閉,不會無限期延後程序。
附錄
原始碼樹中的目錄
| 滿足 | 目錄 |
|---|---|
| 與 CarPowerManager 相關的程式碼。 | packages/services/Car/car-lib/src/android/car/hardware/power |
| CarPowerManagementService 等等。 | packages/services/Car/service/src/com/android/car/power |
處理 VHAL 的服務,例如 VehicleHal 和 HAlClient。 |
packages/services/Car/service/src/com/android/car/hal |
| VHAL 介面和屬性定義。 | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
範例應用程式,提供 CarPowerManager 的一些概念 |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
類別圖
這個類別圖表顯示電源管理系統中的 Java 類別和介面:

圖 4. 電源類別圖。
物件關係
圖 5 說明哪些物件參照其他物件。邊緣表示來源物件參照目標物件。舉例來說,VehicleHAL 參照 PropertyHalService 物件。

圖 5. 物件參照圖。