[English](https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README.md) # Android Performance Monitor [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.markzhai/blockcanary-android) BlockCanary是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。 取名为BlockCanary则是为了向LeakCanary致敬,顺便本库的UI部分是从LeakCanary改来的,之后可能会做一些调整。 - 1.5.0 Context 中增加 Debug 时不监控选项。 - 1.4.1 Bug修复 - 1.4.0 修复 1.3.x 的 bug,增加发生卡慢时的拦截方法。 - 1.3.0 增加白名单和包名过滤功能 # 包介绍 - blockcanary-android blockcanary类的一些实现 - blockcanary-analyzer 记录block信息的核心实现 - blockcanary-no-op 空包,为了release打包时不编译进去 # 引入 **一般选取以下其中一个 case 引入即可** **如果有多个buildTypes需求,请使用 ```buildTypeComple ``` 关键字根据buildTypes组合使用即可** ```gradle dependencies { compile 'com.github.markzhai:blockcanary-android:1.5.0' // 仅在debug包启用BlockCanary进行卡顿监控和提示的话,可以这么用 debugCompile 'com.github.markzhai:blockcanary-android:1.5.0' releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0' } ``` PS: 由于该库使用了 `getMainLooper().setMessageLogging()`, 请确认是否与你的app冲突. # 使用方法 在Application中: ```java public class DemoApplication extends Application { @Override public void onCreate() { // 在主进程初始化调用哈 BlockCanary.install(this, new AppBlockCanaryContext()).start(); } } ``` 实现自己的监控上下文(强烈建议看清所有配置项,避免使用错误): ```java public class AppBlockCanaryContext extends BlockCanaryContext { // 实现各种上下文,包括应用标示符,用户uid,网络类型,卡慢判断阙值,Log保存位置等 /** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */ public String provideQualifier() { return "unknown"; } /** * Implement in your project. * * @return user id */ public String provideUid() { return "uid"; } /** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */ public String provideNetworkType() { return "unknown"; } /** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */ public int provideMonitorDuration() { return -1; } /** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */ public int provideBlockThreshold() { return 1000; } /** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. *
* Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). *
* * @return dump interval (in millis) */ public int provideDumpInterval() { return provideBlockThreshold(); } /** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */ public String providePath() { return "/blockcanary/"; } /** * If need notification to notice block. * * @return true if need, else if not need. */ public boolean displayNotification() { return true; } /** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */ public boolean zip(File[] src, File dest) { return false; } /** * Implement in your project, bundled log files. * * @param zippedFile zipped file */ public void upload(File zippedFile) { throw new UnsupportedOperationException(); } /** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */ public List