如何才能更持久系列之——如何才能準確測量APP的功耗

引言:電量消耗控制一直是困擾所有APP開發者的一大難題,其中又以Android平臺尤甚。業界同行爲此做了非常多的研究與嘗試,騰訊自然也不例外。本週大講堂繼續推出省電系列第二篇文章,與大家一起探討Android開發中的省電竅門。

上篇文章羅列了很多數據,除了通過評測軟件跑出來的數據外,還有些實際功耗數據,這些除了用power monitor硬件設備以外,還有是通過軟件測出來的。有同學可能要挑戰了,除了power monitor,其他軟件形式的電量數據都是不可靠的,這種數據拿出來是沒有說服力的。挑戰的很好,爲什麼這麼說,先來分析下幾種可行的電量測試方法:

方法不多,有如下幾種:
用電源模擬電池給手機供電,再實時監控,非專業人士這種方法可以直接pass了,投入產出比太低了。

用如monsoon power monitor的硬件設備接在手機電源上來測功耗,仍然太麻煩,而且設備太貴啊有木有,繼續pass。

而且上面硬件方式最大的問題是區分不了不同硬件模塊的功耗,無法實現精準測試數據。

那麼讀取/proc, /sys文件的方式呢?這種就更不靠譜了,首先這種方法無法給出實際功耗,也無法解決更新頻率問題,另外最重要一點,如gps、cellular及屏幕等模塊是沒有任何數據可以使用的。當然,這些數據還是非常有用的,不過只能作爲輔助功能。

通過BatteryStats、BatteryService等Battery驅動程序都是用的Linux標準的Power Supply驅動程序與上層sys文件系統做接口,主要用於讀取sys中電池相關的文件信息。現在大部分電池管理軟件都是基於這個實現的。包括無線部門非常牛x的專項工具GT中所提供的電量檢測就是讀取power_supply/battery下面數據來實現的,不過侷限性較大,除了不能分模塊以外還對機型有要求(原因後面解釋)。
如何才能準確測量APP的功耗?【省電系列之2】

如上圖表面上似乎PowerTutor已經超脫於上面所說的各種侷限了,他能檢測不同模塊,而且給出功耗數據。但他的能耗估計實質上是估計功率,再根據功率和時間乘積算出能耗,也就是說最終檢測到的功耗數據是估算出來的,而非真實功耗。不過PowerTutor得出的數據其實跟實際數據是非常接近的[1],下圖是跑google map和youtube估算結果跟實際測量的功耗,從曲線上看差不多。那是否用PowerTutor就能幫助我們實際展開電量專項測試了呢?

如何才能準確測量APP的功耗?【省電系列之2】
如何才能準確測量APP的功耗?【省電系列之2】

從他的代碼來看,功率的計算主要是由PhonePowerCaculator接口定義的,而且根據不同的機型實現了不同的接口,比如getThreegPower函數,只是根據目前3G接口的狀態,返回該狀態下的固定功率。而固定功率以硬編碼的形式固定在DreamConstants.java中,這些固定功率應該是使用專門的設備進行檢測出來的[2]。也就是說除了G1、G2和Nexus One,PowerTutor並不能保證準確性。而且可惜的是雖然他們官網表示會支持更多手機類型,但現實是殘酷的,他們已經3年沒有更新代碼了,而且幾個主創人員要麼畢業工作了,要麼換課題了,基本上可以宣告他已經爛尾了。

App電量問題其實在業界也一直困擾着很多同行,這不我在四處尋覓時看到了一位同學,也在尋覓着稱手的兵器。
如何才能準確測量APP的功耗?【省電系列之2】

這位同學在跟誰討教呢?原來是在牛X的Qualcomm公司技術論壇,向他們的產品經理請教電量工具的問題,請允許我爲大家介紹Qualcomm移動設備監控工具Trepn Profiler。
如何才能準確測量APP的功耗?【省電系列之2】

trepn profiler的工作原理Qualcomm並沒有太詳盡的介紹,但其實也並不複雜,如上圖,軟件通過SnapDragon800+系列移動芯片架構中所使用的特殊EPM電路以及電池電量計芯片(如DS2780 、MAX17048等)直接獲取電流數據,可以理解成SnapDragon800+系列芯片專門在如每個cpu核心、數字核心、電量監控等處build in了多個sensors,當開始運行trepn profiler時sensor就開始工作,並將數據通過圖表形式展現出來,基本上可以算是從硬件直接獲取的數據了

說到這裏有必要簡單介紹下fuel gauge IC(即電量計芯片),因爲手機需要確定電池的可用電量以及充電狀態(SOC),主要是根據剩餘電量與電池容量的比來確定的,而手機電池經過多次充放電導致電池容量變化,以及電壓與電量之間不存在明確的關係。所以爲了達到足夠高的電量計量精度,引入了fuel gauge IC,下圖是現在使用比較廣泛的MAXIM DS2786[3]。工作原理就不詳述了,有興趣的自研,市面上一般不是MAXIM的就是TI的,資料都在官網。
如何才能準確測量APP的功耗?【省電系列之2】

不過也基於依賴fuel gauge IC獲取數據的原因,電池類型不同芯片肯定不同,手機不同芯片也有可能不同,所以某些設備的數據並不準確,如已知以下幾款(發現木有都是三星啊…):

· Samsung Galaxy S III (SCH-I535)

· Samsung Galaxy S4 (SCH-I545)

· Samsung Galaxy S5

· Samsung Galaxy Note II

· Samsung Galaxy Note 3 (SM-N900V)

