【Android】效能優化:電量消耗統計
電量的消耗和使用對於移動裝置非常重要,一項調查問卷顯示,電池的容量和壽命是手機最重要的營銷點:所謂“the one thing that you can't do without”。
硬體
從硬體的角度看,Android電量的消耗主要來自螢幕,CPU,網路裝置和各樣的感測器:指紋,亮度,溫溼度,陀螺儀,加速器等等。通常情況下,螢幕是耗電量最大的模式。一般來講,Android裝置的螢幕主要分為兩種:Liquid-crystal display (LCD)和Light-emitting diode (LED):
- LCD有很多個液晶分子來負責每個畫素的顯示,然後由一個背光將所有的液晶分子同時照亮。每個畫素的能耗是相同的,與呈現的顏色無關。
- 而LED則是自發光:每個畫素點由紅、藍、綠三種顏色光源的發光二極體共同控制和呈現。黑色不使用任何顏色,所以可以認為是無能耗,而白色需要所有的光源,耗能最多。所以有些手機在省電模式下(比如華為的超級省電模式),手機的背景都會設定成黑色。
LED與LCD的功耗比大約為1:10,LED更節能。同時LED在重新整理率,鮮豔度和飽和度方面效果也更好,可以製造出比LCD更薄、更亮、更清晰的顯示器。所以現在市面上的智慧機大部分為LED屏。
除了螢幕之外,比較明顯的耗電硬體是wifi或者資料網路連線裝置,以及GPS定位。一般情況,使用wifi的能耗要小於使用行動網路的能耗。
另外還有CPU。一定情況下,CPU的耗電量可能是最大的,比如我們玩遊戲的時候會明顯感覺手機發燙,電量急速下掉。
耗電統計
可以使用adb dump來得到裝置的能耗統計(batterystats)。首先重置手機狀態:
adb shell dumpsys batterystats --reset
adb shell dumpsys batterystats --enable full-wake-history
拔掉usb連線(避免充電),隨意進行一定操作之後,採集能耗資料:
adb shell dumpsys batterystats > battery.txt
可以得到每個程序(Uid)的WakeLock以及所有app的能耗清單。
Battery History (1% used, 6456 used of 512KB, 115 strings using 8706):
0 (10) RESET:TIME: 2018-12-02-21-59-12
0 (2) 100 status=discharging health=good plug=none temp=286 volt=4388 charge=3574 +running +wake_lock +screen phone_signal_strength=great brightness=medium +usb_data wifi_signal_strength=4 wifi_suppl=completed proc=u0a99:"com.google.android.apps.turbo"
0 (2) 100 proc=u0a83:"com.android.printspooler"
0 (2) 100 proc=u0a20:"com.google.android.setupwizard"
0 (2) 100 proc=1000:"com.google.SSRestartDetector"
0 (2) 100 proc=u0a167:"com.tencent.mm"
0 (2) 100 proc=u0a171:"com.touchtype.swiftkey"
...
Google的Battery Historian可以幫助我們更直觀的分析這些資料。battery-historian/scripts/有Battery Historian的第一版,用起來比較簡單(需要有Python環境):
python historian.py -a battery.txt> battery.html
開啟生成的battery.html檔案可以看到具體的耗電情況。
一些簡單的示意:
- 橫座標:時間
- battery_level:剩餘電量
- plugged:裝置是否連線電源
- screen:螢幕開啟時長
- top:當前螢幕顯示的程序,比如上圖中的程序com.tencent.mm就是微信
- wake_lock*:wake_lock模組的工作時長
- running:介面狀態,主要為是否處於idle的狀態。可以協助統計應用
- wake_lock_in: 模組開始工作的時間以及時長
- job:後臺job
- conn:網路連線方式,wifi或者2G,3G等
- power_save:應該是省電模式開始時長吧,可能Android P之後才有的
historian.py是Battery Historian的第一版,而用Go重寫的第二版更為強大,可以將耗電統計精確到每個程序。Battery Historian 2.0在9999埠掛在了一個分析和轉換資料格式的伺服器,比較簡單的方法是通過Docker容器引擎,需要先安裝Docker。執行:
docker run hello-world
看到如下輸出就證明安裝成功啦:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest:
sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest
...
啟動Battery Historain映象:
docker -- run -p <port>:9999 gcr.io/android-battery-historian/:3.0 --port 9999
其中<port>為你的埠號,比如:
docker -- run -p 2222:9999 gcr.io/android-battery-historian/:3.0 --port 9999
如果遇到下面的錯誤:
Unable to find image 'gcr.io/android-battery-historian:3.0' locally
docker: Error response from daemon: manifest for gcr.io/android-battery-historian:3.0 not found.
See 'docker run --help'.
可以嘗試sudo或者stable版:
docker -- run -p 2222:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999
執行成功後在http://localhost/2222 就可以上傳你的bugreport來分析了。生成bugreport:
adb bugreport > bugreport.zip
將bugreport.zip上傳到http://localhost/2222,就可以看到詳細的耗電統計報告:
Historain V2非常強大,可以看到每個App的耗電情況,比如微信:
資料
- https://developer.android.com/studio/profile/battery-historian
- https://github.com/google/battery-historian
- https://docs.docker.com/install/
- https://www.phonearena.com/news/What-is-the-most-important-smartphone-feature-to-you_id103392
- https://en.wikipedia.org/wiki/Light-emitting_diode
- https://en.wikipedia.org/wiki/Liquid-crystal_display
(轉載請註明作者和出處:http://blog.csdn.net/xiaowei_cqu 未經允許請勿用於商業用途)
掃描或搜尋公眾號:小魏的修行路,在手機端檢視文章