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

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










