入坑 Gradle 插件開發(一)


最近由於需要做一些功能,比如統計方法的執行時間,處理刪除一方法等。網上找了一圈,雖有有很多開源工具有類似的功能了,但是不夠靈活,所以想自己開發 Android Gradle 插件,於是研究了下如何開發 Android Gradle 插件。

僅自己的工程裏面使用

如果是指自己使用的話,可以用下面的方法來快速開發一個插件。在 apk module 下面的 build.gradle 新增一段代碼

class DemoPlugin implements Plugin<Project> {
  @Override
  void apply(Project project) {
    println "=============================="
    println 'hello, DemoPlugin!'
    println "=============================="
  }
}
apply plugin: DemoPlugin

然後 執行一下 assembleDebug 命令,會在控制檯看到下面的打印。

==============================
hello, DemoPlugin!
==============================

到這裏一個簡單的 gradle 插件就完成了。

希望開源發佈出去,供大家使用

如果需要發佈出去,那麼需要新建一個 Module 了,在剛剛的 Demo Project 裏面新建一個 Java Library Module 。建好 Module 後,我們需要進行一定的改造纔可以開發 gradle 插件,改造的方法如下:

修改 build.gradle

修改剛剛新建的 Module 下面的 build.gradle 爲下面的內容

//apply plugin: 'java-library'
apply plugin: 'groovy'

dependencies {
  compile gradleApi() //gradle sdk
  compile localGroovy() //groovy sdk
  implementation fileTree(dir: 'libs', include: ['*.jar'])
}

新建 src/main/groovy 目錄

由於插件是用 groovy 開發的,所有我們需要在 src/main 下面新建一個 groovy 目錄,groory 的源碼將在這個目錄( src/main/groovy) 下面。有一個小技巧是,如果 AS 給你新建了一個 src/main/java 目錄的話,建議你直接把 java 目錄名修改爲 groovy

創建 Plugin 類

groovy 目錄創建好了以後,我們需要創建一個實現 Plugin 的類,然後通過 Plugin 接口裏面的 apply 方法入口做我們後面想做的事情。這裏有一個 demo 代碼片段:

// 源碼路徑爲 src/main/groovy/com/xander/plugin/DemoPlugin.groovy
package com.xander.plugin

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

public class DemoPlugin implements Plugin<Project> {

  @Override
  void apply(Project project) {
    println "===================================="
    println "Hello DemoPlugin!!!"
    println "===================================="
  }
}

新建一個 properties 配置

剛剛我們新建了一個 Plugin 了,但是我們如何讓 AS 知道我們的插件是哪一個呢,這個時候我們就需要新建一個 properties 配置來告訴 AS。這個配置文件需要放在 src/main/resources/META-INF/gradle-plugins 目錄下面,如果沒有想要的目錄,需要自己創建。當目錄創建好以後,你可以新建一個 properties 配置了,需要特別注意的是,配置的文件名就是後面 build.gradle 裏面的 apply plugin: ‘xxx.xxx.xxx’。 在這裏我新的配置的文件名是 com.xander.plugin。配置建好了,我們需要往裏面寫入配置。你可以參考下面的配置。

implementation-class=com.xander.plugin.DemoPlugin

properties 裏面的內容說白了就是一個個的鍵值對,這裏面鍵是 implementation-class ,這個是固定的,用來告訴 AS 我們的 Plguin 的入口實現類,而值就是類的路徑,簡單說就是包名+類名

到這裏,改造就完成了,我們就有了一個 gradle 插件開發的環境。最後的 Module 結構如下

.
├── build.gradle
├── libs
├── plugin.iml
└── src
    └── main
        ├── groovy
        │   └── com
        │       └── xander
        │           └── plugin
        │               └── DemoPlugin.groovy
        └── resources
            └── META-INF
                └── gradle-plugins
                    └── com.xander.plugin.properties

上傳到 maven 庫

既然我們的插件是希望提供給別人用的,所以我們需要把我們的插件上傳到 maven 庫供大家下載使用。這個時候需要修改 plugin module 下面的 build.gradle 文件,可以參考下面的示例

//apply plugin: 'java-library'
apply plugin: 'groovy'
apply plugin: 'maven'

uploadArchives {
  repositories.mavenDeployer {
    repository(url: uri("../repos")) // repos 爲本地的地址,後續可以替換爲網路上的 maven 庫地址
    pom.groupId = "com.xander.plugin"
    pom.artifactId = "demoplugin"
    pom.version = "1.0.0"
  }
}

dependencies {
  compile gradleApi() //gradle sdk
  compile localGroovy() //groovy sdk
  implementation fileTree(dir: 'libs', include: ['*.jar'])
}

修改 build.gradle 文件後, sync 下就可以看到 uploadArchives task 了,執行 uploadArchives task 就會發布我們的插件了。如果在控制檯看到類似下面的 log 信息,一般就是上次成功了。

> Task :plugin_demo:compileJava NO-SOURCE
> Task :plugin_demo:compileGroovy UP-TO-DATE
> Task :plugin_demo:processResources NO-SOURCE
> Task :plugin_demo:classes UP-TO-DATE
> Task :plugin_demo:jar UP-TO-DATE
> Task :plugin_demo:uploadArchives

別人如何引用 gradle 插件

當我們的插件開發完成,並且也上傳到了 maven 庫了以後,別人如何使用我們開發的插件呢?

首先我們需要修改 project 根目錄下面的 build.gradle 文件

buildscript {

  repositories {
    maven { url uri("./repos") } // repos 爲本地的地址,後續需要修改爲發佈的 maven 庫地址 
    google()
    jcenter()
  }

  dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files

    //格式爲 --> group:module:version
    classpath 'com.xander.plugin:demoplugin:1.0.0'
  }
}

然後修改 apk module 下面的 build.gradle 文件,新增下面的一句命令就好了

// com.xander.plugin 爲 resources/META-INF/gradle-plugins 下的 properties 文件名稱
apply plugin: 'com.xander.plugin'

到這裏,插件的開發就介紹完了。

參考資料:
擁抱 Android Studio 之五:Gradle 插件開發

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