StrictMode 严格模式应用

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());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值