什麼是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
任務,我們輕按兩下該任務執行它,會發現控制台中出現如下資訊:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csETS65kZ50WWxw2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzEzM5QzNzQTM3AzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
這表明我們編寫的插件代碼正常工作。
其實為了讓插件代碼跟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插件項目主要也是用在目前項目中,不能被外部的項目引用,它的建立有一套固定的流程,步驟如下:
- 在項目根目錄下建立一個
目錄,然後點選Android Studio的make按鈕編譯項目,IDE會自動在buildSrc目錄下建立一些檔案,如下圖所示:buildSrc
Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考 - 在
目錄下建立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
}
- 在
目錄下建立buildSrc
目錄,并在src
目錄下分别建立src
和main/java
目錄main/resources
- 在
目錄下編寫插件代碼,比如這裡我們建立一個簡單的插件類,代碼如下: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...");
}
}
- 配置插件。要配置插件,需要在
目錄下再建立src/main/resources/
目錄,并在該目錄中添加一個檔案,檔案的命名需要根據插件所在類的名稱來,比如上面我們編寫的插件類在META-INF/gradle-plugins
包下面,那麼就需要建立一個com.test.myplugin
檔案,該檔案内容如下:com.test.myplugin.properties
implementation-class=com.test.myplugin.MyPlugin
項目整體的結構如下圖:
以上所有步驟都做完之後,即可在app module中引用插件了,引用插件的方法是直接在app/build.gradle檔案頭部通過apply plugin: 'com.test.myplugin’的方式即可,然後我們通過AndroidStudio make圖示編譯項目,在輸出的日志中會發現該插件列印的消息,如下圖所示:
獨立項目
如果要使我們編寫的gradle插件被外部項目所引用,比如每個AndroidStudio建立的項目都依賴了’com.android.application’這個插件,那麼我們就需要使用這種獨立項目來完成gradle插件的開發了,開發步驟如下:
- 在Android項目上右鍵,選擇
-New
-Module
建立一個Java library,這裡我們取名為pluginJava or Kotlin Library
- 在該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倉庫的位址 } } }
- 同第二種實作gradle插件的方式一樣,在library的根目錄下建立
目錄,并在src
目錄下分别建立src
main/java
目錄main/resources
- 在
目錄下編寫插件代碼,這裡測試用的代碼如下: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..."); } }
- 在
目錄下建立檔案,檔案名為src/main/resources/META-INF/gradle-plugins
,檔案内容為:com.example.plugin.properties
implementation-class=com.example.plugin.MyPlugin
- 通過Gradle sync項目,在AndroidStudio右側的Gradle視圖中,我們會看到該插件對應的任務,如下圖所示: 我們輕按兩下Tasks - upload - uploadArchives任務,AS會自動将該插件打包并上傳到maven倉庫,注意在上面的第2步中,我們設定了maven倉庫為本地位址
Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考
,則任務執行成功後,會在library的根目錄下生成repo目錄,如下圖所示:./repo
Android Gradle插件開發基礎什麼是GradleGradle插件Gradle插件編寫方式源碼參考
為了引用該插件,我們需要在Android項目中做如下配置:
- 在項目根目錄的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 } }
- 在app module的build.gradle檔案頭部引用該插件:
然後編譯項目,可以看到該插件輸出的日志資訊。apply plugin: 'com.example.plugin'
源碼
本篇博文的源碼可以在這裡下載下傳:
https://github.com/yubo725/gradle-plugin-demo
參考
Gradle官方文檔
Gradle插件開發指南