Gradle for Android(一) 使用Gradle和Android Studio

Google引入Gradle和Android Studio時峦剔,希望更容易的去重用代碼芥颈、創(chuàng)建構(gòu)造變體和配置惠勒、自定義構(gòu)造過程。除此之外爬坑,他們想要好的IDE集成纠屋,但是又不想讓構(gòu)建系統(tǒng)依賴IDE。使用命令行盾计,或者在持續(xù)集成的服務(wù)器上運(yùn)行Gradle售担,將和在Android Studio中運(yùn)行Gradle得到同樣的結(jié)果。

在本書中署辉,我們會偶爾涉及到Android Studio族铆,因為它提供了一個簡單的途徑來配置工程、處理變更等等哭尝。如果你還沒有安裝Android Studio哥攘,你可以在http://developer.android.com/sdk/index.html下載

本章將涵蓋以下內(nèi)容:

  • 初識Android Studio
  • 了解Gradle基礎(chǔ)
  • 創(chuàng)建一個新工程
  • 開始使用Gradle Wrapper
  • 遷移Eclipse工程(略過)

Adroid Studio

Google在2013年5月發(fā)布了Android Studio的早期預(yù)覽版,支持Gradle材鹦。Android Studio以JetBrains公司的IntelliJ IDEA為基礎(chǔ)逝淹,在設(shè)計上包含了Android獨(dú)特的風(fēng)格。它是免費(fèi)的桶唐,支持Linux栅葡、Mac OS X和Windows系統(tǒng)。

相對于Eclipse尤泽,Android Studio擁有改進(jìn)的UI設(shè)計欣簇,更好的內(nèi)存監(jiān)控,更友好的編輯器坯约,對Android特有的一些問題發(fā)出警告熊咽,以及其他許多針對Android開發(fā)者的特征。除IntelliJ IDEA已有的工程視圖和包視圖闹丐,它有獨(dú)特的針對Android工程的工程結(jié)構(gòu)視圖网棍。這個獨(dú)特的視圖使用一種便捷的方式對Gradle腳本、drawables和其他資源進(jìn)行分組妇智。Android Studio v1.0穩(wěn)定版甫一發(fā)布滥玷,Google就停止了對ADT的支持,推薦開發(fā)者們切換到Adroid Studio巍棱。這意味著Goole將再也不會為Eclipse提供新特性惑畴,并且所有的IDE相關(guān)的工具開發(fā)將集中在Android Studio身上。如果你還在使用Eclipse航徙,是時候去更換開發(fā)工具了如贷。

更新

Android Studio有四個更新渠道:

  • Canary是最前沿的更新渠道,但可能有bug
  • Dev或多或少每月一更新
  • Beta功能完全更新到踏,但可能有bug
  • Stable是默認(rèn)的渠道杠袱,新特性經(jīng)過了完全的測試,很少有bug

默認(rèn)Android Studio每次啟動都會檢查更新窝稿,若有更新會及時通知你楣富。

在你第一次啟動Android Studio的時候,它會引導(dǎo)你設(shè)置環(huán)境變量伴榔,確保你有最新的Android SDK和必要的Google repositories纹蝴。它還會讓你選擇去創(chuàng)建一個模擬器,以便運(yùn)行你的應(yīng)用踪少。

了解Gradle基礎(chǔ)

為了使Android工程能夠使用Gradle進(jìn)行構(gòu)建塘安,你需要配置構(gòu)建腳本。腳本名稱必須是build.gradle援奢,這是約定俗成的兼犯。在我們學(xué)習(xí)基礎(chǔ)的時候,你會注意到一件事情集漾,Gradle在配置上更傾向于約定切黔,通常會為設(shè)置和屬性提供默認(rèn)值。這就使得我們可以使用更少的配置來開發(fā)項目帆竹,相對于Ant或者M(jìn)aven系統(tǒng)要更加簡單绕娘。我們不必絕對遵守這些約定俗成的東西,因為在需要的時候它們可以被覆寫栽连。

Gradle腳本語言并非使用傳統(tǒng)的XML险领,而是使用了基于Groovy的domain-specific language(DSL),一種運(yùn)行在JVM上的動態(tài)語言秒紧。Gradle團(tuán)隊認(rèn)為使用基于動態(tài)語言的绢陌、聲明式的、DSL風(fēng)格的方式熔恢,比Ant使用的更加程式化脐湾、自由浮動的風(fēng)格,或者很多其他構(gòu)建系統(tǒng)使用的基于XML的方式具有更大的優(yōu)勢叙淌。

