1. 程式人生 > >AS 自定義 Gradle plugin 插件 案例 MD

AS 自定義 Gradle plugin 插件 案例 MD

efault 創建 .net cnblogs pla one 映射 tails 傳遞

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-taskcustomTask, 我們可以通過兩種方式運行這兩個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