有些第三方sdk中的敏感权限会给我们上架带来困扰,比如:QUERY_ALL_PACKAGES权限会导致上架Google play被拒。
案例:<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
在app下的Manifest中并没有添加该权限,而被google检测出来
此时我们可以通过合并后的清单文件去查找是否真的存在这个权限
在这里我们找到了这个权限。然后尝试手动删除,发现只要重新编译这个权限又会重新添加回来,无法删除。
原来这个文件的路径指向的是.gradle>caches,重新编译会重新加载。所以删掉后重新编译会重新出现。
解决方法:
在优先级最高的Manifest中移除权限
在项目的app>build.gradle中添加<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:node="remove"/>
再看Merged Manifest中已经去掉了该权限
参考:合并多个清单文件
另外:网上有使用tools:node="remove"无法移除权限情况:在gradle打包流程中重新把权限添加回来了。
解决方案(网上找的,未验证过,我通过tools:node="remove"就已经移除了权限):
在编译构建流程中,把这些权限删除。在项目的app>build.gradle的android{}末尾添加以下代码
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.GET_TASKS"/>', '')
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>', '')
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.BLUETOOTH"/>', '')
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>', '')
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>', '')
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.READ_PHONE_STATE"/>', '')
manifestContent = manifestContent.replace('<uses-permission xmlns:tools="http://schemas.android.com/tools" android:name="android.permission.ACCESS_COARSE_LOCATION"/>', '')
manifestContent = manifestContent.replace('<uses-permission xmlns:tools="http://schemas.android.com/tools" android:name="android.permission.BLUETOOTH"/>', '')
println("manifestContent:" + manifestContent)
file(manifestPath).write(manifestContent)
}
}
}
}
最后:flutter项目可以通过从Android原生打开的方式进行这些操作,因为从dart packages上引入的第三方库在加载成功后也是通过原生的代码引入该第三方sdk
例如: