移动性能测试 Android BlockCanary 实践

xinxi · December 01, 2018 · Last by xinxi replied at December 05, 2018 · 791 hits

前言

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

本文介绍使用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权限

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up