性能基础:Android6.0 StrictMode 两个新特性
StrictMode,严苛模式。在启动StrictMode的情况下,程序必须严格遵守某种“要求”干事,否则的话就会得到“惩罚”。如果程序在运行中没有被“惩罚”,说明程序优化的比较好,否则程序要进行进一步优化。
“要求”分两种:ThreadPolicy和VmPolicy,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)