关于QUERY_ALL_PACKAGES权限导致Google下架apk

  • Post author:
  • Post category:其他


突然收到提示,因为应用使用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/



版权声明:本文为mr_hmgo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。