1. 程式人生 > >【Android】效能優化:電量消耗統計

【Android】效能優化:電量消耗統計

電量的消耗和使用對於移動裝置非常重要,一項調查問卷顯示,電池的容量和壽命是手機最重要的營銷點:所謂“the one thing that you can't do without”。

硬體

從硬體的角度看,Android電量的消耗主要來自螢幕,CPU,網路裝置和各樣的感測器:指紋,亮度,溫溼度,陀螺儀,加速器等等。通常情況下,螢幕是耗電量最大的模式。一般來講,Android裝置的螢幕主要分為兩種:Liquid-crystal display (LCD)Light-emitting diode (LED):

  • LCD有很多個液晶分子來負責每個畫素的顯示,然後由一個背光將所有的液晶分子同時照亮。每個畫素的能耗是相同的,與呈現的顏色無關。

  • LED則是自發光:每個畫素點由紅、藍、綠三種顏色光源的發光二極體共同控制和呈現。黑色不使用任何顏色,所以可以認為是無能耗,而白色需要所有的光源,耗能最多。所以有些手機在省電模式下(比如華為的超級省電模式),手機的背景都會設定成黑色。

LEDLCD的功耗比大約為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 未經允許請勿用於商業用途)

掃描或搜尋公眾號:小魏的修行路,在手機端檢視文章