前言
相信不少使用Android Studio開發(fā)Android的朋友都在為Gradle中的一些配置疑惑买窟,今天來介紹一下我在學(xué)習(xí)Gradle的一些經(jīng)驗(yàn)和總結(jié)春宣,希望能對(duì)大家有所幫助院峡。先大致的看一張Gradle學(xué)習(xí)的結(jié)構(gòu)圖卑雁,對(duì)正片文章有個(gè)大致的了解跌榔,其次逐一說明一些Android Gradle 插件中的一些變量的含義及用法實(shí)例地熄。
Groovy簡(jiǎn)介
由于Gradle使用Groovy作為默認(rèn)的編譯語言叉讥,所以在學(xué)習(xí)Gradle之前窘行,可以簡(jiǎn)單的了解一下Groovy的一些簡(jiǎn)單語法會(huì)事半功倍。
Groovy特點(diǎn)
- Groovy和Java一樣节吮,源碼都會(huì)被編譯成class字節(jié)碼文件然后可以在JVM中運(yùn)行抽高;
- Groovy兼容所有的Java語法,也就是說透绩,你可以在.groovy中直接寫Java代碼翘骂,編譯運(yùn)行壁熄;
- Groovy中自定義變量和方法都使用關(guān)鍵字 def 來定義;
- 閉包(注意碳竟,這將是在Gradle配置中經(jīng)常使用的)
關(guān)于Groovy的語法學(xué)習(xí)教程很多草丧,這里篇幅原因,就不詳細(xì)解釋了莹桅〔矗可以參看簡(jiǎn)書的另一篇博文:《Groovy語法》
Gradle語法介紹
這里就具體的Gradle語法進(jìn)行介紹,如果要詳細(xì)介紹可能需要一本書才能講完诈泼。本文僅結(jié)合具體的項(xiàng)目來介紹一些關(guān)鍵的知識(shí)點(diǎn)懂拾。
在Gradle中,每個(gè)Project都對(duì)應(yīng)一個(gè)build.gradle
文件铐达,而buidl.gralde中定義了每個(gè)Project所需要執(zhí)行的Task岖赋,而這些Task是由具體的插件(Plugin)決定的。
比如Java Project的Gradle插件在build.gradle
中配置如下:
group 'Sample'
version '1.0-SNAPSHOT'
//配置java插件
apply plugin: 'java'
//編譯源文件時(shí)使用的Java版本
sourceCompatibility = 1.5
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
以上是我基于IDEA新建的一個(gè)簡(jiǎn)單的Java工程瓮孙,build.gralde為自動(dòng)生成文件唐断。由于項(xiàng)目為Java工程,所以需要使用Gradle的Java插件來定義編譯規(guī)則杭抠。
同理脸甘,我們?cè)谑褂肁ndroidStudio 新建一個(gè)Android項(xiàng)目時(shí),也會(huì)生成對(duì)應(yīng)的build.gradle
文件偏灿。以新建一個(gè)Sample工程為例:
/app/build.gradle如下(注釋詳解):
//使用Gradle Android插件
//DSL語法網(wǎng)址:http://google.github.io/android-gradle-dsl/current/index.html
apply plugin: 'com.android.application'
//android{...} 表示插件的 dsl 入口丹诀,凡是在DSL中定義的都只在此閉包中生效
android {
//編譯的sdk版本(必填)
compileSdkVersion 23
//構(gòu)建工具版本 (必填)
buildToolsVersion "23.0.2"
//默認(rèn)配置
defaultConfig {
//應(yīng)用標(biāo)識(shí)
applicationId "com.mrljdx.sample"
//最小sdk版本
minSdkVersion 9
//編譯sdk版本
targetSdkVersion 23
//版本號(hào)
versionCode 1
//版本名稱
versionName "1.0"
}
//編譯類型,在構(gòu)建編譯變種時(shí)菩混,可以在此定義
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//android dsl 結(jié)束
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
}
Gradle Android Plugin 工程目錄結(jié)構(gòu)約定如下:
其中說明一下jniLibs目錄忿墅,它主要存放.so庫文件。在jni文件夾下存放ndk編譯相關(guān)的c/c++文件沮峡,編譯后生成的文件會(huì)在jniLibs中疚脐,Gradle默認(rèn)讀取jniLibs目錄下的.so庫文件,所以一般習(xí)慣于Eclipse的為了改變文件目錄邢疙,會(huì)使用Android Plugin 的 DSL 語法 sourceSet來重新定義文件目錄棍弄,如下:
sourceSets {
main {
//將jniLibs下的文件/子文件目錄 定義到與'src'同級(jí)的'libs'目錄下
jniLibs.srcDirs = ['libs']
}
}
對(duì)比Eclipse目錄結(jié)構(gòu)和Android Studio的目錄結(jié)構(gòu)
可以發(fā)現(xiàn)在Android Studio中,會(huì)默認(rèn)識(shí)別Gradle Android Plugin 預(yù)先約定的工程目錄結(jié)構(gòu)疟游,有些文件夾會(huì)變成藍(lán)色呼畸,表示源碼目錄,而帶有數(shù)據(jù)表示的文件夾颁虐,則表示存放資源文件蛮原。這點(diǎn)比起Eclipse要好很多。
那么問題來了另绩,如何通過配置build.gralde來適配Eclipse工程導(dǎo)出的文件目錄結(jié)構(gòu)呢儒陨?其實(shí)不難花嘶,如下配置即可:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc... instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
androidTest.setRoot('test')
}
理解以上代碼并不難,請(qǐng)參閱《Android Plugin DSL參考手冊(cè)》 即可蹦漠。
Gradle的生命周期
通過分析Android Studio創(chuàng)建的項(xiàng)目結(jié)構(gòu)或者IDEA創(chuàng)建的Java工程項(xiàng)目結(jié)構(gòu)椭员,不難發(fā)現(xiàn),在每個(gè)Project的根目錄下笛园,一定會(huì)存在 setting.gradle
文件隘击。
Gradle有一個(gè)初始化流程,這個(gè)時(shí)候setting.gradle
會(huì)執(zhí)行研铆,通過setting.gradle
可以獲取當(dāng)前整個(gè)工程的配置獲取一個(gè)Settings對(duì)象(查看Gradle DSL參考手冊(cè) 了解更多詳情)
關(guān)于Gradle的Project相關(guān)的生命周期埋同、任務(wù)、依賴等官方解釋如下:
可以簡(jiǎn)單的總結(jié)一下蚜印,就是在初始化時(shí)莺禁,讀取setting.gradle中的項(xiàng)目配置留量,來確定編譯的工程窄赋,通過每個(gè)工程中的build.gradle來確定編譯的任務(wù),而這些任務(wù)是由對(duì)應(yīng)的plugin來決定的楼熄,比如 'com.android.application'插件決定編譯成apk忆绰,而'com.android.library'插件決定項(xiàng)目編譯成.aar庫文件等。
在每個(gè)插件中可岂,都有相應(yīng)的語法約定错敢。通過Android DSL 手冊(cè) 可以理解為啥要那么定義。以及每個(gè)定義中的變量所對(duì)應(yīng)的類型和方法缕粹。
在博客《Android中實(shí)用的Gradle配置》 中說明了一個(gè)應(yīng)用在開發(fā)過程中的一些配置問題稚茅,其中對(duì)于每一個(gè)配置都有解釋說明,感興趣的可以參考一下平斩。
Gradle學(xué)習(xí)建議
關(guān)于Gradle的具體語法相關(guān)DSL細(xì)節(jié)亚享,如果在這里講可能要寫很多。授人以魚不如授人以漁绘面,這里結(jié)合自身的學(xué)習(xí)過程給大家一點(diǎn)建議和參考:
- Gradle 官方文檔 :了解Project對(duì)應(yīng)的章節(jié)欺税,仔細(xì)閱讀LifeCycle、Tasks揭璃、Dependencies晚凿、Multi-project Builds、Plugins瘦馍、Properties歼秽、Extra Properties、Dynamic Methods相關(guān)內(nèi)容情组≡锟辏基本上可以理解為何一個(gè)工程項(xiàng)目的結(jié)構(gòu)以及依賴是如何導(dǎo)入的扛吞。
- 深入理解Android(一):Gradle詳解 :詳細(xì)的介紹了Groovy相關(guān)語法、Gradle構(gòu)建細(xì)節(jié)等內(nèi)容荆责。其中關(guān)于Groovy的 List滥比、Map、Range做院、閉包等內(nèi)容值得細(xì)看盲泛,因?yàn)樵贕radle的使用中,比如多版本多渠道的APK構(gòu)建會(huì)用到這些內(nèi)容键耕。
- Android DSL 參考手冊(cè) :可以結(jié)合本片文章開頭的圖來進(jìn)行系統(tǒng)學(xué)習(xí)寺滚,了解Android DSL的語法層級(jí),了解構(gòu)建的一些內(nèi)容屈雄,理解即可村视。
- Gralde In Action 中文版:看名字就知道,這本書主要講解一些Gradle常用的實(shí)例講解酒奶,可以好好看看
END
由于個(gè)人能力有限蚁孔,在文中如有紕漏還請(qǐng)斧正,關(guān)于Gradle構(gòu)建項(xiàng)目相關(guān)的問題歡迎交流惋嚎,開卷有益~