You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:58:17