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当然会继续扩展。
分享到:
相关推荐
StrictMode是自Android 2.3(Gingerbread)版本起引入的一个功能,它作为开发者模式的一部分,为应用程序提供了一种检测和报告应用行为中潜在问题的机制。通过启用StrictMode,开发者可以监控并捕获应用在运行时可能...
"api-82"指的是该API兼容Android 2.3.3(API级别82,即Gingerbread MR1版本)。 Xposed API-82包含两个主要文件: 1. **api-82.jar**:这是核心的Xposed库文件,其中包含了开发者编写Xposed模块所需的所有接口和类...
**ACME Gingerbread Kit** 是一个为ACME Resource Pack打造的独特主题变体,专注于创造一个充满圣诞节和冬季风情的游戏体验。这个资源包以其创新的纹理设计,为玩家提供了丰富的建筑素材,让玩家能够构建出富有节日...
1. **传感器API的改进**:Android Gingerbread扩展了Sensor类和SensorManager服务,提供了更多的接口和事件类型,使开发者可以更方便地访问和管理设备上的各种传感器。 2. **低功耗传感器支持**:为适应日益增长的...
Camera1 API适用于Android 2.3(Gingerbread)至Android 4.3(Jelly Bean MR2),而Camera2 API是自Android 5.0(Lollipop)开始引入的,提供了更强大的功能和控制。 1. Camera1 API:这是早期的API,主要用于基本...
- **API Level 9**:对应Android 2.3(Gingerbread),增强了输入法、摄像头等功能。 - **API Level 10**:对应Android 2.3.3(Gingerbread MR1),小幅更新。 - **API Level 11**:对应Android 3.0(Honeycomb),...
6. **库和API**:Android SDK提供了丰富的API,如SQLite数据库、多媒体处理、网络通信等,方便开发者构建应用程序。 7. **编译工具链**:从源代码到可执行程序,需要经过编译、链接等步骤,这些工具链如GCC、NDK等...
Android 2.3.3,又称为Gingerbread(姜饼),是Google在2010年12月推出的Android操作系统版本,对应的API级别为10。这个版本的发布为移动设备带来了诸多改进和新特性,包括性能优化、电池管理、用户界面升级以及对多...
前者主要用于Android 2.3(Gingerbread)及更早版本,后者则从Android 3.0(Honeycomb)开始引入,是目前主流的接口。ContactsContract API提供了更强大、灵活和高效的方式来处理联系人数据。 1. **...
API Level 10(Gingerbread)加强了对蓝牙2.1的支持,提升了设备间的数据传输效率。 API Level 11(Honeycomb)是专为平板电脑设计的版本,引入了ActionBar和Fragment,使得在大屏幕设备上构建复杂的用户界面变得...
#### Android 2.3 "Gingerbread" - **发布时间**:2010年12月6日 - **API Level**:10 - **描述**:专注于提高整体性能。 - **特点**: - 提高了电源管理能力。 - 引入了近场通信(NFC)支持。 - 改进了摄像头应用...
Android API级别6对应的是Android 2.3 (Gingerbread)版本,而API级别7对应的是Android 2.2 (Froyo)。这两个版本在Android历史上具有重要意义,因为它们引入了许多关键功能和改进。 在Android 2.3 (Gingerbread)中,...
这个文件包含了Android SDK中的核心类库,让开发者能够访问并使用Android API的各种功能。在描述中提到的2.3、2.3.3以及4.2.2,代表了不同的Android版本,这表明该"android.jar"包含了这些特定版本的系统API。 1. *...
而XposedBridgeApi-54.jar则相对老旧,可能适用于更早版本的Android系统,比如Android Gingerbread (2.3)。在开发Xposed模块时,选择与目标设备系统版本相匹配的API版本是非常关键的,因为错误的版本可能导致模块...
1. **Canvas**和**Bitmap**:ApiDemos展示了如何在Canvas上进行绘图和处理位图,包括自定义视图和复杂的2D图形绘制。 2. **OpenGL ES**:针对移动设备优化的3D图形库,ApiDemos包含了一些简单的OpenGL ES 2.0示例。...
而Android 2.3(Gingerbread)API则加强了电源管理,优化了多媒体支持,为开发者提供了更多创新的空间。 在Android开发中,"android.widget"包尤为重要,它包含了Android UI框架的核心组件,如Button、TextView、...
“AndroidBox0.5”这个版本可能代表了一次更新,其中可能包括了对Android SDK某个特定版本(可能是Android 2.3 Gingerbread到4.0 Ice Cream Sandwich之间,因为0.5通常对应早期的Android版本)的中文翻译。...
Android 2.3(Gingerbread)则进一步增强了平台的稳定性和效率,同时引入了一些新特性,如多任务支持、蓝牙键盘和打印机支持等。在API文档中,开发者可以找到如何使用`android.app.Service`实现后台服务,以支持长...
Android 2.3.3-2.3.7 SDK API 10是Android操作系统的一个重要版本,它在2010年12月发布,代号为“Gingerbread”(姜饼)。这个版本带来了许多改进和新特性,对开发者来说具有深远的影响。下面将详细阐述其中的关键...