Android知识首页投稿(暂停使用,暂停投稿)Android技术知识

关于Gradle打包动态添加渠道号

2017-12-25  本文已影响0人  Kael_祈求者

1.如何理解Gradle?Gradle在Android的构建过程中有什么作用?

1.Gradle是一个基于Groovy的,是Android项目中的构建工具,通过gradle,我们很容易进行分模块编程,将大事化小,从而清晰的进行模块开发。从maven演变过来,比maven更灵活。

2.首先,在Android的构建过程中,有很多常用的配置,也可以叫方法,通过这些个配置,我们能很容易的通过gradle来指定项目中所用的版本号,包名,还有第三方库的依赖等等。

2.实践问题如下
问题:我们知道,Android中时常需要分布渠道包,需要将渠道包信息附加到Apk中,然后在程序启动的时候读取渠道信息。动态指定一个渠道号(比如1001),
在AndroidManifest.xml文件里面的application节点下面添加如下meta-date。
写一段Gradle脚本自动完成。

<application android:allowBackup="false" android:supportsRtl="true">
<meta-data android:name=“channel" android:value=“1001" />
</application>

要求:当通过如下命令来构建渠道包的时候,将渠道号自动添加到apk的manifest中。
gradlew clean assembleRelease -P channel=1001

//导包
import com.android.build.gradle.api.ApplicationVariant
import groovy.xml.XmlUtil

//动态向AndroidManifest.xml中 添加渠道号
project.afterEvaluate {
    android.applicationVariants.each{ ApplicationVariant variants ->
        def name = variants.name;
        def variantsName = name.capitalize();
        println "nam == ${name}"
        println "capitalizeName == ${variantsName}"
        def mergeManifestTask = project.tasks.getByName("process${variantsName}Manifest")
        println "mergeManifestTask == ${mergeManifestTask}"
        mergeManifestTask.doLast { mm ->
            def manifest = mm.manifestOutputFile
            println "manifest == ${manifest}"
            if(project.hasProperty("channel")){
                addChannel(manifest);
            }
        }
    }
}

def addChannel(File manifest){
    def channelNo = project.property("channel")
    println "channelNo == ${channelNo}"
    def parse = new XmlParser().parse(manifest);
    println "object == ${parse.application[0]}"
    parse.application[0].appendNode("meta-data",['android:name':'channel','android:value':channelNo])
    manifest.withPrintWriter("UTF-8"){
        XmlUtil.serialize(parse,it)
    }
}

此时只需要在打包时运行上面的命令即可~下面看看效果图


image.png
上一篇下一篇

猜你喜欢

热点阅读