您的位置:首页 > 移动开发 > Android开发

Android应用ANR检测工具BlockCanary试用小记

2016-08-21 01:07 302 查看
1. 关于BlockCanary的介绍,可以参考如下链接:

作者博客:http://blog.zhaiyifan.cn/2016/01/16/BlockCanaryTransparentPerformanceMonitor/

Git地址:https://github.com/markzhai/AndroidPerformanceMonitor/blob/master/README_CN.md

2. 接下来主要是记录一下整个试用的过程:

2.1 首先创建一个新的Android工程,具体功能为添加一个按钮,点击后,让线程休眠,模拟一个ANR现象,代码如下:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.TestBtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//模拟一个长时间操作,产生ANR
try {
Thread.sleep(8*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

Toast toast = Toast.makeText(getApplicationContext(),"点击完成", Toast.LENGTH_LONG);
toast.show();
}
});

}
2.2 在Module的build.gradle添加BlockCanary依赖,如下:

dependencies {
....
compile 'com.github.moduth:blockcanary-android:1.2.1'
}
2.3 接下来是在应用中初始化BlockCannary,新建一个类继承Application类,代码如下:

public class DemoApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
// 在主进程初始化调用哈
BlockCanary.install(this, new AppBlockCanaryContext()).start();

}
}
2.4 实现自己的监控上下文,代码如下:

public class AppBlockCanaryContext extends BlockCanaryContext {

// override to provide context like app qualifier, uid, network type, block threshold, log save path

// this is default block threshold, you can set it by phone's performance

@Override
public int getConfigBlockThreshold() {
return 5000;
}

// if set true, notification will be shown, else only write log file
@Override
public boolean isNeedDisplay() {
return BuildConfig.DEBUG;
}

// path to save log file
@Override
public String getLogPath() {
return "/mnt/sdcard/";
}

}
2.5 在AndroidManifest.xml文件中声明Application,如图:



2.6 现在就已经将BlockCanary集成到应用里面了,接下来,编译安装到手机上,点击测试按钮,将产生一个anr,效果如图:



3. 总结

整个配置过程还是比较简单,日志里面的堆栈信息也很清晰明了,可以很快定位到具体的产生anr的代码,相对于获取anr目录下面的trace文件,进行分析的方式,更加的实时和方便. 另外关于block时间阀值的设置,

public int getConfigBlockThreshold() {

        return 5000;

    }

由于不同设备的性能不一样也有所不同;一般来说,以下两种情况,容易产生ANR现象:

1. 用户操作在5秒内都没有任何响应;

2. 一个广播接收器(BroadcastReceiver)在10秒内都没有结束运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: