應(yīng)黨中央(主席)要求,用代碼實現(xiàn)動態(tài)指定一個渠道號
首先第一步自定義一個plugin
class mPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
}
}
}
然后根據(jù)我們的需求我們需要拿到manifest文件,并動態(tài)更改其中的channel節(jié)點
所以我們可以先給channel賦值:<meta-data android:name="channel" android:value="channelValue" />
channelValue就是我們的坑位,需要在gradle里更改manifest文件,最先想到的就是將文件變?yōu)閟tring,然后替換(replace)掉“channelValue”,于是有了下面的代碼:
void apply(Project project) {
project.afterEvaluate {
//拿到manifest文件
File manifest = new File("app/src/main/AndroidManifest.xml")
//轉(zhuǎn)換為String
String mText = manifest.text
//替換坑位
String replaceText = mText.replaceAll("channelValue", project.channel)
寫進manifest文件里(groovy寫法,超級方便)
manifest.write(replaceText)
}
}
so easy媽媽再也不用擔(dān)心我的學(xué)習(xí)!~(其實之前還試過XML解析,IO讀寫都失敗了)不過通過學(xué)習(xí),了解了groovy的IO操作和XML解析,比JAVA方便的多,大家有興趣可以了解下。
assembleRelease一波后發(fā)現(xiàn)完美執(zhí)行,我的manifest文件變成了這樣:
<meta-data android:name="channel" android:value="1001" />
好了,文本到此結(jié)束.......個屁啊,manifest文件變成這樣了,下次構(gòu)建的時候坑位“channelValue”不就沒有了嗎?難道手動改,那gradle的意義何在?
想想manifestPlaceholders的實現(xiàn),只在APK的manifest里更改了相應(yīng)的渠道變量,而工程里的沒有變。如何實現(xiàn)呢?
1、找到gradle打包時的manifest,更改此文件的內(nèi)容
2、先改掉,打包完成后又改回來
第一種實現(xiàn)方式恕在下愚笨,沒有找到(沒有源碼真的好難做)
于是選擇了第二種方式,那么難點來了:代碼如何在打包或者manifest使用后執(zhí)行呢?學(xué)習(xí)了剛哥一波視頻后知道了assembleRelease依賴了很多任務(wù),從中我找到了manifest相關(guān)的任務(wù):processReleaseManifest,只要在這個任務(wù)之后改回來就好了,光這樣也不行,因為不一定每個命令都會執(zhí)行這個任務(wù),所以改也要在assembleRelease系列任務(wù)里改,這里由于水平有限不知道哪個任務(wù)最合適,就選了一個processReleaseManifest執(zhí)行之前的任務(wù)mergeReleaseResources,具體代碼如下:
void apply(Project project) {
project.afterEvaluate {
File manifest = new File("app/src/main/AndroidManifest.xml")
String mText = manifest.text
project.android.applicationVariants.all { variant ->
//獲取任務(wù):因為不同build方式,方法名也不同,所以利用variant獲取(參考virtualAPK)
MergeResources mergeTask = project.tasks["merge${variant.name.capitalize()}Resources"]
//doLast會在任務(wù)之后執(zhí)行
mergeTask.doLast {
String replaceText = mText.replaceAll("channelValue", project.channel)
manifest.write(replaceText)
println "mergeTask"
}
MergeManifests manifestTask = project.tasks["process${variant.name.capitalize()}Manifest"]
manifestTask.doLast {
manifest.write(mText)
println "manifestTask"
}
}
}
}
好的,以上就可以完美運行了,gradle水太深....