AndroidManifest.xml 是Android应用必需的元数据清单文件,位于app/src/main/下,用于声明四大组件、权限、特性等,系统在安装和运行时强制读取;缺失或错误将导致构建失败、组件不可见或安装被拒。

AndroidManifest.xml 是什么
AndroidManifest.xml 是每个 Android 应用的必选配置文件,位于模块根目录 app/src/main/ 下。它不是可选的“说明文档”,而是系统在安装、启动、权限校验等环节**强制读取的元数据清单**。没有它,APK 构建会失败;写错结构或关键字段(比如 package 或 android:name),会导致 Activity 找不到、服务无法启动、甚至安装被拒。
如何声明四大组件:Activity、Service、BroadcastReceiver、ContentProvider
所有组件都必须显式出现在 标签下,否则系统完全不可见——哪怕 Java/Kotlin 类存在且逻辑正确,也等于不存在。
-
Activity必须用声明,并通过指定启动入口(如LAUNCHER);否则无法从桌面图标启动 -
Service需声明,前台服务还需在运行时申请FOREGROUND_SERVICE权限(Android 9+) -
BroadcastReceiver分静态注册(manifest 中写)和动态注册(代码中registerReceiver());静态注册的 receiver 在 Android 8.0+ 无法监听隐式广播(如CONNECTIVITY_ACTION),除非是系统白名单动作 -
ContentProvider必须有android:authorities,且通常需设android:exported="true"(Android 12+ 要求显式声明)才能被其他应用访问
常见错误:android:exported 和 targetSdkVersion 的联动影响
Android 12(targetSdkVersion 31)起,所有含 的 Activity、Service、Receiver 必须显式设置 android:exported。漏写会直接导致安装失败,报错:Installation failed due to: 'Error: INSTALL_FAILED_VERIFICATION_FAILURE' 或更具体的 java.lang.SecurityException: Component ... requires android:exported to be explicitly specified。
- 如果组件只供本应用内部使用(无
),设android:exported="false" - 如果组件需响应外部 Intent(如分享、Deep Link),设
android:exported="true",并确保权限控制得当 - 混淆时注意:ProGuard/R8 不会自动保留 manifest 中引用的类名,若组件类被混淆,运行时会抛
NoClassDefFoundError
权限、uses-feature 和 uses-permission-sdk-23 怎么配
权限声明不等于自动获得—— 是安装时向系统申请的“许可列表”,但危险权限(如 READ_CONTACTS)仍需运行时调用 requestPermissions();而普通权限(如 INTERNET)安装即授。
-
会影响 Google Play 分发:设为true会过滤掉无摄像头设备 - 针对 Android 6.0+ 新增的权限组,可用
声明仅在 SDK 23+ 生效的权限(较少用,多数情况直接用即可) -
是 Android 13+ 必须声明的通知权限,否则NotificationManager.requestPermission()直接返回拒绝
AndroidManifest.xml 时,最终产物是合并结果——冲突字段(如 package、application 属性)可能被覆盖,调试时得看 app/build/intermediates/merged_manifests/ 下的最终文件,而不是只盯自己写的那一份。










