??在android studio中g(shù)radle作為主要的構(gòu)建工具摔踱,其核心工作任務(wù)在于執(zhí)行一系列的Task菇存。而plugin在gradle構(gòu)建過程又扮演著舉足輕重的角色习柠,有時為了完成相應(yīng)的構(gòu)建任務(wù)必須通過引入相應(yīng)的插件來輔助芳来,這些插件中定義了構(gòu)建Project需要的一系列Task梆暮,并且負(fù)責(zé)執(zhí)行相應(yīng)的Task捉超,比如構(gòu)建android應(yīng)用'com.android.application',構(gòu)建Library的'com.android.library'胧卤。
??除了系統(tǒng)自帶的插件外,有時候我們也需要開發(fā)屬于我們自己的plugin拼岳,比如熱修復(fù)枝誊,插件化開發(fā)中基本上都有可能會去自定義插件。
自定義插件主要有三種方式:
1惜纸、直接在module的build.gradle中開發(fā)</br>
2叶撒、創(chuàng)建當(dāng)前項(xiàng)目使用的插件</br>
3、創(chuàng)建通用的插件耐版,發(fā)布到maven
方式一祠够、build.gradle中開發(fā)
在我們自己的module的build.gradle中編寫代碼
apply plugin: 'com.android.application'
apply plugin: HelloPlugin
class HelloPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
project.task('testPlugin') << {
println 'hello, plugin!'
}
}
}
上面我們自定義了一個名為HelloPlugin的插件,然后其中定義了testPlugin的task粪牲。</br>
下面我們測試下看看效果古瓤,在Terminal中執(zhí)行g(shù)radle testPlugin命令
方式二、創(chuàng)建當(dāng)前項(xiàng)目使用的插件
1腺阳、新建一個類型為Android Library的Module湿滓,名字為buildsrc,注意這個名字只能為buildsrc,如果不是這個名稱舌狗,這里是無法apply包名的,會提示找不到扔水。
2痛侍、除build.gradle,src/main外,其他文件都刪除掉,刪除main下的文件主届。
3赵哲、在src/main下新建groovy文件夾。
4君丁、在groovy文件夾下新建package枫夺,包名隨便取,例如com.build.src绘闷。
5橡庞、在package下創(chuàng)建.groovy的文件,例如PluginDemoTest.groovy印蔗。
PluginDemoTest.groovy的內(nèi)如為如下:
package com.build.src
import org.gradle.api.Plugin
import org.gradle.api.Project
public class PluginDemoTest implements Plugin<Project> {
@Override
void apply(Project project) {
project.logger.error("==========定義插件開始運(yùn)行了===========")
//這里加一個簡單的task
project.task('test-task') << {
println "hello, this is test task!"
}
}
}
應(yīng)用自定義plugin
在同工程的其他module的build.gradle中應(yīng)用這插件
apply plugin: com.build.src.PluginDemoTest
運(yùn)行控制臺中執(zhí)行g(shù)radle test-task
方式三扒最、創(chuàng)建通用的插件,發(fā)布到maven
1华嘹、創(chuàng)建module
[1] 選擇Android Library類型吧趣,名稱可以隨便定義了,比如:PluginDemo
[2] 將Module里面的內(nèi)容刪除耙厚,只保留build.gradle文件和src/main目錄强挫。
[3]在main目錄下新建groovy目錄
[4]在groovy目錄下新建package,包名隨便取薛躬,比如:com.plugin.demo
[5]在com.plugin.demo包下創(chuàng)建.groovy文件俯渤,比如MyPluginDemo.groovy,需要實(shí)現(xiàn)org.gradle.api.Plugin接口,代碼如下:
package com.plugin.demo
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MyPluginDemo implements Plugin<Project> {
@Override
void apply(Project project) {
println "hello, this is test plugin!"
project.task('plugin-task') << {
println "hello, this is a test task!"
}
}
}
[6] 定義插件的類創(chuàng)建好后泛豪,需要我們?nèi)ザx使用插件時的名稱稠诲,在src/main 目錄下創(chuàng)建resources目錄,然后在resources目錄下再新建META-INF目錄诡曙,再在META-INF里面新建gradle-plugins目錄臀叙。最后在gradle-plugins目錄里面新建.properties文件,文件的名稱可以隨意取名 价卤,比如為com.plugin.gradle.properties劝萤,后面應(yīng)用的時候就是apply plugin: 'com.plugin.gradle'.
properties里面的內(nèi)容為指定我們自定義的類
implementation-class=com.plugin.demo.MyPluginDemo
[7]編寫build.gradle,我們最后要打包到maven,所以需要用到maven插件,內(nèi)容為:
apply plugin: 'groovy'
apply plugin: 'maven'
repositories {
mavenCentral()
}
dependencies {
compile gradleApi() //gradle sdk
compile localGroovy() //groovy sdk
}
這樣我們的plugin工程目錄都創(chuàng)建完成了慎璧,如下圖
2床嫌、利用mavenDeployer發(fā)布插件
??自定義插件開發(fā)好后,我們可以發(fā)布到Maven庫里面去胸私,可以選擇發(fā)布到本地也可以選擇發(fā)布到遠(yuǎn)程服務(wù)器中厌处。在我們自定義Module目錄下的build.gradle添加如下代碼:
//設(shè)置maven deployer
uploadArchives {
repositories {
mavenDeployer {
pom.project {
groupId 'com.plugin.demo' //決定jar文件生成的目錄
artifactId 'plugin-test' //模塊的名稱
version '1.0.0' //指定版本號
description project.description ?:''
packaging 'jar'
}
//文件發(fā)布到下面目錄
repository(url: uri('../release'))
//發(fā)布到遠(yuǎn)程服務(wù)端
// repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "xxx", password: "xxx")
// }
}
}
}
執(zhí)行uploadArchives這個task,點(diǎn)擊AndroidStudio右側(cè)的gradle工具岁疼,具體操作如下圖:
雙擊這個task之后阔涉,就在本地目錄下生成相應(yīng)的jar包,生成結(jié)果請看下圖:
在build.gradle中我們配置的maven本地倉庫路徑是release,故生成的文件都在release目錄下瑰排。
3贯要、定義plugin的應(yīng)用
??插件開發(fā)包生成完成后,就是實(shí)戰(zhàn)應(yīng)用了椭住,首先需要先引入maven倉庫以及生成的插件jar崇渗,其實(shí)跟我們使用ButterKnife需要在工程的build.gradle中配置ButterKnife插件依賴是一樣的道理,我們這里將其配置到module的build.gradle里京郑,也就是說只有這個module可以使用這個插件包宅广。其次,就是應(yīng)用具體的plugin傻挂,也就是apply plugin:xxx乘碑,具體的配置如下:
//com.plugin.gradle為resources/META-INF/gradle-plugins下的properties文件名稱
apply plugin: 'com.plugin.gradle'
buildscript {
repositories {
maven {
//本地Maven倉庫地址
//這里是發(fā)布在本地文件夾了
url uri('../release')
}
}
dependencies {
//格式為 groupId:artifactId:version
classpath 'com.plugin.demo:plugin-test:1.0.0'
}
}
執(zhí)行g(shù)radle plugin-task 結(jié)果如下
以上便是自定義插件的三種方式,一般而言第三種方式最常用金拒,實(shí)用性比較強(qiáng)兽肤。