Android功耗評測系列之——軟體評測方案原理
軟體評測方案也有很多種,但核心原理都是同一個。
軟體評測方案中,所有Android功耗的統計都是通過程式碼進行估算,沒有任何實體電路和硬體裝置參與統計彙報。這個配置檔案儲存在Android裝置的以下路徑中:
/frameworks/base/core/res/res/xml/power_profile.xml
(不同的廠商定製ROM中,此檔案的路徑可能會稍有不同)
配置檔案內容節選示例如下:
檔案中會詳細設定手機中的每個部件在不同工況中的功耗單位值。所以,軟體評測準確與否,與該檔案息息相關。某些品牌的手機由於造假吹牛成風,故不可用於功耗評測。嗯,你知道我說的是誰。
在電源配置檔案中,功耗表示額定電壓下的電流消耗量,單位為毫安 (mA),也可用微安(uA) 表示(分數值)。該值應代表電池上消耗的電流,而非與電池消耗的電流不對應的相應電源軌的值。
例如,顯示屏電源配置檔案列出了當顯示屏開啟狀態下保持最低亮度和最高亮度時需消耗的電流量 (mA)。為了確定顯示屏常亮時所需的電源成本(即由顯示屏元件所消耗的電池量),框架會跟蹤在各個亮度級別下維持的時間,然後將這些時間間隔乘以通過插值演算法計算的顯示亮度成本。
軟體評測的計算方法和原理
Android系統為了進行電源管理,設計了PowerManagement框架,其中包含BatteryState服務。BatteryStats 會不斷地收集資訊,並存儲這些資訊以便在重新啟動後繼續使用。該服務不會直接跟蹤電池中消耗的電流,而是通過收集計時資訊來估算不同元件所消耗的電量。
該框架使用以下方法收集統計資訊:
· 推送:服務察覺到元件狀態發生變化後,會將狀態變化推送到 BatteryStats 服務中。
· 拉取:對於應用使用的 CPU 等元件,框架會在轉換點(例如啟動活動或停止活動)自動拉取資料以擷取快照。
資源消耗與使用資源的應用相關。當多個應用同時使用某項資源(例如防止系統掛起的喚醒鎖)時,框架會將資源消耗量分攤到這些應用上,但不一定會均分。
為了避免由於系統關閉事件而丟失電池使用統計資訊(這些統計資訊可能表明存在電池功耗問題,比如由於電池電量耗盡而關閉),框架會大約每 30 分鐘傳送一次統計資訊。
要確定電源配置檔案的有關數值,請使用測量裝置耗電量的硬體,並執行需要資訊的各種操作。測量執行這些操作時的電量使用情況並計算各項值(在適當情況下與其他基準操作的電量消耗做對比所得的差異值)。
電源配置檔案的目的在於適當地估算電量消耗情況,電源配置檔案的有關數值以電流(安培)表示。Android 框架用電流乘以子系統處於啟用狀態的時間,並計算毫安時值,然後將此值用於評估應用/子系統消耗的電池電量。
原理似乎不太複雜,那實際中到底是咋算的呢?
(以下內容摘自網路,侵刪。)
在BatteryStatsHelper.java 中,有這麼一個方法:
processAppUsage()方法中,一個應用的總功耗在這裡體現出來了:
· cpu
· Wakelock(保持喚醒鎖)
· 資料天線(2G/3G/4G)
· WIFI
· 藍芽
· 感測器
· 相機
· 閃光燈
這些資料,將決定著你的應用在耗電排行榜中的位置,以及是否給予使用者警告高耗電。這些警告對於應用來說可能是致命的,使用者可能因此而解除安裝應用。
應用總功耗是上述八個統計值的和。這八個統計器同繼承自 PowerCalculator.java
具體來說,這八個耗電計算器的演算法分別如下: