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ù)
project和task是Gradle中兩個最重要的概念斤贰。每個構(gòu)建由至少一個project組成,每個project包含一個或多個tasks次询。每個build.gradle
文件代表一個project荧恍,tasks聲明在構(gòu)建腳本中。初始化構(gòu)建過程時渗蟹,Gradle基于構(gòu)建文件收集(assembles)Project
和Task
對象块饺。一個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绒尊。需要提供的必需屬性只有compileSdkVersion
和buildToolsVersion
畜挥。
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)行
assemble
和check
- clean清理工程的output
我們將在第二章詳細(xì)討論這些任務(wù)羡疗。
從Eclipse遷移
本節(jié)略過