gradle是目前android開發(fā)中必備的一款構(gòu)建工具,一直以來自己都只是照的網(wǎng)上的代碼對(duì)gradle里面的內(nèi)容進(jìn)行copy,完全不懂里面的含義昔穴,加上最近在看熱修復(fù)過程中,多次強(qiáng)調(diào)要先掌握gradle剧蚣,所以就花時(shí)間將gradle先研究了一遍支竹。
1旋廷、gradle是什么?
gradle是一款基于Groovy的DSL礼搁,他是一個(gè)用來提供各種構(gòu)建的腳本框架饶碘。
2、gradle的結(jié)構(gòu)
在gradle中馒吴,最重要的3個(gè)個(gè)概念是project扎运、task和action,每一次構(gòu)建至少包含一個(gè)project饮戳,每一個(gè)project包含至少一個(gè)task豪治,task是整個(gè)構(gòu)建的最小單元,action是task里面的具體執(zhí)行對(duì)象扯罐。在android里面负拟,每一個(gè)builde.gradle代表一個(gè)project。
3歹河、構(gòu)建生命周期
初始化:project的實(shí)例會(huì)在這個(gè)階段被創(chuàng)建掩浙,如果一個(gè)項(xiàng)目有多個(gè)模塊,并且都有對(duì)應(yīng)的build.gradle文件秸歧,那么就會(huì)用settings.gradle配置好所有的projcet厨姚,然后創(chuàng)建里面的所有project。
配置:解析project對(duì)象键菱,并創(chuàng)建task對(duì)象谬墙,然后將所有task的關(guān)系確定,形成一個(gè)有向無環(huán)圖纱耻。
執(zhí)行:執(zhí)行之前創(chuàng)建的task任務(wù)芭梯,根據(jù)之前建立好的關(guān)系去執(zhí)行,我們做的很多操作弄喘,如編譯玖喘、clean、install等蘑志,實(shí)際上都是在執(zhí)行一個(gè)task累奈,然后根據(jù)有向無環(huán)圖執(zhí)行一系列的task。
4急但、gradle對(duì)象
當(dāng)我們創(chuàng)建project的時(shí)候澎媒,實(shí)際上是將build.gradle腳本生成了一個(gè)project對(duì)象,這個(gè)project對(duì)象是來自于gradle對(duì)象中波桩,所有的project對(duì)象都是由一個(gè)gradle對(duì)象管理戒努。之前的生命周期都可以通過gradle對(duì)象在每一個(gè)周期執(zhí)行完成后,做一些我們自己想要的事情镐躲,來達(dá)到想要的效果储玫。
5侍筛、project對(duì)象
每一個(gè)build.gradle文件都會(huì)轉(zhuǎn)換成一個(gè)Project對(duì)象。在Gradle術(shù)語中撒穷,Project對(duì)象對(duì)應(yīng)的是BuildScript匣椰。
Project包含若干Tasks。另外端礼,由于Project對(duì)應(yīng)具體的工程禽笑,所以需要為Project加載所需要的插件,比如為Java工程加載Java插件蛤奥。其實(shí)佳镜,一個(gè)Project包含多少Task往往是插件決定的。
所以喻括,在Project中邀杏,我們要:
加載插件,然后不同插件有不同的行話唬血,即不同的配置望蜡。我們要在Project中配置好,這樣插件就知道從哪里讀取源文件等拷恨,最后設(shè)置屬性脖律。
6、task介紹
一個(gè)Task包含若干Action腕侄。所以小泉,Task有doFirst和doLast兩個(gè)函數(shù),用于添加需要最先執(zhí)行的Action和需要和需要最后執(zhí)行的Action冕杠。Action就是一個(gè)閉包微姊。
Task創(chuàng)建的時(shí)候可以指定Type,通過type:名字表達(dá)分预。這是什么意思呢兢交?其實(shí)就是告訴Gradle,這個(gè)新建的Task對(duì)象會(huì)從哪個(gè)基類Task派生笼痹。比如配喳,Gradle本身提供了一些通用的Task,最常見的有Copy 任務(wù)凳干。Copy是Gradle中的一個(gè)類晴裹。當(dāng)我們:task myTask(type:Copy)的時(shí)候,創(chuàng)建的Task就是一個(gè)Copy Task救赐。
當(dāng)我們使用 task myTask{ xxx}的時(shí)候涧团。花括號(hào)是一個(gè)closure。這會(huì)導(dǎo)致gradle在創(chuàng)建這個(gè)Task之后少欺,返回給用戶之前喳瓣,會(huì)先執(zhí)行closure的內(nèi)容。
當(dāng)我們使用task myTask << {xxx}的時(shí)候赞别,我們創(chuàng)建了一個(gè)Task對(duì)象,同時(shí)把closure做為一個(gè)action加到這個(gè)Task的action隊(duì)列中配乓,并且告訴它“最后才執(zhí)行這個(gè)closure”(注意仿滔,<<符號(hào)是doLast的代表)。
總結(jié):這些都是我個(gè)人通過查閱資料對(duì)于gradle的理解犹芹,在這里強(qiáng)烈推薦http://blog.csdn.net/innost/article/details/48228651這篇文章崎页,里面講解的非常仔細(xì),在學(xué)習(xí)的過程中腰埂,我從最開始看的一頭霧水到最后慢慢能看懂一點(diǎn)一點(diǎn)飒焦,再到最后能完全明白,覺得這篇講解的非常十分細(xì)致屿笼。另外如果是沒有接觸過gradle的牺荠,可以先看《gradle for android》來入門,至少對(duì)里面的一些配置做一些了解驴一,了解groovy的語法后休雌,就能看懂里面具體的內(nèi)容是在做什么。