Android Gradle 基礎(chǔ)知識

一、gradle 是什么

官方解釋是:

Gradle is an open-source build automation tool focused on flexibility and performance. Gradle build scripts are written using a Groovy or Kotlin DSL.

可以從三個角度來理解

1. gradle 是一個自動化構(gòu)建工具?

gradle 是通過組織一系列 task 來最終完成自動化構(gòu)建的墙歪,所以 task 是 gradle 里最重要的概念

我們以生成一個可用的 apk 為例铐然,整個過程要經(jīng)過 資源的處理忘衍,javac 編譯漓库,dex 打包愿伴,apk 打包踊赠,簽名等等步驟呵扛,每個步驟就對應(yīng)到 gradle 里的一個 task

gradle 可以類比做一條流水線,task 可以比作流水線上的機器人筐带,每個機器人負責不同的事情今穿,最終生成完整的構(gòu)建產(chǎn)物

2. gradle 腳本使用了 groovy 或者 kotlin DSL?

gradle 使用 groovy 或者 kotlin 編寫,不過目前還是 groovy 居多

那什么是 DSL 呢伦籍?DSL 也就是 Domain Specific Language 的簡稱蓝晒,是為了解決某一類任務(wù)專門設(shè)計的計算機語言

DSL 相對應(yīng)的是 GPL (General-Purpose Language)腮出,比如 java

與 GPL 相比起來,DSL 使用簡單芝薇,定義比較簡潔胚嘲,比起配置文件,DSL 又可以實現(xiàn)語言邏輯

對 gradle 腳本來說洛二,他實現(xiàn)了簡潔的定義馋劈,又有充分的語言邏輯,以 android {} 為例晾嘶,這本身是一個函數(shù)調(diào)用妓雾,參數(shù)是一個閉包,但是這種定義方式明顯要簡潔很多

3. gradle 基于 groovy 編寫垒迂,而 groovy 是基于 jvm 語言?

gradle 使用 groovy 編寫械姻,groovy 是基于 jvm 的語言,所以本質(zhì)上是面向?qū)ο蟮恼Z言机断,面向?qū)ο笳Z言的特點就是一切皆對象楷拳,所以,在 gradle 里毫缆,.gradle 腳本的本質(zhì)就是類的定義唯竹,一些配置項的本質(zhì)都是方法調(diào)用,參數(shù)是后面的 {} 閉包

比如 build.gradle 對應(yīng) Project 類苦丁,buildScript 對應(yīng) Project.buildScript 方法

二浸颓、gradle 項目分析

關(guān)于 gradle 的項目層次,我們新建一個項目看一下

2.1 settings.gradle

settings.gradle 是負責配置項目的腳本對應(yīng)Settings?類旺拉,gradle 構(gòu)建過程中产上,會根據(jù) settings.gradle 生成 Settings 的對象

對應(yīng)的可調(diào)用的方法在文檔里可以查找其中幾個主要的方法有:

include(projectPaths)

includeFlat(projectNames)

project(projectDir)

一般在項目里見到的引用子模塊的方法,就是使用 include蛾狗,這樣引用晋涣,子模塊位于根項目的下一級

include ':app'

如果想指定子模塊的位置,可以使用 project 方法獲取 Project 對象沉桌,設(shè)置其 projectDir 參數(shù)

include ':app'

project(':app').projectDir = new File('./app')

2.2 rootproject/build.gradle

build.gradle 負責整體項目的一些配置谢鹊,對應(yīng)的是?Project?類gradle 構(gòu)建的時候,會根據(jù) build.gradle 生成 Project 對象留凭,所以在 build.gradle 里寫的 dsl佃扼,其實都是 Project 接口的一些方法,Project 其實是一個接口蔼夜,真正的實現(xiàn)類是 DefaultProject?

build.gradle 里可以調(diào)用的方法在Project?可以查到其中幾個主要方法有:

buildscript // 配置腳本的 classpath

allprojects // 配置項目及其子項目

respositories // 配置倉庫地址兼耀,后面的依賴都會去這里配置的地址查找

dependencies // 配置項目的依賴

以 EasyGradle 項目來看

buildscript { // 配置項目的 classpath

? ? repositories {? // 項目的倉庫地址,會按順序依次查找

? ? ? ? google()

? ? ? ? jcenter()

? ? ? ? mavenLocal()

? ? }

? ? dependencies { // 項目的依賴

? ? ? ? classpath 'com.android.tools.build:gradle:3.0.1'

? ? ? ? classpath 'com.zy.plugin:myplugin:0.0.1'

? ? }

}

allprojects { // 子項目的配置

? ? repositories {

? ? ? ? google()

? ? ? ? jcenter()

? ? ? ? mavenLocal()

? ? }

}

2.3 module/build.gradle

build.gradle 是子項目的配置,對應(yīng)的也是 Project 類

子項目和根項目的配置是差不多的瘤运,不過在子項目里可以看到有一個明顯的區(qū)別窍霞,就是引用了一個插件 apply plugin "com.android.application",后面的 android dsl 就是 application 插件的 extension拯坟,關(guān)于 android plugin dsl 可以看

?android-gradle-dsl?

其中幾個主要方法有:

compileSdkVersion // 指定編譯需要的 sdk 版本

defaultConfig // 指定默認的屬性但金,會運用到所有的 variants 上

buildTypes // 一些編譯屬性可以在這里配置,可配置的所有屬性在?這里

productFlavor // 配置項目的 flavor

