給 ANDROID 初學(xué)者的 GRADLE 知識(shí)普及

版權(quán)聲明:本文為 stormzhang 原創(chuàng)文章,可以隨意轉(zhuǎn)載,但必須在明確位置注明出處83蕖!卢未!

1. 前言

前一段時(shí)間有人在我的邪教群里問「剛學(xué) Android 不久肪凛,對(duì) Gradle 不懂,看了很多資料依然一知半解辽社,希望張哥給講講 Gradle 」伟墙,沒想到群里很多人都響應(yīng),表示同感滴铅,有人在群里推薦了一本書戳葵,說看這本書就行了。說實(shí)在的汉匙,我不反對(duì)看書拱烁,但是我反對(duì)的是為了弄懂一個(gè)知識(shí)點(diǎn)就需要看一本書那效率也太低了,于是我良心張就隨口說了句「要不我在群里開個(gè)講座給你們普及下 Gradle 基本概念吧噩翠?」沒想到平時(shí)潛水的人全都出來了戏自,然后紛紛回復(fù)「666…」,講真伤锚,剛說過我就后悔了擅笔,主要沒有那么多時(shí)間,但是畢竟已經(jīng)放開話了见芹,當(dāng)晚加班回到家剂娄,沒有一點(diǎn)準(zhǔn)備就在群里給他們開始了長(zhǎng)達(dá)一個(gè)多小時(shí)的普及工作,事后玄呛,出乎意料的大家一致反映效果很好阅懦,而且聽課的全都很認(rèn)真,有很多有心的人把我在群里一字一句打的聊天記錄整理成了筆記分享在群里徘铝,我覺得這個(gè)主題可能對(duì)我的很多讀者也都很有幫助耳胎,所以我在群里整理的筆記的基礎(chǔ)上做了點(diǎn)補(bǔ)充與改進(jìn),希望這篇文章對(duì)你們有幫助惕它!

2. 什么是構(gòu)建工具怕午?

我們大家都知道 Gradle 是一種構(gòu)建工具,那么什么是構(gòu)建工具呢淹魄?

網(wǎng)上一大堆的文字解釋我覺得很難理解郁惜,這里我以咱們 Android 開發(fā)來舉個(gè)例子吧。

我們以前開發(fā)都是用 Eclipse 甲锡,而 Eclipse 大家都知道是一種 IDE (集成開發(fā)環(huán)境)兆蕉,最初是用來做 Java 開發(fā)的羽戒,而 Android 是基于 Java 語言的,所以最初 Google 還是希望 Android 能在 Eclipse 上進(jìn)行開發(fā)虎韵,為了滿足這個(gè)需求易稠,Google 開發(fā)了一個(gè)叫 ADT (Android Developer Tools)的東西,相信以前從 Eclipse 時(shí)代過來的對(duì) ADT 應(yīng)該都不陌生包蓝,正是因?yàn)橛辛?ADT 驶社,從此我們只需要碼好代碼,然后直接在 Eclipse 上進(jìn)行編譯测萎、運(yùn)行亡电、簽名、打包等一系列流程硅瞧,而這背后的工作都是 ADT 的功勞逊抡。某種意義上 ADT 就是我們的構(gòu)建工具。

而自 Google 推出 Android Studio 以來零酪,就宣布默認(rèn)使用 Gradle 來作為構(gòu)建工具,并且之后放棄更新 ADT 拇勃,從此 Gradle 走入 Android 開發(fā)者的視野四苇,而我也是在 AS 的 Beta 版開始接觸并學(xué)習(xí) Gradle。

一般來說方咆,構(gòu)建工具除了以上提到的編譯月腋、運(yùn)行、簽名瓣赂、打包等榆骚,還具備依賴管理的功能,什么是依賴管理呢煌集?還是拿 Eclipse 來說妓肢,我們以前在 Eclipse 上開發(fā) Android ,如果需要用到第三方庫(kù)的時(shí)候一般都是先下載 jar 文件苫纤,然后把 jar 文件添加到 libs 目錄碉钠,然后項(xiàng)目中就可以引用了。但是你不覺得這種管理方式很麻煩么卷拘?假設(shè)第三方庫(kù)有更新喊废,需要下載最新的 Jar 文件,然后替換掉原來的栗弟,引用的庫(kù)少還好污筷,一旦引用的第三方庫(kù)多,那簡(jiǎn)直麻煩死乍赫,可以說這種方式只有依賴瓣蛀,而沒有管理陆蟆。

現(xiàn)在大家不陌生的 Gradle 引用第三方庫(kù)方式是這樣的:

compile 'com.android.support:support-v4:24.0.1'

類似這樣的依賴方式,是不是很方便揪惦?而且很直觀杉女,直接可以看到源地址,升級(jí)的話直接改下版本號(hào)就可以了业稼,這就是所謂的依賴管理刃跛。

所以構(gòu)建工具就是對(duì)你的項(xiàng)目進(jìn)行編譯、運(yùn)行纫塌、簽名诊县、打包、依賴管理等一系列功能的合集措左,傳統(tǒng)的構(gòu)建工具有 Make依痊、Ant、Maven怎披、Ivy等胸嘁,而 Gradle 是新一代的自動(dòng)化構(gòu)建工具。

3. 什么是 Gradle 凉逛?

上面說了性宏,Gradle 是新一代的自動(dòng)化構(gòu)建工具,它是一個(gè)獨(dú)立的項(xiàng)目状飞,跟 AS毫胜、Android 無關(guān),官方網(wǎng)站:https://gradle.org/, 類似 Ant诬辈、Maven這類構(gòu)建工具都是基于 xml 來進(jìn)行描述的酵使,很臃腫,而 Gradle 采用的是一種叫做 Groovy 的語言焙糟,語法跟 Java 語法很像口渔,但是是一種動(dòng)態(tài)語言,而且在 Java 基礎(chǔ)上做了不少改進(jìn)穿撮,用起來更加簡(jiǎn)潔搓劫、靈活,而且 Gradle 完全兼容 Maven混巧、Ivy枪向,這點(diǎn)基本上宣布了 Maven、Ivy 可以被拋棄了咧党,Gradle 的推出主要以 Java 應(yīng)用為主秘蛔,當(dāng)然目前還支持 Android、C、C++深员。

4. Gradle 與 Android Studio 的關(guān)系

上面也提到负蠕,Gradle 跟 Android Studio 其實(shí)沒有關(guān)系,但是 Gradle 官方還是很看重 Android 開發(fā)的倦畅,Google 在推出 AS 的時(shí)候選中了 Gradle 作為構(gòu)建工具遮糖,為了支持 Gradle 能在 AS 上使用,Google 做了個(gè) AS 的插件叫 Android Gradle Plugin 叠赐,所以我們能在 AS 上使用 Gradle 完全是因?yàn)檫@個(gè)插件的原因欲账。在項(xiàng)目的根目錄有個(gè) build.gradle 文件,里面有這么一句代碼:

classpath 'com.android.tools.build:gradle:2.1.2'

這個(gè)就是依賴 gradle 插件的代碼芭概,后面的版本號(hào)代表的是 android gradle plugin 的版本赛不,而不是 Gradle 的版本,這個(gè)是 Google 定的罢洲,跟 Gradle 官方?jīng)]關(guān)系踢故。關(guān)于 android gradle plugin 的更多信息可以到這里查看,這里列舉了 android gradle plugin 每個(gè)版本的具體變化與具體功能:

http://tools.android.com/tech-docs/new-build-system

友情提示惹苗,需要科學(xué)上網(wǎng)殿较!

5. Gradle Wrapper

現(xiàn)在默認(rèn)新建一個(gè)項(xiàng)目,然后點(diǎn)擊 AS 上的運(yùn)行桩蓉,默認(rèn)就會(huì)直接幫你安裝 Gradle 斜脂,我們不需要額外的安裝 Gradle 了,但是其實(shí)這個(gè) Gradle 不是真正的 Gradle 触机,他叫 Gradle Wrapper ,意為 Gradle 的包裝玷或,什么意思呢儡首?假設(shè)我們本地有多個(gè)項(xiàng)目,一個(gè)是比較老的項(xiàng)目偏友,還用著 Gradle 1.0 的版本蔬胯,一個(gè)是比較新的項(xiàng)目用了 Gradle 2.0 的版本,但是你兩個(gè)項(xiàng)目肯定都想要同時(shí)運(yùn)行的位他,如果你只裝了 Gradle 1.0 的話那肯定不行氛濒,所以為了解決這個(gè)問題,Google 推出了 Gradle Wrapper 的概念鹅髓,就是他在你每個(gè)項(xiàng)目都配置了一個(gè)指定版本的 Gradle 舞竿,你可以理解為每個(gè) Android 項(xiàng)目本地都有一個(gè)小型的 Gradle ,通過這個(gè)每個(gè)項(xiàng)目你可以支持用不同的 Gradle 版本來構(gòu)建項(xiàng)目窿冯。

理解了 Gradle Wrapper 的概念就好辦了骗奖,以下的所有操作都是基于 Gradle Wrapper 的。

