Gradle為什么那么火

Android主要有以下幾步:

主要的資源文件(layout, values 等)都被 aapt 編譯,并且在一個(gè) R 文件中引用

Java 代碼被 Java 編譯器編譯成 JVM 字節(jié)碼(.class 文件)

JVM 字節(jié)碼再被 dex 工具轉(zhuǎn)換成 dalvik 字節(jié)碼(.dex 文件)

然后這些 .dex 文件梢莽、編譯過的資源文件和其他資源文件(比如圖片)會(huì)被打包成一個(gè) apk

apk 文件在安裝前會(huì)被 debug/release 的 key 文件簽名安裝到設(shè)備

幾個(gè)注意點(diǎn)

注意主要的資源文件萧豆,有些特別的資源文件就不會(huì)被編譯,比如 assets 目錄下的文件昏名,raw 目錄下的文件還有圖片涮雷,都不會(huì)被編譯。只不過 raw 下的文件會(huì)在 R 文件里生成 id

如果對(duì) apk 正式簽名轻局,還需要使用 zipalign 工具對(duì) apk 進(jìn)行對(duì)齊操作洪鸭,這樣做的好處是當(dāng)應(yīng)用運(yùn)行時(shí)會(huì)減少內(nèi)存的開銷

通過上面的介紹可以看到,這么復(fù)雜的構(gòu)建過程如果需要人手動(dòng)去完成未免太過殘忍仑扑,于是有了各種的構(gòu)建工具览爵。

Android 構(gòu)建的舊愛:Ant, Maven

在 Gradle 之前被廣泛使用的是 Apache Ant 和 Maven。

Ant

Ant 2000 年發(fā)布镇饮,很快成為 Java 項(xiàng)目最流行的構(gòu)建工具蜓竹。

Ant 的優(yōu)點(diǎn)就是:

簡(jiǎn)單、易學(xué)储藐,不需要什么特殊準(zhǔn)備就能上手

基于過程式編程思想使得構(gòu)建非常靈活

后來還能支持插件俱济。

不足之處就是使用 XML 作為腳本配置格式,除非是很小的項(xiàng)目钙勃,否則它的 XML 文件很快就大得無法管理蛛碌。

Maven

Maven 發(fā)布于 2004 年。目的是解決使用 Ant 所帶來的一些問題辖源。

Maven 也是使用 XML 作為構(gòu)建配置的文件格式蔚携,不過文件結(jié)構(gòu)卻有了巨大的變化:

Ant 需要開發(fā)者將執(zhí)行 task 所需的全部命令都列出來

而 Maven 依靠約定并提供現(xiàn)成的可調(diào)用的目標(biāo)

不僅如此,Maven 更重要的一個(gè)進(jìn)步是具備從網(wǎng)絡(luò)上自動(dòng)下載依賴的能力(當(dāng)然 Ant 后來通過 Ivy 也具備了這個(gè)功能)同木,這革命性地改變了我們開發(fā)軟件的方式浮梢。

Maven 的缺點(diǎn)是:

依賴管理不能很好地處理相同庫(kù)文件不同版本之間的沖突(Ivy在這方面更好一些)

XML 作為配置文件的格式有嚴(yán)格的結(jié)構(gòu)層次和標(biāo)準(zhǔn),定制化目標(biāo)很困難

Maven 主要解決了依賴管理的問題彤路,然而使用 XML 的錯(cuò)誤使它重蹈覆轍秕硝,實(shí)際上用 Maven 很難寫出復(fù)雜、定制化的構(gòu)建腳本,在大型項(xiàng)目中远豺,它經(jīng)常什么“特別的”事還沒干就有幾百行代碼奈偏,甚至不如 Ant。

前輩們?cè)诜词∏皟煞N構(gòu)建工具的錯(cuò)誤之后躯护,提出了 DSL (Domain Special Language, 領(lǐng)域?qū)S谜Z言)的概念惊来,目標(biāo)是設(shè)計(jì)一套能夠解決特定領(lǐng)域問題的語言。在構(gòu)建這方面棺滞,DSL 的一個(gè)成功案例就是 Gradle裁蚁。

Android 構(gòu)建的新歡:Gradle

