1.如何理解Gradle娩践?Gradle在Android的構(gòu)建過程中有什么作用翻伺?
1.Gradle是一個基于Groovy的,是Android項目中的構(gòu)建工具吨岭,通過gradle,我們很容易進行分模塊編程旦事,將大事化小,從而清晰的進行模塊開發(fā)歪赢。從maven演變過來埋凯,比maven更靈活白对。
2.首先甩恼,在Android的構(gòu)建過程中条摸,有很多常用的配置铸屉,也可以叫方法,通過這些個配置彻坛,我們能很容易的通過gradle來指定項目中所用的版本號,包名昌屉,還有第三方庫的依賴等等。
2.實踐問題如下
問題:我們知道,Android中時常需要分布渠道包间驮,需要將渠道包信息附加到Apk中,然后在程序啟動的時候讀取渠道信息烤咧。動態(tài)指定一個渠道號(比如1001),
在AndroidManifest.xml文件里面的application節(jié)點下面添加如下meta-date偏陪。
寫一段Gradle腳本自動完成。
<application android:allowBackup="false" android:supportsRtl="true">
<meta-data android:name=“channel" android:value=“1001" />
</application>
要求:當通過如下命令來構(gòu)建渠道包的時候笛谦,將渠道號自動添加到apk的manifest中。
gradlew clean assembleRelease -P channel=1001
//導包
import com.android.build.gradle.api.ApplicationVariant
import groovy.xml.XmlUtil
//動態(tài)向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