关于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