Android:AndroidManifest.xml配置文件详解

AndroidManifest.xml 是Android应用的核心配置文件,它向Android系统描述了应用的基本信息、组件、权限、硬件要求等。

一、概述

AndroidManifest.xml 是每个 Android 应用都必须包含的核心配置文件,它位于应用的根目录下。该文件向 Android 系统提供了关于应用的基本信息,是 Android 系统与应用程序之间进行通信的桥梁。

用途

  1. 定义应用组件:定义应用包含的Activity、Service、BroadcastReceiver和ContentProvider。
  2. 定义应用权限:定义应用自身需要的权限,以及声明其他应用访问该应用组件所需的权限。
  3. 定义硬件和软件要求:指定应用所需的API级别、硬件配置(如摄像头、蓝牙)等。
  4. 定义应用兼容性:指定应用支持的不同屏幕尺寸、输入方式等。
  5. 其他元数据:如应用图标、主题、进程名称等。

二、主要用途

1. 应用基本信息

  • 定义应用的包名(唯一标识)
  • 版本号(versionCode 和 versionName)
  • 应用图标和名称
  • 安装位置设置

2. 声明应用组件

  • Activity(活动)
  • Service(服务)
  • BroadcastReceiver(广播接收器)
  • ContentProvider(内容提供者)

3. 权限管理

  • 申请应用需要的权限
  • 声明其他应用访问本应用组件所需的权限

4. 硬件和软件要求

  • 指定应用所需的最小 SDK 版本
  • 声明需要的硬件特性
  • 定义支持的屏幕尺寸和密度

5. Intent 过滤器

  • 定义应用可以响应的 Intent
  • 指定默认启动 Activity

三、主要配置项详解

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">

<!-- 权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />

<!-- 硬件特性 -->
<uses-feature android:name="android.hardware.camera" />

<!-- SDK版本 -->
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="33" />

<!-- 应用配置 -->
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:allowBackup="true"
android:supportsRtl="true">

<!-- 主Activity -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
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=".MyService" />
<receiver android:name=".MyReceiver" />
<provider android:name=".MyProvider" android:authorities="com.example.myapp.provider" />

<!-- 元数据 -->
<meta-data android:name="com.google.android.geo.API_KEY" android:value="your_api_key" />
</application>

</manifest>

1. <manifest> - 根元素

1
2
3
4
5
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto">

属性:

  • package:应用的唯一包名
  • versionCode:内部版本号,用于版本比较(整数)
  • versionName:用户可见的版本号(字符串)
  • installLocation
    • auto:由系统决定
    • internalOnly:只安装到内部存储
    • preferExternal:优先外部存储

2. <uses-sdk> - SDK 版本要求

1
2
3
4
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="33"
android:maxSdkVersion="34" />

注意: maxSdkVersion 从 API 30 开始不推荐使用

3. <uses-permission> - 权限声明

1
2
3
4
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- 危险权限需要运行时申请 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

4. <permission> - 自定义权限

声明自定义权限,用于保护应用组件。必须在 <application> 外部声明。

1
2
3
4
5
<permission
android:name="com.example.app.permission.SHARE_DATA"
android:protectionLevel="normal"
android:label="分享数据"
android:description="允许应用分享数据" />

protectionLevel 取值:

  • normal:低风险权限
  • dangerous:高风险权限
  • signature:相同签名应用可获取
  • signatureOrSystem:系统应用或相同签名

5. <application> - 应用配置

1
2
3
4
5
6
7
8
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:allowBackup="true"
android:supportsRtl="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:usesCleartextTraffic="false">

重要属性:

  • icon:应用图标。
  • label:应用名称。
  • theme:应用主题。
  • allowBackup:是否允许备份(默认为 true)
  • supportsRtl:是否支持从右到左布局
  • usesCleartextTraffic:是否允许明文传输(HTTP)

6. <activity> - 活动组件

声明Activity,可以包含<intent-filter>定义启动条件。<activity> 必须在<application>应用配置里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:exported="true"
android:launchMode="standard"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

关键属性:

  • android:name: 指定 Activity 对应的类名(相对、绝对路径),关联 XML 配置与具体的 Java/Kotlin 实现类

    • 相对路径形式:.MainActivity(相对于 manifest 标签中的 package 属性)
    • 绝对路径形式:com.bytedance.speech.speechdemo.MainActivity(完整的类路径)
    • 两种写法功能相同,都会指向同一个 MainActivity 类
  • android:theme: 指定 Activity 使用的主题样式,定义界面外观、动画等视觉效果

  • android:label: 设置 Activity 的显示标签,定义在 Launcher 或任务管理器中显示的名称

  • exported:是否允许其他应用启动(Android 12+ 重要安全特性)

  • android:launchMode: 定义 Activity 的启动模式,控制 Activity 实例的创建和复用策略

    • standard:标准模式(默认)
    • singleTop:栈顶复用
    • singleTask:栈内复用
    • singleInstance:独立栈
  • android:screenOrientation: 用于控制 Activity 的屏幕显示方向,常用取值包括:

    • portrait: 竖屏模式

    • landscape: 横屏模式

    • unspecified: 默认值,由系统决定方向

    • sensor: 根据设备传感器自动旋转

    • nosensor: 不响应传感器变化,保持初始方向

    • user: 用户当前首选的方向

    • behind: 与前一个 Activity 方向保持一致

    • reversePortrait: 反向竖屏(倒置)

    • reverseLandscape: 反向横屏(倒置)

    • sensorPortrait: 仅支持竖屏但可感应正反向

    • sensorLandscape: 仅支持横屏但可感应正反向

    • fullSensor: 支持所有四个方向的自由旋转

  • android:windowSoftInputMode: 控制软键盘与窗口的交互模式,管理键盘弹出时的窗口调整行为

    • 示例:stateHidden 表示默认隐藏输入法
  • android:configChanges: 指定当设备配置发生改变时,Activity是否自己处理这些变化,而不是让系统重新创建Activity。

    • 示例:orientation|screenSize 表示自行处理屏幕旋转
  • <intent-filter>: 定义 Activity 能够响应的 Intent 类型

    • android.intent.action.MAIN: 声明该 Activity 是应用程序的主入口点
    • android.intent.category.LAUNCHER: 指定该 Activity在应用启动器中显示(即桌面图标)

