耗电优化

2019-09-30  本文已影响0人  修塔寻千里

电量与应用程序

电能计算公式

电能 = 电压 * 电流 * 时间

对于手机来说电压一般不会改变,所以最终模块耗电情况计算公式为:

模块电量(mAh)= 模块电流(mA) * 模块耗时(h)

Android系统要求不同的厂商必须在/frameworks/base/core/res/res/xml/power_profile.xml 中提供组件的电源配置文件。power_profile.xml文件定义了不同模块的电流消耗值以及该模块在一段时间内大概消耗的电流。



Android系统的电量计算PowerProfile也是通过读取power_frofile.xml的数据,不同的厂商具体数据不太一样,可以通过以下方法获取:

adb shell dumpsys batterystats > battery.txt

adb shell dumpsys batterystats --reset

BatteryStatsService是对外的电量统计服务,但具体的统计工作是由BatteryStatsImpl来完成,而BatteryStatsImpl内部使用的就是PowerProfile。BatteryStatsImpl会为每个应用创建一个UID实例来监控应用的系统资源使用情况,统计系统资源包括下面图里的内容。



Android 9.0之后严格的电源管理限制:


什么是耗电优化

耗电优化的难点

耗电优化的方法

浪费电量的主要原因有:

耗电监控

1、监控内容

2、如何监控耗电

Java Hook

Hook方案的好处是使用者接入非常简单,不需要修改自己的代码。通过Hook我们可以在申请资源的时候将堆栈信息保存起来,当我们触发某个规则上报问题时候,可以将收集到的堆栈信息、电池是否充电、CPU信息、应用前后台时间等辅助信息一起带上

插桩

虽然使用Hook非常简单,但是某些规则可能不太容易找打合适的Hook点,而且Android P之后,很多的Hook点都不支持了。Facebook也有一个耗电监控的开源库Battery-Metrics,它监控的数据非常全,包括Alarm、WakeLock、Camera、CPU、Network等。而且也有收集电量充电状态、电量水平等信息。
插桩方案使用起来兼容性非常好,并且使用者也没有太大的接入成本,但是它并不是完美无缺的,对于系统的代码插桩方案是无法替换的。

上一篇 下一篇

猜你喜欢

热点阅读