2012 年發(fā)布的 Gradle 深刻吸取前面幾位前輩的經(jīng)驗(yàn)和教訓(xùn),集大家之所成继准,做了很多改進(jìn)枉证。

Gradle 有約定優(yōu)于配置的原則,即為設(shè)置和屬性提供默認(rèn)值移必,這使得它比 Ant 或者 Maven 更容易上手室谚。

Gradle 構(gòu)建腳本不再使用 xml ,而是使用基于 Groovy 的 DSL 進(jìn)行書寫(Groovy 是一種基于 Java 虛擬機(jī)的動(dòng)態(tài)語言崔泵,因此 Android 開發(fā)者看著會(huì)很熟悉)秒赤,從而使得構(gòu)建腳本比用 Ant 和 Maven 寫的更清晰、簡(jiǎn)潔憎瘸,下面是實(shí)現(xiàn)同樣目標(biāo)的 Maven 代碼和 Gradle 代碼對(duì)比:

Gradle 既有 Ant 的強(qiáng)大和靈活入篮,又有 Maven 的依賴管理,支持插件且易于使用幌甘。因此一推出就獲得廣泛關(guān)注崎弃,2013 年被 Google 選為 Android Studio 的默認(rèn)構(gòu)建工具。

Gradle 設(shè)計(jì)的方式使得它可以很容易地?cái)U(kuò)展構(gòu)建和插入到現(xiàn)有的構(gòu)建過程中含潘,Google 推廣 Gradle 和 Android Studio 時(shí),目標(biāo)是讓代碼復(fù)用线婚、構(gòu)建 variant遏弱、配置和定制構(gòu)建過程變得更加簡(jiǎn)單。

有人可能擔(dān)心是否需要專門去學(xué)習(xí)新語言 Groovy塞弊,《Gradle for Android》書中專門提到:

Groovy 代碼非常易讀漱逸,如果你學(xué)習(xí)過 Java,那么學(xué)習(xí) Groovy 的曲線不會(huì)陡峭游沿。 如果你想構(gòu)建自己的任務(wù)和插件饰抒,那么對(duì) Groovy 有更深層次的理解尤為重要。 不過因?yàn)?Groovy 是基于 Java 虛擬機(jī)的诀黍,所以你完全可以用 Java 或者其他基于 Java 虛擬機(jī)的語言來編寫你的自定義插件袋坑。

Gradle 的關(guān)鍵概念及構(gòu)建生命周期

Gradle 中兩個(gè)關(guān)鍵的概念:項(xiàng)目和任務(wù)。

每個(gè) build.gradle 構(gòu)建腳本文件代表一個(gè)項(xiàng)目 project:

任務(wù) task 定義在構(gòu)建腳本里:

每次構(gòu)建至少包括一個(gè)項(xiàng)目眯勾,每個(gè)項(xiàng)目里又至少包括一個(gè)任務(wù)枣宫。

構(gòu)建生命周期

一個(gè) Gradle 構(gòu)建通常包括下面三個(gè)階段:

1.初始化

項(xiàng)目實(shí)例會(huì)在這時(shí)被創(chuàng)建婆誓,如果這個(gè)項(xiàng)目里有多個(gè) module,或者依賴多個(gè) library也颤,并且它們都有對(duì)應(yīng)的 build.gradle 文件洋幻,就會(huì)創(chuàng)建多個(gè)項(xiàng)目實(shí)例

2.配置

在這個(gè)階段構(gòu)建腳本被執(zhí)行,并且為每個(gè)項(xiàng)目實(shí)例創(chuàng)建和配置任務(wù)

3.執(zhí)行

在這個(gè)階段 Gradle 將根據(jù)構(gòu)建腳本的配置決定哪些任務(wù)會(huì)被執(zhí)行

不同任務(wù)之間可能有 相互依賴翅娶,因此在配置階段 Gradle 會(huì)生產(chǎn)依賴關(guān)系圖文留,沒有依賴的任務(wù)通常會(huì)被優(yōu)先執(zhí)行,然后一個(gè)接一個(gè)執(zhí)行其他任務(wù)竭沫。一旦一個(gè)任務(wù)被執(zhí)行過燥翅,就不會(huì)被再次執(zhí)行。

Gradle Wrapper

Gradle 在不斷的發(fā)展输吏,有可能存在新版本不兼容舊版本的情況权旷,于是官方為我們提供了 Gradle Wrapper,就是為了兼容和適配不同版本贯溅,確保構(gòu)建是可重復(fù)的拄氯。

普通的 Gradle 腳本命令是:

gradle...

而 Gradle Wrapper 命令只是在 gradle 后加了個(gè) w:

gradlew...

在 Mac 下略微有些不同:

./gradlew...

開發(fā)者或者自動(dòng)構(gòu)建系統(tǒng)可以通過使用 wrapper 來運(yùn)行 gradle 命令,由它來搞定兼容等問題它浅。因此我們甚至都不需要安裝 gradle译柏,直接使用 gradle wrapper 即可,就像 Android Studio 里推薦的一樣:

上圖我并沒有使用 wrapper姐霍,是因?yàn)楫?dāng)你運(yùn)行 gradlew 命令時(shí)鄙麦,gradle wrapper 會(huì)自動(dòng)下載需要但是你沒有的 gradle 版本并使用。 這在多人協(xié)作時(shí)镊折,很可能因?yàn)閯e人修改了 gradle 版本胯府、上傳到 git,然后導(dǎo)致你運(yùn)行命令時(shí)需要下載半天恨胚。

不過官方還是推薦使用 wrapper骂因,畢竟這樣更穩(wěn)定。

總結(jié)

這篇文章對(duì)比 Ant 和 Maven 介紹了 Gradle 的一些優(yōu)點(diǎn)和基礎(chǔ)概念赃泡,在理解 Gradle 為什么會(huì)被使用寒波、它有什么優(yōu)點(diǎn)之后,有助于我們后續(xù)深入學(xué)習(xí) Gradle 的使用升熊。

轉(zhuǎn)自微信公眾號(hào):Android開發(fā)中文站

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俄烁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子级野,更是在濱河造成了極大的恐慌页屠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卷中,居然都是意外死亡矛双,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蟆豫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來议忽,“玉大人,你說我怎么就攤上這事十减≌恍遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帮辟,是天一觀的道長(zhǎng)速址。 經(jīng)常有香客問我,道長(zhǎng)由驹,這世上最難降的妖魔是什么芍锚? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔓榄,結(jié)果婚禮上并炮,老公的妹妹穿的比我還像新娘。我一直安慰自己甥郑,他們只是感情好逃魄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澜搅,像睡著了一般伍俘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勉躺,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天癌瘾,我揣著相機(jī)與錄音,去河邊找鬼饵溅。 笑死柳弄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的概说。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚣伐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糖赔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轩端,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤放典,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奋构,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壳影,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弥臼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴咧。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖径缅,靈堂內(nèi)的尸體忽然破棺而出掺栅,到底是詐尸還是另有隱情,我是刑警寧澤纳猪,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布氧卧,位于F島的核電站,受9級(jí)特大地震影響氏堤,放射性物質(zhì)發(fā)生泄漏沙绝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一鼠锈、第九天 我趴在偏房一處隱蔽的房頂上張望闪檬。 院中可真熱鬧,春花似錦脚祟、人聲如沸谬以。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽为黎。三九已至,卻和暖如春行您,著一層夾襖步出監(jiān)牢的瞬間铭乾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工娃循, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炕檩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓捌斧,卻偏偏與公主長(zhǎng)得像笛质,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捞蚂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評(píng)論 6 342
  • Android Studio作為Android應(yīng)用開發(fā)的官方IDE妇押,默認(rèn)使用Gradle作為構(gòu)建工具,所以對(duì)于An...
    feil0n9wan9閱讀 1,674評(píng)論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理姓迅,服務(wù)發(fā)現(xiàn)敲霍,斷路器俊马,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 碎霧藏綠,光景著晴肩杈,是與非柴我,醉難傾。煙雨流暉扩然,琉璃弄影艘儒,昨與今,清無淌与学。是非昨今都如水彤悔,罕須淚。醉索守,我苦晕窑,清...
    月光qaq丶閱讀 95評(píng)論 1 0