APK文件只能包含一个AndroidManifest.xml文件,但是Android Studio项目可以包含多个Manifest文件,因此在构建应用时,Gradle构建会将所有的清单文件合并到一个封装到APK文件的清单文件中。所有我们的主项目的Manifest文件并不是最终的打包时的Manifest文件
假如我们引入一个第三方库,但是里面的Mianfest文件定义了一些我们不想要的东西,在合并到最终的Manifest文件时我们需要删除里面的一些东西(多余的权限申请,多余的Activity定义等),我们可以参考一下合并多个清单文件的规则:合并多个清单文件 利用清单文件的合并规则去删除或者添加一些属性
还有另一种方法就是在Gradle构建的过程中通过Task去修改Manifest文件
在 Migrate to Android Plugin for Gradle 3.0.0 这篇文章中介绍了一种方法,通过Android Plugin提供的task拿到Manifest的内容,然后对其做修改 如下:
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
output.processManifest.doLast {
// Stores the path to the maifest.
String manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"
// Stores the contents of the manifest.
def manifestContent = file(manifestPath).getText()
// Changes the version code in the stored text.
manifestContent = manifestContent.replace('android:versionCode="1"',
String.format('android:versionCode="%s"', generatedCode))
// Overwrites the manifest with the new text.
file(manifestPath).write(manifestContent)
}
}
}
但是上面的方法的给的有瑕疵:
variant.outputs返回的是一个List,并没有all方法,应该换用each方法(应该是文档的错误)
Manifest文件的位置可以直接通过output来拿到
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
def manifestOutFile = output.processManifest.manifestOutputFile
def manifestContent = manifestOutFile.getText('UTF-8')
···
//对manifestContent进行字符串操作
···
manifestOutFile.write(manifestContent)
}
}
}
可以通过manifestOutputFile.path确定最终Manifest文件的位置
全量编译时