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();}}}}


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)


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:

对于线程策略剩下的比较简单就不多说,然后介绍一下:使用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() {@Overridepublic void run() {SystemClock.sleep(1000);}}).start();}

log:


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:


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:


考虑倒关于版本兼容问题,因为按照上面的写法在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以下}

StrictMode总结相关推荐

  1. Android 应用性能优化-StrictMode(严格模式)

    为什么80%的码农都做不了架构师?>>>    UI线程如果被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来说是一个很严重的问题. 如何防止应用程序出现AN ...

  2. 严苛模式 strictmode

    参考链接 http://blog.csdn.net/brokge/article/details/8543145 一.严苛模式-虚拟机策略 虚拟机策略(VmPolicy)能检查内存泄漏,譬如,当关闭一 ...

  3. android 严苛模式,Android- 严苛模式(StrictMode)

    写程序时,你应该始终假定下列两种情况: 网络很慢(你正在试图连接的服务器甚至可能没有响应): 文件系统的访问速度很慢. 结论就是,不应该在主线程内进行网络操作或访问文件系统,因为缓慢的操作会拖累系统的 ...

  4. Android严苛模式StrictMode使用与取消

    StrictMode最常用来捕捉应用程序的主线程,报告与线程及虚拟机相关的策略违例.一旦检测到策略违例(policy violation),开发者将获得输出警告:包含了一个栈trace显示你的应用在何 ...

  5. [转]Android最佳实践之:StrictMode介绍

    [IT168技术]最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写 ...

  6. 严苛模式(StrictMode)

      Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益.那它都做什么呢?它将报告与线程及虚拟机相关 ...

  7. Android性能调优利器StrictMode

    2019独角兽企业重金招聘Python工程师标准>>> 作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对 ...

  8. Android之严苛模式(StrictMode)

    Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益.那它都做什么呢?它将报告与线程及虚拟机相关的策 ...

  9. React中的fragment和StrictMode

    一.fragment 在之前的开发中,我们总是在一个组件中返回内容时包裹一个div元素: 我们又希望可以不渲染这样一个div应该如何操作呢? 使用Fragment Fragment 允许你将子列表分组 ...

  10. android strictmode有什么作用,Android 性能优化 之 StrictMode

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? StrictMode概述 StrictMode 是用来检测程序中违例情况的开发者工具.使用StrictMode,系统检测 ...

最新文章

  1. UI培训分享:导航栏UI设计规范及注意事项有哪些?
  2. 高压小功率三极管 MFV13001
  3. 泛函编程(19)-泛函库设计-Parallelism In Action
  4. 便携式计算机的工作原理,便携式计算机及控制该计算机的方法
  5. 笔记-信息系统开发基础-CMMI组织能力成熟度模型-连续式和阶梯式的分组
  6. VS Code 中有哪些好用的 Azure 插件?
  7. div无法触发blur事件解决的方法
  8. Windows as a Service(4)——使用Intune管理Windows10更新
  9. php判断搜索引擎来路,php实现判断访问来路是否为搜索引擎机器人的方法
  10. 量子纠缠,如何理解不确定性
  11. layer数据加载中,loading的显示
  12. windows7 系统下载(2)
  13. 传输rp文件到ftp服务器并通过浏览器访问html
  14. 平板电脑应用_机房巡检AI机器人是啥,工业平板电脑的应用如何体现
  15. 四级英语测试软件,英语四级必备软件推荐
  16. windows微软商店打不开代码0x80131解决方法
  17. 对于提高团队开会效率的看法
  18. 企业为提高团队协作,一般都会使用什么办公工具?
  19. CSharp中的集合与字典:不同数据量的内存占用情况
  20. 【图像去噪】基于matlab GUI均值+中值滤波图像去噪(含PNSR)【含Matlab源码 372期】

热门文章

  1. 微信小程序实战篇-下拉刷新与加载更多
  2. 销售如何维护客情关系 销售维护客户有什么方法
  3. C语言中的二分查找法
  4. 在 Create-React-App 中使用 TypeScript(汉化)
  5. matlab java堆内存溢出,matlab内存溢出的解决方案
  6. 【c语言】有符号机器数之间怎么比较大小?
  7. KBL410-ASEMI适配高端电源整流桥
  8. 如何看计算机内存使用百分比,如何查看内存条的实际使用频率
  9. ASCII 与 UNICODE 字符映射表
  10. 转行程序员日记---2020-09-18【,勿忘国耻】【回忆青春】