关于移除QUERY_ALL_PACKAGES权限后应用仍下架的技术问询
问题背景
- 应用因
QUERY_ALL_PACKAGES权限违规被下架,已移除该权限但应用仍处于下架状态 - 官方提示问题疑似由历史版本导致,但无法下架历史版本
- 官方明确要求使用
<queries>元素声明特定包可见性替代全量查询,涉及拆分包SPLIT_BUNDLE 4400012和SPLIT_BUNDLE 4400018 - 已通过Android Studio排查APK、清单文件及编译目录,未发现该权限,第三方库排查也无结果
针对性解决步骤
1. 彻底排查拆分包的权限声明
由于问题指向特定拆分包,需单独检查这两个bundle的清单文件:
- 找到项目中对应拆分包的模块(通常在
src/main/AndroidManifest.xml或拆分模块的清单文件) - 检查是否存在
android.permission.QUERY_ALL_PACKAGES声明,包括是否通过tools:node="remove"未生效的情况 - 若使用动态功能模块,确认模块清单是否继承了主模块的权限,可添加
tools:node="remove"强制移除
2. 验证构建输出的所有APK/AB包
- 使用
aapt dump permissions <apk-path>命令直接解析拆分包APK的权限列表,确认是否存在目标权限(比Android Studio可视化分析更准确) - 检查App Bundle构建输出的
bundle目录下的所有模块文件,确认权限是否被意外打包
3. 处理历史版本遗留问题
- 向官方提交申诉,明确说明:
- 当前版本已完全移除
QUERY_ALL_PACKAGES权限,并附上aapt解析的权限列表截图/文本 - 说明已按照要求通过
<queries>声明了所需的特定包可见性,附上清单文件中<queries>配置的代码片段 - 解释无法下架历史版本的情况,请求官方针对当前合规版本恢复上架
- 当前版本已完全移除
- 申诉时重点强调:当前版本的功能实现未依赖全量包查询,完全符合
<queries>的窄范围可见性要求
4. 确认<queries>配置的正确性
确保<queries>元素正确覆盖了所有需要访问的应用包名,示例配置:
<queries> <!-- 声明需要访问的特定应用包名 --> <package android:name="com.example.targetapp1" /> <package android:name="com.example.targetapp2" /> <!-- 若需要基于Intent过滤,可添加intent节点 --> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="text/plain" /> </intent> </queries>
5. 排查构建脚本与依赖的隐式引入
- 检查项目的
build.gradle文件,确认是否有通过manifestPlaceholders或其他构建逻辑动态添加权限的情况 - 使用
./gradlew app:dependencies(对应模块命令)分析依赖树,查看是否有第三方库间接引入该权限,可通过exclude规则移除:
dependencies { implementation('com.example.somelibrary') { exclude group: 'androidx.core', module: 'core' // 示例,根据实际依赖调整 } }
内容的提问来源于stack exchange,提问作者user14534315
相关产品推荐
相关产品推荐

