天天看點

Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考

什麼是Gradle

在Gradle官方文檔上是這麼描述的:

Gradle 是一種開源建構自動化工具,其設計足夠靈活,幾乎可以建構任何類型的軟體。

Gradle 允許您建構任何軟體,因為它對您嘗試建構的内容或應該如何完成幾乎沒有做出任何假設。最顯着的限制是依賴管理目前隻支援 Maven 和 Ivy 相容的存儲庫和檔案系統。

Gradle 将其建構模組化為任務(工作單元)的有向無環圖 (DAG)。這意味着建構本質上是配置一組任務并将它們連接配接在一起——基于它們的依賴——以建立該 DAG。建立任務圖後,Gradle 會确定哪些任務需要以何種順序運作,然後繼續執行它們。

Gradle插件

在Android開發中,我們最常見的是

build.gradle

中的

apply plugin: 'com.android.application'

,這個

apply plugin: 'com.android.application'

便是Android提供的用于建構APK的一個gradle插件。

Gradle 插件打包了可重用的建構邏輯片段,可以在許多不同的項目和建構中使用。Gradle 允許您實作自己的插件,是以您可以重用您的建構邏輯,并與他人共享。

您可以使用您喜歡的任何語言實作 Gradle 插件,前提是該實作最終被編譯為 JVM 位元組碼。在我們的示例中,我們将使用 Java 作為獨立插件項目的實作語言,并在 buildscript 插件示例中使用 Groovy 或 Kotlin。一般來說,使用靜态類型的 Java 或 Kotlin 實作的插件比使用 Groovy 實作的插件性能更好。

Gradle插件編寫方式

一般有如下三種方式編寫Gradle插件:

編寫方式 說明
建構腳本 您可以直接在建構腳本中包含插件的源代碼。這樣做的好處是插件會自動編譯并包含在建構腳本的類路徑中,而您無需執行任何操作。但是,該插件在建構腳本之外不可見,是以您不能在定義它的建構腳本之外重用該插件。
buildSrc 項目 您可以将插件的源代碼放在rootProjectDir/buildSrc/src/main/java目錄中(rootProjectDir/buildSrc/src/main/groovy或rootProjectDir/buildSrc/src/main/kotlin取決于您喜歡的語言)。Gradle 将負責編譯和測試插件,并使其在建構腳本的類路徑上可用。該插件對建構使用的每個建構腳本都是可見的。但是,它在建構之外不可見,是以您不能在定義它的建構之外重用插件。
獨立項目 您可以為您的插件建立一個單獨的項目。該項目生成并釋出一個 JAR,然後您可以在多個建構中使用它并與他人共享。通常,這個 JAR 可能包含一些插件,或者将幾個相關的任務類捆綁到一個庫中。或者兩者的某種組合。

為了友善,本篇中全部使用Java來開發Gradle插件,你也可以用Groovy或者Kotlin來開發。

在開始下面的流程前,我們先建立一個空的Android項目。

下面分别用一個例子來說明在Android開發中三種編寫Gradle插件的流程。

建構腳本

這種方式是最簡單的,一般用于比較簡單的邏輯,隻需要修改build.gradle檔案即可。

我們直接在新建立的Android項目的app/build.gradle檔案末尾添加如下代碼:

class MyPluginExtension {
	// 為插件擴充定義一個字元串類型的變量
    String message = "Hello this is my custom plugin..."
}

// gradle自定義的插件必須繼承Plugin接口
class GreetingPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
    	// 建立插件擴充,greeting為插件擴充的名稱,可以在gradle檔案其他地方使用
        def extension = project.extensions.create('greeting', MyPluginExtension)

        project.task('hello') {
            doLast {
            	// 插件的任務就是列印message資訊
                println extension.message
            }
        }
    }
}

// 使用這個自定義的插件
apply plugin: GreetingPlugin
           

然後sync項目,在AndroidStudio右側的Gradle視圖裡,可以發現Tasks/others下面出現了一個

hello

任務,我們輕按兩下該任務執行它,會發現控制台中出現如下資訊:

Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考
Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考
Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考

這表明我們編寫的插件代碼正常工作。

其實為了讓插件代碼跟app/build.gradle檔案中的其他配置互相獨立,可以把插件代碼單獨用一個gradle檔案來編寫,比如你可以在app/build.gradle同級的目錄下建立一個myplugin.gradle檔案,然後将上面的插件代碼全部寫到其中,再在app/build.gradle檔案中引用myplugin.gradle檔案即可,app/build.gradle中引用的代碼如下:

apply plugin: 'com.android.application'

// 這一行可以引用外部的gradle檔案
apply from: './myplugin.gradle'

android {
	...
}

// 通過這種配置方式,修改自定義插件中配置的message的值
greeting {
    message = "new message..."
}
           

buildSrc項目

