APP——功耗測試(耗電測試)——adb命令復雜獲取分析


查看手機電量信息:adb shell dumpsys battery

設置電池為充電狀態——adb shell dumpsys battery set status 2

設置電池為非充電狀態——adb shell dumpsys battery set status 1

設置電量百分比——adb shell dumpsys battery set level 100

復位,恢復實際狀態——adb shell dumpsys battery reset

設置斷開充電(Android 6.0以上)——adb shell dumpsys battery unplug              ——軟件角度模擬斷開充電(實際上是充進電)

==================================================================================================

==================================================================================================

獲取整個設備的電量消耗信息: adb shell dumpsys batterystats  | more
獲取某個apk的電量消耗信息:  adb shell dumpsys batterystats  包名 | more

C:\Users\del>adb shell dumpsys batterystats | more > C:\Users\del\Desktop\a.txt

C:\Users\del>adb shell dumpsys batterystats com.wawj.app.t | more > C:\Users\del\Desktop\a.txt

==================================================================================================

==================================================================================================

清除已有的耗電量數據——   adb shell dumpsys batterystats --enable full-wake-history

設備耗電量數據重置——   adb shell dumpsys batterystats --reset

==================================================================================================

==================================================================================================

電量分析工具Battery Historian的環境搭建與使用

Battery Historian 是一個這樣的的工具:可以在 Android 5.0 Lollipop(API 級別21)及更高版本的 Android 設備上檢測與電池相關的信息和事件,而在此期間,該設備沒有插上電源。它允許應用程序開發人員在時間軸上可視化系統和應用級別的事件,並使用平移和縮放功能,在設備最后一次完全充電之后,可以輕松地查看各種聚合統計信息,可以選擇一個應用程序,檢查所選擇的應用程序對電池指標的影響。此外,它還允許對兩個錯誤報告進行 A/B 比較,突出顯示了關鍵電池相關指標的差異。

環境配置

(1)安裝Go編程語言

點擊下載go語言
配置GOROOT、GOPATH、PATH環境變量。

 
GOROOT
 
GOPATH
 
Path

檢查是否安裝成功:cmd 執行 “go version”

 
 
(2)安裝 Python

下載:https://www.python.org/ 【注意僅支持 python 2.7,python3.0改變很大】

安裝

配置環境變量

 
Paste_Image.png

檢查是否安裝成功:cmd 執行 “python –V”【注意是大寫V】

 
 
(3)安裝Git

下載:https://git-scm.com/

安裝

檢查是否安裝成功:cmd 執行 “git version”

 
 
(4)下載 Battery Historian 源碼並且運行
  1. cmd 執行“go get -d -u github.com/google/battery-historian/...”【注意最后有三個點】
 
 

下載成功后會在GOPATH(我自己建的工作空間文件目錄)下生成src文件夾


 
 
  1. 進入到$GOPATH/src/github.com/google/battery-historian目錄下方


     
     
  2. 運行Battery Historian

  cmd 執行“go run setup.go”【第一次執行要下載,時間會久一些,以后就快些】 
 
 

