前言
在日常业务测试中经常会发现页面跳转卡顿、滑动卡顿等等卡顿问题,但是往往发生了卡顿问题也没有什么具体信息提供给开发同学排查问题,所以也就不了了之了。
本文介绍使用BlockCanary测试app卡顿并且做到log日志上报。
Blockcanary介绍
介绍
Blockcanary是@markzhai开发的检测app主线程卡顿工具,不需要在代码中插桩和debug代码就能检测出卡顿。
https://github.com/markzhai/AndroidPerformanceMonitor
原理
代码配置
build.gradle
app目录的build.gradle中,增加如下代码:
代码语言:javascript复制implementation 'com.github.markzhai:blockcanary-android:1.5.0'
AppBlockCanaryContext类
代码语言:javascript复制新建AppBlockCanaryContext继承BlockCanaryContext,重写几个方法:
provideQualifier: 获取应用版本信息
provideUid: 获取用户uid
provideNetworkType: 获取网络类型
provideMonitorDuration: 设置监控时长,eg:100000ms
provideBlockThreshold: 设置监控卡顿阀值,eg:1000ms
providePath: 设置log保存地址, eg:BlockTest
displayNotification: 设置是否在桌面展示,eg: true or false
初始化BlockCanary
一般是在Application中的onCreate中注册,比如:
代码语言:javascript复制
BlockCanary.install(this, new AppBlockCanaryContext()).start();
# 此处初始化BlockCanary
但是在使用targetsdk24有些申请权限不在Application中,而是放到WelcomeActivity申请权限.因为当卡顿写入log文件,是需要读写sdcard权限的.如果初始化BlockCanary比较早并且又没读写sdcard权限,就会报错.所以需要把BlockCanary初始化滞后些。
代码语言:javascript复制 @NeedsPermission({Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
void initAfterPhonePermission() {
PermissionsUtil.getInstance().resetGotoSetting();
initAfterPermission();
BlockCanary.install(this, new AppBlockCanaryContext()).start();
new BlockThread().start();
}
卡顿log日志
根据上面的配置代码并打包app,进行手工测试如果主线程卡顿超过1000ms,会在手机sdcard/BlockTest目录下生成卡顿日志。
卡顿文件包含几点:
- 发生时间
- 版本
- imei
- cpu型号
- 内存
- 卡顿堆栈
上报log日志
之前方式的卡顿日志需要连接该设备把log手动导出来分析,或者在卡顿弹框中展示,这样并不能做到日志持久化和做后期的数据分析。
在客户端代码中写一个post方法把log日志上传到我们的后端接口保存日志。
扫描日志有两个方式,子线程定时扫描上传、app至于后台上传。
定时扫描上传
启动子线程
创建子线程
定时扫描文件
子线程启动以后,就可以定时扫描卡顿日志并上报。
app置于后台上传
上面介绍定时扫描的方式会对cpu、内存有一定消耗。所以可以采用把app置于后台上传,这种操作并不会很频繁。
项目
我们模拟一个Demo项目来模卡顿,点击block按钮后sleep2秒来模拟卡顿。
卡顿日志: