改进版

作者: from0 | 来源:发表于2017-12-22 10:53 被阅读16次

使用 groovy 的 XML 的 API 修改 <meta-data> 节点的值。
查了半天资料。这里有几个需要注意的地方:

  1. 需要声明 android 命名空间
  2. 修改完后需要序列化重新写入原来的文件

这俩坑,我查了好久资料终于搞定了。。代码如下:

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

相关文章

网友评论

      本文标题:改进版

      本文链接:https://www.haomeiwen.com/subject/oestgxtx.html