Android 12(S+)未使用PendingIntent仍报FLAG_IMMUTABLE异常求解
你遇到的Android 12+系统上的PendingIntent崩溃异常,核心原因是应用targetSdk升级到31及以上后,系统强制要求所有PendingIntent创建时必须明确指定FLAG_IMMUTABLE或FLAG_MUTABLE标识,你本身业务代码没有直接使用PendingIntent,问题100%来自引入的三方依赖的版本兼容缺陷。
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
你提到的Presenter层通过Retrofit结合Observable、Observer实现API调用的业务逻辑和该异常完全无关,不需要对这部分代码做任何修改。
1. 升级已知存在兼容缺陷的直接依赖
你当前引入的几个依赖都存在明确的Android 12适配问题,按以下方式调整即可:
- 升级
androidx.work:work-runtime-ktx:你使用的2.7.1版本存在PendingIntent未添加强制flag的已知bug,直接升级到2.7.4及以上稳定版即可,该版本起官方已全量适配Android 12的PendingIntent规则,无需修改业务代码。 - 调整Firebase相关依赖:你当前手动引入的
firebase-iid:21.1.0属于多余依赖,新版Firebase Messaging已经自动集成该组件能力,手动引入低版本iid反而会拉取未适配的旧代码;同时你使用的firebase-core:21.0.0、firebase-messaging:23.0.0版本过低,存在适配漏洞。建议直接引入Firebase BOM统一管控组件版本,自动拉取互相匹配、已完成Android 12适配的版本,调整后的依赖配置如下:
// 删掉手动引入的firebase-iid依赖,无需单独配置 implementation 'androidx.work:work-runtime-ktx:2.7.4' implementation platform('com.google.firebase:firebase-bom:31.2.0') implementation 'com.google.firebase:firebase-core' implementation 'com.google.firebase:firebase-messaging'
2. 排查传递依赖拉取的旧版本组件
如果升级上述直接依赖后仍然报错,执行Gradle命令查看全量依赖树,排查是否有其他间接依赖拉取了未适配的旧版本组件:
./gradlew app:dependencies
在输出的依赖树中检索work-runtime、firebase-*及其他可能涉及PendingIntent使用的三方组件(如推送SDK、分享SDK、统计SDK等),如果发现传递依赖拉取了2.7.4版本以下的work-runtime、23.1.0版本以下的firebase-messaging,直接在对应依赖中通过exclude规则排除旧版本即可,示例配置如下:
implementation('对应三方SDK的依赖坐标') { exclude group: 'androidx.work', module: 'work-runtime' }
3. 兜底强制版本适配
如果存在暂时无法升级的三方SDK未适配Android 12规则,可以在app模块的build.gradle中添加全局强制配置,让所有依赖统一使用已完成适配的组件版本:
configurations.all { resolutionStrategy { force 'androidx.work:work-runtime-ktx:2.7.4' force 'androidx.core:core-ktx:1.9.0' } }
androidx.core:core-ktx从1.7.0版本开始就对PendingIntent创建逻辑做了系统版本兼容,强制拉取新版core组件后,大部分旧SDK的PendingIntent创建逻辑会被自动适配,无需修改SDK本身代码。
内容的提问来源于stack exchange,提问作者Stuti Kasliwal

