前言
看了大多數(shù)寫Gradle的文章猬仁,一開始就先講解各種概念遥昧,最后被繞的云里霧里踩验,心里默默感慨道:講的真tm的好,但是我還是不懂汰瘫。
所以,我這里想先從全局上給大家來一個(gè)通俗的解釋擂煞,盡量簡潔明了混弥,而后再各個(gè)深入進(jìn)去。
闡明主題
Gradle作為一個(gè)構(gòu)建工具对省,主要功能是打包用蝗拿。沒錯(cuò),對(duì)于android工程來講蒿涎,就是最后產(chǎn)出一個(gè)apk或者aar哀托,中間你可以插入你自定義的一些操作,比如改字節(jié)碼劳秋,改資源名稱之類的仓手。
所以胖齐,大致的過程需要說一下:
1. 首先,讀取工程根目錄下settings.gradle文件俗或,創(chuàng)建Settings 對(duì)象市怎,獲取 include 的 Projects
2. 根據(jù)獲取的projects ,創(chuàng)建Project對(duì)象實(shí)例層次,單module就是單實(shí)例,多module就是多實(shí)例辛慰。
3. 然后會(huì)通過讀取每個(gè)module下的build.gradle文件來評(píng)估這個(gè)Project区匠,以及Project之間的先后順序。
4. 最后會(huì)順序執(zhí)行這些project的build.gradle 的task帅腌,生成目標(biāo)文件apk或aar驰弄。
注意,每個(gè)build.gradle都對(duì)應(yīng)一個(gè)Project對(duì)象實(shí)例
一個(gè)例子
我們新建一個(gè)空白工程速客,只有一個(gè)主工程module戚篙,多module類似。
可以看到有三個(gè).gradle文件溺职。settings.gradle,兩個(gè)build.gradle岔擂,不過一個(gè)是application的,一個(gè)是module的浪耘。
settings.gradle
include ':app'
很簡單乱灵,就執(zhí)行了一個(gè)include方法,當(dāng)然七冲,多module的話痛倚,只需在后面加 ,':module1'
類似即可澜躺,當(dāng)你加入一個(gè)新的module以后蝉稳,一個(gè)ProjectDescriptor
便會(huì)被創(chuàng)建出來,然后你就可以用這個(gè)對(duì)象去改某個(gè)module的特定屬性了掘鄙,這里大部分人應(yīng)該沒怎么注意耘戚,看不懂也沒關(guān)系,用到了就會(huì)懂了操漠。
注意毕莱,我這里說執(zhí)行了,為什么這么說呢颅夺?看這里: include確實(shí)是 Settings的一個(gè)方法朋截,要多看api文檔,很多問題都會(huì)迎刃而解吧黄。
build.gradle(Application)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
看上面就應(yīng)該清楚和module的區(qū)別了吧
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter() //jcenter倉庫
}
}
這里是繼承了Delete基類的 一個(gè)task部服,作用就是刪除 rootProject.buildDir下的文件。
辣么問題來了拗慨,rootProject是什么鬼廓八?為什么會(huì)有這個(gè)對(duì)象奉芦?
task clean(type: Delete) {
delete rootProject.buildDir
}
這里要介紹Build script structure,BS是一個(gè)以閉包為參數(shù)的方法調(diào)用剧蹂,對(duì)就是這樣声功。在x{y{}}中,這里的x{}和x{}里的y{}都是BS宠叼。
從下圖可以看出先巴,每一個(gè)BS都一一映射到一個(gè)類。BS中屬性就對(duì)應(yīng)于這些類的成員變量冒冬。我們可以參照官方文檔來了解我們不知道的一些細(xì)節(jié)伸蚯,也能為我們以后自己寫插件做鋪墊。
build.gradle(module)
相信大家對(duì)這個(gè)就比較熟悉了简烤,我們就先提出幾個(gè)問題吧:apply 是什么鬼剂邮?為什么這樣就把a(bǔ)ndroid主module用到的BS全部都包含進(jìn)去了?android{}這個(gè)東西是怎么來的横侦?
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.1"
defaultConfig {
applicationId "com.shang.myapplication"
minSdkVersion 10
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
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:25.1.1'
testCompile 'junit:junit:4.12'
}
Ctrl+鼠標(biāo)放到apply可以看到下圖:
前面我們講個(gè)每個(gè)build.gradle文件都對(duì)應(yīng)一個(gè)Project對(duì)象挥萌,辣么很顯然這個(gè)apply就應(yīng)該是這個(gè)類的方法,我就毫不猶豫的打開了Project類
介紹枉侧,Project 實(shí)現(xiàn)了PluginAware接口引瀑,全局搜了下apply,豁然明了:apply to ,apply plugin ,apply from棵逊。apply plugin 對(duì)應(yīng)的是插件的id,而這個(gè)插件里則定義了很多個(gè)屬性银酗,閉包辆影,來提供給我們做個(gè)性化定制使用。
寫到這里黍特,對(duì)一個(gè)簡單工程的gradle分析大致結(jié)束了蛙讥,其實(shí)很多東西,網(wǎng)上的人云亦云灭衷,照抄照搬次慢,看來看去,還不如直接對(duì)照官方文檔來得方便翔曲,希望能夠多多閱讀api文檔迫像,與大家共勉。