Android 性能优化(5)--卡顿优化

本文探讨了卡顿问题排查的复杂性,介绍了CPUProfiler、Systrace和StrictMode在卡顿优化中的应用,包括它们的优缺点和使用场景。还提出了自动化卡顿检测方案,比较了AndroidPerformaceMonitor和ANR-WatchDog的区别,以及针对单点问题如IPC和DB操作的检测方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卡顿优化

在这里插入图片描述

  • 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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值