日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

深入浅出Android App耗电量统计

發(fā)布時(shí)間:2025/4/16 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出Android App耗电量统计 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文出處:http://www.cnblogs.com/hyddd/p/4402621.html

在Android統(tǒng)計(jì)App耗電量比較麻煩,直至Android 4.4,它仍沒公開“電量統(tǒng)計(jì)”API或文檔……額,是的,僅沒有公開,并不是沒有。平時(shí)在手機(jī)“設(shè)置- 電量”看到的數(shù)據(jù)

?? ?

?就是系統(tǒng)調(diào)用內(nèi)部API的統(tǒng)計(jì)結(jié)果。

基礎(chǔ)概念

手機(jī)由眾多“部件”組成,所謂“部件”是指:CPU,WIFI,GPS....所以,Android?App消耗總電量為 App運(yùn)行過程中,涉及各部件的消耗電量的總和。
假設(shè)運(yùn)行App導(dǎo)致CPU運(yùn)行,時(shí)間:t,CPU單位時(shí)間消耗電量:w,則App的CPU耗電量為:W = w*t,而有物理公式 W = U*I*t(U:電壓值,I:電流值),在手機(jī)中,一般U恒定不變,所以,可以單獨(dú)通過 Q(電容量,單位: mAh)= I * t 表示電量 ? 系統(tǒng)源碼分析

????核心源碼/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java

????核心類

  • BatteryStatsImpl:提供App各部件運(yùn)行時(shí)間
  • PowerProfile:提供部件電流數(shù)值

????問題

  • Android怎樣存儲(chǔ)與讀取App耗電量信息(即:BatteryStatsImpl數(shù)據(jù)怎么來的?)
  • Android怎么存儲(chǔ)部件電流數(shù)值(即:PowerProfile數(shù)據(jù)怎么來的?)
  • Android具體耗電量計(jì)算方法

????1. Android怎樣存儲(chǔ)與讀取App耗電量信息

??????? (1)先看下PowerUsageSummary.java如何獲取BatteryStatsImpl?

??????? ?

?????? ?

?????? ?

??????? 可見 BatteryStatsImpl 通過 系統(tǒng)服務(wù)“batteryinfo”獲得。