以 app 模塊的 build.gradle 來看

apply plugin: 'com.android.application' // 引入 android gradle 插件

android { // 配置 android gradle plugin 需要的內(nèi)容

? ? compileSdkVersion 26

? ? defaultConfig { // 版本郁季,applicationId 等配置

? ? ? ? applicationId "com.zy.easygradle"

? ? ? ? minSdkVersion 19

? ? ? ? targetSdkVersion 26

? ? ? ? versionCode 1

? ? ? ? versionName "1.0"

? ? }

? ? buildTypes {

? ? ? ? release {

? ? ? ? ? ? minifyEnabled false

? ? ? ? ? ? proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

? ? ? ? }

? ? }

? ? compileOptions { // 指定 java 版本

? ? ? ? sourceCompatibility 1.8

? ? ? ? targetCompatibility 1.8

? ? }

? ? // flavor 相關(guān)配置

? ? flavorDimensions "size", "color"

? ? productFlavors {

? ? ? ? big {

? ? ? ? ? ? dimension "size"

? ? ? ? }

? ? ? ? small {

? ? ? ? ? ? dimension "size"

? ? ? ? }

? ? ? ? blue {

? ? ? ? ? ? dimension "color"

? ? ? ? }

? ? ? ? red {

? ? ? ? ? ? dimension "color"

? ? ? ? }

? ? }

}

// 項目需要的依賴

dependencies {

? ? implementation fileTree(dir: 'libs', include: ['*.jar']) // jar 包依賴

? ? implementation 'com.android.support:appcompat-v7:26.1.0' // 遠程倉庫依賴

? ? implementation 'com.android.support.constraint:constraint-layout:1.1.3'

? ? implementation project(':module1') // 項目依賴

}

2.4 依賴

在 gradle 3.4 里引入了新的依賴配置傲绣,如下:

還是以 EasyGradle 為例,看一下各個依賴的不同:

項目里有三個模塊:app巩踏,module1, module2

模塊 app 中有一個類 ModuleApi

模塊 module1 中有一個類 Module1Api

模塊 module2 中有一個類 Module2Api

其依賴關(guān)系如下:


implementation 依賴?

當 module1 使用 implementation 依賴 module2 時续搀,在 app 模塊中無法引用到 Module2Api 類


api 依賴?

當 module1 使用 api 依賴 module2 時塞琼,在 app 模塊中可以正常引用到 Module2Api 類,如下圖


compileOnly 依賴?

當 module1 使用 compileOnly 依賴 module2 時禁舷,在編譯階段 app 模塊無法引用到 Module2Api 類彪杉,module1 中正常引用,但是在運行時會報錯

反編譯打包好的 apk牵咙,可以看到 Module2Api 是沒有被打包到 apk 里的


runtimeOnly 依賴?

當 module1 使用 runtimeOnly 依賴 module2 時派近,在編譯階段,module1 也無法引用到 Module2Api


2.5 flavor

在介紹下面的流程之前洁桌,先明確幾個概念渴丸,flavor,dimension另凌,variant

在 android gradle plugin 3.x 之后谱轨,每個 flavor 必須對應(yīng)一個 dimension,可以理解為 flavor 的分組吠谢,然后不同 dimension 里的 flavor 兩兩組合形成一個 variant

舉個例子

如下配置:

flavorDimensions "size", "color"

productFlavors {

? ? big {

? ? ? ? dimension "size"

? ? }

? ? small {

? ? ? ? dimension "size"

? ? }

? ? blue {

? ? ? ? dimension "color"

? ? }

? ? red {

? ? ? ? dimension "color"

? ? }

}

那么生成的 variant 對應(yīng)的就是 bigBlue土童,bigRed,smallBlue工坊,smallRed

每個 variant 可以對應(yīng)的使用 variantImplementation 來引入特定的依賴献汗,比如:bigBlueImplementation,只有在 編譯 bigBlue variant的時候才會引入

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末王污,一起剝皮案震驚了整個濱河市罢吃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玉掸,老刑警劉巖刃麸,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異司浪,居然都是意外死亡泊业,警方通過查閱死者的電腦和手機把沼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吁伺,“玉大人饮睬,你說我怎么就攤上這事±貉伲” “怎么了捆愁?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窟却。 經(jīng)常有香客問我昼丑,道長,這世上最難降的妖魔是什么夸赫? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任菩帝,我火速辦了婚禮,結(jié)果婚禮上茬腿,老公的妹妹穿的比我還像新娘呼奢。我一直安慰自己,他們只是感情好切平,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布握础。 她就那樣靜靜地躺著,像睡著了一般悴品。 火紅的嫁衣襯著肌膚如雪禀综。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天他匪,我揣著相機與錄音菇存,去河邊找鬼。 笑死邦蜜,一個胖子當著我的面吹牛依鸥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悼沈,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼贱迟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了絮供?” 一聲冷哼從身側(cè)響起衣吠,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壤靶,沒想到半個月后缚俏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年忧换,在試婚紗的時候發(fā)現(xiàn)自己被綠了恬惯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡亚茬,死狀恐怖酪耳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刹缝,我是刑警寧澤碗暗,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站梢夯,受9級特大地震影響言疗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颂砸,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一洲守、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沾凄,春花似錦、人聲如沸知允。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽温鸽。三九已至保屯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涤垫,已是汗流浹背姑尺。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝠猬,地道東北人切蟋。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像榆芦,于是被迫代替她去往敵國和親柄粹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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