話題:關(guān)于Gradle的知識
1、如何理解Gradle?Grade在Android的構(gòu)建過程中有什么作用?
2、實(shí)踐如下問題。
問題:我們都知道,Android中時常需要發(fā)布渠道包,需要將渠道信息附加到apk中,然后在程序啟動的時候讀取渠道信息。仍然拿VirtualAPK來舉例,
鏈接:GitHub - didi/VirtualAPK: A powerful and lightweig...
動態(tài)指定一個渠道號(比如1001),那么構(gòu)建的apk中,請在它的AndroidManifest.xml文件里面的application節(jié)點(diǎn)下面添加如下meta-data,請寫一段Gradle腳本來自動完成:
<application android:allowBackup="false" android:supportsRtl="true">
<meta-data android:name=“channel" android:value=“1001" />
</application>
要求:當(dāng)通過如下命令來構(gòu)建渠道包的時候,將渠道號自動添加到apk的manifest中。 ./gradlew clean assembleRelease -P channel=1001 PS:禁止使用manifestPlaceholders 如何學(xué)習(xí)? 請從網(wǎng)上查找相干Gradle的主題,也可以閱讀VirtualAPK和Small里面構(gòu)建部分的代碼。
答案:
在app build.gradle中
import com.android.build.gradle.api.ApplicationVariant
import groovy.xml.XmlUtil
project.afterEvaluate {
android.applicationVariants.each { ApplicationVariant variant ->
String variantName = variant.name.capitalize()
def mergeManifestTask = project.tasks.getByName("process${variantName}Manifest")
mergeManifestTask.doLast { mm ->
def manifest = mm.manifestOutputFile
if (project.hasProperty("channel")){
addChannel(manifest)
}
}
}
}
def addChannel(File manifest){
def channelNo = project.property("channel")
def xml = new XmlParser().parse(manifest)
xml.application[0].appendNode("meta-data",['android:name': 'channel', 'android:value': channelNo])
manifest.withPrintWriter("UTF-8"){
XmlUtil.serialize(xml,it)
}
}
核心思想:在project afterEvaluate以后,找到處理manifest的那個task,然后再它的doLast后面通過Groovy xml API來直接修改構(gòu)建生成的xml文件即可,至于用不用Gradle插件,其實(shí)原理都一樣,直接寫在build.gradle里面了。