Android卡顿优化工具

    技术2022-07-10  126

    一、BlockCanary 检测卡顿

    添加依赖:

    debugImplementation ‘com.squareup.leakcanary:leakcanary-android:1.5.4’ releaseImplementation’com.squareup.leakcanary:leakcanary-android-no-op:1.5.4’

    配置BlockCanaryContext 关键属性:

    provideBlockThreshold 检测卡顿的阈值,单位毫秒(必须配置)onBlock 阻塞回调(可不配置)providePath 日志文件保存路径 在主线程中写个测试代码,阻塞800ms,日志信息如下: 可以看到该方法耗时803ms,通过日志我们可以定位到发生阻塞的地方:

    二、CPU Profiler 查看方法耗时

    在 CPU Profiler 界面下半部,有四个标签页,分别对应四个不同的数据图表,它们分别是: Call Chart、Flame Chart、Top Down 和 Bottom Up。

    4种视图区别如下: 详细介绍参考官方文档:https://blog.csdn.net/jILRvRTrc/article/details/106953074

    用法

    使用 CPU Profiler,首先要产生一些 CPU 的使用记录

    ①进入 Android Studio 中的 CPU Profiler 界面,在您的应用已经部署的前提下,点击 “Record” 按钮;

    ②在应用中进行您想要分析的操作,执行对应方法

    ③返回 CPU Profiler,点击 “Stop” 按钮

    ④由于最终呈现的数据是基于线程组织的,所以需要选择正确的线程: 下面分别使用Call Chart、Flame Chart、Top Down 和 Bottom Up四种视图来查看方法耗时。

    2.1、Call Chart视图:

    展开**main()**线程,放大时间线视图,查看对应方法耗时 绿色区域是调用者所占用时间区域,找到对应方法,可以看到block()方法用时802.16ms

    2.2、Flame Chart视图

    选择右侧Flame Chat 查看百分比视图 可以看到,我们测试的block()方法耗时802.16ms

    有时方法执行过多,不方便查找的话,可以使用查找功能 上面是查找block方法,还可以直接查找包名:

    2.3、Bottom Up视图

    选择Bottom Up 视图 可以看到block()方法耗时802.162ms

    参数释义: • Self Time —— 运行自己的代码所消耗的时间; • Children Time —— 调用其他方法的时间; • Total Time —— 前面两者时间之和。

    2.4、Top Down 视图

    具体使用何种视图,可以参考:

    三、通过Trace文件分析方法耗时

    3.1、生产.trace文件

    1)通过代码生成**.trace**文件

    其中testTrace为文件路径。

    执行完成后导出testTrace.trace文件

    2)通过CPU Profile产生.trace文件

    选择CPU Profile视图,Record -> Stop 后,点击下方保存按钮

    3.2 查看.trace文件

    打开Monitor,通过Monitor打开testTrace.trace文件 可以看到该视图也是基于线程组织的。可以分为三个区域

    左边区域是线程信息,右边区域则是时间线,同一颜色越长表示方法耗时越长,下边区域是方法列表

    和CPU Profile的Call Chart视图区别在于它的信息更加详细。

    在下方方法列表区找到对应方法: 点击选中该方法,可以看到时间区域会刷新,时间区域上方会显示该方法名和时间,其中 Real msec:显示的是方法真实用时,表示该方法执行时长。 (也可以直接将鼠标放在时间线上,也能查看到对应方法和时间) 各列作用说明

    列名描述Name该线程运行过程中所调用的函数名Incl Cpu Time某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间Excl Cpu Time某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间Call+Recur Calls/Total某函数被调用次数以及递归调用占总调用次数的百分比Cpu Time/Call某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间Real Time同CPU Time/Call类似,只不过统计单位换成了真实时间
    Processed: 0.009, SQL: 12