Flutter适配Android S+创建PendingIntent报FLAG_IMMUTABLE错误如何解决
Flutter适配Android S+ PendingIntent崩溃修复方案
该崩溃由Android 12(API 31)新增的PendingIntent强制校验规则触发:所有面向API31及以上的应用,创建PendingIntent时必须显式声明FLAG_IMMUTABLE或FLAG_MUTABLE标志位,缺失则直接抛出异常。修复按以下步骤操作:
一、修正自有业务代码
- 排查项目中所有PendingIntent创建逻辑(包括
getActivity、getBroadcast、getService、getForegroundService方法调用),按业务场景追加对应标志位:- 普通场景(点击通知跳转、定时任务触发、闹钟唤起等不需要动态修改PendingIntent内容的场景),统一使用官方推荐的
FLAG_IMMUTABLE标志 - 仅当业务依赖可变特性(通知内联回复、气泡功能、需要动态更新Intent参数的场景),才使用
FLAG_MUTABLE标志
- 普通场景(点击通知跳转、定时任务触发、闹钟唤起等不需要动态修改PendingIntent内容的场景),统一使用官方推荐的
- 兼容写法示例(以创建通知跳转PendingIntent为例):
val pendingIntentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE } else { PendingIntent.FLAG_UPDATE_CURRENT } val clickPendingIntent = PendingIntent.getActivity( context, requestCode, jumpIntent, pendingIntentFlags )
注意:
FLAG_IMMUTABLE标志从API 23(Android 6.0)开始提供,低版本系统无需添加该标志,通过版本判断做兼容即可,避免低版本运行报错。
二、处理第三方依赖兼容问题
如果自有代码已经全部修正仍出现崩溃,基本是引入的第三方SDK/Flutter插件未适配API31规则导致,按以下方式处理:
- 先将项目所有Flutter依赖升级到最新版本,主流官方插件(本地通知、推送、Firebase系列等)的高版本均已完成该适配
- 若升级依赖后仍存在问题,可在
android/app/build.gradle中强制引入适配API31的WorkManager依赖,大量未适配插件都是因为依赖了低版本androidx.work库触发崩溃,配置如下:
dependencies { // 强制使用已适配API31的WorkManager版本 implementation 'androidx.work:work-runtime-ktx:2.7.1' // 原有其他依赖保持不变 }
- 配置完成后执行
flutter clean清理构建缓存,重新打包运行即可。
内容的提问来源于stack exchange,提问作者gulalicelik
相关产品推荐
相关产品推荐

