电量与应用程序
电能计算公式
电能 = 电压 * 电流 * 时间
对于手机来说电压一般不会改变,所以最终模块耗电情况计算公式为:
模块电量(mAh)= 模块电流(mA) * 模块耗时(h)
Android系统要求不同的厂商必须在/frameworks/base/core/res/res/xml/power_profile.xml 中提供组件的电源配置文件。power_profile.xml文件定义了不同模块的电流消耗值以及该模块在一段时间内大概消耗的电流。
Android系统的电量计算PowerProfile也是通过读取power_frofile.xml的数据,不同的厂商具体数据不太一样,可以通过以下方法获取:
- 从手机中导出/system/framework/framework-res.apk文件
- 使用反编译工具对导出的文件framework-res.apk进行反编译
- 查看power_profile.xml文件在framework-res.反编译目录路径:/res/xml/power_profile.xml。
对于系统的耗电量情况,可以通过dumpsys batterystats导出
adb shell dumpsys batterystats > battery.txt
adb shell dumpsys batterystats --reset
BatteryStatsService是对外的电量统计服务,但具体的统计工作是由BatteryStatsImpl来完成,而BatteryStatsImpl内部使用的就是PowerProfile。BatteryStatsImpl会为每个应用创建一个UID实例来监控应用的系统资源使用情况,统计系统资源包括下面图里的内容。
Android 9.0之后严格的电源管理限制:
什么是耗电优化
- 耗电优化的的第一个方向是优化后台应用的后台耗电
- 耗电优化的第二个方向是符合系统规则,让系统认为你的耗电是正常的
耗电优化的难点
- 缺乏现场,无法复现
- 信息不全,难以定位
- 无法评估结果
耗电优化的方法
浪费电量的主要原因有:
- 某个需求场景强制要求
- 代码bug
相反耗电优化的解决方案就是: - 找到需求场景的替代方案
- 符合Android规则
- 异常情况监控
耗电监控
1、监控内容
- 监控信息
- 现场信息
- 提炼规则
2、如何监控耗电
Java Hook
Hook方案的好处是使用者接入非常简单,不需要修改自己的代码。通过Hook我们可以在申请资源的时候将堆栈信息保存起来,当我们触发某个规则上报问题时候,可以将收集到的堆栈信息、电池是否充电、CPU信息、应用前后台时间等辅助信息一起带上
插桩
虽然使用Hook非常简单,但是某些规则可能不太容易找打合适的Hook点,而且Android P之后,很多的Hook点都不支持了。Facebook也有一个耗电监控的开源库Battery-Metrics,它监控的数据非常全,包括Alarm、WakeLock、Camera、CPU、Network等。而且也有收集电量充电状态、电量水平等信息。
插桩方案使用起来兼容性非常好,并且使用者也没有太大的接入成本,但是它并不是完美无缺的,对于系统的代码插桩方案是无法替换的。
网友评论