Android開發自定義Gradle插件

目錄

1.在自己的module(例如:app)中build.gradle中定義插件 

2.創建當前項目的插件

3.創建通用插件,發佈到maven

3.1.創建module

3.2利用mavenDeployer發佈插件

3.3定義plugin應用


在android studio中gradle作爲主要的構建工具,其核心工作任務在於執行一系列的Task,而plugin在gradle構建過程又扮演着舉足輕重的角色,有時爲了完成相應的構建任務必須通過引入相應的插件來輔助,這些插件中定義了構建Project需要的一系列Task,並負責執行相應的Task,比如構建android應用'com.android.application',構建Library的'com.android.application'

除了系統自帶的插件外,有時候我們也需要開發屬於我們自己的plugin,比如熱修復,插件化開發中基本上都有可能會去自定義插件。

自定義插件有三種方式:

a.直接在module(例如:app)的build.gradle中開發;

b.創建當前項目使用的插件;

c.創建通用的插件,發佈到maven;

1.在自己的module(例如:app)中build.gradle中定義插件 

插件定義

app(module)-build.gradle
apply plugin: HelloPlugin

class HelloPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task('testPlugin') << {
            println 'hello, plugin!'
        }
    }
}

插件執行結果(gradle testPlugin)

2.創建當前項目的插件

插件定義

a.新建一個類型Android Library的Module,名字爲buildSrc,注意名字只能爲buildSrc,如果不是這個名字,這裏是無法apply包名的,會提示找不到;

b.除了build.gradle,src/main外,其他文件都刪除掉,刪除main下的文件;

c.在src/main下新建groovy文件夾;

d.在groovy文件夾下新建package,包名隨便取,例如:com.mimhope.plugin;

e.在package下新建.groovy的文件,例如NoTracePointPlugin.groovy;

NoTracePointPlugin.groovy

實現Plugin接口,重寫apply()方法

插件應用

在其他Module例如app中build.gradle文件中添加插件com.mimhope.plugin.NoTracePointPlugin;

apply plugin: 'com.android.application'
apply plugin: 'com.mimhope.plugin.NoTracePointPlugin'

在控制檯上執行任務(gradle test-task)

以上com.mimhope.plugin.NoTracePointPlugin輸出日誌;

3.創建通用插件,發佈到maven

3.1.創建module

a.選擇Android Library類型,名字可以隨便定義了,mavenplugindemo;

b.除了build.gradle,src/main外,其他文件都刪除掉,刪除main下的文件;

c.在src/main下新建groovy文件夾;

d.在groovy文件夾下新建package,包名隨便取,例如:com.baidu.plugin;

e.在package下新建.groovy的文件,例如BaiduPlugin.groovy,實現org.gradle.api.Plugin接口;

f.定義插件的類創建好後,需要我們去定義使用插件時的名稱,在src/main 目錄下創建resources目錄,然後在resources目錄下再新建META-INF目錄,再在META-INF裏面新建gradle-plugins目錄。最後在gradle-plugins目錄裏面新建.properties文件,文件的名稱可以隨意取名 ,比如爲com.baidu.gradle.properties,後面應用的時候就是apply plugin: 'com.baidu.gradle'.
properties裏面的內容爲指定我們自定義的類
implementation-class=com.baidu.plugin.BaiduPlugin

g.編寫build.gradle,我們最後要打包到maven,所以需要用到maven插件,內容爲:

apply plugin: 'groovy'
apply plugin: 'maven'

repositories{
    mavenCentral()
}

dependencies {
    implementation gradleApi()//gradle sdk
    implementation localGroovy()//groovy sdk
    //implementation 'com.android.tools.build:gradle:3.0.1'
}

//repositories {
//    jcenter()
//}

這樣我們的plugin工具目錄都創建完成了,如圖:

3.2利用mavenDeployer發佈插件

自定義插件開發好後,我們可以發佈到Maven庫裏面去,可以選擇發佈到本地也可以選擇發佈到遠程服務器中。在我們自定義Module目錄插件下的build.gradle添加如下代碼:

//設置maven deployer
uploadArchives {
    repositories {
        mavenDeployer {
            pom.project {
                groupId 'com.baidu.gradle' //決定jar文件生成的目錄
                artifactId 'plugin-baidu'  //模塊的名稱
                version '2.0.0'  //指定版本號
                description project.description ?:''
                packaging 'jar'
            }
            //文件發佈到下面目錄
            repository(url: uri('../release'))
            //發佈到遠程服務端
            // repository(url: "http://www.xxx.com/repos") {
            // authentication(userName: "xxx", password: "xxx")
            // }
        }
    }
}

執行uploadArchives這個task,點擊AndroidStudio右側的gradle工具,具體操作如下圖(maven打包):

雙擊這個task之後,就在本地目錄下生成相應的jar包,生成結果請看下圖:

在build.gradle中我們配置的maven本地倉庫路徑是release,故生成的文件都在release目錄下(maven打包後文件生成圖);

3.3定義plugin應用

插件開發包生成完成後,就是實戰應用了,首先需要先引入maven倉庫以及生成的插件jar,其實跟我們使用ButterKnife需要在工程的build.gradle中配置ButterKnife插件依賴是一樣的道理,我們這裏將其配置到module的build.gradle裏,也就是說只有這個module可以使用這個插件包。其次,就是應用具體的plugin,也就是apply plugin:xxx,具體的配置如下:

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

buildscript {
    repositories {
        maven {
            //本地Maven倉庫地址
            //這裏是發佈在本地文件夾了
            url uri('../release')
        }
    }
    dependencies {
        //格式爲 groupId:artifactId:version
        classpath 'com.baidu.gradle:plugin-baidu:2.0.0'
    }
}

執行gradle plugin-task 結果如下

以上便是自定義插件的三種方式,一般而言第三種方式最常用,實用性比較強。

 

參考:

https://www.jianshu.com/p/6ec6b06cb5d6

 

 

 

 

 

 

 

 

 

 

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