Unity构建启动崩溃(API等级31及以上):PendingIntent参数缺失问题
解决TargetSdk 31+启动崩溃(PendingIntent Flag缺失)问题
问题根源
Android 12(API 31)及以上版本强制要求创建PendingIntent时必须指定FLAG_IMMUTABLE或FLAG_MUTABLE标记,未指定会直接触发崩溃。你遇到的情况大概率是依赖的第三方SDK(Firebase/AdMob)旧版本未适配该规则,或者自己代码中存在未添加标记的PendingIntent创建逻辑。
分步解决方案
1. 优先升级第三方SDK到最新稳定版
Firebase和AdMob官方早已针对API31+适配了PendingIntent的标记要求,升级到最新版本通常能直接解决问题:
- Firebase SDK:使用Firebase BOM统一管理版本,确保所有Firebase组件版本一致且最新。在
build.gradle(Module级别)中更新:dependencies { // 使用Firebase BOM获取最新版本 implementation platform('com.google.firebase:firebase-bom:32.7.0') // Crashlytics和Analytics implementation 'com.google.firebase:firebase-crashlytics' implementation 'com.google.firebase:firebase-analytics' } - AdMob SDK:更新广告依赖到最新稳定版:
注:版本号可根据官方最新发布调整,确保使用当前最新稳定版。dependencies { implementation 'com.google.android.gms:play-services-ads:22.6.0' }
2. 检查并修复自有代码中的PendingIntent
如果升级SDK后仍崩溃,排查自己代码中所有创建PendingIntent的场景(如通知、闹钟、广播跳转等),添加对应标记:
- 优先使用
FLAG_IMMUTABLE(绝大多数场景推荐,避免意外修改Intent):// 示例:创建跳转Activity的PendingIntent Intent intent = new Intent(this, TargetActivity.class); PendingIntent pendingIntent; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { pendingIntent = PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); } else { pendingIntent = PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT ); } - 仅当业务需要修改
PendingIntent内部的Intent时,才使用FLAG_MUTABLE(如某些动态更新通知内容的场景)。
3. 排查隐藏的PendingIntent依赖
如果以上两步都没解决,检查是否使用了其他间接依赖PendingIntent的组件:
- 自定义通知渠道或通知创建逻辑
- 第三方推送SDK(如果除Firebase外还有其他)
- 闹钟任务(
AlarmManager)或定时任务
验证方法
升级依赖/修复代码后,清理项目缓存(Build > Clean Project),重新构建并在API31+的设备/模拟器上测试启动,确认崩溃消失。
内容的提问来源于stack exchange,提问作者Baraa Halabi
相关产品推荐
相关产品推荐

