• 面试复习题--ANR


    1、ANR出行的原生阀值

        1.broadcast前台超时时间为10秒,后台超时60秒

    1. static final int BROADCAST_FG_TIMEOUT = 10*1000;
    2. static final int BROADCAST_BG_TIMEOUT = 60*1000;

       2.按键无响应的超时时间为5秒,测量过程中为60毫秒

    1. // How long we wait until we timeout on key dispatching.
    2. static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
    3. // How long we wait until we timeout on key dispatching during instrumentation.
    4. static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000;

       3.前台service无响应的超时时间为20秒,后台service为200秒

    1. // How long we wait for a service to finish executing.
    2. static final int SERVICE_TIMEOUT = 20*1000;
    3. // How long we wait for a service to finish executing.
    4. 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

  • 相关阅读:
    安化云台山怎么玩?两日游攻略来啦
    八、2023.10.2.Linux(二).8
    Grafana----Grafana快速体验
    【UVA 101】 区块世界 The Blocks Problem or【POJ No.1208】
    算法竞赛进阶指南 0x68 二分图的匹配
    Java-网络编程
    如果一个人不爱你了,你只需拿回两样东西
    C++面试基础整理(私房菜)
    驱动开发:通过ReadFile与内核层通信
    Seata框架详解
  • 原文地址:https://blog.csdn.net/hqiangtai/article/details/126081778