前言
最近要上架Google Play 但是因为有个敏感权限很容易被拒。
想着把权限依赖的库去掉就行了,但是遇到一个恶心的问题。就是这个权限在Android Studio的Merged Manifest 视图中没有,但是在生成的apk中却包含。这样的就不能通过Android Studio来定位权限来自于那个库。
包含在生成的清单文件中
解决方案
通过gradle脚本动态移除 ,放在app模块的build.gradle文件中即可。以下脚本在gradle:8.4.2中运行良好
void removePermission(File file){
if(file.isDirectory()){
file.listFiles().every {
removePermission(it)
}
}
if(file.name.equals("AndroidManifest.xml")){
def manifestOutFile =file;
def manifestContent = manifestOutFile.getText()
// 删除指定权限,通过替换成不敏感的权限实现
if (manifestContent.contains('android.permission.QUERY_ALL_PACKAGES')) {
println "包含敏感权限"
} else {
println "不包含敏感权限"
}
manifestContent = manifestContent.replaceAll('android.permission.QUERY_ALL_PACKAGES', 'android.permission.INTERNET')
println('执行替换')
if (manifestContent.contains('android.permission.QUERY_ALL_PACKAGES')) {
println "包含敏感权限"
} else {
println "不包含敏感权限"
}
// 再写回manifest文件
manifestOutFile.write(manifestContent)
}
}
afterEvaluate {
def set= getTasks().findAll {
def name=it.name;
if(name.contains('process')&&name.contains("ManifestForPackage")){
return true;
}
return false;
}
println "set="+set
set.each {
it.doFirst{
it.inputs.files.each {
removePermission(it)
}
}
}
运行结果
成功把敏感权限替换成了非敏感权限。相当于移除了