通常在實驗室環境中測量和記錄各種穩態條件下的設備子系統功耗,例如螢幕開啟或裝置處於空閒功耗狀態時。這適用於具有恆定功耗的子系統,或在實驗室環境中易於測量的條件下,但不適用於某些用例,例如螢幕顯示影片時。
IPower.hal 1.0
提供了一個接口,用於傳遞電源提示並報告子系統睡眠狀態指標的累積數據。在 Android 10 及更高版本中,累積統計報告函數駐留在IPowerStats.hal
電源統計收集 API 中,並提供了一種檢索裝置上能源使用資料的方法。這取代了IPower.hal
介面的累積統計資料收集部分,以實現更清晰的功能分離。
IPowerStats
服務讀數不是週期性的。它們發生在關鍵時刻,例如電池電量下降 1% 時。當電池電量較低時,讀數頻率較低,而當電池電量較高時,讀數頻率較高。數據可以發送回伺服器,並且可以在錯誤報告中用於分析和分類。這支持了降低功耗和延長電池壽命的持續努力。
IPower.hal 和 IPowerStats.hal
IPower.hal
和IPowerStats.hal
介面皆可在 Android 10 上使用,但IPower.hal
統計資料收集功能僅可從IPowerStats.hal
介面使用。 IPowerStats.hal
功能包括用於獲取和使用從受支援設備的設備上電源測量中收集的數據的 API:
- 為低頻 (
getRailInfo
) 和高頻 (streamEnergyData
) 用戶端執行軌道級能量測量,並報告自啟動以來累積的能量。 - 報告與每個支援的
PowerEntity
(其數據可用)相關的資訊。PowerEntity
是影響總設備功耗的平台子系統、週邊或電源域。 - 報告指定實體為其提供駐留資料的電源實體狀態集 (
getPowerEntityStateInfo
),然後報告每個指定PowerEntity
的累積資料。
IPowerStats.hal
API 由下列客戶端使用:
-
Statsd
,收集每軌功耗指標。 -
Perfetto
,將功耗與 CPU 活動關聯。 -
Batterystats
,透過使用測量資料來改善電池歸因,而不是根據power_profile.xml.
對於 Android 10 及更高版本,裝置製造商可以在IPower.hal
和IPowerStats.hal
函數之間進行選擇,但如果未實現IPowerStats.hal
,所有用戶端都必須回退到IPower.hal
。
IPowerStats.hal 實作選項
Android 7 到 Android 9 上僅提供IPower.hal
函數。某些 SoC 會為您收集用電統計信息,或者您也可以透過軟體取得電源實體狀態駐留資訊。電源監控硬體只需要支援getRailInfo()
、 getEnergyData()
和streamEnergyData()
。
如果您在沒有電源監控硬體的情況下實作IPowerStats.hal
, getRailInfo(), getEnergyData()
和streamEnergyData()
傳回NOT_SUPPORTED
。同樣,如果不打算使用getPowerEntityInfo(), getPowerEntityStateInfo()
和getPowerEntityStateResidencyData()
也可能傳回NOT_SUPPORTED
。
鐵路監控 API 傳回的資料範例包括
- 顯示器的電源軌消耗 X µW。
- 數據機的電源軌消耗 Y µW。
子系統睡眠狀態 API 傳回的資料範例包括
- 調製解調器休眠了 X 毫秒。
- SoC 處於電源崩潰狀態達 Y 毫秒。
- GPU 處於暫停狀態 Z 毫秒。
使用硬體電源監控子系統
如果您的裝置設計具有硬體電源監控子系統,請透過建立PowerStats.hal
可以從中解析資料的單一sysfs節點或透過進行ioctl類型系統呼叫的集合來實現IPowerStats.hal
。
您必須以防止累加器溢出的方式實作核心驅動程式。使用的演算法取決於您獨特的硬體電源監控子系統設計,該設計必須提供瞬時和平均總線電壓和電流測量。內核驅動程式必須以不清除能量累加器的方式捕獲此數據,並且必須以64 位元變數的形式維護自啟動以來每個子軌的累積能量數據,該變數隨著從能量讀取器中讀取的能量而遞增每個累加器查詢。
給定元件(或可選的多個元件)的統計資料必須位於單一節點中。雖然這不是sysfs的常規用法(通常將每個節點限制為單一值),但它確保所有資料都是一致的。
設計指導
- 從sysfs節點讀取或進行系統呼叫時,保持較低的延遲(最大 1 毫秒)。
- 確保支援統計功能不會顯著增加功耗:
- 不要增加存取點 (AP) 和/或子系統喚醒來追蹤參數,例如睡眠模式下花費的時間。
- 盡可能在應用程式處理器和韌體之間利用其他流量傳輸統計資料。
- 如果需要,子系統可以使用下列驅動程式函數:
- 內部快取資料以避免延遲/喚醒,但代價是資料稍微陳舊。
- 當子系統處於睡眠狀態時執行外推,以提供更新的睡眠時間而不喚醒子系統。
選擇元件、子系統和統計數據
選擇從中收集IPowerStats.hal
資料的元件或子系統時,請選擇裝置上消耗大量電流(5 mA 或更多)或支援多種功耗模式的任何內容,如下所示:
- 單獨的 SoC 子系統。
- 部分或完全位於 SoC 之外的子系統,例如 WiFi、影像處理器或安全處理器。
- 高功率 LED 和攝影機等周邊設備。
- 使用不同模式的電源域(例如整個 SoC 的電源域)。
客製化
此可選功能可以自訂。設計用例並自訂您的使用:
- 決定測量哪些導軌以及測量頻率。
- 決定何時讀取資料以及如何解釋它。
- 根據您的數據決定採取什麼行動以及何時採取行動。
驗證
VTS 測試確保滿足 Android 要求。 IPowerStats.hal
中的註解用於驗證裝置是否合規。
例如,如果您呼叫getRailInfo()
並且它不傳回任何內容,則 VTS 測試會失敗,因為您沒有收到有關受監視軌道的信息,也沒有收到返回的SUCCESS
狀態。同樣,如果您收到鐵路訊息,但伴隨著NON_SUPPORTED
或FILE_SYSTEM_ERROR
響應,這也是失敗。 VTS 使用 IPower.hal 和 IPowerStats.hal 註解中的要求來驗證 HAL 檔案中是否遵守裝置製造商規範。 VTS 測試中使用的註解範例如下所示:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);