博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 应用性能优化-StrictMode(严格模式)
阅读量:6501 次
发布时间:2019-06-24

本文共 1740 字,大约阅读时间需要 5 分钟。

  hot3.png

UI线程如果被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来说是一个很严重的问题。 如何防止应用程序出现ANR,怎么分析查看导致ANR问题的原因? 我们来介绍Android的严格模式。

怎样开启严格模式

有两种开启方式。

  • 开发者选项

进入开发者选项,里面找到启用严格模式,打开。 当应用主线程执行长时间操作的话会闪锁屏幕。

  • StrictMode API(代码调用)

可以在Activity或者自定义的Application类的onCreate方法里面开启StrictMode。

// 设置线程策略StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()    .detectDiskReads() // 磁盘读    .detectDiskWrites() // 磁盘写    .detectNetwork()   // 网络    .penaltyLog()    .build());// 设置VM策略StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()    .detectActivityLeaks()    .detectLeakedSqlLiteObjects() // SQLite 对象    .detectLeakedClosableObjects()     .penaltyLog()    .penaltyDeath() // 触发违规操作,kill应用    .build());

怎样使用StrictMode API

StrictMode可以理解为设置策略、侦测违规操作、惩罚。

设置策略有两种

  • setThreadPolicy // 设置线程策略
  • setVmPolicy // 设置VM策略

侦测违规操作包含如下,可分为线程策略可侦测的违规操作和 VM策略可侦测的违规操作

线程策略可侦测的违规操作

  • detectDiskReads()
  • detectDiskWrites()
  • detectNetwork()
  • detectCustomSlowCalls()

VM策略可侦测的违规操作

  • detectActivityLeaks()
  • detectLeakedSqlLiteObjects()
  • detectLeakedClosableObjects()
  • detectFileUriExposure()
  • detectLeakedRegistrationObjects()

惩罚方式

  • penaltyLog() // 打印log
  • penaltyDeath() // 杀掉进程
  • penaltyDialog() // 弹出对话框

怎样分析StrictMode Log

可以通过 adb shell 来过滤StrictMode log。

adb logcat -s StrictMode

过滤StrictMode log如下:

02-12 21:43:41.580: E/StrictMode(14269): class com.test.TestActivity; instances=2; limit=102-12 21:43:41.580: E/StrictMode(14269): android.os.StrictMode$InstanceCountViolation: class com.example.testa.BActivity; instances=2; limit=102-12 21:43:41.580: E/StrictMode(14269): at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

instances=2 limit=1,说名限制的TestActivity实例只能是一个,却有两个实例,说明TestActivity有内存泄漏。

其他StrictMode Log 可以根据上下文的描述分析是什么违规导致。

转载于:https://my.oschina.net/oldmou/blog/681134

你可能感兴趣的文章
测试用例出错重跑--flaky插件
查看>>
yaf的安装
查看>>
比较java与C++的不同
查看>>
Twitter Storm入门
查看>>
使用scikit-learn进行文本分类
查看>>
Ansible自动化运维配置与应用(结合实例)
查看>>
下面简要介绍软件工程的七条原理
查看>>
java POI实现excel实现表格导出
查看>>
Lua(三)——语句
查看>>
怎么看电脑有没有安装USB3.0驱动
查看>>
overflow清除浮动的原理
查看>>
Spring Boot 使用parent方式引用时 获取值属性方式默认@
查看>>
解决maven下载jar慢的问题(如何更换Maven下载源)
查看>>
linux安装gitLab
查看>>
concurrent包的实现示意图
查看>>
golang os.Args
查看>>
Linux常用命令
查看>>
spring-data-elasticsearch 概述及入门(二)
查看>>
Solr启动和结束命令
查看>>
1.12 xshell密钥认证
查看>>