什么是Gradle滤奈,我打開(kāi)idea哀蘑,在設(shè)置里面會(huì)有一個(gè)選項(xiàng)是build tools厘贼,這個(gè)選項(xiàng)里有3個(gè)選項(xiàng)界酒,ant,maven和gradle嘴秸。
所以gradle就是build tools毁欣,簡(jiǎn)稱構(gòu)建工具。ant岳掐,maven和gradle就是java中常用的構(gòu)建工具凭疮。
那什么是構(gòu)建工具呢,按照我的理解串述,構(gòu)建工具就是把代碼變成應(yīng)用的工具执解,比如gradle能把項(xiàng)目代碼變成apk文件。這也就是應(yīng)用和網(wǎng)頁(yè)其中一個(gè)不同的地方纲酗。
一.Product與task
第一次看到Android中默認(rèn)配置的gradle我也看不懂衰腌,就完全不懂寫的是什么,感覺(jué)亂亂的耕姊,深入理解后才看懂一些皮毛桶唐。
一個(gè)Android項(xiàng)目如果要編譯的話,至少要有一個(gè)模塊的build.gradle茉兰,而每個(gè)模塊的build.gradle就是Gradle 的一個(gè)Project尤泽,默認(rèn)情況下我門有個(gè)app的build.gradle,這個(gè)就是一個(gè)Project规脸。
一個(gè)Project里頭包含多個(gè)task(任務(wù))坯约,一個(gè)task又包含多個(gè)action。所以Gradle 抽象來(lái)說(shuō)是由至少一個(gè)Project組成莫鸭,Project由多個(gè)task組成闹丐,task由多個(gè)action組成。還有一點(diǎn)就是這個(gè)Project具體執(zhí)行的task是由具體的Plugin決定的被因。比如我們app的build.gradle最上方會(huì)寫著apply plugin: 'com.android.application'
如果你用命令gradlew tasks tools 卿拴,你就可以查看全部task,mac記得在前面加.\
有個(gè)我不清楚的地方是梨与,有的人說(shuō)是用gradle堕花,但是我這是用gradlew才有效果,我不知道這兩個(gè)命令的區(qū)別粥鞋。
順帶一說(shuō)缘挽,常用的task有assemble、check、build壕曼、clean苏研,task可以用命令來(lái)執(zhí)行。
注意:如果你看到gradlew這個(gè)命令腮郊,那就是對(duì)構(gòu)建工具進(jìn)行操作的命令摹蘑。
二.編譯過(guò)程
Android的編譯過(guò)程很復(fù)雜,不是我這種渣渣能看得懂的伴榔,我只知道項(xiàng)目經(jīng)過(guò)編譯后得到dex文件和資源文件纹蝴。
編譯什么的,一聽(tīng)就有點(diǎn)不理解的意思踪少。apk是通過(guò)代碼進(jìn)行先編譯后打包得到的,這樣講就大概覺(jué)得編譯有點(diǎn)意思糠涛。
在別人寫的博客中有說(shuō)到援奢,Gradle編譯分為三個(gè)階段:
(1)初始化階段:創(chuàng)建 Project 對(duì)象
(2)配置階段:創(chuàng)建project下的task
(3)執(zhí)行階段:執(zhí)行task
所以為什么在模塊化中每個(gè)模塊能單獨(dú)編譯,因?yàn)槊總€(gè)模塊在初始化階段會(huì)得到一個(gè)Project 忍捡。
三.Android Gradle結(jié)構(gòu)
Gradle在AS中有3個(gè)基本的組成集漾,一個(gè)是settings.gradle,一個(gè)是總項(xiàng)目的build.gradle砸脊,還有各個(gè)模塊的build.gradle
1.settings.gradle
這個(gè)文件很簡(jiǎn)單具篇,主要用來(lái)來(lái)配置多項(xiàng)目構(gòu)建。通俗點(diǎn)講就是你要構(gòu)建的項(xiàng)目中需要包含哪些模塊凌埂。
2.頂層build.gradle
一般文件結(jié)構(gòu)是這樣
官方也給出了各個(gè)部分作用
看看我們as給我們配的
buildscript {
repositories {
jcenter()//設(shè)置之后可以在項(xiàng)目中輕松引用jcenter上的開(kāi)源項(xiàng)目
}
dependencies {
// 添加插件
classpath 'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()//代碼托管庫(kù):設(shè)置之后可以在項(xiàng)目中輕松引用jcenter上的開(kāi)源項(xiàng)目
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
好吧驱显,不裝逼了,其實(shí)我也很好奇為什么會(huì)有兩個(gè)repositories
3.模塊中的build.gradle
//說(shuō)明是app程序瞳抓,執(zhí)行的是app的task
apply plugin: 'com.android.application'
// android程序相關(guān)的配置
android {
compileSdkVersion 26//編譯的SDK版本
buildToolsVersion "26.0.1"http://編譯的Tools版本
// 默認(rèn)配置
defaultConfig {
applicationId "com.example.kylinarm.biyemonk"http://應(yīng)用程序的包名
minSdkVersion 158//支持的最低版本
targetSdkVersion 26//支持的目標(biāo)版本
versionCode 1//需要構(gòu)建的應(yīng)用的版本
versionName "1.0"http://需要構(gòu)建的應(yīng)用的版本名
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 這個(gè)我在打包那說(shuō)過(guò)埃疫,正式包和測(cè)試包的配置
buildTypes {
//正式包,你開(kāi)心也可以多寫個(gè)debug測(cè)試包的配置
release {
minifyEnabled false//是否混淆(true為混淆)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件
}
}
}
//依賴孩哑,這個(gè)沒(méi)什么好說(shuō)的
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
testCompile 'junit:junit:4.12'
compile project(':baselibrary')
compile project(':componentlibrary')
compile 'com.jakewharton:butterknife:5.1.1'
}
在android{}的配置中栓霜,不光只有defaultConfig、buildTypes 這些横蜒,還有其它的胳蛮,我這就不多說(shuō),用到再說(shuō)丛晌,因?yàn)槲铱偣惨仓挥眠^(guò)那幾種仅炊,并不知道全部的配置。
四.總結(jié)
這里主要講的是淺談茵乱,gradle的知識(shí)內(nèi)容很多茂洒,有些都出了一本書專門講gradle,我懂的也不多,就懂它的一個(gè)大概的一些基本的原理督勺,某些功能比如說(shuō)打包渠羞,我也是需要具體去查怎么使用。
我總結(jié)對(duì)gradle的理解:
(1)gradle是一個(gè)build tools智哀,主要功能是執(zhí)行task
(2)Android配置中的配置內(nèi)容要記住次询,因?yàn)樗玛P(guān)項(xiàng)目的構(gòu)建
(3)gradle構(gòu)建的一個(gè)過(guò)程,也就是它的生命周期