測量組件功率

您可以透過比較組件處於所需狀態(例如開啟、活動、掃描)和組件關閉時設備消耗的電流來確定各個組件的功耗。使用外部電源監視器(例如桌上型電源或專用電池監視工具(例如 Monsoon Solution Inc. 電源監視器和 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 速度恆定,並使用部分喚醒鎖來防止系統掛起。然後 Joe 關閉設備螢幕並進行測量 (200 mA)。接下來,Joe 以最低亮度打開設備螢幕並進行另一次測量 (300 mA)。 screen.on值為 100 mA (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 )來產生網路接收和傳輸流量。