Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢?它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃(crash),也可以仅将警告计入日志,让你的应用继续执行。策略的细节尚难确定,可以期待随Android的成熟Google将增加更多策略。
主要采用采用ThreadPolicy(线程策略)和VmPolicy(Vm策略)进行检测,各策略检测内容如下:
ThreadPolicy 线程策略检测的内容有
- 自定义的耗时调用 使用 detectCustomSlowCalls() 开启
- 磁盘读取操作 使用 detectDiskReads() 开启
- 磁盘写入操作 使用 detectDiskWrites() 开启
- 网络操作 使用 detectNetwork() 开启
- 资源类型不匹配 使用detectResourceMismatches() 开启 android 23 开始增加
VmPolicy 虚拟机策略检测的内容有
- Activity泄露 使用 detectActivityLeaks() 开启
- 未关闭的Closable对象泄露 使用 detectLeakedClosableObjects() 开启
- 泄露的Sqlite对象 使用 detectLeakedSqlLiteObjects() 开启
- 网络流量监控 使用 detectCleartextNetwork() android 23增加
- 广播或者服务等未注销导致泄漏 使用 detectLeakedRegistrationObjects()开启 android 23增加
- 文件uri暴露 使用detectFileUriExposure() android增加
要注意anroid 23新增加的几个策略检测
- android 23 以后传递软件包网域外的 file://URI 可能给接收器留下无法访问的路径。 因此,尝试传递 file://URI 会触发 FileUriExposedException。 分享私有文件内容的推荐方法是使用 FileProvider。
如果不使用FileProvider时,而且开启了严格模式,则必须关闭detectFileUriExposure() - 建议在使用的直接调用detectAll(),而不是依次开启检测具体的策略
- 而且严格模式StrictMode建议在调试模式中开启,防止影响正常运行
StrictMode具体使用:
StrictMode建议在application 的onCreate()的方法中调用;
StrictModeHelper.setPolicy(BuildConfig.DEBUG);
调试时才开启,而且利用BuildConfig属性是否app在调试模式
public class StrictModeHelper {
public static void setPolicy(Boolean isDebug) {
if (isDebug && Build.VERSION.SDK_INT >= 9) {
setThreadPolicy();
setVmPolicy();
}
}
//线程策略检测
private static void setThreadPolicy() {
StrictMode.ThreadPolicy.Builder builder = new StrictMode.ThreadPolicy.Builder()
.detectAll() //detectAll() 检测下述所有
// .detectCustomSlowCalls() //自定义耗时调用
// .detectDiskReads() //磁盘读取操作
// .detectDiskWrites() //磁盘写入操作
// .detectNetwork() //网络操作
// .detectResourceMismatches() //资源类型不匹配 android 23增加
.penaltyLog(); //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
StrictMode.setThreadPolicy(builder.build());
}
//虚拟机策略检测
private static void setVmPolicy() {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder()
.detectAll() //检测下述所有
// .detectActivityLeaks() //Activity泄漏
// .detectLeakedClosableObjects() //未关闭Closable对象泄漏
// .detectLeakedSqlLiteObjects() //SqlLite对象泄漏
// .detectCleartextNetwork() //网络流量监控 android 23增加
// .detectLeakedRegistrationObjects() //广播或者服务等未注销导致泄漏 android 23增加
// .detectFileUriExposure() //文件uri暴露 android增加
.penaltyLog(); //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
StrictMode.setVmPolicy(builder.build());
}
}
网友评论