AndroidManifest.xml 是应用总纲,需正确定义权限、硬件依赖、组件导出及包可见性:权限分正常/危险/特殊三类;危险权限需运行时申请;硬件依赖用 声明;Android 12+ 要求显式设置 android:exported 并配置 。

AndroidManifest.xml 是每个 Android 应用的“总纲”,它不光告诉系统这个应用叫什么、长什么样、从哪启动,更关键的是——它决定了应用能做什么、能访问哪些资源、能否被其他应用调用。权限配置是其中最敏感也最容易出错的一环,配错轻则功能失效,重则被 Google Play 拒绝上架或触发用户卸载。
权限声明必须写在 根节点内
所有 标签都必须直接放在 标签下(不能嵌套在 或其他组件里),否则编译会通过但系统不会识别。
- 格式固定:
- 敏感权限(如
CAMERA、ACCESS_FINE_LOCATION)仅声明还不够,运行时还需动态申请(Android 6.0+) - 普通权限(如
INTERNET、ACCESS_NETWORK_STATE)只需声明,安装时自动授予 - 一个权限声明一次即可,重复声明无意义也不报错
区分权限级别:正常 / 危险 / 特殊
Android 将权限分为三类,影响声明方式和用户授权流程:
-
正常权限(Normal):低风险,安装即授,如
SET_ALARM、INTERNET -
危险权限(Dangerous):涉及用户隐私或设备操作,需运行时弹窗申请,分组管理(如位置、存储、麦克风等),例如:
READ_CONTACTS、RECORD_AUDIO -
特殊权限(Special):极高风险,需用户手动进入系统设置开启,如
MANAGE_EXTERNAL_STORAGE(Android 11+)、REQUEST_INSTALL_PACKAGES
注意:从 Android 12(API 31)起,package visibility(包可见性)成为新门槛,即使你没声明任何权限,若想隐式启动其他 App 的组件(如调用分享服务),也需在 块中提前声明目标包名或 intent 过滤器。
硬件与功能依赖声明要配合权限使用
仅声明 CAMERA 权限,并不意味着设备一定有相机;若你的功能强依赖某硬件,应同时用 明确声明,避免在无该硬件的设备上被错误分发。
- 必需硬件:
→ Google Play 会过滤不支持设备 - 可选硬件:
→ 允许安装,代码中需运行时检测getPackageManager().hasSystemFeature() - 常见搭配示例:
CAMERA权限 +android.hardware.camera特性;BLUETOOTH_SCAN权限 +android.hardware.bluetooth特性
自定义权限与组件导出控制
除了“用别人的功能”,还要管好“别人能不能用你的功能”。这靠两个关键属性:
-
android:exported:决定组件(Activity/Service/BroadcastReceiver/ContentProvider)是否能被其他应用调用。Android 12+ 强制要求显式设置,未设默认为false(安全优先) -
标签:用于定义你自己的权限,比如只允许合作方 App 调用你的后台服务。需配合android:permission属性用在组件上 - 示例:防止恶意 App 启动你的支付回调 Activity,可设
android:exported="false";若需开放给指定伙伴,则定义自定义权限并要求对方在自己 Manifest 中声明使用










