android 卡顿 canary,Android BlockCanary 实践

前言

在日常业务测试中经常会发现页面跳转卡顿、滑动卡顿等等卡顿问题,但是往往发生了卡顿问题也没有什么具体信息提供给开发同学排查问题,所以也就不了了之了.

本文介绍使用 BlockCanary 测试 app 卡顿并且做到 log 日志上报.

Blockcanary 介绍

介绍

Blockcanary 是@markzhai开发的检测 app 主线程卡顿工具,不需要在代码中插庄和 debug 代码就能检测出卡顿.

原理

be55094a59f3b3b589fb5a9af7583bc5.png

代码配置

build.gradle app目录的build.gradle中,增加如下代码

implementation 'com.github.markzhai:blockcanary-android:1.5.0'

AppBlockCanaryContext 类 新建AppBlockCanaryContext继承BlockCanaryContext,重写几个方法:

provideQualifier: 获取应用版本信息

provideUid: 获取用户uid

provideNetworkType: 获取网络类型

provideMonitorDuration: 设置监控时长,eg:100000ms

provideBlockThreshold: 设置监控卡顿阀值,eg:1000ms

providePath: 设置log保存地址, eg:BlockTest

displayNotification: 设置是否在桌面展示,eg: true or false

初始化 BlockCanary 一般是在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();

}

卡顿 log 日志

根据上面的配置代码并打包 app,进行手工测试,如果主线程卡顿超过 1000ms,会在手机 sdcard/BlockTest 目录下生成卡顿日志.

1585945db75e30dd1e87f5f7ba20c1d8.png

卡顿文件包含几点:

发生时间

版本

imei

cpu 型号

内存

卡顿堆栈

5f26cbc53db8aea42f59d3a3974bf568.png

上报 log 日志

之前方式的卡顿日志需要连接该设备把 log 手动导出来分析,或者在卡顿弹框中展示.这样并不能做到日志持久化和做后期的数据分析.

在客户端代码中写一个 post 方法把 log 日上传到我们的后端接口保存日志.

扫描日志有两个方式,子线程定时扫描上传、app 置于后台上传

定时扫描上传

启动子线程

5412a371de0ab9c173bab927c33eecce.png

创建子线程

22d9850bf505005dfe6ab9ddd8f54386.png

定时扫描文件

子线程启动以后,就可以定时扫描卡顿日志并上报.

a354d13db5a959119471092ae53be7ef.png

app 置于后台上传

上面介绍定时扫描的方式会对 cpu、内存有一定消耗.所以可以采用把 app 置于后台上传,这种操作并不会很频繁.

a354d13db5a959119471092ae53be7ef.png

演示项目

点击 block 按钮后 sleep2 秒来模拟卡顿.

89f8616e2c5b42bb32633f1e4155fb2d.png

卡顿日志:

fe880ee96208ad4dc6cfb4e0927aeae3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值