关于应用ANR的一些事儿

180 阅读1分钟

ANR的触发

  • Broadcast timeout
  • Service timeout
  • ContentProvider timeout
  • InputDispatcher timeout

ANR时都获取了谁的trace

firstPids : ANR 应用的pid, persistent app pid, system_server

extraPids : LRU 链表中,CPU 使用前5的应用

nativePids :


      // Which native processes to dump into dropbox's stack traces
      public static final String[] NATIVE_STACKS_OF_INTEREST = new String[] {
          "/system/bin/audioserver",
          "/system/bin/cameraserver",
          "/system/bin/drmserver",
          "/system/bin/mediadrmserver",
          "/system/bin/mediaserver",
          "/system/bin/netd",
          "/system/bin/sdcard",
          "/system/bin/surfaceflinger",
          "/system/bin/vold",
          "media.extractor", // system/bin/mediaextractor
          "media.metrics", // system/bin/mediametrics
          "media.codec", // vendor/bin/hw/android.hardware.media.omx@1.0-service
          "media.swcodec", // /apex/com.android.media.swcodec/bin/mediaswcodec
          "com.android.bluetooth",  // Bluetooth service
          "/apex/com.android.os.statsd/bin/statsd",  // Stats daemon
      };

其它的一些tips

  • dump trace 的时候,要看reportLatency,如果大于1分钟,只dump自己的trace
  • 判断是否是SilentAnr,如果是,则只dump自己
  • 读取/proc/stat 和 /proc/pid 节点来统计CPU的使用情况
  • 如果是SilentAnr,dump 完trace之后,直接kill 应用,不会弹出error 对话框

基于Android R的时序图

1.png