Gradle插件在項目中的應用方式

Gradle基礎概念

  • projects ( 項目 ):每一個構建都是由一個或多個 projects 構成的,安卓工程每個module工程就是一個project退客,對應的是module里面的build.gradle文件
project.png
  • tasks ( 任務 ):每一個 project 是由一個或多個 tasks 構成的. 一個 task 代表一些更加細化的構建
task.png

Gradle 擴展

如上圖project盘寡,project是實現(xiàn)了ExtensionAware的矮慕。ExtensionAware的getExtensions方法返回了一個ExtensionContainer恳啥,也就是一個可以擴展容器亏拉。通過ExtensionContainer我們可以去創(chuàng)建擴展。

org.gradle.api.tasks.TaskContainer接口:
//查找task
findByPath(path: String): Task
getByPath(path: String): Task
getByName(name: String): Task
withType(type: Class): TaskCollection
matching(condition: Closure): TaskCollection

//創(chuàng)建task
create(name: String): Task
create(name: String, configure: Closure): Task 
create(name: String, type: Class): Task
create(options: Map<String, ?>): Task
create(options: Map<String, ?>, configure: Closure): Task
ExtensionAware.png
ExtensionContainer.png
extuse.png

按照文檔坐桩,我們來試試

set.png

注釋掉配置里面的內容尺棋,我們再看看運行打印結果

notset.png

從上圖可以看出,如果我們沒有配置撕攒,就會使用默認的陡鹃,這種配置的寫法是不是似曾相識,譬如我們經(jīng)常要改動的android{}里面的版本號之類的抖坪,android 它就是一個 Extension,看看源碼就知道android 實際就是 AppExtension 這個類萍鲸。所以 android 能配置什么屬性就可以在 AppExtension查找即可。

/**
 * Gradle plugin class for 'application' projects.
 */
public class AppPlugin extends BasePlugin implements Plugin<Project> {
    
    protected BaseExtension createExtension(
            @NonNull Project project,
            @NonNull Instantiator instantiator,
            @NonNull AndroidBuilder androidBuilder,
            @NonNull SdkHandler sdkHandler,
            @NonNull NamedDomainObjectContainer<BuildType> buildTypeContainer,
            @NonNull NamedDomainObjectContainer<ProductFlavor> productFlavorContainer,
            @NonNull NamedDomainObjectContainer<SigningConfig> signingConfigContainer,
            @NonNull ExtraModelInfo extraModelInfo) {
        return project.getExtensions()
                .create(
                        "android",//"android" 就是 Extension 的名字
                        AppExtension.class,
                        project,
                        instantiator,
                        androidBuilder,
                        sdkHandler,
                        buildTypeContainer,
                        productFlavorContainer,
                        signingConfigContainer,
                        extraModelInfo);
    }


Gradle 本地腳本插件

有時候我們不希望很多把很多gradle腳本寫在build.gradle里面擦俐,通過apply就可以依賴本地其他gradle文件脊阴,就如同java里面import一樣

localgradle.png

Gradle 遠程腳本插件

其實和本地插件一樣,只不過是依賴的遠程http的url地址蚯瞧。有時候有些腳本我們需要動態(tài)的改變的時候使用這種方法嘿期,譬如我們的依賴組件的版本號統(tǒng)一管理,所有同一個版本發(fā)布的組件引用同一個分支的遠程gradle文件埋合。

gitplugin.png
remoteplugin.png

Gradle 二進制插件

Gradle插件主要是實現(xiàn)Plugin接口apply方法备徐,下面是之前我寫的一個檢測項目中圖片是否全部是webp的插件,因為webp體積小甚颂,用于體積優(yōu)化的任務插件

  1. 在項目工程的根目錄下創(chuàng)建buildSrc目錄蜜猾,這個名字不能錯,必須是buildSrc振诬。創(chuàng)建完之后蹭睡,rebuild一下工程,會在buildSrc下生成一些目錄
  2. 在buildSrc目錄下創(chuàng)建build.gradle.kts文件赶么,用kotlin寫插件
kotlingradle.png
plugins {
    `kotlin-dsl`
}
repositories {
    jcenter()
}
  1. 在buildSrc目錄下創(chuàng)建src/main/kotlin目錄,目錄名字一定不要錯<缁怼!辫呻!清钥,然后編寫插件
taskImpl.png
  1. 在 main 目錄下新建 resources 目錄,然后在 resources 目錄里面再新建 META-INF 目錄放闺,再在 META-INF 里面新建 gradle-plugins 目錄循捺。最后在 gradle-plugins 目錄里面新建 properties 文件,注意這個文件的命名雄人,你可以隨意取名,但是后面使用這個插件的時候,會用到這個名字础钠。比如恰力,你取名為com.example.harry.properties,那么這個插件的id就是com.example.harry
resource.png
  1. 在app中進行引用
taskrun.png
  • 我們還可以通過另一種方式來生成插件
gradlePlugin {
    plugins {
        create("HarryPlugin2") {
            //插件id,用于引用插件,如:apply plugin: 'id'
            id = "com.example.harry2"
            //指定插件的實現(xiàn)類
            implementationClass = "com.example.harry.HarryPlugin2"
        }
    }
}
plugin2.png
  • 我們還可以通過這個buildSrc包來進行依賴管理
deps.png
depimpl.png

獨立插件maven的發(fā)布

  • 直接新建一個module旗吁,不需要以buildSrc命令踩萎。新建module默認的gradle里面內容刪除掉,添加maven依賴很钓,編寫插件后即可發(fā)布本地maven倉庫
maven.png

發(fā)布完成后即可在項目中引用


mavenapply.png

上面是使用的本地倉庫香府,如果有maven服務器,將url替換成遠程maven即可码倦。maven服務搭建請點擊這里

文中代碼地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末企孩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袁稽,更是在濱河造成了極大的恐慌勿璃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推汽,死亡現(xiàn)場離奇詭異补疑,居然都是意外死亡,警方通過查閱死者的電腦和手機歹撒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門莲组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暖夭,你說我怎么就攤上這事锹杈。” “怎么了鳞尔?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵嬉橙,是天一觀的道長。 經(jīng)常有香客問我寥假,道長市框,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任糕韧,我火速辦了婚禮枫振,結果婚禮上,老公的妹妹穿的比我還像新娘萤彩。我一直安慰自己粪滤,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布雀扶。 她就那樣靜靜地躺著杖小,像睡著了一般肆汹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上予权,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天昂勉,我揣著相機與錄音,去河邊找鬼扫腺。 笑死岗照,一個胖子當著我的面吹牛,可吹牛的內容都是我干的笆环。 我是一名探鬼主播攒至,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躁劣!你這毒婦竟也來了迫吐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤习绢,失蹤者是張志新(化名)和其女友劉穎渠抹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闪萄,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡梧却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了败去。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放航。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圆裕,靈堂內的尸體忽然破棺而出广鳍,到底是詐尸還是另有隱情,我是刑警寧澤吓妆,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布赊时,位于F島的核電站,受9級特大地震影響行拢,放射性物質發(fā)生泄漏祖秒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一舟奠、第九天 我趴在偏房一處隱蔽的房頂上張望竭缝。 院中可真熱鬧,春花似錦沼瘫、人聲如沸抬纸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿故。三九已至阿趁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晓锻,已是汗流浹背歌焦。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砚哆,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓屑墨,卻偏偏與公主長得像躁锁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卵史,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容