每个Android开发者都绕不开这个配置文件。它就像应用程序的"身份证"和"通行证",不仅定义了应用的基本属性,还决定了系统如何与你的应用交互。我见过太多项目因为Manifest配置不当导致的奇葩问题——从简单的权限缺失到诡异的Activity启动失败。
这个文件位于项目的app/src/main目录下,默认路径是app/src/main/AndroidManifest.xml。新建项目时Android Studio会自动生成基础版本,但随着功能增加,我们需要深入理解每个节点的作用。
重要提示:修改Manifest后必须Clean Project才能确保改动生效,这是新手常踩的坑
xml复制<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
xmlns:android:定义Android命名空间,固定值勿改动
package:应用的唯一标识符(重要!)
这里有个隐藏陷阱:2021年起Google Play要求package name必须至少包含两段式域名(如com.example)。我曾有个项目因使用单段包名被拒审。
xml复制<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
关键属性说明:
allowBackup:是否允许自动备份(默认true)supportsRtl:从右到左布局支持(中东语言必需)theme:全局主题(会继承给所有Activity)实测发现:如果设置allowBackup=false,在Android 6.0+设备上会导致Auto Backup完全失效,即使用户手动备份也不生效
xml复制<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="standard"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
必须掌握的属性:
exported:是否允许外部应用调用(Android 12+强制显式声明)launchMode:四种启动模式的实际差异:
xml复制<service
android:name=".MyService"
android:enabled="true"
android:exported="false">
</service>
后台服务注意事项:
FOREGROUND_SERVICE权限静态注册示例:
xml复制<receiver android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
动态注册优势:
xml复制<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
权限管理要点:
xml复制<permission
android:name="com.example.myapp.PERMISSION_PRIVATE"
android:protectionLevel="signature"/>
protectionLevel的三种关键值:
normal:低风险权限(系统自动授予)dangerous:需要用户确认signature:只有相同签名的应用才能获取xml复制<meta-data
android:name="channel_id"
android:value="${CHANNEL_VALUE}" />
配合build.gradle实现多渠道打包:
groovy复制android {
flavorDimensions "channel"
productFlavors {
google {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "google"]
}
huawei {
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE: "huawei"]
}
}
}
xml复制<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
关键设备特性声明:
| 错误类型 | 现象 | 解决方法 |
|---|---|---|
| INSTALL_FAILED_CONFLICTING_PROVIDER | 内容提供者冲突 | 修改authorities为唯一值 |
| ActivityNotFoundException | 找不到Activity | 检查exported和intent-filter配置 |
| SecurityException | 权限缺失 | 检查权限声明和运行时申请 |
当引入第三方库时可能出现属性冲突,解决方法:
groovy复制android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processResources.doFirst { pm ->
pm.manifestOverrides = [android:icon:"@mipmap/ic_launcher"]
}
}
}
}
code复制-keep class com.example.myapp.** { *; }
在最近一个电商项目中,我们通过优化Manifest配置: