[Android] 深入浅出Android App耗电量统计
reference to : http://www.cnblogs.com/hyddd/p/4402621.html
前言
在Android统计App耗电量比较麻烦,直至Android 4.4,它仍没公开“电量统计”API或文档……额,是的,仅没有公开,并不是没有。平时在手机“设置- 电量”看到的数据
就是系统调用内部API的统计结果。
基础概念
核心源码:/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java
核心类:
- BatteryStatsImpl:提供App各部件运行时间。
- PowerProfile:提供部件电流数值。
问题:
- Android怎样存储与读取App耗电量信息(即:BatteryStatsImpl数据怎么来的?)
- Android怎么存储部件电流数值(即:PowerProfile数据怎么来的?)
- Android具体耗电量计算方法
(1)先看下PowerUsageSummary.java如何获取BatteryStatsImpl?
可见 BatteryStatsImpl 通过 系统服务“batteryinfo”获得。
(2)系统服务“batteryinfo”是什么玩意呢?(见:BatteryStatsService.java)
系统服务“batteryinfo”其实就是BatteryStatsService,而BatteryStatsService“唯一的”构造函数提供了一个很重要的信息:filename!
(3)BatteryStatsService在哪里创建?filename是什么?(见:ActivityManagerService.java)
filename文件是:/data/system/batterystats.bin,关于batterystats.bin,之前民间很多文章说它用作电池校正,但Android工程师Dianne Hackborn在google+上明确:
betterystats.bin文件仅仅是一个记录不同app使用电量的一个文件。
(4)再看看 BatteryStatsImpl(String filename) 构造函数(见:BatteryStatsImpl.java)
这里只做了些基本的初始化。真正载入betterystats.bin数据是在 (ActivityManagerService.java)mBatteryStatsService.getActiveStatistics().readLocked();
至此,Android怎样存储与读取App耗电量信息分析结束。
总结:
(1)ActivityManagerService 创建并初始化 BatteryStatsService,并传入耗电量记录文件batterystats.bin;
(2)BatteryStatsService 在内部创建 BatteryStatsImpl 实例,并传入耗电量记录文件batterystats.bin;
(3)ActivityManagerService 执行 mBatteryStatsService.getActiveStatistics().readLocked();导致 BatteryStatsService 的 BatteryStatsImpl 加载batterystats.bin数据;
(4)在PowerUsageSummary计算App耗电量时,PowerUsageSummary从BatteryStatsService 中获取BatteryStatsImpl 实例,从而获得App的相关数据。
2. Android怎么存储部件电流数值
(1)比较简单,见 PowerProfile.java
PowerProfile读取资源 com.android.internal.R.xml.power_profile,并把数据加载到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。
下面是一个samsung的power_profile.xml:
字段含义见《Power Profiles for Android》。
(3)每个OEM厂商有自己独立的power_profile.xml配置
官方文档表明:OEM厂商应该有自己的power_profile.xml,因为部件(如:cpu, wifi…)耗电量应与具体硬件相关,这个只有OEM厂商清楚……
(4)PowerProfile关键API:
- public double getAveragePower(String type):返回type的电流值(mA),type表示power_profile.xml中的某关键字(如:gps.on)。
- public double getAveragePower(String type, int level) :返回type的电流值(mA),level表示xml中array的第几个value。
至此,Android怎么存储部件电流数值分析结束。
总结:
(1)Android部件电流信息存于:power_profile.xml
(2)每个OEM厂商有私有power_profile.xml
(2)PowerProfile读取power_profile.xml,并提供API访问部件电流数值。
3. Android具体耗电量计算方法
App耗电量统计:processAppUsage()
硬件耗电量统计:processMiscUsage()
processAppUsage()分析
【1】processAppUsage耗电量统计的 时间段 是?
关于统计的 时间段,BatteryStats有4个选项:
可见,processAppUsage 是 上一次拔掉设备后 ~ 至今 的App耗电量统计。
【2】processAppUsage 的统计对象真的是App?
具体的 统计流程 都在for循环里,额……所以processAppUsage真实统计粒度是Uid。
Uid与App关系:2个App签名和sharedUserId相同,则在运行时,他们拥有相同Uid。就是说processAppUsage统计的可能 是多个App的耗电量数据,对于普通App,出现这种情况的几率较少,而对于Android系统应用则较为常见。
【3】耗电量计算公式 - 部分1:计算Uid属下每个Process的耗电量数据,并求和。
Uid_Power1 = (Process1_Power + … + ProcessN_Power);
Process_Power = (CPUSpeed_Time * POWER_CPU_ACTIVE);
【4】耗电量计算公式 - 部分2:计算Uid的wake lock耗电量
这里,Android只计算了partial wake lock的耗电量。
Uid_Power2 = PartialWakeLock_Time * POWER_CPU_WAKE
【5】耗电量计算公式 - 部分3:计算Uid的数据流量(data traffic)耗电量
Uid_Power3 = ( tcpBytesReceived + tcpBytesSent ) * averageCostPerByte
【6】耗电量计算公式 - 部分4:计算Uid WIFI耗电量。
Uid_Power4 = wifiRunningTimeMs * POWER_WIFI_ON
【7】耗电量计算公式 - 部分5:计算Uid其他传感器耗电量。
Uid_Power5 = (Sensor1_Power + … + SensorN_Power)
Sensor_Power = Sensor_Time * Power_Sensor
至此,App耗电量计算方法分析结束。硬件耗电量统计(processMiscUsage())亦类似。
总结App耗电量计算公式:
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
[Android] 深入浅出Android App耗电量统计的更多相关文章
- 深入浅出Android App耗电量统计
前言 在Android统计App耗电量比较麻烦,直至Android 4.4,它仍没公开“电量统计”API或文档……额,是的,仅没有公开,并不是没有.平时在手机“设置- 电量”看到的数据 就是系统调用内 ...
- Android性能专项测试之耗电量统计API
版权声明:本文为Doctorq原创文章,未经博主允许不得转载. https://blog.csdn.net/qhshiniba/article/details/49155979 参考文章:Androi ...
- Android 深入浅出 - Android系统启动过程
Activity的类继承关系及跟踪Activity的启动 Android系统启动过程 https://study.163.com/course/courseLearn.htm?courseId=213 ...
- android app 流量统计
https://blog.csdn.net/yzy9508/article/details/48300265 | android 数据流量统计 - CSDN博客https://blog.csdn.ne ...
- Android应用耗电量统计,无需USB连接
Android应用耗电量统计一直是一个很头疼的问题,手工统计耗时太长,自动化统计又不是非常精准(执行自动化代码需要通过USB连接,而USB又会充电,这就造成统计数据不准).后来从前辈那里得知可以通过a ...
- 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...
- 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)
2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...
- 转: Android 后台任务型App多进程架构演化
评注:android 后台分进程保活方式的实践 Android 后台任务型App多进程架构演化 字数1621 阅读2790 评论8 喜欢35 什么是后台任务型app 类似音乐.录音机,需要用户长时间在 ...
- Android应用发布后的统计——百度移动统计的应用
一个App发布到各个渠道之后,我们需要采集不同渠道的一些信息,比如app在运行过程中产生的一些异常信息,app在各个android版本的分布,以及各个app版本的分布,各渠道的用户数,用户忠诚度等等信 ...
随机推荐
- maven项目如何使用jetty启动?
1.在pom.xml文件中插入下面的片段 <build> <plugins> <plugin> <groupId>org.eclipse.jetty&l ...
- PL/sql developer连接数据库的问题以及oracle数据库中文乱码的问题
今天第二次配置PL/sql developer,表示很蛋疼,昨天因为动了一个东西然后莫名其妙的就再也连接不了数据库,总是显示各种错误,我动的东西是因为中文会显示乱码,(因为我是用32位的PL/sql ...
- BZOJ3052——糖果公园
0.题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3052 1.题目大意:给定一颗n个点的无根树,每个点有一个颜色,要进行q次操作,有两种操 ...
- [RouterOS] ROS对接碧海威或PA等流控实现完美流控详细教程(附脚本全免费)
前言: 经常在群里看到不少朋友争论海蜘蛛 ROS 维盟 爱快 碧海威 流控大师 Woyos等等软路由,哪个好.实际上,网络产品是复杂的,现在的软路由功能上已经远远不是单独的路由了.每种产品都有他本身的 ...
- Python自动化之IO多路复用
单线程.多线程和异步对比图 灰色的是阻塞 IO多路复用 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心 ...
- 17.5---珠玑妙算,四个槽,红色黄色绿色蓝色(CC150)
思路:注意一下,找猜中的时候什么都不用做,直接统计,找伪猜中也是先不管,然后再把结果减去猜中即可. public static int[] calcResult(String a, String b) ...
- PyQt4自定义事件
listview控件与updateText 相关联 self.listview.updateText.connect(self.viewlist) updateText = QtCore.pyqt ...
- 在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...
- VIM基础
http://www.cnblogs.com/wawlian/archive/2012/05/22/2512801.html http://www.cnblogs.com/wawlian/archiv ...
- ios UIWindow 错误使用导致无法接收motionEnded(摇一摇)函数
今天遇到一个问题,第一次运行程序时,- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event函数无法调用,第二次就好了 ...