??????? (2)系統(tǒng)服務(wù)“batteryinfo”是什么玩意呢?(見:BatteryStatsService.java

?????? ?

??????? 系統(tǒng)服務(wù)“batteryinfo”其實(shí)就是BatteryStatsService,而BatteryStatsService“唯一的”構(gòu)造函數(shù)提供了一個(gè)很重要的信息:filename!

??????? (3)BatteryStatsService在哪里創(chuàng)建?filename是什么?(見:ActivityManagerService.java

?????? ?

??????? filename文件是:/data/system/batterystats.bin,關(guān)于batterystats.bin,之前民間很多文章說它用作電池校正,但Android工程師Dianne Hackborn在google+上明確:

?????? ?

??????? betterystats.bin文件僅僅是一個(gè)記錄不同app使用電量的一個(gè)文件。

??????? (4)再看看 BatteryStatsImpl(String filename) 構(gòu)造函數(shù)(見:BatteryStatsImpl.java

?????? ?

??????? 這里只做了些基本的初始化。真正載入betterystats.bin數(shù)據(jù)是在(ActivityManagerService.java)mBatteryStatsService.getActiveStatistics().readLocked();

?????? ?

?????? ?

??????? 至此,Android怎樣存儲(chǔ)與讀取App耗電量信息分析結(jié)束。

??????? 總結(jié):

  • ActivityManagerService 創(chuàng)建并初始化 BatteryStatsService,并傳入耗電量記錄文件batterystats.bin
  • BatteryStatsService 在內(nèi)部創(chuàng)建 BatteryStatsImpl 實(shí)例,并傳入耗電記錄文件batterystats.bin
  • ActivityManagerService 執(zhí)行 mBatteryStatsService.getActiveStatistics().readLocked();導(dǎo)致 BatteryStatsService 的 BatteryStatsImpl 加載batterystats.bin數(shù)據(jù)
  • 在PowerUsageSummary計(jì)算App耗電量時(shí),PowerUsageSummary從BatteryStatsService 中獲取BatteryStatsImpl 實(shí)例,從而獲得App的相關(guān)數(shù)據(jù)

????2. Android怎么存儲(chǔ)部件電流數(shù)值

??????? (1)比較簡單,見?PowerProfile.java

?????? ?

??????? PowerProfile讀取資源 com.android.internal.R.xml.power_profile,并把數(shù)據(jù)加載到sPowerMap。

??????? (2)com.android.internal.R.xml.power_profile在哪里?

??????? 在官方文檔《Power Profiles for Android》明確了power_profile.xml位置:device///frameworks/base/core/res/res/xml/power_profile.xml。

??????? 下面是一個(gè)samsung的power_profile.xml

?????? ?

??????? 字段含義見《Power Profiles for Android》。

??????? (3)每個(gè)OEM廠商有自己獨(dú)立的power_profile.xml配置

??????? 官方文檔表明:OEM廠商應(yīng)該有自己的power_profile.xml,因?yàn)椴考?#xff08;如:cpu, wifi…)耗電量應(yīng)與具體硬件相關(guān),這個(gè)只有OEM廠商清楚……

?????? ?

??????? (4)PowerProfile關(guān)鍵API:

  • public double getAveragePower(String type):返回type的電流值(mA),type表示power_profile.xml中的某關(guān)鍵字(如:gps.on)
  • public double getAveragePower(String type, int level) :返回type的電流值(mA),level表示xml中array的第幾個(gè)value

??????? 至此,Android怎么存儲(chǔ)部件電流數(shù)值分析結(jié)束。

??????? 總結(jié):

??????? (1)Android部件電流信息存于:power_profile.xml

??????? (2)每個(gè)OEM廠商有私有power_profile.xml

??????? (2)PowerProfile讀取power_profile.xml,并提供API訪問部件電流數(shù)值。

?

????3. Android具體耗電量計(jì)算方法

??????? App耗電量統(tǒng)計(jì):processAppUsage()??

??????? 硬件耗電量統(tǒng)計(jì):processMiscUsage()

?

????????processAppUsage()分析

????????????【1】processAppUsage耗電量統(tǒng)計(jì)的 時(shí)間段 是?

?????????? ?

?????????? ?

??????????? 關(guān)于統(tǒng)計(jì)的 時(shí)間段,BatteryStats有4個(gè)選項(xiàng):

?????????? ?

??????????? 可見,processAppUsage 是 上一次拔掉設(shè)備后 ~ 至今 的App耗電量統(tǒng)計(jì)。

??????????

????????????【2】processAppUsage 的統(tǒng)計(jì)對象真的是App?

?????????? ?

??????????? 具體的 統(tǒng)計(jì)流程 都在for循環(huán)里,額……所以processAppUsage真實(shí)統(tǒng)計(jì)粒度是Uid。

??????????? Uid與App關(guān)系:2個(gè)App簽名和sharedUserId相同,則在運(yùn)行時(shí),他們擁有相同Uid。就是說processAppUsage統(tǒng)計(jì)的可能是多個(gè)App的耗電量數(shù)據(jù),對于普通App,出現(xiàn)這種情況的幾率較少,而對于Android系統(tǒng)應(yīng)用則較為常見。

?

????????????【3】耗電量計(jì)算公式 - 部分1:計(jì)算Uid屬下每個(gè)Process的耗電量數(shù)據(jù),并求和。

??????????? Uid_Power1 = (Process1_Power + … + ProcessN_Power);

??????????? Process_Power = (CPUSpeed_Time * POWER_CPU_ACTIVE);

????????????

?

????????????【4】耗電量計(jì)算公式 - 部分2:計(jì)算Uid的wake lock耗電量

??????????? 這里,Android只計(jì)算了partial wake lock的耗電量。

?????????? ?Uid_Power2 = PartialWakeLock_Time * POWER_CPU_WAKE

????????????

?

????????????【5】耗電量計(jì)算公式 - 部分3:計(jì)算Uid的數(shù)據(jù)流量(data traffic)耗電量

??????????? Uid_Power3 = ( tcpBytesReceived + tcpBytesSent ) * averageCostPerByte

?????????? ?

?????????? ?

?

????????????【6】耗電量計(jì)算公式 - 部分4:計(jì)算Uid WIFI耗電量。

?????????? ?Uid_Power4 = wifiRunningTimeMs * POWER_WIFI_ON

?????????? ?

?

????????????【7】耗電量計(jì)算公式 - 部分5:計(jì)算Uid其他傳感器耗電量。

?????????? ?Uid_Power5 = (Sensor1_Power + … + SensorN_Power)

?????????? ?Sensor_Power = Sensor_Time * Power_Sensor

?

??????????? 至此,App耗電量計(jì)算方法分析結(jié)束。硬件耗電量統(tǒng)計(jì)(processMiscUsage())亦類似。

????????????總結(jié)App耗電量計(jì)算公式:

??????????????? Uid_Power(App耗電量,單位:mAh) = Uid_Power1 + Uid_Power2 + Uid_Power3 + Uid_Power4 + Uid_Power5

??????????????????? Uid_Power1 = (Process1_Power + … + ProcessN_Power);

??????????????????????? - Process_Power = (CPUSpeed_Time * POWER_CPU_ACTIVE);

??????????????????? Uid_Power2 = PartialWakeLock_Time * POWER_CPU_WAKE??????????????

??????????????????? Uid_Power3 = ( tcpBytesReceived + tcpBytesSent ) * averageCostPerByte

??????????????????? Uid_Power4 = wifiRunningTimeMs * POWER_WIFI_ON

??????????????????? Uid_Power5 = (Sensor1_Power + … + SensorN_Power)

??????????????????????? - Sensor_Power = Sensor_Time * Power_Sensor

? ??????????? 說這么多,來一發(fā)……不,來一個(gè)統(tǒng)計(jì)耗電量的App吧,其實(shí),之前已有人把這段Android系統(tǒng)代碼摳出來,做了一個(gè)App,可以到?這里下載。
? ? ? ? ? ? 有一個(gè)好消息是:android5.0后,獲取電量數(shù)據(jù)不用這么痛苦了,dumpsys?batterystats數(shù)據(jù)中。包含:Estimated power use (mAh):,下面就是每個(gè)uid的耗電量,只要把a(bǔ)pp下所有uid耗電量加起來即可!
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的深入浅出Android App耗电量统计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。