這并不意味著在開始你的構(gòu)建腳本之前秤掌,你需要先去了解Groovy愁铺。它很容易閱讀,并且如果你已經(jīng)會使用Java闻鉴,學(xué)習(xí)起來將得心應(yīng)手茵乱。如果你想去創(chuàng)建你自己的任務(wù)和插件(我們會在后續(xù)的章節(jié)討論),你最好對Groovy有個深入的理解孟岛。不管怎樣瓶竭,因為它是基于JVM的,你可以使用Java或其他任何基于JVM的語言去寫你自己的插件渠羞。

工程和任務(wù)

projecttask是Gradle中兩個最重要的概念斤贰。每個構(gòu)建由至少一個project組成,每個project包含一個或多個tasks次询。每個build.gradle文件代表一個project荧恍,tasks聲明在構(gòu)建腳本中。初始化構(gòu)建過程時渗蟹,Gradle基于構(gòu)建文件收集(assembles)ProjectTask對象块饺。一個Task對象由一系列的Action對象構(gòu)成,它們將順序執(zhí)行雌芽。一個Action對象是一個代碼塊授艰,類似Java中的方法。

構(gòu)建的生命周期

以最簡單的方式來看世落,Gradle構(gòu)建的執(zhí)行過程就是執(zhí)行task的actions淮腾,這個task又依賴于其他的task。為了簡化構(gòu)建過程屉佳,構(gòu)建工具會創(chuàng)建一個工作流的動態(tài)模型谷朝,就像一個有向無循環(huán)圖。這意味著所有的task將會一個接一個執(zhí)行武花,并且不會循環(huán)圆凰。一旦一個task被執(zhí)行,它不會再次被執(zhí)行体箕。沒有依賴的task先于其他task執(zhí)行专钉。依賴圖在構(gòu)建的配置期生成。一個Gradle構(gòu)建有3個時期:

  • Initialization:創(chuàng)建Project實例累铅。如果有多個module跃须,每個都有自己的build.gradle文件,那么將會創(chuàng)建多個Project娃兽。
  • Configuration:執(zhí)行構(gòu)建腳本菇民,為每一個Project對象創(chuàng)建和配置所有的tasks。
  • Execution:Gradle將決定哪些tasks被執(zhí)行。哪些任務(wù)被執(zhí)行取決于啟動構(gòu)建時傳入的參數(shù)以及當(dāng)前所在目錄第练。

構(gòu)建配置文件(build.gradle)

為使Gradle能夠構(gòu)建工程阔馋,必須要有一個build.gradle文件。該文件只有很少的必需元素:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}

這里將為最終的構(gòu)建進(jìn)行配置复旬。在repositories塊中為構(gòu)建腳本配置了JCenter倉庫作為一個依賴源垦缅。JCenter是一個預(yù)置的Maven倉庫,不需要額外的配置驹碍,Gradle已經(jīng)為你配置好了。Gradle有幾個倉庫可以直接使用凡恍,而且添加你自己的倉庫也非常簡單志秃,不管是本地的還是遠(yuǎn)程的。

構(gòu)建腳本塊同時定義了一個Android構(gòu)建工具的依賴嚼酝,有了它就可以使用Android插件了浮还。Android插件提供構(gòu)建和測試應(yīng)用的所有東西。每一個Android工程需要引入以下代碼來使用Android插件:

apply plugin 'com.android.application'

插件用來擴(kuò)展Gradle構(gòu)建腳本的能力闽巩。在工程中應(yīng)用插件钧舌,可以使構(gòu)建腳本使用在插件中聲明的屬性和任務(wù)。

如果你正在構(gòu)建一個library涎跨,你需要引用:

apply plugin 'com.android.library'

你不可以在一個工程中同時引用這兩個插件洼冻,否則會導(dǎo)致構(gòu)建錯誤。一個module只能是Android application或者Android library之一隅很。

在使用Android插件時撞牢,會配置Android特有的規(guī)則,創(chuàng)建只適用于Android的tasks叔营。在下面的代碼片段中屋彪,android塊可以被聲明和配置:

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
}

構(gòu)建腳本中的Android特有的部分在這里配置。Android插件提供了一個為Android定制的DSL绒尊。需要提供的必需屬性只有compileSdkVersionbuildToolsVersion畜挥。

build.gradle還有很多可定制的屬性。我們將在第2張討論最重要的屬性婴谱。

工程結(jié)構(gòu)

與Eclipse工程相比蟹但,文件夾結(jié)構(gòu)發(fā)生了很大改變。就像前面提到的勘究,Gradle在配置上傾向于約定俗成矮湘,這也體現(xiàn)在文件夾結(jié)構(gòu)上。

