软硬件耗电量计算
软硬件的耗电量在BatteryStatsHelper.java
中的两个方法中实现
- processAppUsage 软件APP耗电量
- processMiscUsage 硬件耗电量
还是在线网站http://androidxref.com/上对Android版本6.0.1_r10源码进行分析
具体位置在 /frameworks/base/core/java/com/android/internal/os/BatteryStatsHelper.java
本篇大部分来自 https://blog.csdn.net/FightFightFight/article/details/82694381
APP八大耗电模块
八大模块的耗电计算器
计算项 | Class文件 |
---|---|
CPU功耗 | mCpuPowerCalculator.java |
Wakelock功耗 | mWakelockPowerCalculator.java |
无线电功耗 | mMobileRadioPowerCalculator.java |
WIFI功耗 | mWifiPowerCalculator.java |
蓝牙功耗 | mBluetoothPowerCalculator.java |
Sensor功耗 | mSensorPowerCalculator.java |
相机功耗 | mCameraPowerCalculator.java |
闪光灯功耗 | mFlashlightPowerCalculator.java |
硬件耗电模块
硬件功耗的子项分为7项
功耗项 | 解释 |
---|---|
UserUsage | 用户功耗 |
PhoneUsage | 通话功耗 |
ScreenUsage | 屏幕功耗 |
WiFiUsage | Wifi功耗 |
BluetoothUsage | 蓝牙消耗 |
IdleUsage | CPU Idle功耗 |
RadioUsage | 移动无线功耗 |
processAppUsage方法
该方法用来统计软件耗电量,在进行统计时,以uid为单位进行统计,Android中的uid是应用安装时由系统分配的,每个应用对应一个uid,背后也涉及了Android的安全机制。咱们也可以通过清单文件 AndroidManifest.xml
中的shareUserId
指定两个应用的uid相同,用来共享部分数据信息
例如这里就是跟系统同一个uid,即设置为系统应用
对于每个uid,也就是我们的一个APP,都会对应一个BatterySipper
对象,APP计算得到的耗电数据会存储到BatterySipper
对象中
跟进方法查看
是否统计所有用户使用的APP,默认为false
电池对应类型的真实运行时间
该值在refreshStats
方法中已经赋值
系统耗电量
获取所有应用APP uid并遍历,实例化BatterySipper
对象,存储电量的统计信息
BatterySipper.DrainType.APP
表示统计类型为应用耗电
软件的耗电归根结底还是使用硬件导致的,比如说屏幕,WIFI,CPU等等,所以接下来就是统计APP对应使用的八大硬件的耗电量
APP总耗电量
如果统计电量大于零或者为ROOT用户,进入if语句
如果当前进程为WIFI,WIFI uid为1010,则添加到统计wifi耗电量的列表List<BatterySipper>
中
蓝牙添加到蓝牙列表中 uid为1002
当不为多用户并且该userId没有对应的用户时,添加到其他用户中
app耗电都添加到mUsageList
中
如果是root进程,也就是操作系统的耗电量,则设置为osSipper
当然计算并不一定准确,设备真实的唤醒时间可能比屏幕打开时间和应用程序唤醒时间更长,所以如果还剩下没有分配的电量消耗,将其分配给操作系统
APP对于八大硬件耗电计算
接下来详细分析APP对于八大硬件的耗电量计算
(算了,直接看这篇吧,这部分我暂时还用不到 http://gityuan.com/2016/01/10/power_rank/
1 CPU
2 Wakelock
3 WIFI
4 BlueTooth
5 Camera
6 Flashlight
7 MobileRadio
8 Sensor
processMiscUsage方法
processMiscUsage()
方法来统计硬件耗电量
计算用户耗电量
具体实现如下,将UserSippers中的功耗都合入bs
aggregateSippers
方法实现如下
累加所有通话耗电情况,统计到DrainType.PHONE
类型的BatterySipper
中
具体实现为
累加所有亮屏的耗电情况,统计到DrainType.SEREEN
类型的BatterySipper
中
WIFI耗电量,硬件功耗类型为DrainType.WIFI
BlueTooth蓝牙耗电量 DrainTyep.BLUETOOTH
类型
CPU IDLE耗电量,类型为DrainType.IDLE
如果不是仅WIFI设备(比如平板就只有WIFI),咱们还需要计算流量消耗
软硬件功耗项对比
功耗项 | 软件榜 | 硬件榜 |
---|---|---|
CPU | √ | √ |
无线电 | √ | √ |
WIFI | √ | √ |
蓝牙 | √ | √ |
Wakelock | √ | - |
Sensor | √ | - |
相机 | √ | - |
闪光灯 | √ | - |
通话 | - | √ |
屏幕 | - | √ |
用户 | - | √ |
参考链接
- 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/17051841.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