从Android 2.3开始提供了一个新的类StrictMode,该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者改进程序,使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞。
推荐博客:
http://www.cnblogs.com/zelos/archive/2011/02/27/1966403.html
ANR窗口产生的原因是多种多样的。程序的主线程因为IO读写或网络阻塞而导致被阻塞了,外部存储设备被独占了或系统负荷(load)过高
(即不是自己编写的程序的问题,可能是系统或者其他第三方程序导致的问题),都有可能导致ANR窗口的出现。
从Android 2.3开始提供了一个新的类StrictMode,可以帮助开发者改进他们的Android应用,StrictMode可以用于捕捉发生在应用程序
主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者使其改进程序,使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,
避免主线程被阻塞,导致ANR窗口的发生。
下面简要说明下Android 2.3新特性StrictMode限制模式的工作方式,见下面的代码:
publicvoid onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O
.penaltyLog() //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite数据库操作
.penaltyLog() //打印logcat
.penaltyDeath()
.build());
}
super.onCreate();
}
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O
.penaltyLog() //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite数据库操作
.penaltyLog() //打印logcat
.penaltyDeath()
.build());
}
super.onCreate();
}
上述代码可以在Application的OnCreate中添加,这样就能在程序启动的最初一刻进行监控了。
输出log如下:
02-27 10:03:56.122: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=696 ms:android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:228)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.io.FileWriter.<init>(FileWriter.java:42)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at org.zelos.asm.main.writeFile(main.java:30)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at org.zelos.asm.main.onCreate(main.java:19)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.Looper.loop(Looper.java:123)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invoke(Method.java:507)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at dalvik.system.NativeStart.main(Native Method)
02-27 10:03:56.162: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=619 ms:android.os.StrictMode$StrictModeDiskWriteViolation: policy=23 violation=1
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:732)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:230)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.io.FileWriter.<init>(FileWriter.java:42)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at org.zelos.asm.main.writeFile(main.java:30)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at org.zelos.asm.main.onCreate(main.java:19)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.os.Looper.loop(Looper.java:123)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invoke(Method.java:507)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at dalvik.system.NativeStart.main(Native Method)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:228)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.io.FileWriter.<init>(FileWriter.java:42)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at org.zelos.asm.main.writeFile(main.java:30)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at org.zelos.asm.main.onCreate(main.java:19)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.Looper.loop(Looper.java:123)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invoke(Method.java:507)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-27 10:03:56.122: DEBUG/StrictMode(16210): at dalvik.system.NativeStart.main(Native Method)
02-27 10:03:56.162: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=619 ms:android.os.StrictMode$StrictModeDiskWriteViolation: policy=23 violation=1
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:732)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:230)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.io.FileWriter.<init>(FileWriter.java:42)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at org.zelos.asm.main.writeFile(main.java:30)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at org.zelos.asm.main.onCreate(main.java:19)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.os.Looper.loop(Looper.java:123)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at java.lang.reflect.Method.invoke(Method.java:507)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-27 10:03:56.162: DEBUG/StrictMode(16210): at dalvik.system.NativeStart.main(Native Method)
相关推荐
作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对话框等等问题。既然有性能问题,就需要进行性能优化。正所谓工欲善其事,必先利其器。一个好的...
`StrictMode`旨在提升应用性能和用户体验,但在不同版本之间适配可能会带来挑战。 在Android 2.x版本中,网络操作可以直接在主线程中执行,但这样做会导致UI阻塞,影响用户体验。而在Android 3.0及以上版本,如果在...
通过使用StrictMode,可以很方便地检查Android应用程序的性能和存在的问题。 StrictMode主要分为两种策略:线程监控策略和虚拟机监控策略。 线程监控策略通过setThreadPolicy()方法应用于当前线程,可以监控磁盘...
### StrictMode在Android开发中的应用详解 #### 一、StrictMode概述 StrictMode是自Android 2.3(Gingerbread)版本...然而,正如任何工具一样,只有在正确理解和恰当使用的情况下,StrictMode才能发挥其最大的效用。
6. 具体技术手段:在Android性能优化过程中,开发者可能需要使用到各种技术手段和工具。例如,使用TraceView和Systrace来分析方法调用和线程行为;利用StrictMode检测主线程的阻塞操作;以及在应用中加入合理的缓存...
Android性能优化是一个涵盖...总的来说,Android性能优化是一个持续的过程,需要开发者深入了解系统工作原理,熟练使用各种工具,以及不断实践和优化。通过以上各个方面的综合运用,可以显著提升应用的性能和用户体验。
### Android应用性能优化的重要性 在当今移动互联网时代,Android应用已成为人们生活中不可或缺的一部分。...通过上述步骤和方法的应用,可以显著提升Android应用的整体性能,为用户提供更佳的使用体验。
内存泄露是Android应用中常见的问题之一,它会导致应用使用越来越多的内存,最终耗尽系统资源或被系统杀死。开发者需要熟悉Android的内存管理机制,包括使用Android Studio中的Profiler工具进行实时监控和分析。此外...
综上所述,《360°全方面性能调优.pdf》这份文档是一份针对Android性能优化的综合指南,它不仅涵盖了代码编写中的基本设计原则和数据结构、算法,也详细讲述了程序性能和开发效率的优化方法,为Android开发人员提供...
《Android性能优化典范 - 第2季 - 胡凯》是关于Android应用性能优化的一系列教程,重点关注在Android Wear设备上的最佳实践。本教程通过一系列短视频涵盖了多个关键优化领域,如电量优化、网络优化,特别是在Android...
1.1 Android如何执行代码 1.2 优化斐波纳契数列 1.2.1 从递归到迭代 1.2.2 BigInteger 1.3 缓存结果 1.4 API等级 1.5 数据结构 1.6 响应能力 1.6.1 推迟初始化 ...
10. **使用Traceview等分析工具**:Android SDK自带的分析工具如Traceview,用于深入分析应用程序的性能瓶颈,帮助定位和优化性能问题。 通过以上十点,开发者可以系统地对Android应用进行性能优化,提高其运行效率...
【Android 应用性能优化】 在Android应用开发中,性能优化是至关重要的,因为它直接影响到用户的体验和应用的留存率。以下是从标题和描述中提取的十个关键要点,旨在提升Android应用的性能: 1. **良好的编程习惯*...
- CPU Profiler和Systrace是Android Studio内置的性能分析工具,用于跟踪CPU使用、内存分配等。 - StrictMode可以帮助检测应用程序中的潜在性能问题。 - Profilo是Facebook开源的性能分析工具,利用PLTHook技术hook ...
测试线程相关代码时,可以使用Android的 StrictMode API 来检测主线程上的不恰当操作,或者利用Logcat输出线程信息进行调试。 10. **最佳实践** - 尽可能减少主线程中的阻塞操作。 - 使用合适的线程模型,如...
4. **启用StrictMode**:从Android 2.3开始,开发者可以使用StrictMode检测主线程中的性能问题,如磁盘读写和网络访问,从而优化应用,确保UI的流畅性。 5. **发布前禁用或减少调试**:在应用发布之前,应移除或...
理解这个问题并找到解决方案对于优化应用性能和提升用户体验至关重要。 首先,我们要明白Android系统的多线程机制。主线程,也称为UI线程,负责处理用户界面的更新和交互。而网络请求、文件读写等耗时操作应当在...
2. 启用`StrictMode`来检测潜在的性能问题和资源泄露。 3. 使用内存分析工具,如MAT(Memory Analyzer Tool)来分析Hprof文件,查找内存泄漏或对象引用循环。 4. 对于递归问题,可以设置递归深度限制或者考虑使用非...