Android 12安装应用报INSTALL_PARSE_FAILED_MANIFEST_MALFORMED问题求解
Android 12(API 31)要求所有带<intent-filter>标签的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)必须显式声明android:exported属性,不需要全部设为true,按组件实际暴露场景设置即可:
- 对外暴露的组件(比如桌面入口Activity、接收系统广播的Receiver、供其他应用调用的Service)设置
android:exported="true" - 仅应用内部使用的组件设置
android:exported="false"
如果报错是第三方SDK的组件未声明该属性,可以在你项目的AndroidManifest.xml中重写对应组件,显式加上android:exported属性覆盖第三方配置即可。
额外建议:当前buildToolsVersion = "28.0.2"和compileSdkVersion=31版本不匹配,建议升级buildToolsVersion到31.0.0及以上,减少编译阶段的兼容问题。
Android 12要求创建PendingIntent时必须显式指定FLAG_IMMUTABLE(不可修改)或者FLAG_MUTABLE(可修改),不能使用未包含这两个标记的旧写法,分两种场景处理:
自有代码中的PendingIntent修改
优先使用官方推荐的FLAG_IMMUTABLE,仅当你需要配合内联回复、气泡等功能修改PendingIntent内容时才用FLAG_MUTABLE,兼容写法示例:
int flag; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // 拼接原有标记和Android12要求的标记 flag = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT; } else { flag = PendingIntent.FLAG_UPDATE_CURRENT; } PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, flag);
第三方依赖导致的报错处理
你的崩溃日志显示报错来自androidx.work库,说明你使用的WorkManager版本过低未适配Android12,直接升级依赖到2.7.0及以上版本即可:
dependencies { // 升级到2.7.1或更高稳定版即可 implementation "androidx.work:work-runtime:2.7.1" }
如果有其他第三方库触发同类报错,优先升级对应依赖到适配Android12的版本即可。
以上两个问题处理完成后,保持targetSdkVersion=31即可正常安装应用,同时可以正常使用Android12专属的android:windowSplashScreenBackground等闪屏相关配置参数。
内容的提问来源于stack exchange,提问作者Nitish

