Android gradle 自定義外掛
Gradle 的外掛有三種打包方式:
- 構建指令碼:外掛邏輯寫在 build.gradle 中,適用於邏輯簡單的任務,但是該方式實現的外掛在該構建指令碼之外是不可見的,只能用於當前指令碼。
-
buildSrc專案:根據語言外掛程式碼放在 rootProjectDir/buildSrc/src/main/groovy 目錄中或者 rootProjectDir/buildSrc/src/main/java 或者rootProjectDir/buildSrc/src/main/kotlin,該外掛對於該專案中構建使用的每個構建指令碼都是可見的,適用於邏輯複雜但又不需要對外可見的外掛
- 獨立專案:一個獨立的 Groovy/Java/Kotlin 專案,該專案生成併發佈一個 jar 然後可以在多個版本中使用它並與他人共享,並且此 jar 包可能包含一些外掛,或者將多個相關的任務類捆綁到單個庫中
接下來我們先從基本的構建指令碼中的外掛開始
1、構建指令碼:
建立 Gradle 外掛,需要建立一個實現 Plugin 介面的類,當外掛應用於專案時,Gradle 會建立外掛類的例項並呼叫例項的 apply() 方法,如果需要的話,外掛還可以用於配置專案
把外掛變得可配置,新增一些簡單擴充套件屬性到 project 上,比如可以新增一個 greeting 擴充套件物件到 project 上,這就允許我們去配置 greeting 物件。
檔案是 build.gradle:
class GreetingPluginExtension { String message = 'Hello from GreetingPlugin' } class GreetingPlugin implements Plugin<Project> { void apply(Project project) { // Add the 'greeting' extension object def extension = project.extensions.create('greeting', GreetingPluginExtension) // Add a task that uses configuration from the extension object project.task('hello') { doLast { println extension.message } } } } apply plugin: GreetingPlugin // Configure the extension greeting.message = 'Hi from Gradle'
2、獨立專案
建立Gradle Module
AndroidStudio中是沒有新建類似Gradle Plugin這樣的選項的,那我們如何在AndroidStudio中編寫Gradle外掛,並打包出來呢?
-
首先,你得新建一個Android Project
-
然後再新建一個 Module,這個 Module用於開發 Gradle 外掛,同樣,Module 裡面沒有 gradle plugin 給你選,但是我們只是需要一個“容器”來容納我們寫的外掛,因此,你可以隨便選擇一個 Module 型別(如 Phone & Tablet Module 或 Android Librarty ),因為接下來一步我們是將裡面的大部分內容刪除,所以選擇哪個型別的 Module 不重要。
-
將 Module 裡面的內容刪除,只保留 build.gradle 檔案和 src/main 目錄。
-
由於 gradle 是基於 groovy,因此,我們開發的 gradle 外掛相當於一個 groovy 專案。所以需要在 main 目錄下新建 groovy 目錄
-
groovy 又是基於Java,因此,接下來建立groovy的過程跟建立java很類似。在 groovy 新建包名,如:com.sjq.greetplugin,然後在該包下新建groovy檔案,通過 new->file→GreetingPlugin.groovy 來新建名為 GreetingPlugin 的 groovy 檔案。一定是要有.groovy 字尾檔案。
-
為了讓我們的 groovy 類申明為 gradle 的外掛,新建的 groovy 需要實現 org.gradle.api.Plugin 介面。
如下所示:
package com.sjq.greetplugin // 包名一定要有,不然打包不會打進對應包裡去,很可能就會出現類找不到的情況。 import org.gradle.api.Plugin import org.gradle.api.Project class GreetingPlugin implements Plugin<Project> { @Override void apply(Project project) { project.task("publishPluginTest"){ // task 名字 doLast { println("新內容是:null") } } } }
定義好了自己的 gradle 外掛類,接下來就是告訴 gradle,哪一個是我們自定義的外掛類,因此,需要在 main 目錄下新建 resources 目錄,然後在resources 目錄裡面再新建 META-INF 目錄,再在 META-INF 裡面新建 gradle-plugins 目錄。最後在 gradle-plugins 目錄裡面新建 properties 檔案,注意這個檔案的命名,你可以隨意取名,但是後面使用這個外掛的時候,會用到這個名字。比如,你取名為 com.sjq.gradle.properties,而在其他build.gradle 檔案中使用自定義的外掛時候則需寫成:
apply plugin: 'com.sjq.greetplugin'
然後在com.hc.gradle.properties
檔案裡面指明你自定義的類
implementation-class=com.sjq.greetplugin.GreetingPlugin // 注意後面跟的是外掛名字,注意大小寫
此處我們還是採用包名,方便記憶。
到這裡後,整個目錄結果如下圖所示:
因為我們要用到 groovy
以及後面打包要用到 maven
, 所以在我們自定義的 Module
下的 build.gradle
需要新增如下程式碼:
apply plugin: 'groovy' apply plugin: 'maven' dependencies { //gradle sdk compile gradleApi() //groovy sdk compile localGroovy() } repositories { mavenCentral() }
打包到本地Maven
前面我們已經自定義好了外掛,接下來就是要打包到 Maven 庫裡面去了,你可以選擇打包到本地,或者是遠端伺服器中。在我們自定義 Module
目錄下的 build.gradle 新增如下程式碼:
//group和version在後面使用自定義外掛的時候會用到 group='com.hc.plugin' version='1.0.0' uploadArchives { repositories { mavenDeployer { //提交到遠端伺服器: // repository(url: "http://www.xxx.com/repos") { // authentication(userName: "admin", password: "admin") // } //本地的Maven地址設定為../repos repository(url: uri('../repos')) } } }
其中,group
和 version
後面會用到,我們後面再講。雖然我們已經定義好了打包地址以及打包相關配置,但是還需要我們讓這個打包 task 執行。點選 AndroidStudio
右側的 gradle 工具
,如下圖所示:
可以看到有 uploadArchives
這個 Task,
雙擊 uploadArchives
就會執行打包上傳啦!執行完成後,去我們的 Maven
本地倉庫檢視一下:
其中,com/sjq/greetplugin
這幾層目錄是由我們的 group
指定,myplugin
是模組的名稱,1.0.0
是版本號( version
指定)。
使用自定義的外掛
接下來就是使用自定義的外掛了,一般就是在 app 這個模組中使用自定義外掛,因此在 app 這個 Module 的 build.gradle 檔案中,需要指定本地 Maven 地址、自定義外掛的名稱以及依賴包名。簡而言之,就是在 app 這個 Module 的 build.gradle 檔案中後面附加如下程式碼:
buildscript { repositories { maven {//本地Maven倉庫地址 url uri('../repos') } } dependencies { //格式為-->group:module:version classpath 'com.sjq.greetplugin:GreetingPlugin:1.0.0' } } //com.sjq.greetplugin 為 resources/META-INF/gradle-plugins 下的 properties 檔名稱 apply plugin: 'com.sjq.greetplugin'
在當前目錄下輸入命令列:
./gradlew -q publishPluginTest
執行結果:
3、開發只針對當前專案的Gradle外掛
前面我們講了如何自定義 gradle 外掛並且打包出去,可能步驟比較多。有時候,你可能並不需要打包出去,只是在這一個專案中使用而已,那麼你無需打包這個過程。
只是針對當前專案開發的 Gradle 外掛相對較簡單。步驟之前所提到的很類似,只是有幾點需要注意:
新建的 Module 名稱必須為 BuildSrc,無需 resources 目錄
其中,build.gradle
內容為:
// 依賴groovy外掛 plugins { id 'groovy' } dependencies { implementation gradleApi() implementation localGroovy() }
CustomPluginB 內容是
package com.sjq.happy.myplugin import org.gradle.api.Plugin import org.gradle.api.Project // 在單獨的groovy檔案中定義外掛類 class CustomPluginB implements Plugin<Project> { @Override void apply(Project project) { project.task('CustomPluginTaskB') { doFirst { println 'This is custom plugin TaskB' } } } }
在app
這個Module
中如何使用呢?直接在app的build.gradle下加入
import com.sjq.happy.myplugin.CustomPluginB
在輸入命令列:
./gradlew -q CustomPluginTaskB
結果如下圖所示:
&n