卡顿优化
- CPU Profiler
- Systrace
- StrictMode
卡顿问题难的排查是比较难的,一方面因为卡顿问题产生的原因错综复杂,比如:代码、内存、绘制、IO操作等,另一方面,有的场景下的卡顿问题,可能难易复现。
工具选择
CPU Profiler
图形的形式展示执行时间,调用栈等
信息全面,包含所有线程
缺点:运行时开销严重,整体会变慢,可能会带偏我们优化的方向。
使用:
Debug.startMethodTracing("")
Debug.stopMethodTracing();
生成文件在sd卡的:Android/data/packagename/files
Systrace
监控和跟踪Api 调用,线程运行情况,生成html报告
轻量级、开销小,直观反应cpu利用率,给出优化建议。
使用条件:最好是在api18 以上,推荐使用TraceCompat
使用方式:需要配合python
python systrace.py -t 10 [other-option][categories]
链接:请添加图片描述
StrictMode
严苛模式,Android提供的一种运行时检测机制,该工具方便强大,它主要用来检测线程策略根虚拟机策略检测。
线程策略:自定义的耗时操作、 网络请求等
虚拟机策略:Activity 的泄漏(detectActivityLeaks())、Sqlite对象泄漏(detectLeakedSqliteObjects)、检测实例对象数量(setClassInstanceLimit)
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls() // API等级11 使用noteSlowCode
.detectDiskReads()
.detectDiskWrites()
.penaltyLog() //logcat 打印异常信息
.build())
StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.setClassInstanceLimit(String.javaClass,1)
.detectActivityLeaks()
.detectLeakedClosableObjects()
.penaltyLog()
.build())
自动化卡顿检测方案及优化
为什么需要自动化检测
1、系统工具适合线下针对性分析
2、线上及测试环节需要自动化检测方案
自动化卡顿检测方案原理
1、消息处理机制,一个线程只有一个Looper
2、mLogging对象在每个message处理前后被调用
3、主线程发生卡顿,是在dispatchMessage执行耗时操作
AndroidPerformaceMonitor
特点:非侵入式的性能监控组件,通知形式弹出卡顿信息
不足之处:
1、确实卡顿,但卡顿堆栈可能不准确
2、和OOM一样,最后的堆栈只是表象,不是真正问题
com.github.markzhai:blockcanary-android
https://github.com/markzhai/AndroidPerformanceMonitor添加链接描述
使用
1、添加依赖
2、设置卡顿检测阈值
自动检测方案优化
获取监控周期内的多个堆栈,而不仅是最后一个 (startMonitor–高频采集堆栈–endMonitor–记录多个堆栈–上报)
ANR
分类
1、KeyDispatchTimeOut 5s
2、BroadcastTimeOut 前台10s,后台60s
3、ServiceTimeOut 前台20s,后台200s
ANR执行流程
1、发生ANR
2、进程接收异常,终止信号,开始写入进程ANR信息
3、弹出ANR提示框
解决套路
1、线下:adb pull data/anr/traces.txt 存储路径 (详细分析CPU、IO、锁)
2、线上:通过监控FileObserver文件变化,高版本有权限问题(高版本监控不到)
3、推荐:ANR-WatchDog (三方库)(https://github.com/SalomonBrys/ANR-WatchDog)
4、ANR-WatchDog原理:调用start()方法后–》post消息改值–》sleep–》检测是否修改–》判断ANR发生
AndroidPerformaceMonitor与ANR-WatchDog区别
1、AndroidPerformaceMonitor:监控Msg
2、ANR-WatchDog:看最终结果
3、前者适合监控卡顿,后者适合补充ANR监控
卡顿单点问题
1、自动卡顿检测方案并不够
2、体系化解决方案务必尽早暴露问题
3、单点问题:主线程IPC、DB操作
IPC问题检测
监测指标
1、IPC调用类型
2、调用耗时、次数
3、调用堆栈、发生线程
方案
1、adb命令:
开始监控
adb shell am trace-ipc start
停止监控并输出文件
adb shell am trace-ipc stop --dump-file /data/local/tmp/ipc-trace.txt
下拉文件
adb pull /data/local/tmp/ipc-trace.txt
2、优雅方案
利用ARTHook完善线下工具
界面秒开
Lancet地址:https://github.com/eleme/lancet