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


相关推荐

  • 腾讯流量主广告点击一次多少钱_好赞移动科技主要做什么的

    腾讯流量主广告点击一次多少钱_好赞移动科技主要做什么的中国的电信市场已经成为全球规模最大的电信市场,11亿左右的客户规模、上万种的业务模式,让国外电信运营商羡慕不已,但与此同时,国内运营商也面临巨大的挑战,特别是随着科技的进步,我们迎来了移动互联网时代,无处不在的网络已经渗透到各个领域。2月27日,工信部正式向中国联通和中国电信颁发LTEFDD牌照,在中国移动凭借TD-LTE牌照抢跑4G网络14个月、4G客户突破1亿大关时,中国市场全面进入4G竞逐

    2025年9月6日
    5
  • 笔试题(贪心)[通俗易懂]

    笔试题(贪心)[通俗易懂]题解多余的数字每次都往左边分配,每次都分配剩余的再向右分配,向右分配不足的需要再从右边多余的数组分配过来,所以就搬动了2次#include<bits/stdc++.h>using namespace std;const long long N = 1e5 + 10;int a[N];int main(){ int n,sum = 0; cin>>n; for(int i = 0;i < n;i ++)cin>>a[i],sum..

    2022年8月8日
    4
  • Fiddler 实现手机抓包详解

    Fiddler 实现手机抓包详解1、Fiddler简介Fiddler是一款强大的抓包工具,原理是以web代理服务器的形式进行工作的:2、Fiddler配置2.1允许监听httpsFiddler如果抓取https协议会话需要进一步配置,在Tools->Options菜单下,选择HTTPS标签并配置如下:2.2允许远程连接手机抓取需要配置远程连接,在Tools->Options菜单下,选择Connections标签并配置如下:监听端口8888并允许远程连接防火墙需要开放

    2022年6月29日
    35
  • 计算机机房整改工作报告,机房整改总结.doc

    计算机机房整改工作报告,机房整改总结.docXX机房整改方案目录一、XX站整改项目说明3二、XX站整改项目目标3三、项目实施要求41、可靠性:42、环境保护:43、灵活性:44、安全性:4四、施工方案简述4第一部分机房工程方案4第二部分:机房装修设计及施工方案6第三部分机房外缆整改及设备支座制作8五、机房综合工程设计标准10六、效果图11XX站整改项目说明本次XX站机房整改项目主要涉及XXX二楼机房、话务机房、电源机房等机房的整体维护。…

    2022年5月25日
    27
  • iis命令停止启动_更新并重启怎么取消

    iis命令停止启动_更新并重启怎么取消直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS重启IIS服务器,开始->运行->cmd(以下列出相关操作命令):iisreset /RESTART停止后启动iisreset/START启动IIS(如果停止)iisreset/STOP停止IIS(如果启动)iisreset/REBOOT重启电脑iisreset/REB…

    2025年5月23日
    1
  • server.mappath方法详解

    server.mappath方法详解server.mappath方法详解server.mappath方法整理,可供需求的朋友参考./当前目录 /网站主目录 ../上层目录 ~/网站虚拟目录 如果当前的网站目录为E:\wwwroot应用程序虚拟目录为E:\wwwroot\company浏览的页面路径为E:\wwwroot\company\news\show.asp 在show.a

    2022年7月12日
    17

发表回复

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

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