Android 开发工具

AndroidManifest 查看 · 把声明与所属组件一起看清

粘贴文本 XML,停顿 350 毫秒后自动分析;关闭自动模式后,可点击分析或按 Ctrl/Cmd+Enter。

AndroidManifest 查看

Manifest XML 输入

分析结果

粘贴文本版 AndroidManifest.xml,或载入示例。

XML 在当前浏览器标签页中处理,不会上传。

选项

仅检查当前 XML 的声明。保留现有文本、空白和资源引用;不计算构建配置或运行时行为。

粘贴文本版 AndroidManifest.xml,或载入示例。

排查一次安装失败时,问题可能藏在某个带 intent-filter 的组件里;核对权限时,又需要分清应用请求了什么、定义了什么。AndroidManifest 查看把这些声明整理成结构化摘要,保留源行号和所属关系,便于回到原文逐项核对。

如果想了解某个源码文件,就粘贴该文件;如果想核对实际构建,请先取得合并后的或已解码的清单。Android Manifest 格式化能改善部分紧凑节点的层级,但不能补上 Gradle 或资源文件里尚未提供的信息。

为什么使用 AndroidManifest 查看

把权限与组件关系拆开看

AndroidManifest 查看区分 uses-permission 的权限请求与 permission 的权限定义,再按类型列出组件。一个 Activity 里的两个 intent-filter 会各自保留 action、category 和 data,启动入口与网页链接声明不会被揉成一条。遇到陌生权限时,先看它是哪种声明,再判断应该去哪里核查。

清单树中的节点分别连接到权限、组件和意图过滤器卡片。

让诊断带着条件和位置

组件导出规则与目标 SDK 有关。数值条件明确满足时,缺少 exported 会进入错误列表;目标值未知时,只给出条件提示。每条结果附源行号,可直接定位。debuggable 明确为 true 提醒你核对发布构建,不会把一份无提示清单包装成安全认证。

带意图过滤器的组件旁出现定位标记,指出尚未声明导出属性的位置。

先确认检查的是哪份清单

01

核对构建上下文

源码里的 uses-sdk 可能被 Gradle 覆盖,依赖库也可能贡献权限。发布前应读取合并清单或成品解码结果。摘要保留 @string/app_name 和占位符,看到这些值时,说明还需要相关资源或构建配置才能确定最终行为。

02

掌握刷新与过期状态

自动模式在输入或缩进变化后等待 350 毫秒;关闭后支持 Ctrl/Cmd+Enter 手动分析。等待期间旧结果不能复制或下载。仅切换摘要、XML 或 JSON 视图不会更改原输入,也不会重新计算。

03

按内容选择导出

摘要视图的复制与 JSON 视图相同,都会取得完整 JSON 报告,并非只复制屏幕上显示的前 50 条。XML 视图复制格式化文本。载入示例或清空前会展示替换预览和字符数量,应用后可撤销一次,同时恢复输入与结果。

从原始声明到可定位的报告

应用、版本与 SDK 原值

集中查看 manifest、uses-sdk 和 application 属性。缺失的字段保持未声明,资源引用保持原样。相对组件名不会根据 package 自动扩展,因为真实类名还受 Gradle namespace 影响;报告不会补出未提供的配置。

保留声明类型的权限清单

提取 uses-permission、uses-permission-sdk-23 和 permission,并保留 maxSdkVersion、protectionLevel 等实际属性。组件包括 activity、activity-alias、service、receiver 和 provider,范围是 application 的直接子节点,重复声明不会被静默去重。

有限且有条件的规则检查

检查 application 数量、组件或权限缺少 name、最小 SDK 大于目标 SDK、过滤器缺少 action、android 前缀绑定错误等问题。目标数值至少为 31 时,检查带过滤器的 Activity、别名、服务和接收器是否缺少 exported;Provider 不套用此条件。

完整 XML 与 JSON 输出

