1.BlockCanary
造成app卡顿的直接原因通常是,主线程执行繁重的UI绘制、大量的计算或IO等耗时操作。常用的解决卡顿的方法有BlockCanary、ArgusAPM、LogMonitor等。
从监控主线程哦哦实现原理上,主要分为两种:
①依赖主线程Looper,监控每次dispatchMessage的执行耗时。(BlockCanary)
②依赖Choreographer模块,监控相邻两次Vsync事件通知的时间差。(ArgusAPM、LogMonitor)
BlockCanary是Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。
BlockCanary对主线程操作进行了完全透明的监控,并能输出有效的信息,帮助开发分析、定位到问题所在,迅速优化应用。其特点有:
①非侵入式,简单的两行就打开监控,不需要到处打点,破坏代码优雅性。
②精准,输出的信息可以帮助定位到问题所在(精确到行),不需要像Logcat一样,慢慢去找。
2.BlockCanary使用
①添加依赖
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'
}
②在Application里进行初始化和start
BlockCanary.install(this, new BlockCanaryContext()).start();
3.BlockCanary原理
首先看install方法:
public static BlockCanary install(Context context, BlockCanaryContext blockCanarayContext) {
BlockCanaryContext.init(context, blockCanaryContext);
setEnabled(context, DisplayActivity.class, BlockCanaryContext.get().displayNotification());
return get();
}
其中BlockCanaryContext表示监测的某些参数,包括卡顿的阈值、输出文件的路径等等。
public class BlockCanaryContext implements BlockInterceptor {
public int provideBlockThreshold() {
return 1000; //默认卡顿阈值为1000ms
}
public String providePath() {
return "/blockcanary/";//输出的log
}
//支持文件上传
public void upload(File zippedFile) {
throw new UnsupportedOperationException();
}<