android開發(fā)中自定義gradle plugin

??在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命令

image.png

方式二、創(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印蔗。

工程結(jié)構(gòu)目錄.png

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

應(yīng)用插件運(yùn)行結(jié)果.png

方式三扒最、創(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)建完成了慎璧,如下圖

插件工程目錄結(jié)構(gòu).png
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工具岁疼,具體操作如下圖:

maven打包.png

雙擊這個task之后阔涉,就在本地目錄下生成相應(yīng)的jar包,生成結(jié)果請看下圖:

maven打包后文件生成圖.png

在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é)果如下

應(yīng)用插件執(zhí)行結(jié)果.png

以上便是自定義插件的三種方式,一般而言第三種方式最常用金拒,實(shí)用性比較強(qiáng)兽肤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绪抛,隨后出現(xiàn)的幾起案子资铡,更是在濱河造成了極大的恐慌,老刑警劉巖幢码,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笤休,死亡現(xiàn)場離奇詭異,居然都是意外死亡症副,警方通過查閱死者的電腦和手機(jī)店雅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贞铣,“玉大人闹啦,你說我怎么就攤上這事≡樱” “怎么了窍奋?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酱畅。 經(jīng)常有香客問我琳袄,道長,這世上最難降的妖魔是什么纺酸? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任窖逗,我火速辦了婚禮,結(jié)果婚禮上餐蔬,老公的妹妹穿的比我還像新娘滑负。我一直安慰自己在张,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布矮慕。 她就那樣靜靜地躺著,像睡著了一般啄骇。 火紅的嫁衣襯著肌膚如雪痴鳄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天缸夹,我揣著相機(jī)與錄音痪寻,去河邊找鬼。 笑死虽惭,一個胖子當(dāng)著我的面吹牛橡类,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芽唇,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼顾画,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匆笤?” 一聲冷哼從身側(cè)響起研侣,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炮捧,沒想到半個月后庶诡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咆课,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年末誓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片书蚪。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡喇澡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出善炫,到底是詐尸還是另有隱情撩幽,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布箩艺,位于F島的核電站窜醉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艺谆。R本人自食惡果不足惜榨惰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望静汤。 院中可真熱鬧琅催,春花似錦居凶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缠黍,卻和暖如春弄兜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓷式。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工替饿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贸典。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓视卢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親廊驼。 傳聞我的和親對象是個殘疾皇子据过,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 這篇文章講給大家?guī)韌radle打包系列中的高級用法-自己動手編寫gradle插件。我們平常在做安卓開發(fā)時蔬充,都會在...
    呆萌狗和求疵喵閱讀 15,974評論 22 80
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蝶俱,服務(wù)發(fā)現(xiàn),斷路器饥漫,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 我的CSDN博客同步發(fā)布:在AndroidStudio中自定義Gradle插件 轉(zhuǎn)載請注明出處:【huachao1...
    huachao1001閱讀 16,429評論 19 60
  • 前言 為什么需要學(xué)Gradle? Gradle 是 Android 現(xiàn)在主流的編譯工具榨呆,雖然在Gradle 出現(xiàn)之...
    Liuuuuuuzi閱讀 1,982評論 0 18
  • 父母們积蜻,注意了,你們現(xiàn)在這種教育方式可真是給我們帶來了太多的壓力彻消。 每天一回到家竿拆,就寫作業(yè),寫作業(yè)宾尚。 我們也要有時...
    膩誠閱讀 289評論 0 1