移动性能测试 Android BlockCanary 实践

xinxi · 2018年12月01日 · 最后由 xinxi 回复于 2018年12月05日 · 3700 次阅读

前言

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

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

Blockcanary 介绍

介绍

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

https://github.com/markzhai/AndroidPerformanceMonitor

原理

image

代码配置

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 目录下生成卡顿日志.

image

卡顿文件包含几点:

  • 发生时间
  • 版本
  • imei
  • cpu 型号
  • 内存
  • 卡顿堆栈

image

上报 log 日志

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

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

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

定时扫描上传

启动子线程

image

创建子线程

image

定时扫描文件

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

app 置于后台上传

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

image

演示项目

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

image

卡顿日志:
image

项目 Demo 地址:
https://github.com/xinxi1990/AndroidDemo.git

共收到 2 条回复 时间 点赞
仅楼主可见

手动开启应用读写 sdcard 权限

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册