Android进阶Android高级进阶知识学习收藏

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

2017-02-22  本文已影响2549人  我在等你回复可你没回

StrictMode,严苛模式。在启动StrictMode的情况下,程序必须严格遵守某种“要求”干事,否则的话就会得到“惩罚”。如果程序在运行中没有被“惩罚”,说明程序优化的比较好,否则程序要进行进一步优化。
“要求”分两种:ThreadPolicyVmPolicy,ThreadPolicy是线程相关的要求,VmPolicy是虚拟机相关的要求。
ThreadPolicy包括:
1.不能在主线程读写磁盘
2.不能在主线程进行网络操作等
StrictMode包括:
1.Activity不能泄露
2.数据库不能泄露等
“惩罚”包括:
1.打出error级别的log
2.直接干掉程序

更多基础使用可以参照下面这篇文章,本文不再赘述。
http://droidyue.com/blog/2015/09/26/android-tuning-tool-strictmode/index.html
Android性能调优利器StrictMode

本文重点讲述Android 6.0 StrictMode的两个新特性API detectCleartextNetwork()和detectFileUriExposure()

detectCleartextNetwork##

detectCleartextNetwork用来检测网络访问是否有加密,例如使用http传输数据是没有加密的,这时StrictMode可以检测出这个潜在的风险点,并给予我们“惩罚”。下面的例子是使用http协议下载文件。

        StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder()     //开启StrictMode
        .detectCleartextNetwork()
        .penaltyLog()
        .build();
        StrictMode.setVmPolicy(policy);
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    URL  url=new URL("http://publicobject.com/helloworld.txt");
                    HttpURLConnection con=(HttpURLConnection) url.openConnection(); 

                    Log.v("wenfeng",""+ con.getResponseCode());
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.v("wenfeng",""+e.toString());
                }
            }
        }).start();
detectCleartextNetwork.png

因为我们开启了StrictMode的detectCleartextNetwork(),应用没有遵守“网络访问要加密”的要求,所以受到了惩罚——“打出error级别的log”。为了满足“网络访问要加密”的要求,我们可以使用https协议来替代http协议。

detectFileUriExposure##

detectFileUriExposure用来检测应用是否通过file:///的方式将文件共享给其他应用,google认为用file:///的方式来共享文件是不规范的,因为可能因为文件的访问权限导致共享失败,StrictMode可以检测出这个潜在的风险点,并给予我们“惩罚”。例如下面的例子通过file:///方式来共享mp3文件给播放器播放。

         StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder()
        .detectFileUriExposure()
        .penaltyLog()
        .build();
        StrictMode.setVmPolicy(policy);
        Uri playUri = Uri.parse("file:///sdcard/Music/test.mp3"); 
        Intent intent = new Intent(Intent.ACTION_VIEW, playUri); 
        intent.setDataAndType(playUri, "audio/mp3");
        startActivity(intent);
detectFileUriExposure.png
因为我们开启了StrictMode的detectFileUriExposure(),应用没有遵守“不能通过file:///方式共享文件”的要求,所以受到了惩罚——“打出error级别的log”。为了满足“不能通过file:///方式共享文件”的要求,我们可以使用file provider的方式来共享文件。
使用可以参照下面文章
http://www.jianshu.com/p/3f9e3fc38eae
Android7.0须知--应用间共享文件(FileProvider)
上一篇下一篇

猜你喜欢

热点阅读