Gradle for Android第一篇( 從Gradle和AS開(kāi)始 )
正如大家所見(jiàn),這是本英文書(shū),而由于國(guó)內(nèi)的gradle翻譯資料不全,所以特次開(kāi)辟專(zhuān)欄,翻譯gradle for android這本書(shū),同時(shí)添加自己的心得體會(huì)以及在實(shí)際工作上的實(shí)戰(zhàn),希望大家能夠喜歡。
如果你是名Android開(kāi)發(fā)新手,或者是名從eclipse切換到Android studio的新手,那么我強(qiáng)烈建議您follow我的文章,正如封面所見(jiàn),利用gradle構(gòu)建工具來(lái)自動(dòng)構(gòu)建你的Android項(xiàng)目。廢話(huà)不多說(shuō),我們直接開(kāi)始吧。
今天主要介紹Android studio工具的使用,以及cradle基礎(chǔ)入門(mén),使用cradle wrapper和如何從eclipse遷移到Android studio。
這篇文章記于2015.12.30,Android studio正式版本已經(jīng)開(kāi)發(fā)到1.5,而預(yù)覽版已經(jīng)到了2.0,所以轉(zhuǎn)到Android studio吧。
當(dāng)你第一次打開(kāi)Android studio的時(shí)候,有一個(gè)視圖顯示你即將創(chuàng)建的環(huán)境以及確保你使用了最新的Android SDK和必要的google依賴(lài)包,同時(shí)會(huì)讓你選擇是否創(chuàng)建AVD,這樣你就可以使用模擬器了。在這兒多說(shuō)幾句:
- 盡量使用Android studio 2.0,因?yàn)樗娴淖兛炝?,而其模擬器的速度也提升了不少,我使用至今,也無(wú)發(fā)現(xiàn)任何bug,所以完全不用擔(dān)心。
- 如果使用模擬器開(kāi)發(fā)Android,盡量使用Genymotion模擬器,盡管其現(xiàn)在的Android6.0仍然有很多bug,但是在其以下版本,其速度還是非??斓?,利用模擬器開(kāi)發(fā),為虛擬機(jī)安裝文件夾瀏覽器,是及時(shí)查看SQLite表文件利器,具體操作辦法,可以google。
- 盡量使用最新的23.0.0以上的構(gòu)建版本。
理解基本的Gradle
如果你想創(chuàng)建一個(gè)Android project基于gradle,那么你必須寫(xiě)一個(gè)構(gòu)建腳本,這個(gè)文件通常稱(chēng)之為build.grade,你可能已經(jīng)覺(jué)察到了,當(dāng)我們查看這一腳本,gradle會(huì)為我們提供很多默認(rèn)的配置以及通常的默認(rèn)值,而這極大的簡(jiǎn)化了我們的工作,例如ant和maven,使用他們的時(shí)候,我們需要編寫(xiě)大量的配置文件,而這很惡心。而gradle得默認(rèn)配置,如果你需要使用自己的配置,完全可以簡(jiǎn)單的去重寫(xiě)他們就好。
Gradle腳本不是像傳統(tǒng)的xml文件那樣,而是一種基于Groovy的動(dòng)態(tài)DSL,而Groovy語(yǔ)言是一種基于jvm的動(dòng)態(tài)語(yǔ)言。
你完全不用擔(dān)心,你在使用gradle的時(shí)候,還需要去學(xué)習(xí)Groovy語(yǔ)言,該語(yǔ)言很容易閱讀,并且如果你已經(jīng)學(xué)習(xí)過(guò)java的話(huà),學(xué)習(xí)Groovy將不會(huì)是難事,如果你想開(kāi)始創(chuàng)建自己的tasks和插件,那么你最好對(duì)Groovy有一個(gè)較深的理解,然而由于其基于jvm,所以你完全可能通過(guò)純正的java代碼或者其他任何基于jvm的語(yǔ)言去開(kāi)發(fā)你自己的插件,關(guān)于插件開(kāi)發(fā),我們后續(xù)將會(huì)有相關(guān)介紹。
Project和tasks
在grade中的兩大重要的概念,分別是project和tasks。每一次構(gòu)建都是有至少一個(gè)project來(lái)完成,所以Android studio中的project和Gradle中的project不是一個(gè)概念。每個(gè)project有至少一個(gè)tasks。每一個(gè)build.grade文件代表著一個(gè)project。tasks在build.gradle中定義。當(dāng)初始化構(gòu)建進(jìn)程,gradle會(huì)基于build文件,集合所有的project和tasks,一個(gè)tasks包含了一系列動(dòng)作,然后它們將會(huì)按照順序執(zhí)行,一個(gè)動(dòng)作就是一段被執(zhí)行的代碼,很像Java中的方法。
構(gòu)建的生命周期
一旦一個(gè)tasks被執(zhí)行,那么它不會(huì)再次執(zhí)行了,不包含依賴(lài)的Tasks總是優(yōu)先執(zhí)行,一次構(gòu)建將會(huì)經(jīng)歷下列三個(gè)階段:
- 初始化階段:project實(shí)例在這兒創(chuàng)建,如果有多個(gè)模塊,即有多個(gè)build.gradle文件,多個(gè)project將會(huì)被創(chuàng)建。
- 配置階段:在該階段,build.gradle腳本將會(huì)執(zhí)行,為每個(gè)project創(chuàng)建和配置所有的tasks。
- 執(zhí)行階段:這一階段,gradle會(huì)決定哪一個(gè)tasks會(huì)被執(zhí)行,哪一個(gè)tasks會(huì)被執(zhí)行完全依賴(lài)開(kāi)始構(gòu)建時(shí)傳入的參數(shù)和當(dāng)前所在的文件夾位置有關(guān)。
build.gradle的配置文件
基于grade構(gòu)建的項(xiàng)目通常至少有一個(gè)build.gradle,那么我們來(lái)看看Android的build.gradle:
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
- }
- }
這個(gè)就是實(shí)際構(gòu)建開(kāi)始的地方,在倉(cāng)庫(kù)地址中,我們使用了JCenter,JCenter類(lèi)似maven庫(kù),不需要任何額外的配置,grade還支持其他幾個(gè)倉(cāng)庫(kù),不論是遠(yuǎn)程還是本地倉(cāng)庫(kù)。
構(gòu)建腳本也定義了一個(gè)Android構(gòu)建工具,這個(gè)就是Android plugin的來(lái)源之處。Android plugin提供了所有需要去構(gòu)建和測(cè)試的應(yīng)用。每個(gè)Android應(yīng)用都需要這么一個(gè)插件:
- apply plugin: 'com.android.application'
插件用于擴(kuò)展gradle腳本的能力,在一個(gè)項(xiàng)目中使用插件,這樣該項(xiàng)目的構(gòu)建腳本就可以定義該插件定義好的屬性和使用它的tasks。
注意:當(dāng)你在開(kāi)發(fā)一個(gè)依賴(lài)庫(kù),那么你應(yīng)該使用’com.android.library’,并且你不能同時(shí)使用他們2個(gè),這將導(dǎo)致構(gòu)建失敗,一個(gè)模塊要么使用Android application或者Android library插件,而不是二者。
當(dāng)使用Android 插件的時(shí)候,Android標(biāo)簽將可以被使用,如下所示:
- android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
- }
更多的屬性我們將在第二章中進(jìn)行討論。
項(xiàng)目結(jié)構(gòu)
和eclipse對(duì)比來(lái)看,Android studio構(gòu)建的結(jié)構(gòu)有很大的不同:
- MyApp
- ├── build.gradle
- ├── settings.gradle
- └── app
- ├── build.gradle
- ├── build
- ├── libs
- └── src
- └── main
- ├── java
- │ └── com.package.myapp
- └── res
- ├── drawable
- ├── layout
- └── etc.
grade項(xiàng)目通常在根文件夾中包含一個(gè)build.gradle,使用的代碼在app這個(gè)文件夾中,這個(gè)文件夾也可以使用其他名字,而不必要定義為app,例如當(dāng)你利用Android studio創(chuàng)建一個(gè)project針對(duì)一個(gè)手機(jī)應(yīng)用和一個(gè)Android wear應(yīng)用的時(shí)候,模塊將被默認(rèn)叫做application和wearable。
gradle使用了一個(gè)叫做source set的概念,官方解釋?zhuān)阂粋€(gè)source set就是一系列資源文件,其將會(huì)被編譯和執(zhí)行。對(duì)于Android項(xiàng)目,main就是一個(gè)source set,其包含了所有的資源代碼。當(dāng)你開(kāi)始編寫(xiě)測(cè)試用例的時(shí)候,你一般會(huì)把代碼放在一個(gè)單獨(dú)的source set,叫做androidTest,這個(gè)文件夾只包含測(cè)試。
開(kāi)始使用Gradle Wrapper
grade只是一個(gè)構(gòu)建工具,而新版本總是在更迭,所以使用Gradle Wrapper將會(huì)是一個(gè)好的選擇去避免由于gradle版本更新導(dǎo)致的問(wèn)題。Gradle Wrapper提供了一個(gè)windows的batch文件和其他系統(tǒng)的shell文件,當(dāng)你使用這些腳本的時(shí)候,當(dāng)前gradle版本將會(huì)被下載,并且會(huì)被自動(dòng)用在項(xiàng)目的構(gòu)建,所以每個(gè)開(kāi)發(fā)者在構(gòu)建自己app的時(shí)候只需要使用Wrapper。所以開(kāi)發(fā)者不需要為你的電腦安裝任何gradle版本,在mac上你只需要運(yùn)行g(shù)radlew,而在windows上你只需要運(yùn)行g(shù)radlew.bat。
你也可以利用命令行./gradlew -v來(lái)查看當(dāng)前gradle版本。下列是wrapper的文件夾:
- myapp/
- ├── gradlew
- ├── gradlew.bat
- └── gradle/wrapper/
- ├── gradle-wrapper.jar
- └── gradle-wrapper.properties
可以看到一個(gè)bat文件針對(duì)windows系統(tǒng),一個(gè)shell腳本針對(duì)mac系統(tǒng),一個(gè)jar文件,一個(gè)配置文件。配置文件包含以下信息:
- #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
你可以改變?cè)搖rl來(lái)改變你的gradle版本。
使用基本的構(gòu)建命令
使用你的命令行,導(dǎo)航到你的項(xiàng)目,然后輸入:
- $ gradlew tasks
這一命令將會(huì)列出所以可運(yùn)行的tasks,你也可以添加–all參數(shù),來(lái)查看所有的task。當(dāng)你在開(kāi)發(fā)的時(shí)候,構(gòu)建項(xiàng)目,你需要運(yùn)行assemble task通過(guò)debug配置:
- $ gradlew assembleDebug
該任務(wù)將會(huì)創(chuàng)建一個(gè)debug版本的app,同時(shí)Android插件會(huì)將其保存在MyApp/app/build/ outputs/apk目錄下。
除了assemble,還有三個(gè)基本的命令:
- check 運(yùn)行所以的checks,這意味著運(yùn)行所有的tests在已連的設(shè)備或模擬器上。
- build 是check和assemble的集合體。
- clean 清楚項(xiàng)目的output文件。
保持舊的eclipse文件結(jié)構(gòu)
關(guān)于如何將eclipse項(xiàng)目導(dǎo)入Android studio本文不再介紹。
- android {
- sourceSets {
- main {
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src']
- resources.srcDirs = ['src']
- aidl.srcDirs = ['src']
- renderscript.srcDirs = ['src']
- res.srcDirs = ['res']
- assets.srcDirs = ['assets']
- }
- androidTest.setRoot('tests')
- }
- }
在grade文件中配置,將會(huì)保存eclipse目錄結(jié)構(gòu),當(dāng)然,如果你有任何依賴(lài)的jar包,你需要告訴gradle它在哪兒,假設(shè)jar包會(huì)在一個(gè)叫做libs的文件夾內(nèi),那么你應(yīng)該這么配置:
- dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- }
該行意為:將libs文件夾中所有的jar文件視為依賴(lài)包。
總結(jié)
通過(guò)本文,我們可以學(xué)習(xí)到gradle的優(yōu)勢(shì),以及為什么要使用gradle,我們簡(jiǎn)單的看了看Android studio,以及其是如何幫助我們生成build文件。
同時(shí)我們學(xué)習(xí)了Gradle Wrapper,其讓我們維護(hù)以及分享項(xiàng)目變得更加簡(jiǎn)單,我們知道了如何創(chuàng)建一個(gè)新的項(xiàng)目在Android studio中,以及如何從eclispe遷移到Android studio并且保持目錄結(jié)構(gòu)。
同時(shí)我們學(xué)習(xí)了最基本的gradle task和命令行命令。在下一篇文章中,我們將會(huì)定制自己的build文件。