添加依赖:
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 界面下半部,有四个标签页,分别对应四个不同的数据图表,它们分别是: 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四种视图来查看方法耗时。
展开**main()**线程,放大时间线视图,查看对应方法耗时 绿色区域是调用者所占用时间区域,找到对应方法,可以看到block()方法用时802.16ms
选择右侧Flame Chat 查看百分比视图 可以看到,我们测试的block()方法耗时802.16ms
有时方法执行过多,不方便查找的话,可以使用查找功能 上面是查找block方法,还可以直接查找包名:
选择Bottom Up 视图 可以看到block()方法耗时802.162ms
参数释义: • Self Time —— 运行自己的代码所消耗的时间; • Children Time —— 调用其他方法的时间; • Total Time —— 前面两者时间之和。
具体使用何种视图,可以参考:
其中testTrace为文件路径。
执行完成后导出testTrace.trace文件
选择CPU Profile视图,Record -> Stop 后,点击下方保存按钮
打开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类似,只不过统计单位换成了真实时间