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 严格模式应用

    Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个An...

  • StrictMode严格模式

    StrictMode是Android2.3加入的一个工具类,用于帮助开发者发现代码中的一些不规范的问题。比如网络操...

  • StrictMode 严格模式

    StrictMode 严格模式 开发者经常会无意地犯些错误:在主线程读写磁盘、访问网络,严格模式能够把帮助开发者监...

  • # 工具

    ## 严格模式 StrictMode(```React.StrictMode```),本质是一个组件,该组件不进行...

  • react Link跳转不生效

    可能是 React.StrictMode 严格模式的原因

  • 性能基础:Android6.0 StrictMode 两个新特性

    StrictMode,严苛模式。在启动StrictMode的情况下,程序必须严格遵守某种“要求”干事,否则的话就会...

  • Android性能优化之StrictMode

    目录 StrictMode是什么 StrictMode从字面上翻译是严格模式的意思,它是Android提供的一种用...

  • StrictMode严格模式原理分析

    一、使用严格模式: 二、严格模式中是如何去检测,在哪个地方有注入StrictMode的代码:在源码中可以直接植入S...

  • React中StrictMode严格模式

    当我们使用npm create-react-app my-app创建一个react项目的时候,在项目根目录inde...

  • Android开发之StrictMode

    一. 简介 StrictMode(严格模式)是在Android 2.3(API 9)开始引入的类,StrictMo...

网友评论

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

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