android 卡顿检测上报,GitHub - wenzhu2018/android-BlockCanary: 卡顿检测工具 for android

凌成天
2023-12-01

一、说明

该库改造于AndroidPerformanceMonitor,在AndroidPerformanceMonitor的基础上修改了以下功能:

1、解决API版本必须要在21以上才能引用该库的问题;

2、解决跑monkey过程中因为误点击AndroidPerformanceMonitor界面的Delete按钮删掉卡顿详情的问题;

3、将卡顿信息保存在磁盘的“blockcanary/应用包名/卡顿时间.txt"文件下,方便查看详细的卡顿信息。

升级清单文档

二、使用说明:

前置条件

1. 需要动态申请的敏感权限

5.0以上系统还需要在代码中动态申请权限,具体请查看Android API

2. 已申请的权限

在Bfc-BlockCanary库中的AndroidManifest.xml中已申请以上所有权限

配置

0、在project的build.gradle中作如下配置:

// 引入BFC的网络配置

apply from: "http://172.28.2.93/bfc/Bfc/raw/master/public-config/newbfc-config.gradle"

allprojects {

repositories {

// 配置BFC各版本的仓库地址

maven { url bfcBuildConfig.MAVEN_URL }

// Bfc项目的灰度仓库

maven { url bfcBuildConfig.MAVEN_RC_URL }

jcenter()

}

}

1、在主module的build.gradle文件中依赖该库:

dependencies {

// 只在debug模式下工作

debugCompile bfcBuildConfig.deps["bfc-blockcanary"]

// 下单版本和自动化测试模式下,屏蔽掉blockcanary,因为该库在检查卡顿问题时会导致应用的性能问题,应谨慎使用

releaseCompile bfcBuildConfig.deps["bfc-blockcanary-no-op"]

testCompile bfcBuildConfig.deps["bfc-blockcanary-no-op"]

}

2、定义AppContext类,继承于BlockCanaryContext,用于对BlockCanary的配置:

public class AppContext extends BlockCanaryContext {

private static final String TAG = "AppContext";

@Override

public String provideQualifier() {

String qualifier = "";

try {

PackageInfo info = DemoApplication.getAppContext().getPackageManager()

.getPackageInfo(DemoApplication.getAppContext().getPackageName(), 0);

qualifier += info.versionCode + "_" + info.versionName + "_YYB";

} catch (PackageManager.NameNotFoundException e) {

Log.e(TAG, "provideQualifier exception", e);

}

return qualifier;

}

@Override

public String provideUid() {

// 用户ID,对于我们来讲,可以随便写

return "C2";

}

@Override

public String provideNetworkType() {

// 这个不知道是干什么的,先不管它

return "4G";

}

@Override

public int provideMonitorDuration() {

// 单位是毫秒

return 10*1000;

}

@Override

public int provideBlockThreshold() {

// 主要配置这里,多长时间的阻塞算是卡顿,单位是毫秒

return 500;

}

@Override

public boolean displayNotification() {

return BuildConfig.DEBUG;

}

@Override

public List concernPackages() {

List list = super.provideWhiteList();

return list;

}

@Override

public List provideWhiteList() {

// 白名单,哪些包名的卡顿不算在内

List list = super.provideWhiteList();

return list;

}

@Override

public boolean stopWhenDebugging() {

return true;

}

/**

* 删除卡顿报告文件时间间隔

*

* @return 单位:毫秒 (-1:不执行此功能)

*/

public long deleteFilesDuration() {

// 默认删除2天前的文件

return 2 * 24 * 3600 * 1000L;

}

/**

* 是否每次app启动都删除所有卡顿报告文件

*

* @return 默认false

*/

public boolean deleteFilesLaunch() {

return false;

}

/**

* 是否toast提示卡顿报告文件保存路径

*

* @return 默认true提示

*/

public boolean toastFileSavePath() {

return true;

}

/**

* 是否monkey测试

*

* 跑monkey时候请设置为true,避免monkey经常跑到显示卡顿信息机界面,效果:

* 1.如果设置通知栏提示,在monkeyTest下点击通知栏不会跳转到卡顿信息界面{@link com.github.moduth.blockcanary.ui.DisplayActivity};

* 2.桌面屏蔽卡顿信息界面{@link com.github.moduth.blockcanary.ui.DisplayActivity}入口.

*

* 注意:桌面刷新是不及时的.如果发现app自己的桌面图标消失了,是因为桌面没有即时更新,请到 设置 --> 应用程序 --> 清除桌面数据,图标就可以正常显示了.

*

* @return 默认false提示

*/

public boolean monkeyTest() {

return false;

}

}

跑monkey 时候monkeyTest()设置为true,可以避免monkey跑到显示卡顿信息机界面, 卡顿的图标会消失 ,这属于正常现象.

注意:如果发现app自己的 桌面图标消失 了,是桌面刷新不及时,请到 设置 --> 应用程序 --> 清除桌面数据,图标就可以正常显示了.

3、在主工程的Application类中做初始化:

public class DemoApplication extends Application {

private static Context sContext;

@Override

public void onCreate() {

super.onCreate();

sContext = this;

BlockCanary.install(this, new AppContext()).start();

}

public static Context getAppContext() {

return sContext;

}

}

4、退出app或不需要时请调用销毁:

BlockCanary.get().destroy();

可选功能

BlockCanary 桌面图标名称修改:

strings.xml

隔壁老王的Block

删除卡顿报告记录文件

BlockCanary.get().deleteAllFiles();

三、更为详细地使用说明请查看blockcanary的wiki文档

四、TODO

将卡顿详情上传到后台;

五、依赖

本项目已集成:

bfc-common

 类似资料: