使用Gradle構(gòu)建Android程序

Android Studio正式版早已經(jīng)發(fā)布了,默認使用Gradle構(gòu)建恬砂,GitHub上80%的Android項目也都是使用Gradle構(gòu)建的蛤铜,我們還有什么理由不使用Gradle呢嘹叫?

環(huán)境要求

JDK下載地址

Android SDK下載地址

Gradle下載地址1下載地址2

給一個國內(nèi)的下載地址:AndroidDevTools

開始(改造Eclipse項目)

eclipse可以直接用adt導出為gradle項目婆殿,android studio直接創(chuàng)建gradle項目。但是罩扇,我們還是有必要了解下手動改造婆芦,這讓我們更清楚每個文件的作用。

獨立項目構(gòu)建

在我的另一篇博客Gradle插件用戶指南(譯)中暮蹂,3.1節(jié)可以看到寞缝,

一個最簡單的build.gradle文件是這樣的:

buildscript{

repositories{

jcenter()

}

dependencies{

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

}

}

apply plugin:'com.android.application'

android{

compileSdkVersion19

buildToolsVersion"22.0.1"

}

這里,要求項目目錄結(jié)構(gòu)是gradle的默認目錄:

project-root

|-src

|-main

|-java

|-res

|-drawable

|-layout

|-values

|-AndroidManifest.xml

如果是eclipse下的項目仰泻,需要配置下項目目錄荆陆,修改后的build.gradle文件是這樣的:

buildscript{

repositories{

jcenter()

}

dependencies{

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

}

}

apply plugin:'com.android.application'

android{

compileSdkVersion19

buildToolsVersion"22.0.1"

sourceSets{

main{

manifest.srcFile'AndroidManifest.xml'

java.srcDirs=['src']

aidl.srcDirs=['src']

renderscript.srcDirs=['src']

res.srcDirs=['res']

assets.srcDirs=['assets']

jniLibs.srcDirs=['libs']

}

}

dependencies{

compile fileTree(dir:'libs',include:['*.jar'])

}

}

與前面的build.gradle相比,只增加了sourceSets{...}塊集侯,在里面指定了對應的文件目錄被啼。

把這個build.gradle拷貝到項目根目錄下,就可以使用gradle來構(gòu)建你的app了棠枉。

打開終端/命令行浓体,切換到項目根目錄,運行g(shù)radle assemble辈讶,在main-project/build/outputs/apk下就可以看到生成的apk文件

Note:

要注意原項目的依賴命浴,比如 ApiDemos ,是依賴support-v4的,要添加到dependencies中生闲。

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

多項目構(gòu)建

如果程序是由多個子工程構(gòu)成的話媳溺,上面的build.gradle文件就不夠用了。

假設(shè)你的項目目錄是這樣的

root

|-main-project

|-library-project1

|-library-project2

并且碍讯,依賴關(guān)系如下:

main-project->library-project1

library-project1->library-project2

那么悬蔽,Gradle構(gòu)建文件應該包含以下幾個文件:

settings.gradle

build.gradle

main-project/build.gradle

library-project1/build.gradle

library-project2/build.gradle

文件位置是這樣:

root

|-main-project

|-...

|-build.gradle

|-library-project1

|-...

|-build.gradle

|-library-project2

|-...

|-build.gradle

|-build.gradle

|-settings.gradle

文件內(nèi)容如下:

settings.gradle:

include':main-project','library-project1','library-project2'

settings.gradle聲明了程序包含的子項目,如果子項目時包含在三級子目錄下捉兴,例如root/library/library-project1蝎困,那么聲明是這樣的:

':library:library-project1'

build.gradle:

buildscript{

repositories{

jcenter()

}

dependencies{

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

}

}

根目錄下的buidle.gradle聲明了項目的編譯環(huán)境,指定了Android Gradle插件的版本倍啥。和上一個章節(jié)禾乘,那個單一的build.gradle的前半部分內(nèi)容是一樣的。

main-project/build.gradle:

apply plugin:'com.android.application'

android{

compileSdkVersion19

buildToolsVersion"22.0.1"

sourceSets{

main{

manifest.srcFile'AndroidManifest.xml'

java.srcDirs=['src']

aidl.srcDirs=['src']

renderscript.srcDirs=['src']

res.srcDirs=['res']

assets.srcDirs=['assets']

jniLibs.srcDirs=['libs']

}

}

dependencies{

compile fileTree(dir:'libs',include:['*.jar'])

compile project(':library-project1')

}

}

這個build.gradle的內(nèi)容與上一章節(jié)build.gradle的后半部分基本一致逗栽,只是多了一個庫項目依賴的聲明盖袭。

這里假設(shè)目錄結(jié)構(gòu)和eclipse下的android項目目錄結(jié)構(gòu)是一樣的失暂,如果實際目錄和gradle的默認目錄結(jié)構(gòu)一樣彼宠,可以去掉sourceSets{...}部分

library-project1/build.gradle和main-project/build.gradle基本一致,只有兩個地方不一樣弟塞。

apply plugin: 'com.android.application'改成apply plugin: 'com.android.library'

compile project(':library-project1')改成compile project(':library-project2')

library-project1/build.gradle和library-project2/build.gradle基本一致凭峡,只有一個地方不一樣。

去掉compile project(':library-project2')

至此决记,多項目的工程完成了gradle改造摧冀,可以在項目根目錄下運行g(shù)radle assemble進行構(gòu)建了。

構(gòu)建的其他細節(jié)系宫,請參考我的另一篇博客Gradle插件用戶指南(譯)索昂。

gradle wrapper

和Eclipse導出或者Android Studio創(chuàng)建的項目相比,我們改造完的項目還差了幾個文件扩借。

在項目根目錄下椒惨,運行終端命令gradle wrapper,就會生成下面幾個文件:

project-root

|-gradle

|-wrapper

|-gradle-wrapper.jar

|-gradle-wrapper.properties

|-gradlew

|-gradlew.bat

gradlew,gradlew.bat是支持多平臺的gradle運行命令潮罪,通過gradlew康谆,可以執(zhí)行g(shù)radle構(gòu)建任務,例如:

./gradlew assemble

如果運行時嫉到,發(fā)現(xiàn)系統(tǒng)沒有對應版本的gradle沃暗,會通過gradle-wrapper.jar下載gradle-wrapper.properties中指定的gradle版本。這樣的話何恶,

任何人獲取代碼后孽锥,不用安裝gradle,就可以構(gòu)建工程细层。

gradle-wrapper.properties文件中指定的版本惜辑,就是運行g(shù)radle wrapper命令時的gradle版本隔崎。

當然,也可以手動指定別的版本韵丑,在根目錄下build.gradle文件中添加:

task wrapper(type:Wrapper){

gradleVersion='2.3'

}

再運行g(shù)radle wrapper爵卒。

使用Android Studio

Android Studio創(chuàng)建的項目默認使用Gradle構(gòu)建,并且目錄結(jié)構(gòu)也是Gradle默認的撵彻。

使用Android Studio 創(chuàng)建 Android 項目

這個很簡單钓株,新建項目,按照引導一步一步往下走就行了陌僵。

新建項目的結(jié)構(gòu)如下:

project-root

|-app

|-src

|-androidTest

|-main

|-java

|-res

|-AndroidManifest.xml

|-build.gradle

|-gradle

|-wrapper

|-gradle-wrapper.jar

|-gradle-wrapper.properties

|-build.gradle

|-gradle.properties

|-gradlew

|-gradlew.bat

|-local.properties

|-settings.gradle

app

是項目代碼和資源目錄

gradlew,gradlew.bat,gradle/wrapper

上一章節(jié)已經(jīng)介紹過了

build.gradle,settings.gradle

上一章節(jié)已經(jīng)介紹過了

gradle.properties

gradle運行的參數(shù)

local.properties

本地環(huán)境參數(shù)轴合,例如android sdk路徑:sdk.dir

導入Gradle項目到Android Studio

對于非Android Studio項目,完成gradle改造后碗短,可以導入到Android Studio中受葛。

File->Open...

或者AndroidStudio啟動頁的

Openan existingAndroidStudioproject

直接選擇打開項目根目錄下的settings.gradle(如果沒有的話,打開build.gradle)文件偎谁,或者setting.gradle文件的父目錄总滩,結(jié)果如下圖:

如果運行過前面的gradle wrapper命令的話(或者是由eclipse導出的gradle項目),目錄下有wrapper文件夾巡雨,Use default gradle wrapper(recommanded)選項就是可選的闰渔,否則只能選擇Use local gradle distribution。

混淆與簽名

請看我另一篇博客Gradle插件用戶指南(譯)3.4.3節(jié)和3.4.4節(jié)

構(gòu)建多渠道包

動態(tài)替換AndroidManifest.xml中的文本

以友盟為例铐望,是通過在AndroidManifest.xml中添加meta-data標簽來區(qū)分渠道:

android:name="UMENG_CHANNEL"

android:value="official"/>

不同的value值對應不同的渠道冈涧。

android gradle plugin從0.13.0版本開始,productFlavor開始支持manifestPlaceHolder正蛙,我們使用這個就可以實現(xiàn)友盟的多渠道打包督弓。

修改AndroidManifest.xml,添加placeHolder變量

android:name="UMENG_CHANNEL"

android:value="${channel_param}"/>

配置build.gradle文件

android{

...

defaultConfig{

...

manifestPlaceholders=[channel_param:"official"]

}

productFlavors{

channel1{

...

}

...

channelN{

...

}

}

productFlavors.all{

flavor->flavor.manifestPlaceholders=[channel_param:name]

}

}

productFlavors.all是合并的寫法乒验,也可以分開寫:

channel1{

manifestPlaceholder=[channel_param:name]

}

再進一步愚隧,國內(nèi)的應用商店可以說數(shù)以百計,如果每個都在build.gradle文件里寫一個flavor徊件,那么build.gradle文件就會變得冗長奸攻。

我們把渠道號寫到一個單獨的文件里channels.txt,內(nèi)容如下:

channel-360

channel-baidu

然后在build.gradle里定義函數(shù)flavors()虱痕,作用就是根據(jù)channels.txt里的內(nèi)容動態(tài)創(chuàng)建productFlavor睹耐,然后在build.gradle中調(diào)用這個函數(shù),優(yōu)化后的結(jié)果是這樣:

android{

...

defaultConfig{

...

manifestPlaceholders=[channel_param:"official"]

}

flavors()

}

defflavors(){

defpath='./channels.txt'//channels.txt的路徑

file(path).eachLine{

line->

if(!line.startsWith("http://")){

//動態(tài)創(chuàng)建productFlavor

android.productFlavors.create(line,{

manifestPlaceholders=[channel_param:name]

})

}

}

}

在Android Studio中部翘,點擊Sync Project with Gradle Files硝训,就可以在Gradle窗口中看到相應的渠道構(gòu)建任務了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窖梁,更是在濱河造成了極大的恐慌赘风,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纵刘,死亡現(xiàn)場離奇詭異邀窃,居然都是意外死亡,警方通過查閱死者的電腦和手機假哎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門瞬捕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舵抹,你說我怎么就攤上這事肪虎。” “怎么了惧蛹?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵扇救,是天一觀的道長。 經(jīng)常有香客問我香嗓,道長迅腔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任陶缺,我火速辦了婚禮钾挟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饱岸。我一直安慰自己,他們只是感情好徽千,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布苫费。 她就那樣靜靜地躺著,像睡著了一般双抽。 火紅的嫁衣襯著肌膚如雪百框。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天牍汹,我揣著相機與錄音铐维,去河邊找鬼。 笑死慎菲,一個胖子當著我的面吹牛嫁蛇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播露该,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼睬棚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抑党,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤包警,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后底靠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體害晦,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年暑中,在試婚紗的時候發(fā)現(xiàn)自己被綠了篱瞎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡痒芝,死狀恐怖俐筋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情严衬,我是刑警寧澤澄者,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站请琳,受9級特大地震影響粱挡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俄精,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一询筏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竖慧,春花似錦嫌套、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砍的,卻和暖如春痹筛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廓鞠。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工帚稠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人床佳。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓滋早,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夕土。 傳聞我的和親對象是個殘疾皇子馆衔,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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