目錄
1.在自己的module(例如:app)中build.gradle中定義插件
在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