Android性能优化面试题经典之ANR的分析和优化

简介: Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

造成ANR的条件

以下四个条件都可以造成ANR发生:

  • InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件

  • BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。

  • Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。

  • ContentProvider Timeout :ContentProvider的publish在10s内没进行完。

常见的耗时操作

在Android开发中,导致应用程序无响应(ANR)的一些常见耗时操作包括:

网络操作

例如,HTTP 请求、下载文件、访问REST API等。网络操作通常需要较长的时间,尤其在网络条件不好的情况下。

数据库操作

大量的数据库查询、插入、更新、删除操作可能会占用大量时间。特别是如果在主线程进行这些操作时,会直接导致ANR。

文件读写

对大文件进行读写操作也可能非常耗时。这些操作同样不应在主线程中进行。

1、文件相关的一些API都要小心

包括但不限于 new File(),exists(),lastModified()等

2、读写一些assets目录下的文件,比如字体,频繁在布局里读取也会很耗时

复杂的计算任务

某些计算密集型任务如图像处理、加解密操作、复杂算法计算等,若在主线程中执行,也会导致界面卡死。

UI 渲染

复杂的UI更新或在UI线程中进行过多的绘图操作,也可能导致ANR。例如,加载巨大的图片或者执行频繁的动画。

锁等待

如果线程在主线程上获取锁资源(如synchronized块)时等待时间太长,也会引发ANR。

ContentProvider 访问

使用ContentProvider访问大量数据或复杂查询,如果在主线程中进行,也会导致ANR。

BroadcastReceivers

长时间运行的BroadcastReceiver(例如,在onReceive()中执行耗时操作)也可能导致ANR。广播接收器应该尽快完成其工作或将耗时任务移到异步线程。

Service 启动

如果在主线程中启动较为耗时的Service,也可能导致ANR。所以服务启动过程中的耗时操作应该在子线程中执行。

系统Service的调用

如果在主线程中调用系统的一些服务,也是耗时的,虽然不一定会ANR,但是也要注意。

比如包管理服务PackageManager

分析ANR的方式:

  • 分析logcat清晰地记录了ANR发生的时间,以及线程的tid
  • 分析traces.txt文件,搜索anr关键字

哪些地方是执行在主线程的

  • Activity的所有生命周期回调都是执行在主线程的.
  • Service默认是执行在主线程的.
  • BroadcastReceiver的onReceive回调是执行在主线程的.
  • 没有使用子线程的looper的Handler的handleMessage, post(Runnable)是执行在主线程的.
  • AsyncTask的回调中除了doInBackground, 其他都是执行在主线程的.
  • View的post(Runnable)是执行在主线程的.

使用子线程的方式有哪些

Java

  • 启Thread方式,或是线程池
  • 使用AsyncTask
  • HandlerThread
  • IntentService,Service是运行在主线程的, 然而IntentService是运行在子线程的.(官方建议使用JetPack组件中的WorkManager或者JobIntentService类代替它)
  • 使用Thread和HandlerThread时, 为了使效果更好, 建议设置Thread的优先级偏低一点

欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
12天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
21天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
45 15
Android 系统缓存扫描与清理方法分析
|
8天前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
14天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
27 5
|
13天前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
33 3
|
20天前
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
47 8
|
22天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
缓存 Android开发 数据格式
Android ListView性能优化,异步加载图片
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/48184383 ListView性能优...
1169 0
|
缓存 算法 Android开发
Android 性能优化——之图片的优化
Android 性能优化——之图片的优化  在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源。相对来说,其他的资源的影响会小一点。这里我就先对图片资源的优化进行一下讲解,如果有什么说的不对的,希望大神指正一下。
1080 0