React Native Android如何排查QUERY_ALL_PACKAGES权限引入来源
定位Android构建中自动合并的QUERY_ALL_PACKAGES权限来源实操方案
按以下优先级逐步排查即可,第一种方法准确率100%,优先使用:
1. 直接读取清单合并报告
这是最准确的排查方式,Gradle的清单合并任务会记录每一个清单节点的来源信息:
- 进入项目的
android目录,执行对应系统的构建命令生成release版本的清单合并报告:- macOS/Linux:
./gradlew app:processReleaseManifest --console=plain - Windows:
gradlew.bat app:processReleaseManifest --console=plain
- macOS/Linux:
- 命令执行完成后,打开生成的报告文件,路径为
android/app/build/outputs/logs/manifest-merger-release-report.txt - 在文件内搜索
QUERY_ALL_PACKAGES关键字,搜索结果会明确标注该权限的引入来源:包含对应依赖的包名、版本号、该依赖自身清单文件的路径,以及合并规则。
2. 直接查看合并后清单的内置标记
不需要执行额外命令,直接打开你已经找到的合并产物即可快速查看:
- 打开
android/app/build/intermediates/merged_manifests/release/AndroidManifest.xml文件 - 定位到
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />这一行 - Android构建工具在合并清单时,会自动给非主模块引入的节点加上来源注释,格式通常为
<!-- from: [依赖坐标] -->,直接读取注释即可拿到引入权限的依赖信息。你提到的bundle_manifest目录下的清单文件也带有同样的来源注释,查询逻辑一致。
3. 依赖树遍历验证
如果前两种方式拿到的信息不够明确,可以通过导出依赖树做交叉验证:
- 在
android目录下执行命令导出release运行时全量依赖树:- macOS/Linux:
./gradlew app:dependencies --configuration releaseRuntimeClasspath > dep_tree.txt - Windows:
gradlew.bat app:dependencies --configuration releaseRuntimeClasspath > dep_tree.txt
- macOS/Linux:
- 常见会引入
QUERY_ALL_PACKAGES的依赖类型包括:设备信息类库、已装应用查询类库、第三方分享/登录/推送SDK、文件选择类库,可以优先针对这类依赖做筛查。 - 定位到可疑依赖后,可以在
app/build.gradle的依赖声明中临时添加exclude规则,重新构建验证权限是否消失,完成最终确认。排除规则示例:
implementation('cn.example:suspicious-sdk:2.1.0') { exclude group: 'cn.example', module: 'permission-module' }
定位后的权限移除方式
如果确认业务不需要该权限,不需要移除对应依赖,只需要在主清单android/app/src/main/AndroidManifest.xml中添加移除规则即可:
- 先在清单根节点
manifest标签上添加tools命名空间声明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.your.app">
- 在清单内添加权限移除节点:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:node="remove" />
重新构建后,该权限就不会出现在最终的安装包/应用包中。
内容的提问来源于stack exchange,提问作者Matthew Dejager
相关产品推荐
相关产品推荐