7. <service> - 服务组件

声明Service,类似Activity,也有nameexported等属性。

1
2
3
4
5
6
7
8
9
10
<service
android:name=".MyService"
android:exported="false"
android:enabled="true"
android:foregroundServiceType="location">

<intent-filter>
<action android:name="com.example.app.ACTION_START_SERVICE" />
</intent-filter>
</service>

8. <receiver> - 广播接收器

声明BroadcastReceiver,同样可以包含<intent-filter>

1
2
3
4
5
6
7
8
9
<receiver
android:name=".MyReceiver"
android:exported="true"
android:enabled="true">

<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

9. <provider> - 内容提供者

声明ContentProvider

  • authorities:内容提供者的唯一标识
  • readPermissionwritePermission:读写权限
1
2
3
4
5
6
7
<provider
android:name=".MyProvider"
android:authorities="com.example.app.provider"
android:exported="false"
android:readPermission="com.example.app.permission.READ_DATA"
android:writePermission="com.example.app.permission.WRITE_DATA">
</provider>

10. <uses-feature> - 硬件特性要求

  • 声明应用需要的硬件特性(如摄像头、蓝牙),Google Play会根据此过滤设备。
1
2
3
4
5
6
7
<uses-feature
android:name="android.hardware.camera"
android:required="true" />

<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />

11. <queries> - 包可见性(Android 11+)

1
2
3
4
5
6
7
8
9
10
<queries>
<!-- 查询特定的包 -->
<package android:name="com.example.anotherapp" />

<!-- 查询特定 Intent 的接收者 -->
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/*" />
</intent>
</queries>

四、配置项优先顺序

1. 合并规则优先级

当多个模块或库的 AndroidManifest.xml 合并时,优先级顺序如下:

1
2
3
4
5
最高优先级:主模块的 manifest

依赖库的 manifest(按依赖顺序,后依赖的优先级更高)

最低优先级:Android Gradle Plugin 的默认配置

2. 属性优先级冲突处理

使用 tools:replacetools:removetools:keep 处理冲突:

1
2
3
4
<!-- 在主模块中覆盖库中的属性 -->
<application
android:allowBackup="false"
tools:replace="android:allowBackup" />

3. 组件启动优先级

多个应用声明相同的 Intent-filter 时,系统按以下顺序选择:

1
2
3
1. 用户明确选择的默认应用
2. 系统偏好设置
3. 安装时间(后安装的可能优先)

4. 权限声明顺序

  • 权限必须在使用前声明
  • 自定义权限必须在 <application> 外部声明
  • 同一权限多次声明不会产生重复

五、最佳实践

1. 安全配置

1
2
3
4
5
<!-- 显式设置 exported 属性 -->
<activity android:exported="false" />

<!-- 设置网络安全配置 -->
<application android:networkSecurityConfig="@xml/network_security_config">

2. 权限分组

1
2
3
4
5
6
7
8
<!-- 按功能分组声明权限 -->
<!-- 网络相关 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- 存储相关 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />

3. 组件配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 完整的 Activity 配置示例 -->
<activity
android:name=".DetailActivity"
android:label="@string/title_detail"
android:exported="false"
android:launchMode="standard"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|screenSize|keyboardHidden"
android:parentActivityName=".MainActivity">

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>

六、调试和验证

1. 使用 Manifest Merger 工具

1
2
# 查看合并结果
./gradlew processDebugManifest --stacktrace

2. 验证配置

1
2
3
4
5
// 在代码中检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
// 权限已授予
}

七、常见问题

1. Android 12+ 的 exported 要求

  • 所有组件必须显式设置 exported 属性
  • 如果组件包含 Intent-filter,默认 exported="true"

2. 包可见性问题

  • Android 11+ 需要使用 <queries> 声明要交互的其他应用
  • 某些隐式 Intent 需要声明包名

3. 权限升级策略

1
2
<!-- 使用权限组 -->
<uses-permission-sdk-23 android:name="android.permission.CAMERA" />

八、总结

AndroidManifest.xml 是 Android 应用的配置中心,合理配置可以:

  1. 确保应用安全性和稳定性
  2. 优化应用性能和兼容性
  3. 提供良好的用户体验
  4. 符合 Google Play 的要求和审核规范

在实际开发中,建议:

  • 定期审查 Manifest 配置
  • 遵循最小权限原则
  • 及时适配新的 Android 版本要求
  • 使用最新的 Android Gradle Plugin 进行构建和合并

Android:AndroidManifest.xml配置文件详解

http://blog.gxitsky.com/2025/12/12/Android-05-AndroidManifest-xml/

作者

光星

发布于

2025-12-12

更新于

2025-12-12

许可协议

评论