第六周:gradle學(xué)習(xí)

應(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水太深....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評論 25 708
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,290評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 轉(zhuǎn)載注明出處:http://m.itdecent.cn/p/5255b100930e 0. 前言 完全由個人翻...
    王三的貓阿德閱讀 2,756評論 0 4
  • 有些愛深藏在心底,默默地,深深地,也是一份美好的念想。 1 “老師,我男神這次又拿了五千元的獎學(xué)金,還是全校十佳大...
    王月英閱讀 505評論 0 7

友情鏈接更多精彩內(nèi)容