· DragonBoard (all versions)

· Inforce IFC6410 SBC

推薦使用以下幾款經Qualcomm測試確認數據無誤的手機:

· Google/ASUS Nexus 7

· LG Nexus 4

· LG Nexus 5

· HTC One (2013)

· Sony Xperia ZL

· HTC Droid DNA

· LG Optimus G Pro

說到這裏就可以回答一下爲何專項工具GT隨身測對有機型要求,因爲其中也用到了實時獲取電流來判斷電量損耗的方法,其中說到經試驗暫時只在nexus 1和4上可用,其實也是跟fuel gauge IC有關,太子1和4可用是因爲android原生支持的原因。

再回到軟件本身,鑑於上面介紹的實現原理,我們可以確定trepn profiler的數據是可靠準確的(相較其他非硬件檢測類方法而言),雖然他也無法區分各個模塊的功耗(MDP工程機支持分模塊監控,手頭無設備,詳情見附錄),但他的優勢在於他能同時監控其他硬件指標,於是我們可以從側面來印證各模塊的功耗,先加載檢測所有可能相關的硬件模塊,通過曲線圖來判斷電量走勢與哪些硬件使用關係最大。

比如下面這張我用谷歌地球的情況,同時檢測電量功耗、cpu、gpu、gps、wifi以及屏幕的使用情況可以看到中間有一段時間電量基本再低谷,而其他曲線除了cpu外基本上也是平的,就可以分析得出這段空閒時間cpu使用並不影響多少電量,相反可以發現電量曲線跟粉紅色曲線很相近,再仔細一看原來粉紅色曲線是GPU使用,那就難怪了。當然我這個圖截得不好,縱軸其實是可以以mW爲單位的。
如何才能準確測量APP的功耗?【省電系列之2】

所以通過trepn profiler檢測到的數據,再加上些個人分析,基本可以滿足我們電量專項測試的需求了。不過如果買一臺SnapDragon MDP工程機,再用trepn profiler的話還能支持查看各模塊的電流、電壓情況,再加上已知的功耗及模塊對應關係,其實就可以估算出比較準確的各模塊實際功耗情況了。但手頭沒有MDP工程機,只是個人猜測而已。

另外比較令人興奮的是,trepn profiler還支持eclipse插件,開發測試兩相宜。
如何才能準確測量APP的功耗?【省電系列之2】

當然強大的Qualcomm公司可不止只有這點能耐,對於他們的OEMs或合作伙伴,他們有更強大的QEPM電量監控軟件,不過實在難以一睹真容,找了張圖權且看看,似乎是一整套性能檢測方案,通過web端實時查看數據。但考慮到獲得授權的可能性,還是作罷了
如何才能準確測量APP的功耗?【省電系列之2】

硬件檢測電量測試方法:相比用power monitor這種東西,用Qualcomm的trepn profiler來完成,簡單方便而且無成本,最重要的是檢測結果是準確可靠的。而且如果能搞一臺MDP能得到更詳盡和精確的數據。主要問題是存在機型適配的問題。

通過讀取系統文件方法:首先也存在機型適配問題,其次頻率、支持模塊都存在問題,最重要是數據並不能保證準確性。不建議用以做電量專項測試。

通過電量消耗模型估算的方法:以PowerTutor爲代表,可以檢測不同模塊的功耗,而且數據準確度較高。但對不同機型要有不同模型適配(主要是固定功率),而且軟件已停止更新。所以如果用適配機型來測電量還是可以接受的,其他機型還是算了。

所以現在看來MDP工程機+trepn profiler是最可行的一種方案,甚至直接只使用trepn profiler的話也不失可行。

但別忘了PowerTutor,雖然他已死,但他的實現方式及思路是非常值得借鑑的,有個韓國棒子稱PowerTutor爲state of the ART,他將這門art發揚了下去並且做得更好,不過本文暫且不表。

附錄(Snapdragon 800(MDP工程機)支持的電量測量範圍):

Power Stats are measured in mW or mWh. Power Stat values are given as adjusted values relative to the baseline measurement. Battery Power values can be set to relative values or raw values by toggling the Show Deltas preference.
Trepn Profiler captures different power statistics depending on the hardware.

Follow the device links for a list of corresponding Power Stats:

On this device, power/current values are available for:
n Audio – Power consumed by the audio codec
n Battery Power – Power consumed by the whole system from battery
n Battery Status – Charging status of the battery; automatically selected when the Battery Power data is selected, but not selectable individually
¨ 0 – Not Charging
¨ 1 – Charging (USB)
¨ 2 – Charging (AC)
¨ 3 – Charging (Generic Source)
n CPU – Power consumed by the CPU
n Camera – Power consumed by the camera
n Codec/GPS/Wireless – Power consumed by the codec, camera, GPS, and wireless
n Digital Core/SD Card/USB – Power consumed by the digital core, SD card, USB
n Graphics – Power consumed by the GPU
n Internal Memory – Power consumed by eMMC memory
n LCD Backlight – Power consumed by the display backlight
n SD Card – Power consumed by the micro-SD card
n USB – Power consumed by the USB
n WLAN/BT/FM – Power consumed by Wi-Fi, Bluetooth, and FM radio

[1] L. Zhang and et.al., “Accurate Online Power Estimation and Automatic Battery Behavior Based Power Model Generation for Smartphones,” in Proc. of CODES+ISSS, 2010.

[2] https://github.com/msg555/PowerTutor

[3] www.maximintegrated.com

轉自:http://qoofan.com/a/50764.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章