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
相关产品推荐
相关产品推荐

