StrictMode 严格模式应用

作者: Jinwong | 来源:发表于2016-06-21 17:16 被阅读1970次

    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());
        }
    }
    

    相关文章

      网友评论

        本文标题:StrictMode 严格模式应用

        本文链接:https://www.haomeiwen.com/subject/qhygdttx.html