Android 12 中的“android:exported”错误:排除故障指南
2024-03-06 13:43:15
Android 12 中的 "android:exported" 错误:全面故障排除指南
背景
升级到 Android 12 后,许多开发人员遇到了一个令人头疼的错误:“Manifest merger failed with multiple errors, see logs”。经过调查,发现罪魁祸首是清单文件中未正确设置的 android:exported
属性。
错误的根源
在 Android 12 中,对于所有非主要活动,android:exported
属性必须显式设置为 false
。未明确设置该属性的活动可能会导致合并清单时出现错误。
解决方案
要解决此问题,请按照以下步骤操作:
- 检查清单文件 :确保所有非主要活动都已将
android:exported
设置为false
。 - 更新旧清单文件 :在
AndroidManifest_old.xml
中将所有活动中的android:exported
设置为false
。 - 包含旧清单文件 :在主清单文件中使用
<include>
标签包含AndroidManifest_old.xml
。 - 更新 Gradle 文件 :将
targetSdkVersion
升级到 31。 - 同步 Gradle 项目 :单击 Android Studio 中的“同步”按钮。
- 重新构建应用程序 :从“构建”菜单选择“重新构建项目”。
最佳实践
除了解决错误外,还有以下最佳实践可避免未来的问题:
- 始终明确设置
android:exported
属性。 - 使用权限控制对活动和服务的访问。
- 定期更新 Gradle 文件以获得最新的兼容性修复。
常见问题解答
Q1. 为什么 Android 12 要求 android:exported
属性?
A1. 这是一项安全措施,有助于防止恶意应用程序启动敏感活动。
Q2. 如何确定活动是否是非主要活动?
A2. 非主要活动是那些不启动应用程序的用户界面或提供主要功能的活动。
Q3. 如果我无法访问旧清单文件该怎么办?
A3. 您可以手动复制所有活动定义到主清单文件中,确保将 android:exported
设置为 false
。
Q4. 为什么包含旧清单文件很重要?
A4. 这允许旧应用程序在没有更新清单文件的情况下继续运行。
Q5. 我可以使用 <activity-alias>
代替 <include>
标签吗?
A5. 不,<activity-alias>
仅用于创建活动别名,而 <include>
标签用于合并整个清单文件。
结论
通过正确设置 android:exported
属性并遵循最佳实践,开发人员可以轻松避免 Android 12 中的清单合并错误。通过在开发过程中保持警惕,应用程序可以保持安全性和稳定性。