您可以比較裝置在元件處於所需狀態 (例如開啟、啟用、掃描) 和關閉時所消耗的電流,藉此判斷個別元件的耗電量。您也可以使用外部電源監控器 (例如工作台電源供應器或專用電池監控工具,例如 Monsoon Solution Inc. Power Monitor 和 Power Tool 軟體),測量裝置在額定電壓下所消耗的平均瞬時電流。
製造商通常會提供個別元件所消耗電流的相關資訊。如果這項資訊實際上準確代表從裝置電池汲取的電流,請使用這項資訊。不過,請先驗證製造商提供的值,再將這些值用於裝置電源設定檔。
控制耗電量
測量時,請確認裝置未連上外部充電源,例如 USB 連線至執行 Android Debug Bridge (adb) 時使用的開發主機。受測裝置可能會從主機汲取電流,因此降低電池的測量值。請避免使用 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 都設為閒置 (除了一個) 可能會產生可接受的結果。使用 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 殼層執行下列指令:
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) 產生網路接收和傳輸流量。