一潜必、關(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中注入代碼》