測量元件功率

您可以通過比較組件處於所需狀態(打開、活動、掃描等)和組件關閉時設備消耗的電流來確定單個組件的功耗。使用外部電源監控器(例如台式電源或專用電池監控工具(例如 Monsoon Solution Inc. Power Monitor 和 Power Tool 軟件))測量設備在標稱電壓下的平均瞬時電流。

製造商通常會提供有關單個組件消耗的電流的信息。如果它準確地代表了實際從設備電池汲取的電流,請使用此信息。但是,在您的設備電源配置文件中使用這些值之前,請驗證製造商提供的值。

控制功耗

測量時,確保設備沒有連接到外部充電源,例如運行 Android 調試橋 (adb) 時使用的與開發主機的 USB 連接。被測設備可能會從主機汲取電流,從而降低電池的測量值。避免 USB On-The-Go (OTG) 連接,因為 OTG 設備可能會從被測設備中汲取電流。

除被測組件外,系統應以恆定的功耗水平運行,以避免因其他組件的變化而導致測量不准確。可能對功率測量造成不必要更改的系統活動包括:

  • 蜂窩、Wi-Fi 和藍牙接收、傳輸或掃描活動。不測量蜂窩無線電功率時,將設備設置為飛行模式並根據需要啟用 Wi-Fi 或藍牙。
  • 屏幕開/關。屏幕開啟時顯示的顏色會影響某些屏幕技術的功耗。測量非屏幕組件的值時關閉屏幕。
  • 系統暫停/恢復。屏幕關閉狀態可以觸發系統暫停,將設備的某些部分置於低功耗或關閉狀態。這會影響被測組件的功耗,並在系統定期恢復發送警報等時導致功率讀數出現較大差異。有關詳細信息,請參閱控制系統掛起
  • CPU 改變速度和進入/退出低功耗調度程序空閒狀態。在正常運行期間,系統會頻繁調整 CPU 速度、在線 CPU 內核數量以及其他系統內核狀態,例如內存總線速度以及與 CPU 和內存相關的電源軌電壓。在測試期間,這些調整會影響功率測量:
    • CPU 速度縮放操作可以減少內存總線和其他系統核心組件的時鐘和電壓縮放量。
    • 調度活動會影響 CPU 處於低功耗空閒狀態的時間百分比。有關防止在測試期間發生這些調整的詳細信息,請參閱控制 CPU 速度

例如,Joe Droid 想要計算設備的screen.on值。他在設備上啟用飛行模式,以穩定的當前狀態運行設備,保持 CPU 速度恆定,並使用部分喚醒鎖來防止系統掛起。喬然後關閉設備屏幕並進行測量 (200mA)。接下來,Joe 以最小亮度打開設備屏幕並進行另一次測量 (300mA)。 screen.on值為 100mA (300 - 200)。

注意:對於活動時電流消耗波形不平坦的組件(例如蜂窩無線電或 Wi-Fi),請使用電源監控工具測量一段時間內的平均電流。

當使用外部電源代替設備電池時,系統可能會由於未連接電池熱敏電阻或集成電量計引腳而出現問題(即電池溫度或剩餘電池容量的無效讀數可能會關閉內核或 Android 系統) .假電池可以在熱敏電阻或電量計引腳上提供模擬正常系統溫度和充電狀態讀數的信號,還可以提供方便的引線用於連接到外部電源。或者,您可以修改系統以忽略丟失電池中的無效數據。

控制系統掛起

本節介紹當您不希望系統掛起狀態干擾其他測量時如何避免它,以及當您確實想要測量系統掛起狀態時如何測量系統掛起狀態的功耗。

防止系統掛起

系統掛起會在功率測量中引入不必要的變化,並將系統組件置於不適合測量有功功率使用的低功率狀態。要防止系統在屏幕關閉時掛起,請使用臨時部分喚醒鎖。使用 USB 電纜,將設備連接到開發主機,然後發出以下命令:

adb shell "echo temporary > /sys/power/wake_lock"

wake_lock中,屏幕關閉狀態不會觸發系統掛起。 (請記住在測量功耗之前斷開 USB 電纜與設備的連接。)

要刪除喚醒鎖:

adb shell "echo temporary > /sys/power/wake_unlock"

測量系統暫停

要測量系統掛起狀態期間的功耗,請測量電源配置文件中cpu.idle的值。測量前:

  • 刪除現有的喚醒鎖(如上所述)。
  • 將設備置於飛行模式以避免蜂窩無線電的並發活動,這可能在與系統掛起控制的 SoC 部分分開的處理器上運行。
  • 通過以下方式確保系統處於掛起狀態:
    • 確認當前讀數穩定到一個穩定值。讀數應在 SoC 掛起狀態的功耗加上保持供電的系統組件(例如 USB PHY)的功耗的預期範圍內。
    • 檢查系統控制台輸出。
    • 觀察系統狀態的外部指示(例如 LED 在未掛起時關閉)。

控制 CPU 速度

