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

Android 12中Firebase Crashlytics出现jdk.internal.misc.Unsafe.park相关问题求助

解决Android 12上Firebase Crashlytics导致的主线程阻塞问题

针对你在Android 12设备上捕获到的Crashlytics相关主线程阻塞(堆栈指向jdk.internal.misc.Unsafe.park)问题,可通过以下步骤解决:

1. 升级Firebase Crashlytics SDK至最新稳定版

该问题大概率是SDK在Android 12上的兼容性bug,Google后续版本已修复主线程阻塞逻辑。更新依赖:

// 使用Firebase BOM管理版本,确保所有Firebase依赖版本一致
implementation platform('com.google.firebase:firebase-bom:32.7.1') // 替换为最新BOM版本
implementation 'com.google.firebase:firebase-crashlytics'

可在Firebase官方文档查看最新版本号,避免依赖冲突。

2. 禁止在主线程执行Crashlytics耗时操作

检查代码中是否存在主线程调用Crashlytics上报、同步等逻辑,将其移至后台线程:

// 错误示例:主线程直接上报异常
FirebaseCrashlytics.getInstance().recordException(throwable);

// 正确做法:后台线程执行
new Thread(() -> FirebaseCrashlytics.getInstance().recordException(throwable)).start();

3. 自定义未捕获异常处理器,规避主线程阻塞

若升级SDK后问题仍存在,自定义处理器将Crashlytics的异常处理逻辑放到后台:

public class CustomCrashHandler implements Thread.UncaughtExceptionHandler {
    private final Thread.UncaughtExceptionHandler defaultHandler;
    private final FirebaseCrashlytics crashlytics;

    public CustomCrashHandler() {
        defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        crashlytics = FirebaseCrashlytics.getInstance();
    }

    @Override
    public void uncaughtException(@NonNull Thread thread, @NonNull Throwable throwable) {
        // 后台线程处理Crashlytics上报
        new Thread(() -> crashlytics.recordException(throwable)).start();
        // 交给系统默认处理器处理崩溃流程
        if (defaultHandler != null) {
            defaultHandler.uncaughtException(thread, throwable);
        }
    }
}

在Application的onCreate中设置:

Thread.setDefaultUncaughtExceptionHandler(new CustomCrashHandler());

4. 开启Android 12主线程严格模式,提前发现问题

Android 12对主线程阻塞监控更严格,开启严格模式可在开发阶段捕获阻塞问题:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .penaltyDeath()
            .build());
}

5. 优化Crashlytics初始化逻辑

确保Crashlytics初始化在后台线程完成,避免主线程初始化阻塞:

new Thread(() -> {
    FirebaseApp.initializeApp(this);
    FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
}).start();

内容的提问来源于stack exchange,提问作者Saurabh Jadhav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:40:39