我是靠谱客的博主 友好电脑,最近开发中收集的这篇文章主要介绍面试复习题--ANR,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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的深层原因

  1.  单纯的block在UI线程,查看trace就行
  2. remote service reply timout ,查看对端进程callstack
  3. 短时间的大量message,查看app的行为
  4. system_wise 问题导致,查看CPU和内存情况,CPU占用率过高,负载过大,IO操作太多, 导致主线程无法得到CPU时间片等系统资源去执行,而产生ANR.
  5. 应用在主线程上非常缓慢地执行涉及 I/O 的操作。
  6. 应用在主线程上进行长时间的计算。 就是在主线程耗时操作太多;
  7. 主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。当前进程的主线程与其他进程进行Binder通信时, 由于Binder通信会让主线程挂起,等待对端的返回, 结果对端由于某些原因一直未返回, 导致当前进程的主线程无法往下执行而超市,产生ANR。
  8. 主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。指主线程与其他线程公用锁但是一直未得到锁, 导致超时,产生ANR;
  9. 主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。
  10. 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部