Android BlockCanary卡顿检测

2022-12-05 12:18:15 浏览数 (1)

前言

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

本文介绍使用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秒来模拟卡顿。

卡顿日志:

0 人点赞