ps:http://blog.csdn.net/feitian_666/article/details/52756522 提供了一個在沒有下載成功情況下補充“go run setup.go”的方法:手動下載【closure-library】和【closure-compiler】和【flot-axislabels】,解壓放到 GOROOT 目錄下 third_party 文件夾下方的的 closure-compiler、closure-library 和flot-axislabels 文件夾,如果沒有均手動創建。

  cmd 執行 go run cmd/battery-historian/battery-historian.go 
 
 
  1. 檢查/battery-historian是否運行
    登錄網址 http://localhost:9999查看是否加載運行battery historian。
     
    G@~)M7WYR)R@T_(V9P%@5JV.png

使用

(1).初始化

battery-historian工具需要使用bugreport中的Battery History,因此需要如下的操作。
重啟adb服務:

adb kill-server
adb start-server

這一步很重要,因為當我們開發時做電量記錄時會打開很多可能造成沖突的東西。為了保險起見我們重啟adb。
通過以下命令來打開電池數據的獲取以及重置:

adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats --reset

上面的操作很重要,因為可以過濾掉不需要的數據。然后斷開數據線(防止數據線造成充放電數據干擾),運行自己的APP進行測試。

(2)導出手機的 Bugreport 文件

重新連接USB調試,通過下面的命令獲取數據:

adb bugreport bugreport.zip(6.0以及以下的,使用adb bugreport > bugreport.txt導出)

你在哪個目錄下執行adb bugreport bugreport.zip 就會在哪個目錄下生成 bugreport.zip文件

(3)上傳bugreport.zip文件至 http://localhost:9999
 
 

最后

注意:7.0以下的,需要使用舊版本的adb工具,不然沒法采集,參考文章http://blog.csdn.net/mwq30123/article/details/53888449
注意:官方SDK文檔導出文件方式為:adb shell dumpsys batterystats > batterystats.txt。使用python historian.py batterystats.txt > batterystats.html查看數據。這是battery-historian老版本的使用方式. 目前Battery Historian已更新2.0版本, 推薦使用bugreport方式導出數據分析, 可以看到更多信息。
注意:模擬器可能獲取不到有用的電量數據,網頁沒有顯示電量信息,如下圖所示:

 
模擬器的bugreport
 
真實手機的bugreport

android電量統計的原理可以參看這篇文章:http://duanqz.github.io/2015-07-21-batterystats-part1

大致原理摘錄如下:

一、電量記錄
1. Android在進行電量統計時,並不是采用直接記錄電流消耗量的方式,而是跟蹤硬件模塊在不同狀態下的使用時間,收集一些可用信息,用來近似的計算出電池消耗量。

舉一個例子,假定某個APK的使用了GPS,使用時間用 t 表示。GPS模塊單位時間的耗電量用 w 表示,那么,這個APK使用GPS的耗電量就可以按照如下方式計算:
耗電量 = 單位時間耗電量(w) × 使用時間(t)
frameworks.jar里的frameworks/base/core/res/res/xml/power_profile.xml這個文件,記錄着各個模塊單位時間的耗電量, 由廠商定義。
以下是Nexus 5(hammerhead)耗電參數配置的代碼片段:

<device name="Android"> <!-- All values are in mAh except as noted --> <item name="none">0</item> ... <item name="wifi.on">3.5</item> <item name="wifi.active">73.24</item> <item name="wifi.scan">75.48</item> ... <item name="battery.capacity">2300</item> </device> 
2. Android框架層通過一個名為batterystats的系統服務,實現了電量統計的功能。

收集信息被組織起來,在內存中的數據結構是由BatteryStats類描述的。 為了能夠從不同維度統計耗電量,這個數據結構設計得比較復雜,我們不在這里展開討論,僅通過一個收集應用程序前台運行時間的例子,來說明信息收集過程。
記錄應用程序中所有Activity從顯示狀態(Resumed)到消失狀態(Paused)的時間,就能夠統計應用程序的前台運行時間。Activity狀態的切換是由AMS掌控的,因此AMS需要將Activity的狀態信息通知給batterystats服務。

當Activity要切換到顯示狀態(Resumed)時, 會調用ActivityStackSupervisor.resumeTopActivitiesLocked()方法, 接下來會調用ActivityStack.resumeTopActivityInnerLocked()方法來完成Activity的狀態切換,在完成狀態切換后, 會調用 ActivityStackSupervisor.reportResumedActivityLocked()方法,從這里開始,就開始通報了:“本Activity已經進入了顯示狀態”。 在ActivityStackSupervisor.reportResumedActivityLocked()中得到BatteryStatsImpl對象, 並啟動一個計時器(StopwatchTimer), 記錄下了啟動時間.在Activity pause時, 再得到結束時間, 這樣就得到了應用程序的acitiviy在前台的運行時間了。 

除了應用程序前台運行時間,還有很多信息是batterystats服務關注的,包括WakeLock、Sendor、Wifi、Audio、Video等,這些信息的采集方式與上述過程雷同,都會經過以下步驟:

由相應的模塊發起狀態變更的通知
BatteryStats使用定時器記錄起止時間

二、電量信息的儲存

Android支持歷史電量信息的顯示的,如果重新啟動Android,那內存中的數據就丟失了, 所以需要把這些信息存儲到磁盤上,磁盤上的 /data/system/batterystats.bin 文件中就是電量信息的序列化數據。
batterystats服務啟動時,會從 batterystats.bin 這個文件中讀取數據,來初始化BatteryStats這個數據結構。

三、電量計算

BatteryStatsHelper.refreshStats()承載了電量計算的全部過程,在需要顯示電量統計信息的地方,就可以通過BatteryStatsHelper這個類,來獲取統計完成的電量信息。 Setting.apk就引用了這個類。電量計算大體可以分為兩塊:

1. AppUsage:應用程序耗電量計算,是指每一個應用程序使用硬件模塊所產生的耗電量

在BatteryStatsHelper.processAppUsage()這個方法中,實現了應用程序的電量計算(實際上統計的粒度是uid,不同的apk可以運行在同一個uid)。

2. MiscUsage:其他雜項耗電量計算

所謂雜項,其實就是用戶比較關心的一大類,包括:待機的耗電量、亮屏的耗電量、通話的耗電量、Wifi的耗電量等,這個統計是系統層面的, 作為app的開發人員可以忽略掉這部分內容。

我們來總結一下應用程序的電量計算過程。Android通過一個名為BatteryStats.Uid的數據結構來維護一個應用程序的電量統計信息。 這個數據結構中,又包含很多子結構:

Proc:表示屬於Uid的進程,一個Uid中可能會有多個進程,每個進程都有CPU占用時間
WakeLock:表示Uid持有的WakeLock鎖的電量統計,一個Uid也可能會持有多個鎖
Mobile Radio:表示Uid使用數據流量的電量統計,譬如3G流量、4G流量
Wifi:表示Uid使用wifi的電量統計
Sendor:表示Uid使用傳感器的電量統計
Android提供的dumpsys命令用於查看系統服務的信息, 將batterystats作為參數,就能輸出完整的電量統計信息。

adb shell dumpsys batterystats



參考鏈接:https://www.jianshu.com/p/1cf7c690a4d2

 

 

================================================================================================

 

 

 

准備條件
 

充電100%后再多充30分鍾后開始測試

關掉其他app排除影響

相同屏幕亮度,最大最好

設置屏幕不自動關閉

使用charles 3G網絡限速

每次留bugreport

每次都要重新安裝app(或者清楚數據),保證耗電量從0開始計算

 

無線adb技術
 

安裝adb【各種baidu就行】

確保手機跟電腦都處於同一個網絡

手機插線連着電腦,確保已連接上,使用【adb devices】命令check,是否連接

輸入【adb tcpip 5555】,使用tcpip協議連接手機

 

1.無線連接手機

adb connect 192.168.1.8

 

 

2.清除已有的耗電量數據

adb shell dumpsys batterystats --enable full-wake-history

 

 

3.設備耗電量數據重置

adb shell dumpsys batterystats --reset

 

 

4.尋找包名的uid

adb shell ps |find "com.nuomi"

以下是dos下出來的信息,u0_a445就是uid,需要去除下划線_,  即u0a445

u0_a445   7068  772   1646920 85320 SyS_epoll_ 0000000000 S com.nuomi:installdex
u0_a445   7158  772   1854944 226048 SyS_epoll_ 0000000000 S com.nuomi
u0_a445   7190  772   1663432 89120 SyS_epoll_ 0000000000 S com.nuomi:ultranet
u0_a445   7208  772   1641072 85336 SyS_epoll_ 0000000000 S com.nuomi:remote

 

 

5.確定測試包的名字和uid

adb shell dumpsys batterystats "com.nuomi" |find "u0a445"

 

 

6.然后執行業務場景,結束之后殺進程

 

7.殺完進程后,把耗電量信息傳到電腦該目錄下

adb bugreport>test.txt

 

 

8.等待傳送結束,手機會震動以下,表示數據傳輸到電腦完畢

 

 

9.打開記錄的txt文件,查找耗電量信息,如下圖,1.98mah(毫安時)就是該業務場景的耗電量

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM