突然收到提示,因为应用使用QUERY_ALL_PACKAGES权限,导致apk上线不了Google,查了一下是2022年7月后Google在高版本上限制了此权限的使用。当然,并不是 QUERY_ALL_PACKAGES 这个权限没有了,而是被列为敏感权限,必须有充分的理由说明,才允许上架 GP,否则还是被一票否决。其实说白了就是大路已经被封了,留了条小路,但是小路只能看,不能走。
但是检查配置清单文件我们是没有添加此权限的,反编译apk却又存在此权限,或者不用反编译,可以直接在AndroidStudio中查看最后合并的Androidmanifest.xml文件,位于 /app/build/intermediates/merged_manifests/debug/AndroidManifest.xml目录下
可以看到最后生成的xml文件确实包含此权限
项目中最后合成的AndroidManifest.xml 中内容的来源:
- 项目自身 AndroidManifest.xml
- 子 module 中的 AndroidManifest.xml
- 依赖中的AndroidManifest.xml
- gradle 中的代码修改
解决方案
通过查找发现,Sharesdk会生成QUERY_ALL_PACKAGES权限。
根据shareSDK官方推荐配置删除权限并配置对应需要查找的包名的queries,用于查找是否存在该应用
在AndroidManifest.xml中添加如下
<!--由于我的应用最后生成的xml文件里有微信的判断了,所以此处只添加了qq是否安装的判断-->
<queries>
<package android:name="com.tencent.mobileqq"/>
<package android:name="想要判断的应用包名"/>
</queries>
经过上述配置,最后生成的xml文件里还是存在QUERY_ALL_PACKAGES权限,在项目build.gradle文件里添加如下代码,删除对应权限即可
//删除QUERY_ALL_PACKAGES权限
project.afterEvaluate {
project.android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processResources.doFirst { pm->
String manifestPath = output.processResources.manifestFile;
def manifestContent = file(manifestPath).getText()
// 需要删除的权限
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>', '')
file(manifestPath).write(manifestContent)
}
}
}
}
参考文档:
https://juejin.cn/post/7114487250510938125
https://blog.csdn.net/Gdeer/article/details/88840980
https://blog.csdn.net/dhl91604/article/details/105969513/