- 系统功耗跟踪
- 功耗分析
- doze模式一直处于关闭状态
- doze模式开启状态
- 功耗优化
- 参考
系统功耗跟踪
- 使用方法,搜集日志
adb shell dumpsys batterystats --reset
// 运行...
adb bugreport bugreport.zip
- 1
- 2
- 3
- 导入Battery Historian分析
采集时间从前一天晚上十点到当天早上十点,总共12个小时,手机禁止放置,灭屏状态
参数名 | 作用 |
CPU running | CPU的运行状态,是否被唤醒。如果把鼠标放到上面去,还能看到更多的信息,如CPU唤醒的原因。 |
Screen | 亮屏状态,可以看到图表中该项着色有间隔,这是因为实验期间我关闭过屏幕,每关闭一次屏幕,着色就被打断。 |
Top app | 当前最上层的app |
Mobile network type | 网络类型,其中需要注意的是,“免费网络可能包括wifi、蓝牙网络共享、USB网络共享” |
Mobile radio active | 移动蜂窝信号 BP侧耗电,通常是指SIM卡,数据链接。该栏过多着色,间隔多。表示功耗也会高。 |
WiFi supplicant | wifi是否开启 |
WiFi signal strength | wifi强度 |
Wifi Running | wifi连接情况下的耗电情况 |
Audio | 音频是否开启 |
Battery Level | 电量 |
Plugged | 是否正在充电,以及鼠标放在上面的时候可以看到充电类型,包括AC(充电器)、USB、其它(例如无线充电) |
Battery Level | 开始测试时的电量,之前抓取的图可以看到电量是100,满电状态。 |
Top app | 前台应用,如果要分析应用的耗电情况,那么在测试期间,就该保证应用一直处于前台。 |
Userspace wakelock | 记录wake_lock模块的工作时间 |
功耗分析
doze模式一直处于关闭状态
- wakelock
可以看出 wakelock的使用,系统被频繁唤起并持有wakelock的前五项如下(按使用时间排序)
统计数据如下
Ranking | Name | Uid | Duration / Hr | Count / Hr Minimum | Total Duration | Total Count |
0 | com.ume.browser : DroiPushService_V2 | 10031 | 1m26s742ms | 11.63 | 18m54.015s | 152 |
1 | ANDROID_SYSTEM : alarm | 1000 | 1s851ms | 14.69 | 24.203s | 192 |
2 | com.asksven.betterbatterystats : BBS_WAKELOCK_WHILE_SAVING_REF | 10102 | 340ms | 0.08 | 4.446s | 1 |
3 | ANDROID_SYSTEM : IpReachabilityMonitor.wlan0 | 1000 | 268ms | 0.08 | 3.506s | 1 |
4 | com.ss.android.article.news : job/com.ss.android.account.AccountProvider/com.ss.android.article.news/今日头条:android | 10096 | 132ms | 3.75 | 1.73s | 49 |
其中com.ume.browser : DroiPushService_V2唤醒时间最长达18min
- JobScheduler
doze模式开启状态
在低电耗模式下,您的应用会受到以下限制:
- wakelock
- JobScheduler
doze模式下所有的wakelock会被忽略,网络暂停,alarm会被推迟到下一个maintenance window,job被禁止
只会在maintenance window期间才会使用网络和执行挂起的任务
功耗优化
从上面的图中可以看出影响手机功耗的主要是wakelock,JobScheduler,alarm,GPS,wifi等,针对这些情况功耗优化可以从以下几个方面入手
- 使能doze模式(需要motion sensor支持,doze第一阶段不需要motion sensor),在手机处于完全禁止待机的时候,doze模式对手机的功耗很有帮助,doze模式下会影响全局的wakelock,alarm,job,网络等
- 将有限制条件出发的service更换为JobScheduler,因为在创建JobScheduler时可以设置相应的触发条件才执行(比如条件 需要连网状态、需要充电状态),触发条件交由系统来管理
- wakelock.acquice()方法最好带超时参数,因为有些网络请求很慢导致系统一直持续wake状态
- 监听电池电量和充电状态来决定后台更新
- 监测联网状态,重复闹铃和后台服务的一些最常见用途是安排定期从互联网资源、缓存数据更新应用数据,或者执行长时间下载,如果监测到没有网络连接就不要唤醒设备
- 对于流氓软件频繁后台唤醒可以采用心跳对齐(alarm)