默認(rèn)我們?cè)?AS 上第一次創(chuàng)建項(xiàng)目會(huì)自動(dòng)下載 Gradle 的,這個(gè)過程很漫長(zhǎng)执桌,出奇的慢鄙皇,但是第一次之后就ok了,接下來就是教大家用命令行測(cè)試下仰挣,請(qǐng)大家在終端或者 AS 帶的終端上切換到所在項(xiàng)目的目錄伴逸,然后輸入 ./gradlew -v (win用戶直接輸入 gradlew -v) ,即可以查看當(dāng)前項(xiàng)目所用的 gradle 的版本膘壶,gradlew 即為 gradle wrapper 的縮寫错蝴,如果你是第一次執(zhí)行命令行,那么會(huì)出現(xiàn)一個(gè)下載的提示香椎,緊接著會(huì)打印一個(gè)個(gè)的點(diǎn)漱竖,這個(gè)過程很漫長(zhǎng),依賴你的網(wǎng)速畜伐,時(shí)間幾分鐘到幾十分鐘不等馍惹。

有人有疑問,我 AS 上明明已經(jīng)可以正常運(yùn)行該項(xiàng)目的玛界,說明 Gradle 已經(jīng)下載過了万矾,為什么命令行還要再下載一次?我也一直有這個(gè)疑問慎框,理論上是不該再下載的良狈,但是事實(shí)他就是要重新下載一次,我猜測(cè)可能是bug吧笨枯。

如果下載完成輸入 ./gradlew -v 出現(xiàn)如下結(jié)果薪丁,證明你的項(xiàng)目是ok的,否則就是你的項(xiàng)目配置有問題了馅精。

6. Android 項(xiàng)目包含的 Gradle 配置文件

這里姑且以我很早在 GitHub 開源的 9GAG 項(xiàng)目為例严嗜,來稍微介紹下一個(gè)完整的 Android 項(xiàng)目包含的基本 Gradle 相關(guān)的配置文件:

紅色標(biāo)記部分從上到下咱們來一步步分析:

9GAG/app/build.gradle

這個(gè)文件是 app 文件夾下這個(gè) Module 的 gradle 配置文件,也可以算是整個(gè)項(xiàng)目最主要的 gradle 配置文件洲敢,具體里面的配置以后再介紹漫玄。

9GAG/extras/ShimmerAndroid/build.gradle

每一個(gè) Module 都需要有一個(gè) gradle 配置文件,語法都是一樣压彭,唯一不同的是開頭聲明的是

apply plugin: ‘com.android.library’

9GAG/gradle

這個(gè)目錄下有個(gè) wrapper 文件夾睦优,里面可以看到有兩個(gè)文件,我們主要看下 gradle-wrapper.properties 這個(gè)文件的內(nèi)容:

可以看到里面聲明了 gradle 的目錄與下載路徑以及當(dāng)前項(xiàng)目使用的 gradle 版本壮不,這些默認(rèn)的路徑我們一般不會(huì)更改的汗盘,這個(gè)文件里指明的 gradle 版本不對(duì)也是很多導(dǎo)包不成功的原因之一。

9GAG/build.gradle

這個(gè)文件是整個(gè)項(xiàng)目的 gradle 基礎(chǔ)配置文件询一,默認(rèn)的內(nèi)容就是聲明了 android gradle plugin 的版本衡未。

9GAG/settings.gradle

這個(gè)文件是全局的項(xiàng)目配置文件尸执,里面主要聲明一些需要加入 gradle 的 module,我們來看看 9GAG 該文件的內(nèi)容:

7. 如何正確導(dǎo)入下載的開源項(xiàng)目缓醋?

我們經(jīng)常會(huì)在 GitHub 發(fā)現(xiàn)一些優(yōu)秀的開源項(xiàng)目如失,然后想要下載學(xué)習(xí),然而第一步一般都是把源碼導(dǎo)入到 AS 里送粱,然后運(yùn)行起來看下效果褪贵,但是經(jīng)常會(huì)運(yùn)行失敗,這里我來給大家說下導(dǎo)入開源項(xiàng)目的正確姿勢(shì):

下載一個(gè)Demo抗俄,先打開每個(gè) module下的 gradle 文件脆丁,即 app 目錄下的 build.gradle 以及各個(gè) library 下的 build.gradle ,首先查看 compileSdkVersion 和 buildToolsVersion,因?yàn)橛行r(shí)候你本地的版本和下載的版本不一致动雹,那么就會(huì)導(dǎo)致失敗槽卫。

然后就是檢查 gradle-wrapper ,Google 有些時(shí)候要求不同的 AS 支持不同的 gradle 版本胰蝠。比如 AS 1.0 的時(shí)候要求必須使用 gradle 1.x 的版本歼培,等到 AS 2.0 的時(shí)候,Google 不支持 gradle1.x 的版本茸塞,這個(gè)時(shí)候你必須手動(dòng)更新下 android gradle plugin 的版本躲庄,然后重新同步下。

檢查以上兩個(gè)地方基本就可以導(dǎo)入并運(yùn)行了钾虐,如果還有其他問題噪窘,那可能就是環(huán)境或者項(xiàng)目本身的問題了。

8. 認(rèn)識(shí)下幾個(gè)命令

上面提到了效扫,假設(shè)我們沒有 IDE 倔监,只有類似 Sublime、Atom菌仁、Vim這種輕量編輯器怎么辦浩习?那我們就沒法開發(fā) Android 了么?然而只要有構(gòu)建工具掘托,不需要 IDE 我們一樣有辦法開發(fā),這個(gè)時(shí)候我們就需要用到幾個(gè)有用的 Gradle 命令了:

./gradlew -v 版本號(hào)

./gradlew clean 清除9GAG/app目錄下的build文件夾

./gradlew build 檢查依賴并編譯打包

這里注意的是 ./gradlew build 命令把 debug籍嘹、release 環(huán)境的包都打出來闪盔,如果正式發(fā)布只需要打 Release 的包,該怎么辦呢辱士,下面介紹一個(gè)很有用的命令 assemble , 如

./gradlew assembleDebug 編譯并打Debug包

./gradlew assembleRelease 編譯并打Release的包

值得注意的是泪掀,以上所有命令都是在終端里執(zhí)行,并且必須要切換到所在項(xiàng)目的根目錄下執(zhí)行颂碘,win系統(tǒng)直接執(zhí)行 gradlew 异赫。

9. 總結(jié)

以上就是今天給大家普及的 Android 中用到的 Gradle 基礎(chǔ)知識(shí),相信大家看完之后就大概理解了 Android 項(xiàng)目中的 Gradle 作用以及一些基本用法,關(guān)于 Gradle 的具體配置以及更多的介紹以后有時(shí)間再跟大家補(bǔ)充吧塔拳,我在很早的博客里的 AS 系列文章里其實(shí)有寫過幾篇關(guān)于 Gradle 的鼠证,感興趣的不妨看這里去閱讀拓展下:

/devtools/2015/06/17/android-studio-all/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市靠抑,隨后出現(xiàn)的幾起案子量九,更是在濱河造成了極大的恐慌,老刑警劉巖颂碧,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠列,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡载城,警方通過查閱死者的電腦和手機(jī)肌似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诉瓦,“玉大人川队,你說我怎么就攤上這事】寻幔” “怎么了呼寸?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猴贰。 經(jīng)常有香客問我对雪,道長(zhǎng),這世上最難降的妖魔是什么米绕? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任瑟捣,我火速辦了婚禮,結(jié)果婚禮上栅干,老公的妹妹穿的比我還像新娘迈套。我一直安慰自己,他們只是感情好碱鳞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布桑李。 她就那樣靜靜地躺著,像睡著了一般窿给。 火紅的嫁衣襯著肌膚如雪贵白。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天崩泡,我揣著相機(jī)與錄音禁荒,去河邊找鬼。 笑死角撞,一個(gè)胖子當(dāng)著我的面吹牛呛伴,可吹牛的內(nèi)容都是我干的勃痴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼热康,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沛申!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起褐隆,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤污它,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庶弃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衫贬,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年歇攻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了固惯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缴守,死狀恐怖葬毫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屡穗,我是刑警寧澤贴捡,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站村砂,受9級(jí)特大地震影響烂斋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜础废,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一汛骂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧评腺,春花似錦帘瞭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芋绸,卻和暖如春媒殉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侥钳。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工适袜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柄错,地道東北人舷夺。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓苦酱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親给猾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疫萤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • Android Studio正式版早已經(jīng)發(fā)布了,默認(rèn)使用Gradle構(gòu)建敢伸,GitHub上80%的Android項(xiàng)目...
    流哲羽閱讀 2,881評(píng)論 1 13
  • 睡前好事冥想扯饶,該給種子澆水施肥曬太陽了,近期目標(biāo)是20170601以后每月收入一萬塊池颈,我自己增加三個(gè)代理商(合作伙...
    馬忠娟閱讀 140評(píng)論 0 1
  • 我心凄凄我心疼尾序,窗外鶯歌茫失魂。 行至橋斷魂驚處躯砰,忽見湖畔細(xì)蕊生每币。
    布衣知州閱讀 109評(píng)論 0 0
  • 關(guān)于line-height 如何使單行文字、多行文字都能居中 就簡(jiǎn)單的說道這里!如果大家有更好的方法琢歇,也請(qǐng)聯(lián)系我!...
    black白先森閱讀 737評(píng)論 0 0