下面是Gradle期望的文件夾結(jié)構(gòu):

MyApp
├── build.gradle
├── settings.gradle
└── app
    ├── build.gradle
    ├── build
    ├── libs
    └── src
        └── main
            ├── java
            │   └── com.package.myapp
            └── res
                ├── drawable
                ├── layout
                └── etc.

Gradle工程通常在根節(jié)點有一個額外的級別口糕。這使得以后添加其他模塊變得簡單缅阳。所有應(yīng)用的源代碼放在app文件夾下。這個文件夾也是默認(rèn)的模塊的名稱。默認(rèn)的模塊并非一定要命名為app十办。舉個例子秀撇,如果你使用Android Studio創(chuàng)建一個同時包含mobile app和Android Wear smartwatch app的工程時,模塊名稱默認(rèn)分別是application和wearable向族。

Gradle使用了source set的概念呵燕。Gradle的官方文檔將source set解釋為“一個可以同時被編譯和執(zhí)行的,包含源文件的集合”件相。對于一個Android工程再扭,main是默認(rèn)的app模塊的source set,包含全部源代碼和資源夜矗。在你開始為Android app寫測試代碼的時候泛范,你將會把所有的測試代碼寫到一個單獨(dú)的稱為androidTest的source set中。

下面是Android app中最重要的文件夾的一個綜述:

目錄 描述
/src/main/java app源代碼
/scr/main/res app相關(guān)的資源紊撕,如drawables罢荡、layouts、strings等
/libs 外部庫对扶,如.jar文件或者.arr文件
/build 構(gòu)建過程的輸出目錄

創(chuàng)建一個新工程

講述如何使用Android Studio開始一個新工程区赵,本節(jié)略過。

使用Gradle Wrapper

Gradle是一個不斷開發(fā)的工具浪南,新的版本可能會打破向后兼容性笼才。使用Gradle Wrapper是避免問題的好方法,并確保構(gòu)建是可復(fù)制的逞泄。

Gradle Wrapper在Windows系統(tǒng)中提供了一個批處理文件患整,在其他操作系統(tǒng)中提供了一個shell腳本。在你運(yùn)行腳本的時候喷众,所需的Gradle版本會被下載下來(如果還未下載的話)各谚,并自動用于構(gòu)建。其背后的思想是每個需要構(gòu)建app的開發(fā)者或者自動構(gòu)建系統(tǒng)只需要運(yùn)行wrapper就可以了到千,剩下的工作wrapper會處理昌渤。這樣在開發(fā)者的機(jī)器或者構(gòu)建服務(wù)器上就不必手動安裝相應(yīng)版本的Gradle。所以憔四,我們建議將wrapper添加到你的版本控制系統(tǒng)中膀息。

運(yùn)行Gradle Wrapper和直接運(yùn)行Gradle沒有太大的差別。你只需要在Linux和Mac OS X上運(yùn)行gradlew了赵,在Windows系統(tǒng)上運(yùn)行gradlew.bat潜支,來替代gradle命令

獲取Gradle Wrapper

為了方便,每一個新建的Android工程都包含Gradle Wrapper柿汛,所以當(dāng)你新建一個工程的時候冗酿,你根本不需要去做任何事情來獲取所需的文件。當(dāng)然了,你也可以在你的電腦上手動安裝Gradle裁替,并在工程中使用它项玛,但Gradle Wrapper可以做同樣的事情,并保證使用正確版本的Gradle弱判。即使在Android Studio之外使用Gralde襟沮,也沒有理由不去使用Wrapper。

你可以切換到工程目錄下昌腰,在終端(Linux开伏、Mac OS X)運(yùn)行./gradlew -v或者在命令行(Windows)運(yùn)行gradlw.bat -v來檢查Gradle Wrapper是否可用。運(yùn)行這個命令會顯示你的Gradle版本和一些關(guān)于你的配置的信息遭商。如果你在轉(zhuǎn)換一個Eclipse工程硅则,默認(rèn)Wrapper是不可用的。這種情況下株婴,你可以使用Gradle來生成它,但前提是你要安裝Gradle暑认。

在你下載并將Gradle添加到環(huán)境變量之后困介,可以用下面代碼創(chuàng)建一個build.gralde文件:

task wrapper(type: Wrapper) {
    gradleVersion = '2.4'
}

接下來運(yùn)行gradle wrapper來生成Wrapper文件。

在最近的Gradle版本中蘸际,默認(rèn)包含這個任務(wù)座哩。你可以使用--gradle-version參數(shù)來指定版本:

$ gradle wrapper --gradle-version 2.4

如果你不指定版本號,將使用task所運(yùn)行的Gradle版本來配置warpper粮彤。

下面是wrapper task所生成的所有文件:

myapp/
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
    ├── gradle-wrapper.jar
    └── gradle-wrapper.properties

可以看到芋肠,Gradle Wrapper由三部分組成:

  • 一個Windows上的批處理文件或者Linux/Mac OS X上的shell腳本
  • 一個批處理文件或者shell腳本使用的JAR包
  • 一個properties文件

gradle-wrapper.properties文件包含配置信息荡碾,并決定Gradle版本:

#Sat May 30 17:41:49 CEST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

你可以修改distributionUrl來自定義Gradle地址。這意味著你使用的每個app或者library可以使用不同的Gradle地址,所以在運(yùn)行wrapper之前一定要確認(rèn)這些屬性是否安全原在。

在工程所使用的Gradle不是最新的時候,Android Studio會友好的顯示一個通知钥勋,并建議是否自動升級到最新版本惭适。Android Studio會修改gradle-wrapper.properties文件的配置,并觸發(fā)一次構(gòu)建递递,這樣最新版本就會下載下來喷橙。

運(yùn)行基本的構(gòu)建任務(wù)

切換到工程目錄,在終端或者命令行運(yùn)行tasks命令:

$ gradlew tasks

這會打印出所有可用的任務(wù)登舞。加上--all參數(shù)贰逾,會顯示更詳細(xì)的任務(wù)之間的依賴關(guān)系。

在Windows系統(tǒng)菠秒,你需要運(yùn)行gradlew.bat疙剑;在Linux/Mac OS X系統(tǒng),你需要運(yùn)行./gradlew,為了簡潔核芽,本書只寫gradlew

當(dāng)你在開發(fā)時去構(gòu)建工程囚戚,使用debug配置去運(yùn)行assemble任務(wù):

$ gradlew assembleDebug

這個任務(wù)會創(chuàng)建一個debug版本的APK。Android插件默認(rèn)將APK保存在MyApp/app/build/outputs/apk目錄轧简。

簡短的任務(wù)名稱
為了避免在終端輸入過多字符驰坊,Gradle提供了簡短的駝峰式任務(wù)名稱作為快捷方式。比如哮独,你可以輸入gradlew assDeb來執(zhí)行assembleDebug拳芙,甚至輸入gradlew aD
需要注意的是皮璧,只有當(dāng)駝峰式表示法唯一的時候才可以這樣寫舟扎。如果其他的任務(wù)有相同的簡寫,這樣書寫方式將不會工作悴务。

除了assemble睹限,還有另外3個基本任務(wù):

  • check運(yùn)行所有的任務(wù),通常用來在真機(jī)或者模擬器上進(jìn)行測試讯檐。
  • build運(yùn)行assemblecheck
  • clean清理工程的output

我們將在第二章詳細(xì)討論這些任務(wù)羡疗。

從Eclipse遷移

本節(jié)略過

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市别洪,隨后出現(xiàn)的幾起案子叨恨,更是在濱河造成了極大的恐慌,老刑警劉巖挖垛,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒钝,死亡現(xiàn)場離奇詭異,居然都是意外死亡痢毒,警方通過查閱死者的電腦和手機(jī)送矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闸准,“玉大人益愈,你說我怎么就攤上這事∫募遥” “怎么了蒸其?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長库快。 經(jīng)常有香客問我摸袁,道長,這世上最難降的妖魔是什么义屏? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任靠汁,我火速辦了婚禮蜂大,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝶怔。我一直安慰自己奶浦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布踢星。 她就那樣靜靜地躺著澳叉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沐悦。 梳的紋絲不亂的頭發(fā)上成洗,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音藏否,去河邊找鬼瓶殃。 笑死,一個胖子當(dāng)著我的面吹牛副签,可吹牛的內(nèi)容都是我干的遥椿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼淆储,長吁一口氣:“原來是場噩夢啊……” “哼修壕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遏考,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓝谨,沒想到半個月后灌具,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡譬巫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年咖楣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芦昔。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡诱贿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咕缎,到底是詐尸還是另有隱情珠十,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布凭豪,位于F島的核電站焙蹭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嫂伞。R本人自食惡果不足惜孔厉,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一拯钻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撰豺,春花似錦粪般、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寡润,卻和暖如春捆憎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梭纹。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工躲惰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人变抽。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓础拨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绍载。 傳聞我的和親對象是個殘疾皇子诡宗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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