缩进可选 2 或 4 个空格,只为没有直接文本的容器补充层级。摘要各类列表每次多显示 50 条;完整导出不受显示数量限制。JSON 包含原始属性、源行号、过滤器所属组件和诊断项,XML 保留已有内容。

结果的适用范围与限制

只接收文本清单
输入必须是一个 XML 1.0 文档,根为不带命名空间的 manifest。编码声明可以为 UTF-8、UTF8,或不写。APK 中的 AXML 和 AAB 清单不属于普通文本,需先用 Android 构建工具解码;本页没有文件导入或 URL 抓取。
不执行构建与资源解析
不会执行 Gradle 合并、tools: 合并指令,也不解析资源表或替换占位符。SDK、包名和应用属性只反映当前输入。缺少 targetSdkVersion 时不会猜一个默认目标,更不会用 package 拼接 .MainActivity。
已有空白可能保持不变
标签之间的换行和缩进也是 XML 文本。含直接文本、CDATA 或保留空白设置的子树保持原样,因此从 2 空格切换到 4 空格可能看不到变化。格式化只生成独立结果,不覆盖输入,也不是规范化 XML 或签名验证。
诊断不等于安全审计
权限声明不证明设备上已经授权,exported 为 true 也不直接证明存在漏洞。allowBackup 只展示声明值;不会评估真实备份策略、验证 App Links 网络配置或执行 Intent,也不能替代 Android Lint、代码审查与真机测试。
字符、节点和输出上限
输入最多 500,000 个 UTF-16 代码单元、20,000 个节点,深度最多 100 层。XML 与 JSON 两种输出分别最多 2,000,000 个代码单元;部分字符会占用两个单元。超过任一上限会停止处理,不提供截断后的部分导出。
不自动修复清单
语法错误会保留行列位置,需修改输入后重新分析。DOCTYPE 会被拒绝,不加载外部实体或命名空间地址。工具不决定该删除哪项权限、该把 exported 设置成什么值,避免把用途不明的声明直接改掉。

AndroidManifest 查看常见问题

APK 中的 AndroidManifest.xml 为什么不能直接打开?

APK 里的 AndroidManifest.xml 通常经过二进制 AXML 编码,不是普通文本 XML。可先用 Android Studio 的 APK 分析器,或 apkanalyzer manifest print 取得文本,再粘贴到本页。将 APK 后缀改成 ZIP 只能看到文件,不能完成解码。

为什么 Android 12 要求明确声明 android:exported?

目标为 Android 12 及以上时,带 intent-filter 的 Activity、服务和广播接收器需要明确声明 exported。本页也检查 Activity 别名;仅在输入目标 SDK 是至少为 31 的数值时报告缺失错误。目标未知时保留条件提示,具体应填 true 还是 false 由组件用途决定。

uses-permission 和 permission 有什么区别?

uses-permission 声明应用请求使用某项权限;permission 定义一项权限,可用来保护组件或操作。报告把它们分成不同类型。清单里的声明无法说明用户在设备上实际授予了哪些运行时权限。

合并后的清单为什么多出未手动添加的权限?

依赖库、产品变体或其他源集都可能在合并时添加声明。本页只能列出当前文档,无法从单个合并结果追溯每一项的来源。请在 Android Studio 的 Merged Manifest 视图或合并报告中查看贡献该节点的文件。

minSdkVersion 和 targetSdkVersion 有什么区别?

minSdkVersion 表示安装所需的最低 API 级别,targetSdkVersion 表示应用面向的平台行为版本。这里显示的是输入中的原始值;Gradle 可以提供或覆盖它们。判断发布包的兼容性时,应核对最终构建,并继续做设备测试。

发现提取或定位结果不准确?

从示例开始检查声明

通过 AndroidManifest 查看示例,分清权限请求和权限定义,再沿行号找到缺少 exported 的组件,确认报告里的每个提示都对应真实输入。