Android 9设备如何通过Firebase收集ANR日志?是否需升级付费版?
问题解答
1. 是否需要升级Firebase付费版?
不需要。Firebase Crashlytics不管是免费版还是付费版,原生仅支持Android 11及以上版本的ANR自动收集,升级付费版无法解决Android 9设备的ANR日志收集问题。
2. 收集Android 9设备ANR并上报Firebase的方案
方案一:自定义ANR监控+上报到Crashlytics
通过代码实现主线程阻塞检测,手动收集ANR堆栈信息后,调用Crashlytics的API完成上报:
步骤1:实现ANR监控逻辑
通过后台线程监控主线程消息队列的响应情况,示例代码如下:
public class ANRWatchDog extends Thread { private static final int ANR_TIMEOUT = 5000; // 匹配系统ANR判定的5秒阈值 private volatile boolean mRunning = true; @Override public void run() { super.run(); while (mRunning) { final AtomicBoolean responded = new AtomicBoolean(false); // 向主线程空闲队列添加检测任务 Looper.getMainLooper().getQueue().addIdleHandler(() -> { responded.set(true); return false; }); try { Thread.sleep(ANR_TIMEOUT); // 超时未收到主线程响应,判定为ANR if (!responded.get()) { // 收集主线程堆栈信息 StringBuilder stackTrace = new StringBuilder(); for (StackTraceElement element : Looper.getMainLooper().getThread().getStackTrace()) { stackTrace.append(element.toString()).append("\n"); } // 上报到Crashlytics reportANRToFirebase(stackTrace.toString()); } } catch (InterruptedException e) { e.printStackTrace(); } } } private void reportANRToFirebase(String stackTrace) { // 用RuntimeException包装ANR信息,上报为非致命异常 RuntimeException anrException = new RuntimeException("ANR Detected (Android 9)\n" + stackTrace); FirebaseCrashlytics.getInstance().recordException(anrException); // 可选:添加时间戳日志辅助排查 FirebaseCrashlytics.getInstance().log("ANR triggered at: " + System.currentTimeMillis()); } public void stopWatchDog() { mRunning = false; interrupt(); } }
步骤2:启动监控
在Application的onCreate()方法中初始化并启动监控:
@Override public void onCreate() { super.onCreate(); new ANRWatchDog().start(); }
方案二:集成第三方ANR检测库后上报
可以使用成熟的第三方ANR检测库(如ANRWatchDog),这类库已封装好稳定的检测逻辑,只需在检测到ANR时调用Crashlytics的上报API即可,核心逻辑和方案一一致。
注意事项
- 自定义监控的阈值需和系统ANR判定逻辑保持一致,确保检测准确性。
- 上报的ANR信息会出现在Crashlytics的「非致命异常」分类下,可通过
ANR Detected关键词筛选查看。
内容的提问来源于stack exchange,提问作者Politchi Li
相关产品推荐
相关产品推荐

