在Gradle中建立自定義插件,Gradle提供了三種方式:html
開發Gradle插件能夠在IDEA中進行開發,也能夠在Android Studio中進行開發,它們惟一的不一樣,就是IDEA提供了Gradle開發的插件,比較方便建立文件和目錄,而Android Studio中,開發者須要手動建立(但實際上,這些目錄並很少,也不復雜,徹底能夠手動建立)。java
在Android Studio中建立一個標準的Android項目,整個目錄結構以下所示:android
├── 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
其中,除了buildSrc目錄之外,都是標準的Android目錄,而buildSrc就是Gradle提供的在項目中配置自定義插件的默認目錄,開發Gradle要建立的目錄,也就是RootProject/src/main/groovy和RootProject/src/main/resources兩個目錄。api
在配置完成後,若是配置正確,對應的文件夾將被IDE所識別,成爲對應類別的文件夾。bash
首先,先來配置buildSrc目錄下的build.gradle文件,這個配置比較固定,腳本以下所示:markdown
apply plugin: 'groovy'
dependencies { compile gradleApi() compile localGroovy() }
接下來,在groovy目錄下,建立一個Groovy類(與Java相似,能夠帶包名,但Groovy類以.grovvy結尾),如圖所示:app
在腳本中經過實現gradle的Plugin接口,實現apply方法便可,腳本以下所示:maven
package com.xys
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MainPluginForBuildSrc implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('testPlugin') << {
println "Hello gradle plugin in src"
}
}
}
在如上所示的腳本的apply方法中,筆者簡單的實現了一個task,命名爲testPlugin,執行該Task,會輸出一行日誌。ide
所謂Groovy腳本的Extension,實際上就是相似於Gradle的配置信息,在主項目使用自定義的Gradle插件時,能夠在主項目的build.gradle腳本中經過Extension來傳遞一些配置、參數。gradle
建立一個Extension,只須要建立一個Groovy類便可,如圖所示:
如上所示,筆者命名了一個叫MyExtension的groovy類,其腳本以下所示:
package com.xys;
class MyExtension {
String message
}
MyExtension代碼很是簡單,就是定義了要配置的參數變量,後面筆者將具體演示如何使用。
在建立了Extension以後,須要修改下以前建立的Groovy類來加載Extension,修改後的腳本以下所示:
package com.xys
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MainPluginForBuildSrc implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create('pluginsrc', MyExtension)
project.task('testPlugin') << {
println project.pluginsrc.message
}
}
}
經過project.extensions.create方法,來將一個Extension配置給Gradle便可。
resources目錄是標識整個插件的目錄,其目錄下的結構以下所示:
└── resources
└── META-INF
└── gradle-plugins
該目錄結構與buildSrc同樣,是Gradle插件的默認目錄,不能有任何修改。建立好這些目錄後,在gradle-plugins目錄下建立——插件名.properties文件,如圖所示:
如上所示,這裏筆者命名爲pluginsrc.properties,在該文件中,代碼以下所示:
implementation-class=com.xys.MainPluginForBuildSrc
經過上面的代碼指定最開始建立的Groovy類便可。
在主項目的build.gradle文件中,經過apply指令來加載自定義的插件,腳本以下所示:
apply plugin: 'pluginsrc'
其中plugin的名字,就是前面建立pluginsrc.properties中的名字——pluginsrc,經過這種方式,就加載了自定義的插件。
在主項目的build.gradle文件中,經過以下所示的代碼來加載Extension:
pluginsrc{ message = 'hello gradle plugin' }
一樣,領域名爲插件名,配置的參數就是在Extension中定義的參數名。
配置完畢後,就能夠在主項目中使用自定義的插件了,在終端執行gradle testPlugin指令,結果以下所示:
:app:testPlugin
hello gradle plugin
在buildSrc中建立自定義Gradle插件只能在當前項目中使用,所以,對於具備廣泛性的插件來講,一般是創建一個獨立的Module來建立自定義Gradle插件。
首先,在主項目的工程中,建立一個普通的Android Library Module,並刪除其默認建立的目錄,修改成Gradle插件所須要的目錄,即在buildSrc目錄中的全部目錄,如圖所示:
如上圖所示,建立的文件與在buildSrc目錄中建立的文件都是如出一轍的,只是這裏在一個自定義的Module中建立插件而不是在默認的buildSrc目錄中建立。
由於是經過自定義Module來建立插件的,所以,不能讓Gradle來自動完成插件的加載,須要手動進行部署,因此,須要在插件的build.gradle腳本中增長Maven的配置,腳本以下所示:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
group='com.xys.plugin'
version='2.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
相比buildSrc中的build.gradle腳本,這裏增長了Maven的支持和uploadArchives這樣一個Task,這個Task的做用就是將該Module部署到本地的repo目錄下。在終端中執行gradle uploadArchives指令,將插件部署到repo目錄下,如圖所示:
當插件部署到本地後,就能夠在主項目中引用插件了。
當插件正式發佈後,能夠把插件像其它module同樣發佈到中央庫,這樣就能夠像使用中央庫的庫項目同樣來使用插件了。
在buildSrc中,系統自動幫開發者自定義的插件提供了引用支持,但自定義Module的插件中,開發者就須要本身來添加自定義插件的引用支持。在主項目的build.gradle文件中,添加以下所示的腳本:
apply plugin: 'com.xys.plugin'
buildscript { repositories { maven { url uri('../repo') }
}
dependencies { classpath 'com.xys.plugin:plugin:2.0.0' }
}
其中,classpath指定的路徑,就是相似compile引用的方式,即——插件名:group:version
配置完畢後,就能夠在主項目中使用自定義的插件了,在終端執行gradle testPlugin指令,結果以下所示:
:app:testPlugin
Hello gradle plugin
若是不使用本地Maven Repo來部署,也能夠拿到生成的插件jar文件,複製到libs目錄下,經過以下所示的代碼來引用:
classpath fileTree(dir: 'libs', include: '\*.jar') // 使用jar
參考:https://docs.gradle.org/current/userguide/custom_plugins.html