BatteryStatsHelper.java源码分析
在分析PowerUsageSummary
的时候,其实可以发现主要获取应用和服务电量使用情况的实现是在BatteryStatsHelper.java
中
还是在线网站http://androidxref.com/上对Android版本6.0.1_r10源码进行分析
具体位置在 /frameworks/base/core/java/com/android/internal/os/BatteryStatsHelper.java
create方法
查看构造方法
设置是否需要注册BATTERY_CHANGED
驻留广播,该广播监听系统电池电量和充电状态
设备是否只有wifi,无移动网络,比如说平板或者车机,有的就是不能插SIM卡的
查看create方法
其中都获取了PowerProfile对象
PowerProfile创建
持续跟进
可以看到这里有一段注释: Read the XML file for the given profile (normally only one perdevice
跟进readPowerValuesFromXml
方法,其实这个方法就是用来解析power_profile.xml
文件的,该文件在源码中的位置为 /frameworks/base/core/res/res/xml/power_profile.xml
,power_profile.xml
是一个可配置的功耗数据文件
在这里需要提一下Android中对于应用和硬件的耗电量计算方式:
有一张“价格表”,记录每种硬件1秒钟耗多少电。有一张“购物清单”,记录apk使用了哪几种硬件,每种硬件用了多长时间。假设某个应用累计使用了60秒的cpu,cpu1秒钟耗1mAh,那这个应用就消耗了60mAh的电
这里的价格表就是我们找到的power_profile.xml
文件,手机的硬件是各不相同的,所以每一款手机都会有一张自己的"价格表",这张表的准确性由手机厂商负责。
这也是为什么我们碰到读取xml文件的时候注释里面会有normally only one perdevice
如果我们想要看自己手机的power_profile.xml文件咋办,它会存储在手机的/system/framework/framework-res.apk
路径中,我们可以将它pull出来,通过反编译的手法获得power_profile.xml
文件
refreshStats方法
接着可以看到重载的refreshStats
refreshStats
是刷新电池使用数据的接口,向上提供数据,其中的具体实现在
我们依次分析
SparseArray<UserHandle> asUsers
UserHanler代表设备上的一个用户long rawRealtimeUs
系统开机后的运行时间long rawUptimeUs
系统不包括休眠的运行时间
初始化Stats操作
如果mStats为空,则初始化
刷新耗电量之前需要先清空之前的数据,clear都是清空操作
初始化八大模块的耗电计算器,都继承于PowerCalculator
抽象类,八大模块在processAppUsage
方法中进行分析,这里只需要知道有哪八个以及进行的操作是初始化即可
计算项 | Class文件 |
---|---|
CPU功耗 | mCpuPowerCalculator.java |
Wakelock功耗 | mWakelockPowerCalculator.java |
无线电功耗 | mMobileRadioPowerCalculator.java |
WIFI功耗 | mWifiPowerCalculator.java |
蓝牙功耗 | mBluetoothPowerCalculator.java |
Sensor功耗 | mSensorPowerCalculator.java |
相机功耗 | mCameraPowerCalculator.java |
闪光灯功耗 | mFlashlightPowerCalculator.java |
电量统计需要先设置统计时间段,通过设置统计类型mStatsType变量来表示
有三种可选值
当前系统的运行时间
当前系统的真实运行时间,包括休眠时间
剩下的也是一堆时间
DEBUG模式下会输出时间日志,这不重要
计算最低和最高的电量近似值
该方法待会详细说明,现在我们只需要知道它主要进行统计APP软件的耗电量操作,统计之后会将每种类型,每个UID的耗电值存储在对应的BatterySipper
中
对每个应用程序的每毫秒ms接收和发送的数据包mobilemspp
进行排序
对mMobilemsppList
进行排序
计算硬件的耗电量,跟前面的processAppUsage(asUsers);
对应,这两个方法我们都后面再说
对软硬件耗电量结果进行降序排序
获取最大耗电量
因为我们刚才进行了排序,所以耗电最多的硬件/软件正位于顶部,赋值mMaxRealPower
最大真实耗电量
遍历usageList
计算得到mComputedPower
耗电量总和
如果存在未计算到的耗电量,实例化一个DrainType.UNACCOUNTED
类型的BatterySipper
进行存储,并添加到mUsageList
中
如果存在计算多了的耗电量,实例化一个DrainType.OVERCOUNTED
类型的BatterySipper
进行存储,并添加到mUsageList
中
这篇已经太长了,关于软硬件的耗电量计算就在另外一篇里面写吧
参考链接
- https://blog.csdn.net/FightFightFight/article/details/82694381
- http://gityuan.com/2016/01/10/power_rank/
- https://duanqz.github.io/2015-07-21-batterystats-part1
- http://androidxref.com/6.0.1_r10/xref//frameworks/base/core/java/com/android/internal/os/BatteryStatsHelper.java
END
建了一个微信的安全交流群,欢迎添加我微信备注进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注 😃
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/17051836.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-01-14 VScode配置markdown自定义代码模板
2022-01-14 CodeQL简介及其windows下环境安装
2020-01-14 [BUUCTF 2018]Online Tool