Android 31系统应用启动失败 未指定PendingIntent强制Flag异常
异常产生原因
这个崩溃和你写的业务代码无关,从堆栈信息可以直接定位到问题出在androidx.work(Jetpack WorkManager)组件的内部实现:
Android 12(API 31)系统新增了强制校验规则,所有创建PendingIntent的代码必须显式声明FLAG_IMMUTABLE(不可变更,官方推荐)或FLAG_MUTABLE(可变更)标识,否则就会抛出该IllegalArgumentException异常。
而你当前项目依赖的WorkManager版本低于2.7.0,该版本发布时还没有适配Android 12的这条规则,内部创建PendingIntent时没有添加对应的标识,所以只要应用targetSdkVersion≥31,运行在Android 12及以上系统就会触发崩溃。
哪怕你自己没有主动调用过PendingIntent或者WorkManager的相关接口,也可能是你引入的其他第三方SDK内部依赖了低版本的WorkManager,间接触发了这个问题。
解决方案
方案一:升级WorkManager到适配版本(推荐)
直接在你项目的模块级build.gradle文件中,强制指定WorkManager的版本为2.7.0及以上,该版本之后官方已经完成了Android 12的适配:
dependencies { // 普通Java项目用这个 implementation "androidx.work:work-runtime:2.8.1" // Kotlin项目可以用KTX版本 // implementation "androidx.work:work-runtime-ktx:2.8.1" }
如果是第三方SDK间接引入的低版本WorkManager,你可以添加全局强制版本规则,覆盖传递依赖的版本:
configurations.all { resolutionStrategy { force "androidx.work:work-runtime:2.8.1" } }
修改完成后可以执行依赖树查看命令验证版本是否生效:
- Linux/Mac:
./gradlew :app:dependencies - Windows:
gradlew.bat :app:dependencies
确认输出的依赖树中WorkManager的版本已经是2.7.0及以上即可。
方案二:临时规避(不推荐)
如果暂时不需要适配高版本targetSdk,可以把build.gradle中的targetSdkVersion降到30以下,就能绕过Android 12的这条强制校验规则。但目前主流应用商店都要求targetSdk≥31才能上架,所以这个方案只能用来临时验证,最终还是建议用方案一解决。
内容的提问来源于stack exchange,提问作者j_wash_BL

