后台耗电分析
一. 概述
为了在待机模式下,减少过多的电量消耗,影响手机的续航时间,进入华为app白名单。
二. Android模块耗电项
系统耗电统计:
path: com.android.internal.os.BatteryStatsHelper#processAppUsage
image.png
由此可以看出以下是耗电大头:
(1) 显示器(led&lcd)
(2) 网络(数据+wifi)
(3) CPU
其次:音频、蓝牙
三. 分析方法及检测工具
1.Battery Historian--Android系统耗电检测分析工具
*Battery Historian可以展示手机耗电的一段时间的过程。
(1) 环境配置步骤:
配置Python、go环境。
下载Battery Historian。
(2) 工具使用及数据获取:
adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats –reset
adb bugreport > bugreport.txt
go run cmd/battery-historian/battery-historian.go
浏览器输入:http://localhost:9999/ 添加刚才的文件,最后submit,如下图:
image.png
(3)关键指标说明:
Cup runing:Cpu是否运行
Wifi runing:WiFi是否运行
Wifi Radio:是否WiFi数据传输
Wifi Scan:WiFi是否扫描
Screen:是否开启屏幕
Network connectivity:网络连接状态
Activity manager proc:活跃的进程
Wifi signal strength:Wifi信号强度
Charging on:是否充电
Battery level:电量
Mobile network type:移动网络类型
Mobile signal strength:移动信号强度
2.TraceView-性能分析工具
(1) trace 获取3种方式
#DDMS-start Method Profiler
#Android Profiler—cpu栏,dump
#Debug.startMethodTracing(“tra.trace”)/stopMethodTracing()-(adb pull sdcard/tra.trace)
(2)工具介绍
image.pngTraceView分为两部分:
线程时间片面板(时间和线程)
分析面板(具体方法消耗)
分析面板函数说明:
Parents:调用该方法的方法
Children:被该方法调用的方法
(3) 关注指标:
Calls+Recur Calls/Total:方法调用次数+递归调用次数
Cpu Time/Call:方法每次调用cpu的耗时
(4) 具体分析方法:
*分析色块:同一个函数颜色一样,频繁出现一样的色块可能会问题。
*分析函数调用次数:Calls+Recur Calls/Total和Cpu Time/Call 函数频繁递归调用可能会有问题。
image.png
3. dmTraceDump
(1)生成分析文件的HTML-列出函数调用信息
/Users/zhouwen/Library/Android/sdk/platform-tools/dmtracedump –h traceA.trace > traceB.trace
*Inclusive
image.png
*Class
image.png
(2)生成函数调用图-可以展示出函数调用(被调用及调用的子方法)
/Users/zhouwen/Library/Android/sdk/platform-tools/dmtracedump –g output_trace.png traceA.trace
image.png
image.png
函数名(Inclusive,Exclusive,Calls)
(1) 生成trace对比HTML-可以对比出两个trace函数耗时以及调用次数。
/Users/zhouwen/Library/Android/sdk/platform-tools/dmtracedump –d traceA.trace –h traceB.traceB
对比结果:
image.png
4. 线程监控和评测浏览(Update Threads)
Threads可以查看当前进程所有线程的活动状态。
image.png
image.png
Theads说明:
Name:线程名
stime:执行系统逻辑累计耗时
utime:执行用户逻辑累计耗时
Status:线程运行状态
Tid:线程id
id:虚拟机分配的Id
Status状态说明:
Runnable:就绪状态
Wait:等待
Vmwait:等待虚拟机
Native:执行native代码
Sleeping:执行Thread.sleep()后
Starting:线程正在启动
Running:运行状态
四.优化前后效果对比
优化前:
image.pngimage.png
image.png
优化后:
image.png五.建议
网络:
1.移动网络情况下减少发包频率,网络异常重试机制。
2.发送数据量很大的情况下,建议在WiFi环境下进行,发送的数据建议压缩。
3.尽量避免使用静态网络广播,被动接受系统网络广播会消耗电量。
其他:
1.Socket心跳重试机制轮询, 定时器,动效等不需要的时候必须要停止掉。
2.使用WakeLock机制,会是CPU一直处于运行状态,在不需要的时候必须release掉。
3.使用JobScheduler异步任务调度, 可以将一些不紧急的任务放在合适的时机再进行触发,这样可以节省不少电量。
4.Doze模式来限制后台大部分任务运行。
Google官网针对电池续航时间的优化建议:
Google battery opt: https://developer.android.com/training/monitoring-device-state/battery-monitoring