Gradle學(xué)習(xí)-----Gradle自定義插件

概述

android項目構(gòu)建主要由com.android.application及com.android.library兩個插件完成惨远,要了解android構(gòu)建及插

件化,gradle插件學(xué)習(xí)是必由之路。

Gradle相關(guān)語法

在這里不再重復(fù)Gradle相關(guān)的語法,如果要學(xué)習(xí)gradle相關(guān)的東西预厌,請查看上篇
http://www.reibang.com/p/57d99c983a7a。官方文檔上也有自定義插件的介紹元媚。

插件類型

Gradle的插件一般有這么幾種:
一種是直接在項目中的gradle文件里編寫轧叽,這種方式的缺點是無法復(fù)用插件代碼,在其他項目中還得復(fù)制一遍代碼(或者說說復(fù)制一遍文件)
另一種是在獨立的項目里編寫插件刊棕,然后發(fā)布到中央倉庫炭晒,之后直接引用就可以了,優(yōu)點就是可復(fù)用(重點學(xué)習(xí)這種)甥角。

Gradle插件開發(fā)

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

1:首先当犯,新建一個Android項目垢村。

2:之后,新建一個Android Module項目嚎卫,類型選擇Android Library嘉栓。(AndroidStudio中是沒有新建類似Gradle Plugin這樣的選項的,那我們?nèi)绾卧贏ndroidStudio中編寫Gradle插件)

3:將新建的Module中除了build.gradle文件外的其余文件全都刪除拓诸,然后刪除build.gradle文件中的所有內(nèi)容后改為如下侵佃。

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

dependencies {
//gradle sdk
    compile gradleApi()
//groovy sdk
    compile localGroovy()
}
repositories {
    url ***
}

4:在新建的module中新建文件夾src,接著在src文件目錄下新建main文件夾奠支,在main目錄下新建groovy目錄馋辈,這時候groovy文件夾會被Android識別為groovy源碼目錄(由于gradle是基于groovy,因此胚宦,我們開發(fā)的gradle插件相當(dāng)于一個groovy項目)首有。

package  com.peyton.test

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

public class PluginImpl implements Plugin<Project> {

    void apply(Project project) {
        System.out.println("========================");
        System.out.println("hello gradle plugin!");
        System.out.println("========================");
    }
}

5:除了在main目錄下新建groovy目錄外,你還要在main目錄下新建resources目錄枢劝,同理resources目錄會被自動識別為資源文件夾井联。在groovy
目錄下新建項目包名,就像Java包名那樣您旁。resources目錄下新建文件夾META-INF烙常,META-INF文件夾下新建gradle-plugins文件夾。然后在
resources/META-INF/gradle-plugins目錄下新建一個properties文件,注意該文件的命名就是你只有使用插件的名字蚕脏,這里命名為com.peyton.testplugin.properties侦副,在里面輸入

implementation-class=com.peyton.test.PluginImpl(指向項目groovy目錄下Plugin子實現(xiàn)類)

目前,項目的結(jié)構(gòu)是這樣的驼鞭。


QQ圖片20170825155855.png

6:上傳maven秦驯,將項目寫好的上傳gradle腳本(主要配置了uploadArchives中需要用到的groupId,artifactId及version)挣棕,復(fù)制到項目下然后執(zhí)行uploadArchives task译隘,即上傳到maven。
也可以先上傳到本地的maven洛心,方法如下:
6.1:在插件module的build.gradle中

//group和version在后面使用自定義插件的時候會用到
group='com.tc.plugin'
version='1.0.0'


uploadArchives {
    repositories {
        mavenDeployer {
            //提交到遠程服務(wù)器:
           // repository(url: "http://****/repos") {
            //    authentication(userName: "***", password: "***")
           // }
           //本地的Maven地址設(shè)置為D:/repos
            repository(url: uri('../repo'))
        }
    }
}

6.2 在使用的module的build.gradle中

buildscript {
    repositories {
        maven {//本地Maven倉庫地址
            url uri('../repo')
        }
    }
    dependencies {
        //格式為-->group:module:version
        classpath 'com.tc.plugin:myplugin:1.0.0'
    }
}
//com.hc.gradle為resources/META-INF/gradle-plugins
//下的properties文件名稱
apply plugin: 'com.peyton.testplugin'

7:項目中使用:在項目中需要用到插件的地方引入插件固耘,如app目錄下build.gradle

buildscript {
    repositories {
        maven {//本地Maven倉庫地址
            url ***********
        }
    }
    dependencies {
        //格式為-->groupId:artifactId:version
        classpath 'com.plugin.test:myplugin:1.0.0'
    }
}
//com.peyton.testplugin為resources/META-INF/gradle-plugins
//下的properties文件名稱
apply plugin: 'com.peyton.testplugin'

以上就完成了最簡單的插件

簡單自定義配置并讀取build.gradle值

根據(jù)Gradle官網(wǎng)的介紹,Project是你與Gradle交互的主接口词身,故將Project作為自定義Plugin的泛型傳入

implements Plugin<Project>

通過Project訪問的使用場景:Extension厅目。先看一個熟悉的內(nèi)容:

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.peyton.test"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

上面的android{}、compileSdkVersion法严、defaultConfig {}等等這些設(shè)置就是通過Extension损敷。下面我們自定義一個Extension。首先渐夸,定義兩個Groovy類:Address和TestExtension.

class Address{
    String province=null
    String city=null
}
class TestExtension{
    String myName = null;

}

再自定義Plugin:

class PluginImpl implements Plugin<Project> {

    @Override
    void apply(Project project) {

        project.extensions.create('tc',TestExtension);
        project.extensions.create('address', Address);


        project.task('readExtension') << {
            def address=project['address']

            println project['tc'].myName
            println address.province+" "+address.city

        }
    }
}

接下來就是使用插件(即build.gradle 中):

apply plugin 'com.peyton.testplugin'

tc {
    address{
       province "Fujian"
        city "Xiamen"
    }

    myName "Peyton"

}

com.peyton.testplugin這一行會導(dǎo)致直接執(zhí)行PluginImpl 類的apply方法嗤锉。所以,tc{}這個塊必須放在com.peyton.testplugin之后墓塌,因為在沒有執(zhí)行project.extensions.create('tc',TestExtension);之前,使用tc{}會報錯奥额!address{}也是同理苫幢。另外,補充一下:project.extensions相當(dāng)于project.getExtensions()即返回的是ExtensionContainer對象(上一篇groovy語法特性中有講到)而ExtensionContainer對象的create方法就是把tc{}TestExtension對應(yīng)起來垫挨。其他通過project.的方式也是同樣的道理韩肝。再看看project.task('readExtension'),這是創(chuàng)建一個task九榔。相當(dāng)于在build.gradle文件中的task xxx <<{}只不過這里是通過代碼的方式動態(tài)創(chuàng)建.接下來只需要在命令行中運行readExtension 任務(wù)即可看下如下信息

:testmodule:readExtension
Peyton
Fujian Xiamen
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哀峻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哲泊,更是在濱河造成了極大的恐慌剩蟀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切威,死亡現(xiàn)場離奇詭異育特,居然都是意外死亡,警方通過查閱死者的電腦和手機先朦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門缰冤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬缨,“玉大人,你說我怎么就攤上這事棉浸』逞Γ” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵迷郑,是天一觀的道長乾戏。 經(jīng)常有香客問我,道長三热,這世上最難降的妖魔是什么鼓择? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮就漾,結(jié)果婚禮上呐能,老公的妹妹穿的比我還像新娘。我一直安慰自己抑堡,他們只是感情好摆出,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著首妖,像睡著了一般偎漫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上有缆,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天象踊,我揣著相機與錄音,去河邊找鬼棚壁。 笑死杯矩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袖外。 我是一名探鬼主播史隆,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曼验!你這毒婦竟也來了泌射?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鬓照,失蹤者是張志新(化名)和其女友劉穎熔酷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颖杏,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡纯陨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翼抠。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咙轩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阴颖,到底是詐尸還是另有隱情活喊,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布量愧,位于F島的核電站钾菊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏偎肃。R本人自食惡果不足惜煞烫,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望累颂。 院中可真熱鬧滞详,春花似錦、人聲如沸紊馏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朱监。三九已至岸啡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赫编,已是汗流浹背巡蘸。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沛慢,地道東北人赡若。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像团甲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子黍聂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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