StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。使用一般是场景是检测主线程中本地磁盘和网络读写等耗时的操作。注意这个StrictMode是在Anroid2.3以后引入的。严格模式主要检测两大问题,一个是线程策略,即TreadPolicy,另一个是VM策略,即VmPolicy。

线程策略(ThreadPolicy)检测的内容有

  • 1、自定义的耗时调用 使用detectCustomSlowCalls()开启
  • 2、磁盘读取操作 使用detectDiskReads()开启
  • 3、磁盘写入操作 使用detectDiskWrites()开启
  • 4、网络操作 使用detectNetwork()开启

虚拟机策略(VmPolicy)检测的内容有

  • 1、Activity泄露 使用detectActivityLeaks()开启
  • 2、未关闭的Closable对象泄露 使用detectLeakedClosableObjects()开启
  • 3、泄露的Sqlite对象 使用detectLeakedSqlLiteObjects()开启
  • 4、检测实例数量 使用setClassInstanceLimit()开启

可以看到线程策略主要与异步处理相关,虚拟机策略主要与内存管理相关。setThreadPolicy()将对当前线程应用该策略。如果不指定检测函数,也可以用detectAll()来替代。penaltyLog()表示将警告输出到LogCat,你也可以使用其他或增加新的惩罚(penalty)函数,例如使用penaltyDeath()的话,一旦StrictMode消息被写到LogCat后应用就会崩溃。另外虚拟机策略(VmPolicy)不能通过一个对话框提供警告。

在线程策略(ThreadPolicy)检测的时候,有几个penalty系列方法。

  • 1、penaltyDeath(),当触发违规条件时,直接Crash掉当前应用程序。
  • 2、penaltyDeathOnNetwork(),当触发网络违规时,Crash掉当前应用程序。
  • 3、penaltyDialog(),触发违规时,显示对违规信息对话框。
  • 4、penaltyFlashScreen(),会造成屏幕闪烁,不过一般的设备可能没有这个功能。

如何使用严格模式

严格模式的开启可以放在Application或者Activity以及其他组件的onCreate方法。为了更好地分析应用中的问题,建议放在Application的onCreate方法中。设置一次就够了。

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll()//开启所有的detectXX系列方法.penaltyDialog()//弹出违规提示框.penaltyLog()//在Logcat中打印违规日志.build());requestDataFromNet();}/*** 请求数据*/private void requestDataFromNet() {URL url;try {url = new URL("http://www.baidu.com");HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.connect();BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String lines ;StringBuilder sb = new StringBuilder();while ((lines = reader.readLine()) != null) {sb.append(lines);}Log.d("response",sb.toString());} catch (Exception e) {e.printStackTrace();}}
}

比如上面代码运行之后,就会有下面的弹窗出来警告。

看一下logcat的日志,是在主线程中做了访问网络的操作。

12-19 17:28:54.226 2729-2729/? D/StrictMode: StrictMode policy violation; ~duration=44 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=63 violation=4at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1123)at java.net.InetAddress.lookupHostByName(InetAddress.java:385)at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)at java.net.InetAddress.getAllByName(InetAddress.java:214)at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)at zhangwan.wj.com.myshare.MainActivity.requestDataFromNet(MainActivity.java:35)at zhangwan.wj.com.myshare.MainActivity.onCreate(MainActivity.java:27)at android.app.Activity.performCreate(Activity.java:5104)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1092)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254)at android.app.ActivityThread.access$600(ActivityThread.java:141)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:137)at android.app.ActivityThread.main(ActivityThread.java:5069)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:511)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)at dalvik.system.NativeStart.main(Native Method)

上面分析了是异步处理相关的例子,现在分析一个内存管相关的例子,比如检测内存泄露检测,用StrickMode怎么搞?

 public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectActivityLeaks()//检测Activity泄露.penaltyLog()//在Logcat中打印违规日志.build());UserManger instance = UserManger.getInstance(this);}}

比如上面的代码UserManger持有了Activity的引用,当反复进入Activity的时候,Activity不能被回收,导致了内存泄露,此时看Logcat。

12-20 09:57:07.626 4787-4787/? E/StrictMode: class zhangwan.wj.com.myshare.MainActivity; instances=3; limit=1android.os.StrictMode$InstanceCountViolation: class zhangwan.wj.com.myshare.MainActivity; instances=3; limit=1at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

明确告诉我们instances=3,说明泄露了3个MainActivity对象

严格模式除了可以检测Activity的内存泄露之外,还能自定义检测类的对象泄露。这个从从API 11 开始。

public
StrictMode.VmPolicy.Builder setClassInstanceLimit (Class klass, int instanceLimit)

比如,检测UserManger有没有泄露,可以这么写。

StrictMode.setVmPolicy(new VmPolicy.Builder().setClassInstanceLimit(UserManger.class, 1).penaltyLog().build());

在比如detectLeakedClosableObjects() 和 detectLeakedSqlLiteObjects(),资源没有正确关闭时回触发,detectLeakedRegistrationObjects() 用来检查 BroadcastReceiver 或者 ServiceConnection 注册类对象是否被正确释放等。

