Gradle系列 (上篇) —Android自定義Gradle插件并在項目中使用

一潜必、關(guān)于Gradle

Android項目的構(gòu)建過程是通過一系列Gradle插件完成的,而Gradle插件是使用Groovy語言實現(xiàn)的便斥,Groovy是一種腳本語言国夜,在國外還是很火的,但是國內(nèi)使用的貌似不多厦凤,Groovy 可以與 Java 語言無縫對接鼻吮,在寫 Groovy 的時候如果忘記了語法可以直接按Java的語法繼續(xù)寫,也可以在 Java 中調(diào)用 Groovy 腳本较鼓,都可以很好的工作椎木。關(guān)于Groovy語言可以到官網(wǎng)做稍微了解學(xué)習(xí):Groovy官網(wǎng),也可以到精通Groovy簡單學(xué)習(xí)博烂。

Gradle中的所有內(nèi)容都基于兩個基本概念:Project和Task

Project:這個接口是build file與Gradle交互的主要API拓哺,通過Project接口可以訪問Gradle的功能。
Task:一個Project本質(zhì)上是Task對象的集合脖母,每個Task都執(zhí)行一些基本的工作士鸥,比如compileDebugJavaWithJavac、assembleRelease等等谆级。

Android項目的build過程

上面這張圖詮釋了Gradle build的生命周期的過程烤礁,分為三個階段。對于Android項目肥照,在Configuration階段會解析項目根目錄下的build.gradle文件脚仔。

上面的 classpath 'com.android.tools.build:gradle:3.6.1' 就是用來導(dǎo)入用于構(gòu)建Android項目的Gradle 插件庫的,導(dǎo)入插件庫以后舆绎,就可以在項目的子module的build.gradle中應(yīng)用該插件庫中的插件了:

apply plugin: 'com.android.application'

為了更清晰的理解gradle插件和使用鲤脏,那接下來就來自定義一個gradle插件并使用它。

二、自定義Gradle插件

Gradle 一共提供了三種方式創(chuàng)建自定義插件:

1猎醇、直接在build腳本中開發(fā)包含插件的源代碼:

插件可以自動編譯并包含在build腳本的classpath中窥突,而無需執(zhí)行其他任何操作。 但是不能在build腳本之外重用插件硫嘶。

2阻问、在buildSrc這個project中創(chuàng)建自定義插件:

在項目中創(chuàng)建module,命名為BuildSrc(必須為BuildSrc)沦疾,與app同級称近。該方式與第三種有點相似,下面會重點介紹第三種方式哮塞。該插件對build使用的每個build腳本都是可見的刨秆。 但是在build之外是不可見的,所以不能在build之外重用該插件忆畅。

3坛善、在獨立的module中創(chuàng)建自定義插件:

為自定義gradle插件創(chuàng)建一個單獨的project。 該project生成并發(fā)布一個包邻眷,可以在多個build中使用該包眠屎。

  • 創(chuàng)建一個module(Android Library),命名隨意肆饶,我這里叫“MyPlugin”改衩。
  • 刪除多余的文件,只留下src/main以及build.gradle文件驯镊,如下:

首先我們要在src/main/這個路徑下創(chuàng)建兩個文件夾:一個是groovy葫督,另外一個是resources/META-INF/gradle-plugins
注意:這里的目錄名字不能寫錯 ,不然運行的時候會找不到板惑。
修改過后的截圖如下:

接下來就可以完善插件內(nèi)容和配置信息了橄镜。
因為插件是用groovy語言寫的,所以接下來我們要在myplugin中的build.gradle添加如下信息冯乘,先刪除之前的內(nèi)容洽胶。

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

repositories {
    mavenCentral()
}


//設(shè)置插件的GAV參數(shù)
group = 'com.zhuyong.myplugin'
archivesBaseName = 'MyPlugin'
version = '1.0.0'


uploadArchives {
    repositories {
        mavenDeployer {
            //在當前同級目錄下生成maven包
            repository(url: uri('repository'))
        }
    }
}

此時可以執(zhí)行以下Sync同步一下。下一步要開發(fā)插件的可執(zhí)行代碼了裆馒,在groovy文件夾下新建package包:com/zhuyong/myplugin姊氓,然后新建一個xxx.groovy的文件(創(chuàng)建方式:new → file → xxx.groovy ) ,我這里的groovy叫做MyPlugin.groovy喷好,截圖如下:

這個groovy文件的是為成為gradle插件而服務(wù)的翔横,需要實現(xiàn)org.gradle.api.Plugin的接口,然后在重載的apply()方法中是插件執(zhí)行的邏輯梗搅,我們在這個插件中輸出一些字符串來驗證是否執(zhí)行了當前插件:

OK禾唁,Plugin已經(jīng)完成了效览,那么如何引用它呢,別急繼續(xù)看荡短。
如何讓其他Project知道我們這個是gradle插件呢丐枉?關(guān)鍵就在剛才創(chuàng)建的resources/META-INF/gradle-plugins,在該目錄下創(chuàng)建properties類型的文件肢预,這里文件命名很重要,這里的命名就是后面我們使用插件所依賴的方式洼哎,比如命名為custom-gradle-plugin.properties烫映,那么在使用時就是:

apply plugin: 'custom-gradle-plugin'

這里新建完成properties文件以后,輸入以下內(nèi)容:implementation-class=自定義的Plugin類的路徑噩峦,截圖如下:

  • 打包發(fā)布自定義插件

我們已經(jīng)自定義好了插件锭沟,下一步我們就要進行打包的過程了,剛才已經(jīng)在build.gradle里面指定好了打包的路徑以及版本號等參數(shù)信息识补,現(xiàn)在我們需要打包一下族淮,在右側(cè)邊欄的myplugin這個module下,在upload下面有一個uploadArchives凭涂,雙擊他就會開始打包了:

此時我們可以看到打包的過程如下:

此時祝辣,在myplugin目錄下就可以看到生成的文件夾了:

  • 引用自定義插件
    第一步:在項目根目錄下的build.gradle中添加以下代碼:
maven {
    url uri('myplugin/repository')
}

------------------------------------------------------------------

classpath 'com.zhuyong.myplugin:MyPlugin:1.0.0'

截圖如下:

第二步:在app目錄下的build.gradle中添加以下代碼:

apply plugin: 'custom-gradle-plugin'

截圖如下:

此時,執(zhí)行Sync或者clean切油,就可以在控制臺輸出之前我們寫的代碼了蝙斜,如下:

OK,到此為止就已經(jīng)完成了自定義Gradle插件的全部內(nèi)容了澎胡,下篇我們將介紹如何通過插件在class文件內(nèi)注入自定義代碼——《Gradle系列 (中篇) —在自定義Gradle插件中使用javassist往class中注入代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孕荠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子攻谁,更是在濱河造成了極大的恐慌稚伍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戚宦,死亡現(xiàn)場離奇詭異个曙,居然都是意外死亡,警方通過查閱死者的電腦和手機受楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門困檩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人那槽,你說我怎么就攤上這事悼沿。” “怎么了骚灸?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵糟趾,是天一觀的道長。 經(jīng)常有香客問我,道長义郑,這世上最難降的妖魔是什么蝶柿? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮非驮,結(jié)果婚禮上交汤,老公的妹妹穿的比我還像新娘。我一直安慰自己劫笙,他們只是感情好芙扎,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著填大,像睡著了一般戒洼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允华,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天圈浇,我揣著相機與錄音,去河邊找鬼靴寂。 笑死磷蜀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的百炬。 我是一名探鬼主播蠕搜,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼收壕!你這毒婦竟也來了妓灌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蜜宪,失蹤者是張志新(化名)和其女友劉穎虫埂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圃验,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡掉伏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澳窑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斧散。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摊聋,靈堂內(nèi)的尸體忽然破棺而出鸡捐,到底是詐尸還是另有隱情,我是刑警寧澤麻裁,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布箍镜,位于F島的核電站源祈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏色迂。R本人自食惡果不足惜香缺,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歇僧。 院中可真熱鬧图张,春花似錦、人聲如沸诈悍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽写隶。三九已至倔撞,卻和暖如春讲仰,著一層夾襖步出監(jiān)牢的瞬間慕趴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工鄙陡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冕房,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓趁矾,卻偏偏與公主長得像耙册,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子毫捣,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容