改进版

作者: 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