使用 groovy 的 XML 的 API 修改 <meta-data>
节点的值。
查了半天资料。这里有几个需要注意的地方:
- 需要声明 android 命名空间
- 修改完后需要序列化重新写入原来的文件
这俩坑,我查了好久资料终于搞定了。。代码如下:
project.afterEvaluate {
// 配置完后设置渠道号
setupChannel()
}
void setupChannel() {
android.applicationVariants.each { variant ->
def name = variant.name
println "name = ${name}"
variant.outputs.each { output ->
println("variant.outputs.each")
output.processManifest.doLast {
println("processManifest doLast")
// 声明命名空间
def android = new Namespace('http://schemas.android.com/apk/res/android', 'android')
// manifest 文件路径
def manifestFile = "${output.processManifest.manifestOutputDirectory}/AndroidManifest.xml"
// 解析 xml 文件
def manifest = new XmlParser().parse(manifestFile)
// 取出所有 <meta-data> 节点遍历修改 name 为 ChannelByGradle 的 value 值。
NodeList children = manifest.children()
NodeList metaDataList = children["meta-data"]
for (int i = 0; i < metaDataList.size(); i++) {
Node node = metaDataList.get(i)
if (node.attribute(android.name) == "ChannelByGradle") {
node.attributes().put(android.value, channel)
println(node.toString())
break
}
}
// 将处理后的结果序列化成 xml 的格式然后写入原来的文件中
def serialize = XmlUtil.serialize(manifest)
println("-------修改后的 xml 文件:\n${serialize}")
file(manifestFile).write(serialize)
}
}
}
}