使用 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)
}
}
}
}