Android Studio正式版早已經(jīng)發(fā)布了,默認使用Gradle構(gòu)建恬砂,GitHub上80%的Android項目也都是使用Gradle構(gòu)建的蛤铜,我們還有什么理由不使用Gradle呢嘹叫?
環(huán)境要求
JDK下載地址
Android SDK下載地址
給一個國內(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)建任務了