StrictMode是Gingerbread的一个新API,用来设置对一个thread的策略,你可以设置不允许在这个thread上执行的某些操 作,并且设置对应的惩罚措施,如果出现不允许的操作的话。通过优雅的设计,这些策略可以通过一些整数很容易的指定。 
默认情况下,你允许所有的操作,除非你已经指定了。你可以指定如下的一些操作: 
detect disk writes

detect disk reads

detect network usage

on a violation: log

on a violation: crash

on a violation: dropbox

on a violation: show an annoying dialog

此外,在大多数访问磁盘(java.io.*,android.database.sqlite.*)或者网络(java.net.*)的地方 StrictMode有一大堆钩子,在那可以检查thread的策略,执行你的指令。

StrictMode强大的地方是每个thread的策略是可以自我繁殖的,当Binder IPC 调用Services或者Providers,

你也许知道你的应用在什么时候访问的磁盘,但是你知道系统中的那些services和providers什么时候会访问吗?我不知道,但肯定有很 多地方访问。因此我习惯使用StrictMode来帮忙,找出那些不经意中访问了磁盘的地方。

等等,为什么要访问磁盘?Android 设备不是一直允许在内存中吗?就像一个超速的SSD?我不需要去关心?不幸的是,我们需要关心。 
你不能指望android设备上的内存或者文件系统一如既往的快。在许多android设备上使用的YAFFS文件,当执行操作时,有一个全局的 锁。只有一个磁盘操作能真正执行,不幸运的话,即使一个简单的"stat"操作也会让你等上一会。其他设备上基于传统的阻塞式文件系统,可能偶尔会让你饱 受等待的折磨,当系统去回收垃圾或者做一些清除的操作时。 
Android的回掉和生命周期事件都是在主thread(即UI thread)上发生的。很多时候让我们更轻松,但是有时候,你总是需要小心一点,因为所有的动画,拖动,以及手势的处理过程都是在主thread上回掉 完成的。 
如果你想以60帧/秒的速度动画,同时处理一个输入事件,你需要在16ms内做出反应,如果你的处理过程超过了16ms,比如写操作,可能就会导 致动画卡顿。读操作可能更好点,但是也可能超过16ms,尤其是在YAFFS上,如果你正在等待一个文件锁,而该文件正写操作了一半。 
网络尤其会慢,而且不连续,因此你不能在主thread上进行网络的请求操作。事实上,即将发布的Honeycomb版本,我们把在主 thread上请求网络,视为一个严重的错误,如果那样,除非你的应用工作在Honeycomb之前的版本上.因此如果你想使用Honeycomb SDK,请确保不要在UI thread上请求网络。 
启用StrictMode 
推荐的使用StrictMode的方式是,在开发阶段,打开它,在发布应用前,关闭它。 
例如:在你的应用中,onCreate(): 
public void onCreate() { 
     if (DEVELOPER_MODE) { 
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
                 .detectDiskReads() 
                 .detectDiskWrites() 
                 .detectNetwork() 
                 .penaltyLog() 
                 .build()); 
     } 
     super.onCreate(); 

或者简单点:

public void onCreate() { 
     if (DEVELOPER_MODE) { 
         StrictMode.enableDefaults(); 
     } 
     super.onCreate(); 

后面这种方式是为了兼容Gingerbread之前的版本而特意添加的API,让你仍然能使用StrictMode或者其他的技术。例如:你能在 Donut(Android 1.6)上使用,如果你在Gingerbread的设备或者模拟器上调试的话。 
Watching StrictMode 
如果你使用penaltyLog(),也是默认选项,只需要运行adb logcat ,查看终端输出,一些违反规则的信息会在这控制台上打出来, 
如果你想更炫一点,打开penaltyDropbox(),将使用DropBoxManager来写,你可以使用以下命令解压来查看: 
adb shell dumpsys dropbox data_app_strictmode --print

Tops on being smooth 
除了Thread和java.util.concurrent.*,还可以检查如下Android APIs,如Handler,AsyncTask,AsyncQueryHandler,IntentService.

我们的经验 
开发Android时,每天我们有一个新的"dogfood"编译工整个组使用,贯穿整个开发Gingerbread的过程中,我们每天编译,使 用StrictMode来记录和上传发现的违规部分,用来分析。每个小时,有一个MapReduce作业在运行,生成一个交互的报告,所有事件的循环场 景,堆栈内容,出现的比率,出现在哪些过程/包中,等等。 
使用这些由StrictMode收集的数据,我们修复了整个系统中上百个无响应的bug和动画故障。我们在Android核心(系统 services和providers)做性能优化,所有的应用都会因此受益,也同时修复了巨量的应用方面的问题。即使你还在使用Froyo,最近的 GMail,Google Maps, 和YouTube的更新也因此受益,通过使用Gingerbread设备来收集数据。 
我们不能使系统自动变快,转而我们通过增加一些API来使这些工作更加容易高效。 
让系统更快,当然不能完全归功于StrictMode,Gingerbread中新的并发垃圾收集器也极大的减少了这些潜伏的短暂没反应的问题。

以后StrictMode API当然会继续扩展。

Android 2.3的StrictMode使用相关推荐

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

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

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

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

  3. 实战-Android 关闭Userdebug版本StrictMode

    引入问题 StrictMode 会在/data/system/dropbox 中生成大量的log文件,占用data分区存储空间. console:/data/system/dropbox # ls - ...

  4. Android性能调优--StrictMode

    转载自:https://blog.csdn.net/weixin_40763897/article/details/89018306 性能无外乎就是CPU密集型或I/O密集型两种. StrictMod ...

  5. strictmode android,Android 应用性能优化-StrictMode(严格模式)

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

  6. Android pms权限管理,Android权限机制

    为什么有权限机制 我们知道 Android 应用程序是沙箱隔离的,每个应用都有一个只有自己具有读写权限的专用数据目录.但是如果应用要访问别人的组件或者一些设备上全局可访问的资源,这时候权限机制就能系统 ...

  7. android 7.0拷贝文件,Android 7.0应用间共享文件----FileProvider

    应用间经常需要将自己的私有文件共享给其他的app,如某应用想要共享图库的图片用来编辑用户的头像,或者文件管理app允许用户在不同目录下复制粘贴文件等等,但为了保护私有文件的安全性,在targetSdk ...

  8. Android 7.0 Nougat介绍

    Android 7.0 Nougat 1.多窗口支持 在 Android 7.0 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 - 多窗口支持. 现在,用户可以一次在屏幕上打开两个应用. ...

  9. takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...

    TakePhoto是一款用于在Android设备上获取照片(拍照或从相册.文件中选择).裁剪图片.压缩图片的开源工具库,目前最新版本4.0.2. 3.0以下版本及API说明,详见TakePhoto2. ...

最新文章

  1. 测试社交软件有哪些,性格测试:测你适合哪个社交平台
  2. mpvue 从零开始 女友的衣装 1 pages
  3. shell内部命令和外部命令
  4. 转载]转如何理解 File's Owner 与 First Responder
  5. python提取cad坐标_从CAD图里提取坐标的方法
  6. 神奇的 Magisk
  7. Unity资源热更-Addressables总结(一)
  8. 显微镜下的大明——第二个故事
  9. 计算机主机当机是什么意思,宕机什么意思_宕机是什么意思?_宕机的意思_电脑宕机是什么意思...
  10. UPC-5094 - Faulty Robot - 搜索
  11. 非线性方程求根方法——二分法
  12. Arranging The Sheep
  13. 自兴人工智能学院有话说,好机构培养好人才!
  14. pom引入外部jar
  15. 目标窗口检测算法-NMS非极大值抑制
  16. samba使用指定端口windows访问linux
  17. 【实训总结】Python从入门到前端知识小结,再到Flask框架搭建在线书城~
  18. 双十一假如有人把支付宝存储服务器炸了...
  19. bochs linux 安装软件,bochs linux镜像
  20. 评央企员工持股时隔11年将重启 个人比例不超5%

热门文章

  1. idea完美激活 转载
  2. java向上转型与向下转型
  3. 什么是职业测评?做职业测评有什么作用?
  4. 查看域名是否支持IPv6
  5. java怎么读取数据?
  6. 安卓学习笔记---支付宝支付-交易订单处理失败,请稍后再试。(提示ALI59错误)
  7. 苹果x为什么总黑屏_苹果X突然黑屏重启怎么回事?教你强制重启方法
  8. 华为1+X认证网络系统管理与运维中级实验
  9. 2.18 小红书的表情文案一键生成,原来这么简单【玩赚小红书】
  10. 大数据算法培养计划!