使用 groovy 的 XML 的 API 修改 <meta-data>
節(jié)點(diǎn)的值。
查了半天資料敌蚜。這里有幾個(gè)需要注意的地方:
- 需要聲明 android 命名空間
- 修改完后需要序列化重新寫(xiě)入原來(lái)的文件
這倆坑晌纫,我查了好久資料終于搞定了竟坛。丈甸。代碼如下:
project.afterEvaluate {
// 配置完后設(shè)置渠道號(hào)
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> 節(jié)點(diǎn)遍歷修改 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
}
}
// 將處理后的結(jié)果序列化成 xml 的格式然后寫(xiě)入原來(lái)的文件中
def serialize = XmlUtil.serialize(manifest)
println("-------修改后的 xml 文件:\n${serialize}")
file(manifestFile).write(serialize)
}
}
}
}