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