概述
1、ANR出行的原生阀值
1.broadcast前台超时时间为10秒,后台超时60秒
static final int BROADCAST_FG_TIMEOUT = 10*1000;
static final int BROADCAST_BG_TIMEOUT = 60*1000;
2.按键无响应的超时时间为5秒,测量过程中为60毫秒
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
// How long we wait until we timeout on key dispatching during instrumentation.
static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000;
3.前台service无响应的超时时间为20秒,后台service为200秒
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20*1000;
// How long we wait for a service to finish executing.
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;
2、ANR的深层原因
- 单纯的block在UI线程,查看trace就行
- remote service reply timout ,查看对端进程callstack
- 短时间的大量message,查看app的行为
- system_wise 问题导致,查看CPU和内存情况,CPU占用率过高,负载过大,IO操作太多, 导致主线程无法得到CPU时间片等系统资源去执行,而产生ANR.
- 应用在主线程上非常缓慢地执行涉及 I/O 的操作。
- 应用在主线程上进行长时间的计算。 就是在主线程耗时操作太多;
- 主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。当前进程的主线程与其他进程进行Binder通信时, 由于Binder通信会让主线程挂起,等待对端的返回, 结果对端由于某些原因一直未返回, 导致当前进程的主线程无法往下执行而超市,产生ANR。
- 主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。指主线程与其他线程公用锁但是一直未得到锁, 导致超时,产生ANR;
- 主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。
- Binder被占满导致主线程无法和System_server进程通信,线程和System_server进程进行Binder通信,由于其他线程或者其他进程与System_server进程之间有太多Binder通信,将Binder池占满,导致主线程的Binder通信一直无法处理,超时产生ANR。
3、ANR的追踪套路
使用 StrictMode
有助于您在开发应用时发现主线程上的意外 I/O 操作。您可以在应用级别或 Activity 级别使用 StrictMode
。
您可以使用 TraceView 在查看用例时获取正在运行的应用的跟踪信息,并找出主线程繁忙的位置。如需了解如何使用 TraceView,请参阅使用 TraceView 和 dmtracedump 分析性能。
3.1 traces.txt
ANR优先查看此日志, AMS在ANR发生的时候,dump相关进程(ANR的进程、systemserver、mediaserver,surfaceFinger等)的当前栈到traces.txt。需要注意的是,traces.txt是抓取的是超时后(如input超时就是5s后)的snapshot,并不一定能够真实的反应出block的点。也存在抓到主线程没有block,在idle的情况。获取traces.txt的方式:adb pull /data/anr/traces.txt
3.2 applogcat-log
我们的logcat信息会打印在此处, 里面有较多的堆栈信息,按照日期,取出里面最新的日志。获取applogcat-log方式:adb pull /data/log/android_logs
3.3 dropbox
里面会记录不同的错误信息日志, 日志命名格式为 AA_BB@CC.txt, 其中AA表示进程名,BB表示异常类型, CC为时间戳,如 system_server_anr@13457689.txt, 就表示一个ANR异常的日志文件, 找到自己对应的时间及进程的日志信息即可。此日志可作为一个线索。获取方式:adb pull /data/system/dropbox
最后
以上就是友好电脑为你收集整理的面试复习题--ANR的全部内容,希望文章能够帮你解决面试复习题--ANR所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复