活動 CPU 可以聯機或脫機,更改其時鐘速度和相關電壓(可能還會影響內存總線速度和其他系統內核電源狀態),並且可以在內核空閒循環中進入低功耗空閒狀態。在為電源配置文件測量不同的 CPU 電源狀態時,在測量其他參數時避免功耗差異。電源配置文件假定所有 CPU 具有相同的可用速度和電源特性。

在測量 CPU 功率時,或在保持 CPU 功率不變以進行其他測量時,保持聯機 CPU 的數量不變(例如讓一個 CPU 聯機,其餘 CPU 脫機/熱插拔)。保持除一個之外的所有 CPU 處於調度空閒狀態可能會產生可接受的結果。使用adb shell stop停止 Android 框架可以減少系統調度活動。

您必須在電源配置文件cpu.speeds條目中為您的設備指定可用的 CPU 速度。要獲取可用 CPU 速度的列表,請運行:

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

這些速度與值cpu.active中的相應功率測量值相匹配。

對於聯機內核數顯著影響功耗的平台,您可能需要修改平台的 cpufreq 驅動程序或調控器。大多數平台都支持使用用戶空間 cpufreq 調控器來控制 CPU 速度,並使用 sysfs 接口來設置速度。例如,要在只有 1 個 CPU 或所有 CPU 共享一個公共 cpufreq 策略的系統上設置 200MHz 的速度,請使用系統控制台或 adb shell 運行以下命令:

echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

注意:確切的命令因平台 cpufreq 實現而異。

這些命令確保新速度不超出允許範圍,設置新速度,然後打印 CPU 實際運行的速度(用於驗證)。如果執行前的當前最小速度高於 200000,您可能需要顛倒前兩行的順序,或者再次執行第一行以在設置最大速度之前降低最小速度。

要測量以不同速度運行的 CPU 消耗的電流,請使用系統控制台使用以下命令將 CPU 置於 CPU 綁定循環中:

# while true; do true; done

在循環執行時進行測量。

由於高溫測量(即在持續高速運行 CPU 之後),某些設備可能會在執行熱節流時限制最大 CPU 速度。注意這種限制,在進行測量時使用系統控制台輸出或在測量後檢查內核日誌。

對於cpu.awake值,測量系統未掛起且未執行任務時的功耗。 CPU 應處於低功耗調度程序空閒循環,可能執行 ARM 等待事件指令或處於 SoC 特定的低功耗狀態,具有適合空閒使用的快速退出延遲。

對於cpu.active值,測量系統未處於掛起模式且未執行任務時的功率。一個 CPU(通常是主 CPU)應該運行任務,而所有其他 CPU 應該處於空閒狀態。

測量屏幕功率

測量屏幕通電時,請確保在屏幕啟用時正常打開的其他設備也處於打開狀態。例如,如果觸摸屏和顯示屏背光在屏幕打開時通常會打開,請確保在您測量時這些設備處於打開狀態,以獲得屏幕電源使用情況的真實示例。

某些顯示技術的功耗會根據顯示的顏色而有所不同,從而導致功率測量值因測量時屏幕上顯示的內容而有很大差異。測量時,確保屏幕顯示的內容具有真實屏幕的功率特性。瞄準全黑屏幕(某些技術的功耗最低)和全白屏幕的極端情況。一個常見的選擇是日曆應用程序中的日程表視圖,其中混合了白色背景和非白色元素。

最小最大顯示/背光亮度下測量屏幕電源。設置最小亮度:

  • 使用 Android UI (不推薦)。將設置 > 顯示亮度滑塊設置為最低顯示亮度。但是,Android UI 只允許將亮度設置為可能的面板/背光亮度的至少 10-20%,並且不允許將亮度設置得過低以至於不費力就看不到屏幕。
  • 使用 sysfs 文件(推薦)。如果可用,請使用 sysfs 文件將面板亮度一直控製到硬件支持的最低亮度。

此外,如果平台 sysfs 文件允許打開和關閉 LCD 面板、背光和触摸屏,請使用該文件在屏幕打開和關閉的情況下進行測量。否則,設置部分喚醒鎖,使系統不會掛起,然後使用電源按鈕打開和關閉屏幕。

測量 Wi-Fi 功率

在相對安靜的網絡上執行 Wi-Fi 測量。避免引入額外的工作來處理與正在測量的活動無關的大量廣播流量。

wifi.on值測量啟用 Wi-Fi 但未主動發送或接收時消耗的功率。這通常測量為系統掛起(睡眠)狀態下啟用 Wi-Fi 與禁用時的電流消耗之間的增量。

wifi.scan值測量在 Wi-Fi 掃描接入點期間消耗的功率。應用程序可以使用 WifiManager 類startScan() API觸發 Wi-Fi 掃描。您還可以打開“設置”>“Wi-Fi”,每隔幾秒執行一次接入點掃描,功耗會明顯增加,但您必須從這些測量值中減去屏幕功率。

注意:使用受控設置(例如iperf )生成網絡接收和傳輸流量。