统计耗电本身也是一件耗电行为,所以软件统计方式其实都不是很精确
https://github.com/google/battery-historian
windows:apowermirror
从手机中导出bugreport文件上传至页面,在网页中生成详细的图表数据来展示手机各模块电量消耗过程,然后通过App数据的分析制定出相关的电量优化的方法
$ docker run -p 9999:9999 registry.cn-beijing.aliyuncs.com/center1/google_battery
$ adb shell dumpsys batterystats --enable full-wake-history
$ adb shell dumpsys batterystats --reset
# Android7.0之后
$ adb bugreport bugreport.zip
# Android7.0之前
$ adb bugreport > bugreport.txt
RefreshRate
屏幕在一秒内刷新屏幕的次数,取决于硬件的固定参数,如60Hz
FrameRate
GPU在一秒内绘制操作的帧数,例如30fps,60fps
大多数用户感受到卡顿等性能问题的主要根源都是因为渲染性能,android系统无法及时完成那些复杂的界面渲染操作,就产生了卡顿/不流畅的想象
因为本来就用不到那么高的fps,屏幕没有绘制要求,那么fps就为0
屏幕每一帧的合成都是针对手机里面所有的进程,当前app停止后其他进程可能还在绘制
数据形式最为直观,游戏/视频等连续绘制的应用可以考虑选用,但不适用于绝大多数非连续绘制的应用
数据形式和FPS类似,可以很好的弥补FPS无法准确刻画非连续绘制的应用显示性能的缺陷
$ adb shell dumpsys gfxinfo 包名
# 例如
$ adb shell dumpsys gfxinfo com.sankuai.meituan
Draw+Prepare+Process+Execute=完整显示一帧的时间
这个时间需要小于16.67ms才能保证不丢帧
frameCount = rowNum
renderTime = Draw + Prepare + Process + Execute
vsyncOverNum=int(renderTime/16.67)-1
vsyncOverNum=int(renderTime/16.67)-1
fps=frameCount*60/(frameCount+vsyncOverNum=int)
腾讯GT
界面过度渲染 布局边界合理性
UI渲染由CPU和GPU两个部分协同完成
一个像素点绘制次数超过1次
开发者选项->调试GPU过度绘制
蓝色和绿色可以接受
当android应用启动时,系统会为应用创建一个主线程,负责和UI组件进行交互
如果主线程里面进行复杂运算就会造成界面无响应/卡顿/不流畅(ANR已经是卡顿的极致了)
分析方法执行时间
在代码里或者开发者选项中开启,查看应用哪些操作在主线程上执行时间过长
当一些操作违背了严格模式时,屏幕四周会闪烁红色,同时输出StrictMode的相关信息到LOGCAT日志中