Gradle自定義插件(Android)

Gradle插件使用在日常開發(fā)中已經(jīng)很熟悉,那么我們怎么去自定義我們的插件?

自定義插件

自定義插件基于源碼放置可以分為3種:

一、Build Script方式

這種插件腳本的源碼放置在模塊內的 build.gradle 中,好處就是插件腳本會被自動編譯并添加進模塊的 classpath 中,我們完全不用做任何事情。但是,這種插件腳本只能在聲明的這個 build.gradle 中使用,其他模塊是沒辦法復用這個插件的。

//app build.gradle
apply plugin: BuildScriptPlugin
class BuildScriptPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            group = "test-plugin"
            doLast {
                println "Hello"
            }
        }
    }
}

這里group為右側組名稱,向這個組添加一個名為hello的task

優(yōu)勢:
1、在當前build.gradle文件編寫,不需要其他配置即可使用
劣勢:
1、在一個文件里面寫代碼多,不易維護
2、插件代碼只能在當前文件中生效,無法復用

二、BuildSrc project方式

Gradle插件是使用Groovy進行開發(fā)的,而Groovy其實是可以兼容Java的。Android Studio其實除了開發(fā)Android App外,完全可以勝任開發(fā)Gradle插件這一工作,下面來講講具體如何開發(fā)。

  • 新建一個Android項目。
  • 新建一個Android Module項目,類型選擇Android Library。
  • 將新建的Module中除了build.gradle文件外的其余文件全都刪除,然后刪除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 插件的項目的整體搭建,之后就是小細節(jié)了。目前,項目的結構是這樣的。


    buildSrc project
這里說一下各個目錄的作用:
[groovy]:

此目錄下為插件源碼目錄
此處測試代碼:
CustomPluginTest.groovy

package com.ann

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

class CustomPluginTest implements Plugin<Project> {

    @Override
    void apply(Project project) {
        //增加閉包名稱,閉包為customPlugin,是 CustomPluginTestExtension類型,因此CustomPluginTestExtension類型中的JaveBean類型的屬性可以任意設置
        project.extensions.add("customPlugin", CustomPluginTestExtension)
        project.task("showPersonInfo") << {
            println("姓名:" + project.customPlugin.name)
            println("年齡:" + project.customPlugin.age)
            println("地址:" + project.customPlugin.address)
        }
    }
}

CustomPluginTestExtension.groovy

package com.ann
class CustomPluginTestExtension{
    def name = "init"
    def age = "init"
    def address = "init"
}
[resources]:

此為資源目錄,在上圖中gradle-plugins文件夾新建了一個ann-test.properties文件,ann-test文件名稱也是以后再build.gradle文件中apply plugin: 'ann-test'的名稱,如果一個庫有多個插件就建立多個此文件

#implementation-class=為固定格式,等號后面是具體類地址
implementation-class=com.ann.CustomPluginTest
[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'

/**
 * 編寫自定義插件配置
 */
dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}
[app build.gradle]:

重新編譯后,會在app中出現(xiàn)新task:showPersonInfo


image.png

優(yōu)勢:插件代碼可以被多個libiary使用
劣勢:這種適用于只在本項目使用的情況

三、Standalone project 方式

這種方法就是使用單獨的一個工程/模塊創(chuàng)建我們的 Gradle 插件,這種方法會構建和發(fā)表一個JAR文件,可以提供給多工程構建和其他開發(fā)者共同使用。然后publish到倉庫,通過apply plugin: 'com.android.application' 這種方式使用,實現(xiàn)了多項目,多module復用。

在開發(fā)方面和方式二一樣,不一樣的地方是:
1、module名稱可以自定義
2、module的build.gradle 文件中加入發(fā)布代碼

[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'

/**
 * 編寫自定義插件配置
 */
dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

/**
 * 發(fā)布配置,這里發(fā)布到本地
 */
publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId 'ann.gradle.plugin'
            artifactId 'customplugin-extension'
            version '1.0.0-SNAPSHOT'
            from components.java
        }
    }

    repositories {
        maven {
            // change to point to your repo, e.g.
            url uri('../repo')
        }
    }
}
發(fā)布到本地

編譯后,右側gradle任務欄module【我這里是buildSrc,可以自定義】中會多一個publish,執(zhí)行此任務,左側項目中會多一個repo倉庫文件夾,

使用:

  • 在工程的根目錄的 build.gradle 中添加如下內容:
buildscript {
    repositories {
        maven {
            url uri('./repo')
        }
    }
    dependencies {
        classpath 'ann.gradle.plugin:customplugin-extension:1.0.0-SNAPSHOT'
    }
}
  • 然后,在app的 build.gradle 中 apply 這個插件:
apply plugin: 'ann-test'
customPlugin{
    name = "bobo"
    age = "25"
    address = "廣東珠海"
}

這里是發(fā)布到本地倉庫,實際使用當中是發(fā)布到外部倉庫中,詳細就不在這里說。
更多插件發(fā)布內容,請查看官網(wǎng):Maven Publishing

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容