Gradle插件使用在日常開發(fā)中已經(jīng)很熟悉,那么我們怎么去自定義我們的插件?
自定義插件
自定義插件基于源碼放置可以分為3種:
一、Build Script方式
這種插件腳本的源碼放置在模塊內的 build.gradle 中,好處就是插件腳本會被自動編譯并添加進模塊的 classpath 中,我們完全不用做任何事情。但是,這種插件腳本只能在聲明的這個 build.gradle 中使用,其他模塊是沒辦法復用這個插件的。
//app build.gradle
apply plugin: BuildScriptPlugin
class BuildScriptPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
group = "test-plugin"
doLast {
println "Hello"
}
}
}
}

這里group為右側組名稱,向這個組添加一個名為hello的task
優(yōu)勢:
1、在當前build.gradle文件編寫,不需要其他配置即可使用
劣勢:
1、在一個文件里面寫代碼多,不易維護
2、插件代碼只能在當前文件中生效,無法復用
二、BuildSrc project方式
Gradle插件是使用Groovy進行開發(fā)的,而Groovy其實是可以兼容Java的。Android Studio其實除了開發(fā)Android App外,完全可以勝任開發(fā)Gradle插件這一工作,下面來講講具體如何開發(fā)。
- 新建一個Android項目。
- 新建一個Android Module項目,類型選擇Android Library。
- 將新建的Module中除了build.gradle文件外的其余文件全都刪除,然后刪除build.gradle文件中的所有內容。
-
在新建的module中新建文件夾src,接著在src文件目錄下新建main文件夾,在main目錄下新建groovy目錄,這時候groovy文件夾會被Android識別為groovy源碼目錄。除了在main目錄下新建groovy目錄外,你還要在main目錄下新建resources目錄,同理resources目錄會被自動識別為資源文件夾。在groovy目錄下新建項目包名,就像Java包名那樣。resources目錄下新建文件夾META-INF,META-INF文件夾下新建gradle-plugins文件夾。這樣,就完成了gradle 插件的項目的整體搭建,之后就是小細節(jié)了。目前,項目的結構是這樣的。
buildSrc project
這里說一下各個目錄的作用:
[groovy]:
此目錄下為插件源碼目錄
此處測試代碼:
CustomPluginTest.groovy
package com.ann
import org.gradle.api.Plugin
import org.gradle.api.Project
class CustomPluginTest implements Plugin<Project> {
@Override
void apply(Project project) {
//增加閉包名稱,閉包為customPlugin,是 CustomPluginTestExtension類型,因此CustomPluginTestExtension類型中的JaveBean類型的屬性可以任意設置
project.extensions.add("customPlugin", CustomPluginTestExtension)
project.task("showPersonInfo") << {
println("姓名:" + project.customPlugin.name)
println("年齡:" + project.customPlugin.age)
println("地址:" + project.customPlugin.address)
}
}
}
CustomPluginTestExtension.groovy
package com.ann
class CustomPluginTestExtension{
def name = "init"
def age = "init"
def address = "init"
}
[resources]:
此為資源目錄,在上圖中gradle-plugins文件夾新建了一個ann-test.properties文件,ann-test文件名稱也是以后再build.gradle文件中apply plugin: 'ann-test'的名稱,如果一個庫有多個插件就建立多個此文件
#implementation-class=為固定格式,等號后面是具體類地址
implementation-class=com.ann.CustomPluginTest
[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'
/**
* 編寫自定義插件配置
*/
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
[app build.gradle]:
重新編譯后,會在app中出現(xiàn)新task:showPersonInfo

優(yōu)勢:插件代碼可以被多個libiary使用
劣勢:這種適用于只在本項目使用的情況
三、Standalone project 方式
這種方法就是使用單獨的一個工程/模塊創(chuàng)建我們的 Gradle 插件,這種方法會構建和發(fā)表一個JAR文件,可以提供給多工程構建和其他開發(fā)者共同使用。然后publish到倉庫,通過apply plugin: 'com.android.application' 這種方式使用,實現(xiàn)了多項目,多module復用。
在開發(fā)方面和方式二一樣,不一樣的地方是:
1、module名稱可以自定義
2、module的build.gradle 文件中加入發(fā)布代碼
[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'
/**
* 編寫自定義插件配置
*/
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
/**
* 發(fā)布配置,這里發(fā)布到本地
*/
publishing {
publications {
mavenJava(MavenPublication) {
groupId 'ann.gradle.plugin'
artifactId 'customplugin-extension'
version '1.0.0-SNAPSHOT'
from components.java
}
}
repositories {
maven {
// change to point to your repo, e.g.
url uri('../repo')
}
}
}

編譯后,右側gradle任務欄module【我這里是buildSrc,可以自定義】中會多一個publish,執(zhí)行此任務,左側項目中會多一個repo倉庫文件夾,
使用:
- 在工程的根目錄的 build.gradle 中添加如下內容:
buildscript {
repositories {
maven {
url uri('./repo')
}
}
dependencies {
classpath 'ann.gradle.plugin:customplugin-extension:1.0.0-SNAPSHOT'
}
}
- 然后,在app的 build.gradle 中 apply 這個插件:
apply plugin: 'ann-test'
customPlugin{
name = "bobo"
age = "25"
address = "廣東珠海"
}
這里是發(fā)布到本地倉庫,實際使用當中是發(fā)布到外部倉庫中,詳細就不在這里說。
更多插件發(fā)布內容,請查看官網(wǎng):Maven Publishing
