Gradle自定義插件

Gradle自定義插件

在Gradle中創建自定義插件,Gradle提供了三種方式:

  • 在build.gradle腳本中直接使用
  • 在buildSrc中使用
  • 在獨立Module中使用

開發Gradle插件可以在IDEA中進行開發,也可以在Android Studio中進行開發,它們唯一的不同,就是IDEA提供了Gradle開發的插件,比較方便創建文件和目錄,而Android Studio中,開發者需要手動創建(但實際上,這些目錄並不多,也不復雜,完全可以手動創建)。

在build.gradle腳本中使用

在build.gradle腳本中使用是最簡單的,但是隻適應於很簡單的功能,也不便於其他地方應用,如下面,可以直接寫在app moudle的build.gradle 裏面

class HelloPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task('testPlugin') << {
            println 'hello, world!'
        }
    }
}
apply plugin: HelloPlugin
在android studio終端裏就可以直接執行此插件:

G:\Android\workspace\demo\nickStudyDemo>gradlew testPlugin
Incremental java compilation is an incubating feature.                               
:app:testPlugin                                                                              
hello, world!             
BUILD SUCCESSFUL         
Total time: 7.123 secs


在項目裏使用

首先在Android Studio中創建一個標準的Android項目,然後在項目的根目錄下新建一個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


下面是我的一個實際項目:

其中,除了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下先創建了子目錄,這裏類似於java 的package一樣,com/nick/plugin 目錄,再創建AssembleApkPlugin.groovy文件:

package com.nick.plugin

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

class AssembleApkPlugin 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 創建Groovy腳本的Extension

所謂Groovy腳本的Extension,實際上就是類似於Gradle的配置信息,在主項目使用自定義的Gradle插件時,可以在主項目的build.gradle腳本中通過Extension來傳遞一些配置、參數。

創建一個Extension,只需要創建一個Groovy類即可,如上圖AssembleApkExtension所示:

package com.nick.plugin

class AssembleApkExtension{
    String message
}

AssembleApkExtension代碼非常簡單,就是定義了要配置的參數變量,後面將具體演示如何使用。

4,在Groovy腳本中使用Extension

在創建了Extension之後,需要修改下之前創建的Groovy類來加載Extension,修改後的腳本如下所示:

package com.nick.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class AssembleApkPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.extensions.create('pluginArgs', AssembleApkExtension);
        project.task('testPlugin') << {
            println project.pluginArgs.message;
        }
    }
}

要注意,create 方法的第一個參數就是你在 build.gradle 文件中的進行參數配置的 dsl 的名字,必須一致;第二個參數,就是參數類的名字。

5,創建resources

resources目錄是標識整個插件的目錄,其目錄下的結構如下所示:

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

該目錄結構與buildSrc一樣,是Gradle插件的默認目錄,不能有任何修改。創建好這些目錄後,在gradle-plugins目錄下創建——插件名.properties文件,如上圖所示的: com.nick.assemble-apk.properties 文件

在該文件中,代碼如下所示:

implementation-class=com.nick.plugin.AssembleApkPlugin

通過上面的代碼指定最開始創建的Groovy類即可。

在主項目中使用插件

在主項目的build.gradle文件中,通過apply指令來加載自定義的插件,腳本如下所示:
apply plugin: 'com.nick.assemble-apk'

其中plugin的名字,就是前面創建com.nick.assemble-apk.properties中的名字——com.nick.assemble-apk,通過這種方式,就加載了自定義的插件。

配置Extension

在主項目的build.gradle文件中,通過如下所示的代碼來加載Extension:

pluginArgs{
    message = 'holle gradle plugin'
}

同樣,領域名爲插件名,配置的參數就是在Extension中定義的參數名。

配置完畢後,就可以在主項目中使用自定義的插件了,在終端執行gradlew testPlugin指令,結果如下所示:

:testPlugin                                                                              
holle gradle plugin        
                           
BUILD SUCCESSFUL
               
Total time: 6.814 secs

在本地Repo中使用

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














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章