AS 自定義 Gradle plugin 插件 案例 MD
Markdown版本筆記 | 我的GitHub首頁 | 我的博客 | 我的微信 | 我的郵箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | [email protected] |
AS 自定義 Gradle plugin 插件 案例 MD
目錄
目錄AS 中自定義 Gradle plugin
編寫插件
傳遞參數
發布插件到倉庫
使用插件
AS 中自定義 Gradle plugin
參考1
參考2
結合 AndroidStudio,自定義Gradle plugin可以完成很多功能,比如:添加編譯依賴、進行Aspecj編譯、自動生成混淆配置。
項目中引入自定義 Gradle plugin 一般有三種方法:
- 直接寫在 build.gradle 中,這種方式的缺點是無法復用插件代碼,在其他項目中還得復制一遍代碼
- plugin 源碼放到
rootProjectDir/buildSrc/src/main/groovy
目錄下(沒用過) - plugin 打包後發布到 maven 倉庫, 然後項目通過依賴的形式引入
下面介紹的是第 3 種方式
編寫插件
1、創建插件 module
新建一個Android工程,在這個工程裏面新建一個Android Library
,先起名叫 cooker-plugin 吧,我們將會用這個 library 寫 Gradle plugin
2、建立 plugin 的目錄結構
把這個 cooker-plugin 中除了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 插件的項目的整體搭建,之後就是小細節了。目前,項目的結構是這樣的:
3、聲明 plugin 信息
在 src/main/resources/META-INF/gradle-plugins
裏聲明 plugin 信息,比如新建cooker-plugin.properties
文件(文件名 cooker-plugin
是插件名稱),在其中指定插件的實現類的全路徑類名:
implementation-class=com.helen.plugin.CookerPlugin
4、配置 build.gradle
在 build.gradle 中聲明用 groovy 開發
apply plugin: ‘groovy‘
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
5、編寫插件邏輯
插件代碼放在 src/main/groovy
下,實現 plugin,其實就是實現 Plugin<Project>
接口
package com.helen.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class CookerPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println "這裏實現plugin的邏輯!"
project.task(‘cooker-test-task‘).doLast { variant ->
println "自定義任務-doLast"
}.doFirst { variant ->
println "自定義任務-doFirst"
}
}
}
6、生成 plugin 插件
在 cooker-plugin 項目中,build 一下
任務完成以後,就能在build/libs
下生成對應的 plugin 插件了
現在這個插件就能使用了,可以發布在本地倉庫或者 Maven 倉庫
傳遞參數
接下來我們介紹如何獲得自定義的參數
1、新建 PluginExtension.groovy,用於定義我們可以支持的參數:
class PluginExtension {
def param1 = "param1 defaut"
def param2 = "param2 defaut"
def param3 = "param3 defaut"
}
我們希望能傳入嵌套的參數,所以再新建一個 PluginNestExtension.groovy:
class PluginNestExtension {
def nestParam1 = "nestParam1 defaut"
def nestParam2 = "nestParam2 defaut"
def nestParam3 = "nestParam3 defaut"
}
2、新建一個 CustomTask.groovy,繼承 DefaultTask
類,使用 @TaskAction
註解標註實現的方法:
class CustomTask extends DefaultTask {
@TaskAction
void output() {
println "param1 is ${project.pluginExt.param1}"
println "param2 is ${project.pluginExt.param2}"
println "param3 is ${project.pluginExt.param3}"
println "nestparam1 is ${project.pluginExt.nestExt.nestParam1}"
println "nestparam2 is ${project.pluginExt.nestExt.nestParam2}"
println "nestparam3 is ${project.pluginExt.nestExt.nestParam3}"
}
}
這裏我們只是做了拿到了參數,然後做最簡單的輸出操作,使用 ${project.pluginExt.param1}
和 ${project.pluginExt.nestExt.nestParam1}
等拿到使用者設置的值。
3、在 apply 方法中建立映射關系:
project.extensions.create(‘pluginExt‘, PluginExtension)
project.pluginExt.extensions.create(‘nestExt‘, PluginNestExtension)
project.task(‘customTask‘, type: CustomTask)
4、定義外部參數,這裏我們定義了param1,param2,nestParam1,nestParam2,而param3和nestParam3保持默認。
pluginExt {
param1 = ‘app param1‘
param2 = ‘app param2‘
nestExt {
nestParam1 = ‘app nestParam1‘
nestParam2 = ‘app nestParam2‘
}
}
這樣之後,在執行customTask
時就會輸出使用者對自定義的參數設置的值
發布插件到倉庫
發布到倉庫的方式有很多,下面只介紹利用 mavenDeployer 插件發布在本地倉庫
1、引入 mavenDeplayer 插件
修改 cooker-plugin 的 build.gradle,添加如下內容:
apply plugin: ‘maven‘//添加maven plugin,用於發布我們的jar
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = ‘com.helen.plugin‘
pom.artifactId = ‘cooker-plugin‘
pom.version = 1.0
repository(url: uri(‘../release‘)) //文件發布目錄(相對當前 build.gradle 的路徑)
}
}
}
2、用 uploadArchices 發布
運行 uploadArchives 就能在設置的倉庫路徑中生成 cooker-plugin 了
使用插件
1、在 build.gradle 中引入 cooker-plugin
buildscript {
repositories {
jcenter()
maven {
url uri(‘release‘) //cooker-plugin 所在的倉庫,這裏是本地目錄(相對當前 build.gradle 的路徑)
}
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.2.1‘
classpath ‘com.helen.plugin:cooker-plugin:1.0‘ //引入cooker-plugin
}
}
apply plugin: ‘cooker-plugin‘
2、我們編譯 App 的時候 cooker-plugin 就會介入了
每次 clean/build
時, 在 Gradle Console 可以看到我們的 log
這裏實現plugin的邏輯!
3、使用 cooker-plugin 中定義的 task
前面demo中,我們新建了兩個task: cooker-test-task
和customTask
, 我們可以通過兩種方式運行這兩個task,一種方式是雙擊 app > other 分類下的 task 名,一種是通過 gradlew 命令
cooker-test-task 打印的日誌:
Executing tasks: [cooker-test-task]
這裏實現plugin的邏輯!
:app:cooker-test-task
自定義任務-doFirst
自定義任務-doLast
customTask 打印的日誌:
Executing tasks: [customTask]
這裏實現plugin的邏輯!
:app:customTask
param1 is app param1
param2 is app param2
param3 is param3 defaut
nestparam1 is app nestParam1
nestparam2 is app nestParam2
nestparam3 is nestParam3 defaut
到此為止, 自定義Gradle plugin的基本過程就介紹完了。
2019-2-11
AS 自定義 Gradle plugin 插件 案例 MD