Android StrictMode:提升应用响应的开发工具详解

2 下载量 86 浏览量 更新于2024-09-03 收藏 569KB PDF 举报
Android严苛模式(StrictMode)是Android 2.3(API 9)引入的一个强大的工具,用于辅助开发者识别和解决代码中的不规范行为,以提升应用程序的响应能力和用户体验。它特别关注主线程的同步和性能消耗,对于那些可能导致应用延迟或ANR(应用程序无响应)的常见问题进行监控。 1. **使用场景与目的**: StrictMode的主要目标是帮助开发者避免在UI线程执行耗时操作,如网络请求、磁盘I/O或数据库操作,这些操作可能会阻塞用户界面,从而导致应用变得不可交互。通过检测和处理这些问题,开发者能够优化代码,确保应用在高压力环境下仍保持流畅。 2. **检测功能**: - **线程策略(ThreadPolicy)**: - 自定义耗时调用:`detectCustomSlowCalls()`用于捕获超过阈值的长时间运行方法。 - 磁盘读取:`detectDiskReads()`监控磁盘读操作。 - 磁盘写入:`detectDiskWrites()`监控磁盘写操作。 - 网络操作:`detectNetwork()`监控网络连接操作。 - **虚拟机策略(VmPolicy)**: - 活动泄露:`detectActivityLeaks()`检查Activity是否正确关闭。 - Closable对象泄露:`detectLeakedClosableObjects()`检查是否有未关闭的资源。 - SQLite对象泄露:`detectLeakedSqlLiteObjects()`监控SQLite对象的生命周期。 - 类实例数量限制:`setClassInstanceLimit()`设置类实例的最大数量,防止内存泄漏。 3. **工作原理**: StrictMode通过libcore.io.BlockGuardOs类进行底层操作,对关键的系统调用(如打开文件、读写磁盘等)进行拦截和监控。当检测到潜在问题时,它会记录错误、暂停线程,甚至杀死进程,以防止性能瓶颈和ANR的出现。 4. **实践建议**: 在开发过程中,开发者应该在合适的位置启用StrictMode,例如在初始化或配置阶段,以确保其在整个应用程序生命周期内有效监控。同时,对于检测到的问题,要及时修复代码,遵循Android的最佳实践,比如避免在主线程执行耗时操作,及时关闭不再使用的资源。 5. **官方文档**: 如需了解更多关于StrictMode的详细用法和配置选项,可参考Android官方文档:<http://developer.android.com/reference/android/os/StrictMode.html>。 Android严苛模式StrictMode是开发者进行性能优化和调试的重要工具,合理使用它可以帮助提升应用的整体性能和用户体验。

01-01 08:11:27.038 E/StrictMode( 2641): Tried to access the API:ViewConfiguration which needs to have proper configuration from a non-UI Context:com.android.camera.app.CameraApp@32d9eff The API:ViewConfiguration needs a proper configuration. Use UI contexts such as an activity or a context created via createWindowContext(Display, int, Bundle) or createConfigurationContext(Configuration) with a proper configuration. 01-01 08:11:27.038 E/StrictMode( 2641): java.lang.IllegalAccessException: Tried to access the API:ViewConfiguration which needs to have proper configuration from a non-UI Context:com.android.camera.app.CameraApp@32d9eff 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.StrictMode.assertConfigurationContext(StrictMode.java:2296) 01-01 08:11:27.038 E/StrictMode( 2641): at android.view.ViewConfiguration.get(ViewConfiguration.java:521) 01-01 08:11:27.038 E/StrictMode( 2641): at android.view.View.<init>(View.java:5321) 01-01 08:11:27.038 E/StrictMode( 2641): at android.widget.ImageView.<init>(ImageView.java:181) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.data.PhotoItem.getView(PhotoItem.java:127) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.data.CameraFilmstripDataAdapter.getView(CameraFilmstripDataAdapter.java:151) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.widget.FilmstripView.buildViewItemAt(FilmstripView.java:850) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.widget.FilmstripView.reload(FilmstripView.java:1827) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.widget.FilmstripView.access$1300(FilmstripView.java:58) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.widget.FilmstripView$3.onFilmstripItemLoaded(FilmstripView.java:1567) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.data.CameraFilmstripDataAdapter.replaceItemList(CameraFilmstripDataAdapter.java:276) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.data.CameraFilmstripDataAdapter.access$700(CameraFilmstripDataAdapter.java:39) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.data.CameraFilmstripDataAdapter$QueryTask.onPostExecute(CameraFilmstripDataAdapter.java:447) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.camera.data.CameraFilmstripDataAdapter$QueryTask.onPostExecute(CameraFilmstripDataAdapter.java:379) 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.AsyncTask.finish(AsyncTask.java:771) 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.AsyncTask.access$900(AsyncTask.java:199) 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788) 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.Handler.dispatchMessage(Handler.java:106) 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.Looper.loopOnce(Looper.java:201) 01-01 08:11:27.038 E/StrictMode( 2641): at android.os.Looper.loop(Looper.java:288) 01-01 08:11:27.038 E/StrictMode( 2641): at android.app.ActivityThread.main(ActivityThread.java:7870) 01-01 08:11:27.038 E/StrictMode( 2641): at java.lang.reflect.Method.invoke(Native Method) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 01-01 08:11:27.038 E/StrictMode( 2641): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

2023-07-14 上传

android.os.strictmode.DiskReadViolation at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1596) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:249) at libcore.io.ForwardingOs.open(ForwardingOs.java:166) at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7844) at libcore.io.MemoryMappedFile.mmapRO(MemoryMappedFile.java:54) at libcore.timezone.ZoneInfoDb.loadData(ZoneInfoDb.java:185) at libcore.timezone.ZoneInfoDb.loadTzDataWithFallback(ZoneInfoDb.java:119) at libcore.timezone.ZoneInfoDb.<clinit>(ZoneInfoDb.java:46) at java.util.TimeZone.getTimeZone(TimeZone.java:579) at java.util.TimeZone.getDefaultRef(TimeZone.java:724) at java.util.TimeZone.getDefault(TimeZone.java:700) at java.text.SimpleDateFormat.initializeCalendar(SimpleDateFormat.java:743) at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:687) at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:666) at com.hryt.remoter.uimce.app.CrashHandler.<init>(CrashHandler.java:53) at com.hryt.remoter.uimce.app.CrashHandler.<clinit>(CrashHandler.java:49) at com.hryt.remoter.uimce.app.CrashHandler.getInstance(CrashHandler.java:65) at com.hryt.remoter.uimce.app.RemoterApplication.onCreate(RemoterApplication.java:32) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7013) at android.app.ActivityThread.access$1300(ActivityThread.java:238) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1921) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7958) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

2023-06-08 上传