buildSrc編寫gradle插件項目主要也是用在目前項目中,不能被外部的項目引用,它的建立有一套固定的流程,步驟如下:

  1. 在項目根目錄下建立一個

    buildSrc

    目錄,然後點選Android Studio的make按鈕編譯項目,IDE會自動在buildSrc目錄下建立一些檔案,如下圖所示:
    Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考
  2. buildSrc

    目錄下建立

    build.gradle

    檔案并加入如下代碼:
apply plugin: 'java-library'

sourceSets {
    main {
        java{
            srcDir 'src/main/java'
        }
        resources {
            srcDir 'src/main/resources'
        }
    }
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
           
  1. buildSrc

    目錄下建立

    src

    目錄,并在

    src

    目錄下分别建立

    main/java

    main/resources

    目錄
  2. src/main/java

    目錄下編寫插件代碼,比如這裡我們建立一個簡單的插件類,代碼如下:
package com.test.myplugin;

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

public class MyPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        System.out.println("Hello from MyPlugin...");
    }
}
           
  1. 配置插件。要配置插件,需要在

    src/main/resources/

    目錄下再建立

    META-INF/gradle-plugins

    目錄,并在該目錄中添加一個檔案,檔案的命名需要根據插件所在類的名稱來,比如上面我們編寫的插件類在

    com.test.myplugin

    包下面,那麼就需要建立一個

    com.test.myplugin.properties

    檔案,該檔案内容如下:
implementation-class=com.test.myplugin.MyPlugin
           

項目整體的結構如下圖:

Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考

以上所有步驟都做完之後,即可在app module中引用插件了,引用插件的方法是直接在app/build.gradle檔案頭部通過apply plugin: 'com.test.myplugin’的方式即可,然後我們通過AndroidStudio make圖示編譯項目,在輸出的日志中會發現該插件列印的消息,如下圖所示:

Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考

獨立項目

如果要使我們編寫的gradle插件被外部項目所引用,比如每個AndroidStudio建立的項目都依賴了’com.android.application’這個插件,那麼我們就需要使用這種獨立項目來完成gradle插件的開發了,開發步驟如下:

  1. 在Android項目上右鍵,選擇

    New

    -

    Module

    -

    Java or Kotlin Library

    建立一個Java library,這裡我們取名為plugin
  2. 在該library module的build.gradle檔案中編寫如下代碼:
    apply plugin: 'groovy'
    apply plugin: 'maven'
    
    repositories {
        mavenLocal()
    }
    
    dependencies {
        implementation gradleApi()
    }
    
    //publish to local directory
    group "com.example.plugin"
    version "1.0.0"
    
    uploadArchives{ //目前項目可以釋出到本地檔案夾中
        repositories {
            mavenDeployer {
                repository(url: uri('./repo')) //定義本地maven倉庫的位址
            }
        }
    }
               
  3. 同第二種實作gradle插件的方式一樣,在library的根目錄下建立

    src

    目錄,并在

    src

    目錄下分别建立

    main/java

    main/resources

    目錄
  4. src/main/java

    目錄下編寫插件代碼,這裡測試用的代碼如下:
    package com.example.plugin;
    
    import org.gradle.api.Plugin;
    import org.gradle.api.Project;
    
    public class MyPlugin implements Plugin<Project> {
    
        @Override
        public void apply(Project project) {
            System.out.println("Hello this is a single gradle plugin...");
        }
    }
               
  5. src/main/resources/META-INF/gradle-plugins

    目錄下建立檔案,檔案名為

    com.example.plugin.properties

    ,檔案内容為:
    implementation-class=com.example.plugin.MyPlugin
               
  6. 通過Gradle sync項目,在AndroidStudio右側的Gradle視圖中,我們會看到該插件對應的任務,如下圖所示:
    Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考
    我們輕按兩下Tasks - upload - uploadArchives任務,AS會自動将該插件打包并上傳到maven倉庫,注意在上面的第2步中,我們設定了maven倉庫為本地位址

    ./repo

    ,則任務執行成功後,會在library的根目錄下生成repo目錄,如下圖所示:
    Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考

為了引用該插件,我們需要在Android項目中做如下配置:

  1. 在項目根目錄的build.gradle檔案中添加如下配置
    buildscript {
        repositories {
            google()
            mavenCentral()
            maven { // (1) 這裡的位址填你本機的repo目錄位址
                url '/Users/xxx/AndroidStudioProjects/TestGradlePlugin/plugin/repo'
            }
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.2.2"
            classpath "com.example.plugin:plugin:1.0.0" // (2)這個版本号為之前上傳時配置的版本号
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
               
  2. 在app module的build.gradle檔案頭部引用該插件:
    apply plugin: 'com.example.plugin'
               
    然後編譯項目,可以看到該插件輸出的日志資訊。

源碼

本篇博文的源碼可以在這裡下載下傳:

https://github.com/yubo725/gradle-plugin-demo

參考

Gradle官方文檔

Gradle插件開發指南