StrictMode总结「建议收藏」

StrictMode总结「建议收藏」Android2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。首先先整体介绍:StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy).det

大家好,又见面了,我是你们的朋友全栈君。

Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。

首先先整体介绍:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy)
                    .detectDiskReads()//检测在UI线程读磁盘操作
                    .detectDiskWrites()//检测UI线程写磁盘操作
                    .detectCustomSlowCalls()//发现UI线程调用的哪些方法执行得比较慢
                    .detectResourceMismatches()//最低版本为API23  发现资源不匹配
                    .detectNetwork() //检测在UI线程执行网络操作
                    .penaltyDialog()//一旦检测到弹出Dialog
                    .penaltyDeath()//一旦检测到应用就会崩溃
                    .penaltyFlashScreen()//一旦检测到应用将闪屏退出 有的设备不支持
                    .penaltyDeathOnNetwork()//一旦检测到应用就会崩溃
                    .penaltyDropBox()//一旦检测到将信息存到DropBox文件夹中 data/system/dropbox
                    .penaltyLog()//一旦检测到将信息以LogCat的形式打印出来
                    .permitDiskReads()//允许UI线程在磁盘上读操作
                    .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()//虚拟机策略(VmPolicy)
                    .detectActivityLeaks()//最低版本API11 用户检查 Activity 的内存泄露情况
                    .detectCleartextNetwork()//最低版本为API23  检测明文的网络
                    .detectFileUriExposure()//最低版本为API18   检测file://或者是content://
                    .detectLeakedClosableObjects()//最低版本API11  资源没有正确关闭时触发
                    .detectLeakedRegistrationObjects()//最低版本API16  BroadcastReceiver、ServiceConnection是否被释放
                    .detectLeakedSqlLiteObjects()//最低版本API9   资源没有正确关闭时回触发
                    .setClassInstanceLimit(MyClass.class, 2)//设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露
                    .penaltyLog()//与上面的一致
                    .penaltyDeath()
                    .build());

一 线程策略

detectDiskReads()/detectDiskWrites操作示例:

       StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskWrites()
                .detectDiskReads()
                .penaltyLog()
                .build());

        strictReads();
        
    }

    private void strictReads(){
        File file = new File(Environment.getExternalStorageDirectory().getPath()+"/note.txt");
        FileInputStream inputStream = null;
        int r = -1;
        try {
            inputStream = new FileInputStream(file);
            while((r = inputStream.read()) != -1){
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

StrictMode总结「建议收藏」


detectCustomSlowCalls操作示例:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectCustomSlowCalls()
                .penaltyLog()
                .build());

        showCustomSlowCallFlag();
        showCustomSlowCall();

    }

    private void showCustomSlowCallFlag(){
        StrictMode.noteSlowCall("This is Andly");
        SystemClock.sleep(10002);
    }

    private void showCustomSlowCall(){
        SystemClock.sleep(10002);
    }

Log:(只有作了标记得才会打印log)

StrictMode总结「建议收藏」
detectResourceMismatches操作示例:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectResourceMismatches()
                .penaltyLog()
                .build());

        showResourceMismatches();

    }

    private void showResourceMismatches() {
        TypedArray ta = getResources().obtainTypedArray(R.array.icons);
        int a = ta.getInt(0,0);
    }

这个没有打印log,不知道为什么。。

detectNetwork操作示例:

  StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectNetwork()
                .penaltyLog()
                .build());

        strictNetWork();
    }

    private void strictNetWork(){
        try {
            URL url = new URL("http://www.baidu.com");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.connect();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setReadTimeout(3000);
            httpURLConnection.setConnectTimeout(5000);
            int code = httpURLConnection.getResponseCode();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


log:

StrictMode总结「建议收藏」

对于线程策略剩下的比较简单就不多说,然后介绍一下:使用penaltyDropBox想要看文件得信息只需要输入:

adb shell dumpsys dropbox (这里写data/system/dropbox目录下文件的名字) –print

二 VM策略

detectActivityLeaks操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectActivityLeaks()
                .penaltyLog()
                .penaltyDropBox()
                .build());


        new Thread(new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(1000);
            }
        }).start();
    }

log:

StrictMode总结「建议收藏」
log上面显示,实例创建了2个但是限制的是一个
detectLeakedClosableObjects操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDropBox()
                .build());

        leakedClosableObj();

    }

    private void leakedClosableObj() {
        File newxmlfile = new File(Environment.getExternalStorageDirectory(), "/note.txt");
        try {
            newxmlfile.createNewFile();
            FileWriter fw = new FileWriter(newxmlfile);
            fw.write("Andly");
            //fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


setClassInstanceLimit操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .setClassInstanceLimit(LimitClass.class, 2)
                .penaltyLog()
                .penaltyDropBox()
                .build());

        classInstanceLimit();
    }

    private void classInstanceLimit() {
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
        classList.add(new LimitClass());
    }

log:

StrictMode总结「建议收藏」
detectLeakedRegistrationObjects操作示例:

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedRegistrationObjects()
                .penaltyLog()
                .penaltyDropBox()
                .build());

        leakeRegistion();
    }

    private void leakeRegistion() {
        receiver = new myReceive();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.andly.broadcast");
        registerReceiver(receiver,filter);
    }

log:

StrictMode总结「建议收藏」
考虑倒关于版本兼容问题,因为按照上面的写法在2.3以下系统是没有问题的,但是在2.3以上的话,就会出错,所以应该采用以下方式来处理

try {
            Class clazz = Class.forName("android.os.StrictMode");
            ApplicationInfo info = getApplicationInfo();
            if((info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0){
                //可以使用严苛模式
            }else{
                //不可使用严苛
            }
        } catch (ClassNotFoundException e) {
            //StrictMode类不可用  用这种方法来判断是否再Android2.3以下
        }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133510.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UE4/UE5 代理使用介绍[通俗易懂]

    UE4/UE5 代理使用介绍[通俗易懂]原创文章,转载请注明出处。UE4有一套代理机制,整理了一下做个介绍。也请大家做补充。有了代理,方便我们做代码设计,减轻耦合。文章里面的代码下载链接:代理单播代理二级目录三级目录多播代理二级目录三级目录单播代理二级目录三级目录多播代理二级目录三级目录…

    2022年9月28日
    3
  • 大数据数据分析架构探究

    大数据数据分析架构探究

    2021年7月5日
    80
  • adb工具+使用adb安装apk「建议收藏」

    adb工具+使用adb安装apk「建议收藏」adb链接:https://pan.baidu.com/s/1pdpIc9oXaqvN4lSrVLR_VA提取码:kxhc使用方法:1.解压压缩包。2.将解压后的文件夹放到合适的目录(我放到了C盘根目录)3.打开windows命令窗口,设置到adb工具目录(cdC:\adb)4.使用adb命令查看链接到的计算机的android设备(adbdevices)5.使用…

    2022年5月20日
    87
  • linux怎样用jps命令_hadoopjps只有五个

    linux怎样用jps命令_hadoopjps只有五个前言:在网上有好多说是以root身份vi/etc/profile,然后在下面加一行exportPATH="usr/java/jdk160_05/bin:$PATH"(其中jdk160_05是你的安装目录,依你自己的安装情况所决定),然后source/etc/profile即可解决我觉得这是当你自己安装jdk后jps命令不好使时可以这样解决,但是经过我试验你自己安装jdk成功后(如:在解压jd…

    2022年9月21日
    2
  • 打造自己的HelloDrone 无人机APP过程《0》

    打造自己的HelloDrone 无人机APP过程《0》目录文章目录目录摘要1.项目设置1.设置一个基本的AndroidStudio项目2.添加客户端库3.实现TowerListener的监听事件4.初始化ControlTower并绑定activity的生命周期5.实现无人机监听事件6.无人机实例化并在tower上注册摘要本节主要记录开发自己的HelloDrone无人机的过程,本节是第一节欢迎批评指正!参考资料:博客参考dronekit-android源码Tower源码usb-serial-for-android库1.项目设置1.设

    2022年8月15日
    7
  • Redis的配置文件详解「建议收藏」

    Redis的配置文件详解「建议收藏」目录1、开头说明2、INCLUDES3、MODULES4、NETWORK5、GENERAL6、SNAPSHOTTING7、REPLICATION8、SECURITY9、CLIENTS10、MEMORYMANAGEMENT11、APPENDONLYMODE12、LUASCRIPTING13、REDISCLUSTER资料推荐   上一篇博客我们介绍了如何安装Redis,在Redis的解压目录下有个很重要的配置文件redis.conf (/opt/redis-4.0.9目录下),

    2022年6月9日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号