React Native安卓App出现未声明QUERY_ALL_PACKAGES权限问题
关于build目录下Manifest文件的作用及额外权限来源
build目录下的所有文件都是Gradle构建流程生成的中间产物,不属于需要手动修改的源码范畴:
merged_manifests目录下的AndroidManifest.xml是安卓构建过程中清单合并步骤的最终输出文件。安卓构建时会自动将三类Manifest内容合并到一起:主源码路径下你自己写的AndroidManifest.xml、所有引入的第三方依赖(包括npm包引入的安卓依赖、Gradle远程依赖)自带的清单文件、当前构建变体(比如release/debug)对应的配置清单。这个合并后的文件会被直接打包进最终的APK/AAB安装包,是应用实际生效的清单配置。bundle_manifest目录下的清单是打AAB格式(Google Play强制要求的上传包格式)时,从最终合并清单中提取出来用于包结构校验的副本,内容和合并后的主清单完全一致。
你没有主动声明的权限,全部是第三方依赖通过清单合并规则自动带入的。安卓默认的清单合并策略会保留所有依赖声明的权限、组件配置,你看到的USE_BIOMETRIC、FOREGROUND_SERVICE、CHECK_LICENSE这类权限基本是React Native核心库、Google Play服务SDK、内购SDK自动声明的,属于正常的基础功能依赖。QUERY_ALL_PACKAGES是某个需要检测设备已安装应用列表的第三方依赖声明的,不会因为你没在主Manifest写就不进入最终包。
移除QUERY_ALL_PACKAGES权限的可落地方案
按以下步骤操作即可满足Google Play合规要求:
- (可选)先定位权限来源
你可以在项目根目录执行以下命令,查看完整的依赖树,找到引入该权限的具体依赖:
# macOS/Linux cd android && ./gradlew app:dependencies # Windows cd android && gradlew.bat app:dependencies
也可以直接打开merged_manifests下的最终合并清单,找到QUERY_ALL_PACKAGES所在行,行尾一般会附带注释标明该条目来自哪个依赖包。如果该依赖有新版本移除了这个权限,直接升级依赖是最彻底的解决方式。
- 强制移除权限(通用方案,适用于所有场景)
你不需要改动依赖代码,直接在自己维护的主Manifest文件(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="你的应用包名">- 在你声明的权限列表中添加一行移除规则,告诉构建系统在合并时强制删除该权限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:node="remove" /> - 校验结果
修改完成后重新打release包,再次查看build目录下的合并Manifest文件,确认QUERY_ALL_PACKAGES条目已经消失,就可以上传Google Play了。
注意:其余自动合并进来的权限(
USE_BIOMETRIC、FOREGROUND_SERVICE、CHECK_LICENSE、com.google.android.c2dm.permission.RECEIVE等)均为Google Play合规允许的权限,是内购、推送、生物识别、授权校验等基础功能的必需项,不需要额外移除。
内容的提问来源于stack exchange,提问作者Matthew Dejager
相关产品推荐
相关产品推荐

