Gradle自定義外掛詳解

weixin_34365417發表於2017-08-04

關於gradle外掛自定義,發現網上好多的錯誤教程,總結後的文章,若本文中也有錯誤,請及時指正

在Gradle中建立自定義外掛,Gradle提供了三種方式:

  • 在build.gradle指令碼中直接使用
  • 在buildSrc中使用
  • 在獨立Module中使用

開發Gradle外掛可以在IDEA中進行開發,也可以在Android Studio中進行開發,它們唯一的不同,就是IDEA提供了Gradle開發的外掛,比較方便建立檔案和目錄,而Android Studio中,開發者需要手動建立(但實際上,這些目錄並不多,也不復雜,完全可以手動建立,而且在AS中進行建立有利於進行外掛依賴的除錯和功能的完善)。

一.在build.gradle指令碼中使用

在build.gradle指令碼中使用是最簡單的,但是隻適應於很簡單的功能,也不便於其他地方應用,如下面,可以直接寫在app moudle的build.gradle 裡面,sync之後可在右側model對應的other中查詢到MytestPlugin

2333435-d114410425c424f7.png
根目錄下build.gradle

雙擊執行,在android studio終端裡就可以直接執行此外掛:

2333435-dd172efc36befacf.png
執行之後的截圖

由於直接在build.gradle中進行自定義比較簡單,這裡就不在進行重點的講解

二. 在專案裡使用

這裡官網的描述 https://docs.gradle.org/4.0.2/userguide/organizing_build_logic.html#multiProjectBuildSrc
請參考(目前所暫時為最新的gradle4.0.2內容,低版本也相容此功能)

2333435-a27cfc583793d749.png

根據官網的描述,這裡在專案中進行使用的gradle外掛過程如下:
首先在Android Studio中建立一個標準的Android專案,然後在專案的根目錄下新建一個model命名為buildSrc,這個目錄就用來存放自定義外掛,整個目錄結構如下所示:

├── app  
│   ├── build.gradle  
│   ├── libs  
│   └── src  
│       ├── androidTest  
│       │   └── java  
│       ├── main  
│       │   ├── AndroidManifest.xml  
│       │   ├── java  
│       │   └── res  
│       └── test  
├── build.gradle  
├── buildSrc  
│   ├── build.gradle            ---1  
│   └── src  
│       └── main  
│           ├── groovy          ---2  
│           └── resources       ---3  
├── gradle  
│   └── wrapper  
│       ├── gradle-wrapper.jar  
│       └── gradle-wrapper.properties  
├── gradle.properties  
├── gradlew  
├── gradlew.bat  
├── local.properties  
└── settings.gradle  

我們對新建的model操作過程如下:

src/main 專案檔案下:

  • 移除 java 資料夾,因為在這個專案中用不到 java 程式碼
  • 新增 groovy 資料夾,主要的程式碼檔案放在這裡
  • 新增 resources 資料夾,存放用於標識 gradle 外掛的 meta-data
  • 修改src/build.gradle配置內容

下面是我的一個實際專案:

2333435-164a5fa13bc6a2d5.png
專案中使用gradle截圖

其中,除了buildSrc目錄以外,其他都是標準的Android目錄,而buildSrc就是Gradle提供的在專案中配置自定義外掛的預設目錄,開發Gradle要建立的目錄,也就是RootProject/src/main/groovy和RootProject/src/main/resources兩個目錄。

1,建立buildSrc/build.gradle

首先,先來配置buildSrc目錄下的build.gradle檔案,這個配置比較固定,使用官網示例,指令碼如下所示:

apply plugin: 'groovy'  
  
dependencies {  
    compile gradleApi() //gradle sdk  
    compile localGroovy() //groovy sdk  
}  

2,建立Groovy指令碼

接下來,在groovy目錄下,建立一個Groovy類(與Java類似,可以帶包名,但Groovy類以.grovvy結尾,所以groovy檔案的建立是new->file->custom.groovy),如圖所示:

2333435-bcdccfc358af89b4.png
其中MyPlugin為new出的新檔案,全名為MyPlugin.groovy

在groovy下先建立了子目錄,這裡類似於java 的package一樣,com/myPlugin 目錄,再建立MyPlugin.groovy檔案:

package com.myPlugin

import org.gradle.api.Plugin
import org.gradle.api.Project

public class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.task('testPlugin') << {
            println 'hello, world!'
        }
    }
}

注意:
groovy 資料夾中的類,一定要修改成 .groovy
字尾,IDE 才會正常識別。

這個外掛建立了一個名為testPlugin的Task, 並在 task 中列印。外掛是一個類,繼承自 org.gradle.api.Plugin介面,過載 void apply(Project project)方法,這個方法將會傳入使用這個外掛的 project 的例項,這是一個重要的 context。

3,建立resources
resources目錄是標識整個外掛的目錄,其目錄下的結構如下所示:

└── resources 
 └── META-INF 
   └── gradle-plugins

該目錄結構與buildSrc一樣,是Gradle外掛的預設目錄,不能有任何修改。建立好這些目錄後,在gradle-plugins目錄下建立——外掛名.properties檔案,如上圖所示的: myCustomPlugin.properties檔案
在該檔案中,程式碼如下所示:

implementation-class=com.myPlugin.MyPlugin//這裡的com.myPlugin.MyPlugin指的是上面所建立的包名路徑

通過上面的程式碼指定最開始建立的Groovy類即可。

在主專案中使用外掛
在主專案的build.gradle檔案中,通過apply指令來載入自定義的外掛,指令碼如下所示:

apply plugin: 'myCustomGradle'

其中plugin的名字,就是前面建立myCustomPlugin.properties中的名字——myCustomPlugin,通過這種方式,就載入了自定義的外掛。

配置完畢後,就可以在主專案中使用自定義的外掛了,在終端執行gradlew testPlugin指令或者在右側的gradle整合中查詢,及app-other:testPlugin任務進行雙擊,如圖:

2333435-3c5e3d631a3e46ae.png
plugin命令可點選

結果如下所示:

2333435-e667e5ab0c97d0cf.png

三. 在獨立Module中使用

一個獨立的 Groovy 和 Java 專案,可以把這個專案打包成 Jar 檔案包,一個 Jar 檔案包還可以包含多個外掛入口,將檔案包釋出到託管平臺上,供其他人使用。

在buildSrc中建立自定義Gradle外掛只能在當前專案中使用,因此,對於具有普遍性的外掛來說,通常是建立一個獨立的Module來建立自定義Gradle外掛。

建立過程請參考上節中的

《二. 在專案裡使用》

卻別在於:

  1. 不需要進行model的名稱的寫死,也就是你可以隨意的命名
  2. buildSrc會自動的編譯和加入到classpath中,這裡我們需要手動依賴
  3. 需要上傳到maven倉庫中

其實gradle外掛的自定義到這裡介紹的也差不多了,由於篇幅的原因,關於maven的上傳和外掛的依賴我們單獨開一章節來描述。以上功能已經全部驗證,原始碼請見:https://github.com/AnyMarvel/GradleStart

ps:若開發gradle外掛比較犀利的情況下,推薦使用IDEA,至少有個提示功能

未完待續……
(累了休息會吧,gradle環境跑步起來會吐的,真會吐哦)


關注微信公眾號 Android歷練記 或掃一掃二維碼:讓我們一起來搞事情。

2333435-d3539c9b666cf383.jpg

相關文章