利用 Gradle 移除第三方引入的静态权限

今天在群里有小伙伴提到自己的应用被其他第三方库添加了部分额外权限,好奇而研究了一番,发觉可以通过 Gradle 达到移除静态权限。

针对 Gradle 4.1(对应 Android Plugin 3.0.0)的代码是想起新版动态修改 versionCode 的方式而突发奇想试验的,结果证明可行。至于 Gradle 3.3 (对应 Android Plugin 2.3.3) 的代码则是阅读 Android Plugin 的版代码(MergeManifests.groovy, ManifestProcessorTask.groovy)了解到的。

注:由于移除静态权限可能会导致不必要的异常,在正式发布之前记得全面测试,不要因小失大

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
android.applicationVariants.all { variant ->
variant.outputs.forEach { output ->
output.processManifest.doLast {
def (majorVersion, minorVersion, patchVersion) = gradle.gradleVersion.tokenize('.')*.toInteger()
def manifestPath
// gradle version great or equal than 4.1
if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 1)) {
manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"
} else {
manifestPath = manifestOutputFile.absolutePath
}
def manifestContent = file(manifestPath).getText()
manifestContent = manifestContent.replace('<uses-permission android:name="android.permission.INTERNET" />', '')
file(manifestPath).write(manifestContent)
}
}
}