美文网首页Android进阶Android高级进阶知识学习收藏
性能基础:Android6.0 StrictMode 两个新特性

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

作者: 我在等你回复可你没回 | 来源:发表于2017-02-22 18:13 被阅读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)

    相关文章

      网友评论

      本文标题:性能基础:Android6.0 StrictMode 两个新特性

      本文链接:https://www.haomeiwen.com/subject/tdipwttx.html