StrictMode有个更直接的办法,在部分手机上,可以在开发者选项中开启严格模式,开启之后,如果主线程中有执行时间长的操作,屏幕则会闪烁。OKStrictMode比较简单,到此结束!

参考链接:
官网文档:http://developer.android.com/reference/android/os/StrictMode.html
http://blog.csdn.net/meegomeego/article/details/45746721

Please accept mybest wishes for your happiness and success !

Android性能优化第(七)篇---StrickMode严苛模式检测耗时与内存问题相关推荐

  1. Android 性能优化之String篇

    Android 性能优化之 String篇 关于String相关知识都是老掉牙的东西了,但我们经常可能在不经意的String 字符串拼接的情况下浪费内存,影响性能,也常常会成为触发内存OOM的最后一步 ...

  2. Android性能优化系列总篇

    目前性能优化专题已完成以下部分: 性能优化总纲--性能问题及性能调优方式 性能优化第四篇--移动网络优化 性能优化第三篇--Java(Android)代码优化 性能优化第二篇--布局优化 性能优化第一 ...

  3. Android性能优化之渲染篇(一)

    前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...

  4. Android性能优化之运算篇

    原文转自 Techfox IT技术论坛 运算篇 1) Intro to Compute and Memory Problems Android中的Java代码会需要经过编译优化再执行的过程.代码的不同 ...

  5. Android性能优化之电量篇(四)

    原文链接:http://hukai.me/android-performance-battery/ 1)Understanding Battery Drain 手机各个硬件模块的耗电量是不一样的,有些 ...

  6. Android性能优化之运算篇(二)

    原文链接:http://hukai.me/android-performance-compute/ 前言 Android中的Java代码会需要经过编译优化再执行的过程.代码的不同写法会影响到Java编 ...

  7. Android渲染时间 太长,Android性能优化之渲染篇

    1)基本概念 在一个典型的显示系統中,一般包括CPU.GPU.display三個部分, CPU负责計计算数据,把计算好数据交給GPU,GPU会对图形数据进行渲染,渲染好后放到buffer里存起來,然后 ...

  8. Android性能优化之工具篇 — — 开发者选项

    Google为了方便开发者调试Android程序专门开发了开发者选项功能,能够让开发者方便快捷调试Android应用程序.对于一般用户无需关注,所以往往开发者选项在新版本中都会隐藏,需要特殊操作才会展 ...

  9. android11性能有提升吗,Android性能优化第(十 一)篇---卡顿分析,正确评测流畅度...

    转载请注明文章出处LooperJing! 一.FPS评测应用流畅度不准确 说到应用的流畅度,都会想到FPS,系统获取FPS的原理是:手机屏幕显示的内容是通过Android系统的SurfaceFLing ...

  10. Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析

    一.Android 内存管理机制 二.优化内存的意义 三.避免内存泄漏 四.优化内存空间 五.图片管理模块的设计与实现 六.总结 深入探索Android内存优化 第一章.重识内存优化 第二章.常见工具 ...

最新文章

  1. 程序员的创业陷阱:接私活
  2. Spring boot配置嵌入式Servlet容器
  3. 【数据结构与算法】之深入解析“路径总和III”的求解思路与算法示例
  4. 一步一步做一个linux文件传输软件(一)
  5. java中兴参与实参相同_中兴通讯_传输SDH试题(含答案)
  6. Java当中的异常处理
  7. mysql druid读写分离_springboot+mysql+jpa+sharding-jdbc+druid读写分离
  8. mysql8.0.15源码linux_源码安装mysql8.0.20
  9. 串口软件与uPs测试,智能化UPS的软件设计及串口通信实现
  10. drozer console connect错误_Received an empty response from Agent
  11. Ubuntu 20 更新后突然无法获取IP
  12. Junit Test a getter
  13. 39. 组合总和(Python)
  14. UCOS II移植到STM32F103开发板
  15. 面试题之JAVA高级篇
  16. 2022年武汉市创新型中小企业认定条件和评价指标
  17. ringbuffer的特别之处
  18. 关于PE4259等各类射频开关选型对比分析
  19. 任正非:5G关系着公司的生死存亡,不惜代价要赢!
  20. Java数据类型转换02--强制类型转换

热门文章

  1. word 插入表格,位置不在最左边
  2. 电脑W ndoWs未能启动怎么办,Win7系统电脑开机显示“Windows未能启动”的解决方法...
  3. Failed to compile with 1 errors
  4. 计算机感染病毒正确处理方法,【安徽新华】计算机感染了病毒解决方法
  5. Android之远程查看异常崩溃信息——腾讯Bugly的自动集成
  6. Microsoft Visio 2013在安装过程中出错的一种解决方案
  7. 不同终端通信用c语言实现,采用蓝牙技术的北斗终端通信模块的设计
  8. Unity 资源管理插件
  9. 磕技术、筑平台,浪潮存储如何持续破局?
  10. 助力数字经济,服务数智化转型,用友火力全开