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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Office2007集成SP1光盘镜像下载(简体中文专业版+企业版VOL)「建议收藏」

    Office2007集成SP1光盘镜像下载(简体中文专业版+企业版VOL)「建议收藏」MicrosoftOffice2007sp1简体中文专业版http://www.namipan.com/d/fe0fb8a3037fc08c9bbec2cce55296b60160be5d0000763aMicrosoftOffice2007sp1简体中文企业版http://www.namipan.com/d/a25862908b03e67f02249e96b3e9a086…

    2022年7月19日
    22
  • 卷积神经网络卷积层和池化层的作用(卷积神经网络的重要性)

    链接:https://www.zhihu.com/question/36686900/answer/130890492个人觉得主要是两个作用:1.invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)2.保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力(1

    2022年4月12日
    45
  • 【转载】究竟什么才是高精度地图(雷锋网)

    【转载】究竟什么才是高精度地图(雷锋网)原文地址:究竟什么才是高精度地图(一)究竟什么才是高精度地图(二)究竟什么才是高精度地图(三)究竟什么才是高精度地图(一)导语:如果有一张辅助的高精度地图,能否避免特斯拉ModelS的事故?

    2022年8月1日
    6
  • route命令的使用详解[通俗易懂]

    route命令的使用详解[通俗易懂]Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table)。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设…

    2022年7月18日
    17
  • navicat 15 激活码_在线激活

    (navicat 15 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    45
  • Mac录屏软件:Record It[通俗易懂]

    Mac录屏软件:Record It[通俗易懂]RecordIt是一款屏幕录制应用软件,支持录制屏幕和录制声音,让您能够精准,高质量地捕获屏幕上所有的活动。RecordIt支持制作专业的应用软件演示,录制在线视频,ppt和图片幻灯片,制作指导教程等。同时录制来自系统声音或麦克风的声音。软件特色Recordit支持Windows和Mac两种系统,操作方式也很简单,将Recordit安装后执行,它会常驻于右上角菜单栏,开始前先把想录影的视窗打开,点选右上角的Recordit图示开始。使用Recordit的十字线来拖曳、绘制出想要录影

    2025年12月8日
    6

发表回复

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

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