StrictMode 严格模式

作者: 璟龙 | 来源:发表于2016-07-18 16:47 被阅读533次

StrictMode 严格模式

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

注意:严格模式是一种保护机制但是并不保证找出所有的磁盘和网络访问。因为严格模式经常在发生Binder Call的时候报告自己的状态,所以它是一种尽力而为的机制。一般地,网络和磁盘访问一般走JNI调用,所以不一定会触发它。还有一点,线上的应用不应该开启严格模式。

代码示例:
 public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }

严格模式下的两种策略

StrictMode.ThreadPolicy(作用于特定线程)
主要监控以下内容:
  Disk Reads 磁盘读
  Disk Writes 磁盘写
  Network access 网络访问
  Custom Slow Code 自定义的运行速度慢的代码分析

StrictMode.VmPolicy(作用于整个虚拟机进程的所有线程)
主要监控以下内容:
  内存泄露的Activity对象
  内存泄露的SQLite对象
  内存泄露的释放的对象
  内存泄漏的BroadcastReceiver or ServiceConnection

严格模式监控到异常信息触发的提示

Log 日志
  Death 应用退出
  DropBox 持久化的、系统级别的Logcat

测试

代码

package com.jinglong.strickmodetest;

    import android.os.Bundle;
    import android.os.Environment;
    import android.os.StrictMode;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;

    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;

    public class MainActivity extends AppCompatActivity {

        public static final String STRICK_MODE_TEST = "StrickModeTest";
        public static final String TAG = STRICK_MODE_TEST + ":" +MainActivity.class.getName();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());
            File externalStorageDirectory = Environment.getExternalStorageDirectory();
            if (externalStorageDirectory==null||!externalStorageDirectory.exists()){
                Log.d(TAG,"SDCard is not exist");
            }else{
                //获取SD卡下的文件或目录
                String[] childrenFiles = externalStorageDirectory.list();
                for (int i = 0;i < childrenFiles.length;i++){
                    File childFile = new File(externalStorageDirectory.getPath(),childrenFiles[i]);
                    if (childFile.exists()&&childFile.isFile()){
                        //找到第一个File
                        try {
                            FileReader fr = new FileReader(childFile);
                            char ch[] = new char[1024] ;
                            while (fr.read(ch)!=-1){
                                Log.e(TAG,new String(ch));
                            }
                            //为了测试效果,此处不关fr

                            FileWriter fw = new FileWriter(childFile);
                            fw.write("Hello 璟龙");
                            fw.flush();
                            //为了测试效果,此处不关fw
                            
                            break;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

日志

  • 第一条日志表示资源没有关闭,即IO流未关闭
  • 第二条日志表示在主线程中发生了磁盘访问的读操作
07-18 15:05:26.930 10735-10748/com.jinglong.strickmodetest E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
07-18 15:05:26.949 10735-10735/com.jinglong.strickmodetest D/StrictMode: StrictMode policy violation; ~duration=44 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=31 violation=2

相关文章

  • StrictMode严格模式

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

  • StrictMode 严格模式

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

  • # 工具

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

  • react Link跳转不生效

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

  • StrictMode 严格模式应用

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

  • 性能基础: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/cfopjttx.html