自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Gradle for Android系列:為什么Gradle這么火

移動開發(fā) Android
這篇文章對比 Ant 和 Maven 介紹了 Gradle 的一些優(yōu)點和基礎(chǔ)概念,在理解 Gradle 為什么會被使用、它有什么優(yōu)點之后,有助于我們后續(xù)深入學(xué)習(xí) Gradle 的使用。

[[180044]]

Android Studio 占領(lǐng)市場后,構(gòu)建工具 Gradle 的地位無人能比,我們有必要學(xué)習(xí)、使用它來為我們創(chuàng)造價值。

在深入學(xué)習(xí) Gradle 之前,我們有必要了解下它為什么這么流行。

Android 應(yīng)用的構(gòu)建過程

Android 應(yīng)用程序的構(gòu)建過程非常復(fù)雜,如圖所示: 

 

 

Android 應(yīng)用程序的構(gòu)建過程非常復(fù)雜 

主要有以下幾步:

  1. 主要的資源文件(layout, values 等)都被 aapt 編譯,并且在一個 R 文件中引用
  2. Java 代碼被 Java 編譯器編譯成 JVM 字節(jié)碼(.class 文件)
  3. JVM 字節(jié)碼再被 dex 工具轉(zhuǎn)換成 dalvik 字節(jié)碼(.dex 文件)
  4. 然后這些 .dex 文件、編譯過的資源文件和其他資源文件(比如圖片)會被打包成一個 apk
  5. apk 文件在安裝前會被 debug/release 的 key 文件簽名
  6. 安裝到設(shè)備

幾個注意點

  1. 上面的步驟中***步注意是主要的資源文件,有些特別的資源文件就不會被編譯,比如 assets 目錄下的文件,raw 目錄下的文件還有圖片,都不會被編譯。只不過 raw 下的文件會在 R 文件里生成 id
  2. 如果對 apk 正式簽名,還需要使用 zipalign 工具對 apk 進行對齊操作,這樣做的好處是當應(yīng)用運行時會減少內(nèi)存的開銷

通過上面的介紹可以看到,這么復(fù)雜的構(gòu)建過程如果需要人手動去完成未免太過殘忍,于是有了各種的構(gòu)建工具。

Android 構(gòu)建的舊愛:Ant, Maven

在 Gradle 之前被廣泛使用的是 Apache Ant 和 Maven。

Ant 

 

 

[[180045]] 

Ant 2000 年發(fā)布,很快成為 Java 項目***的構(gòu)建工具。

Ant 的優(yōu)點就是:

  • 簡單、易學(xué),不需要什么特殊準備就能上手
  • 基于過程式編程思想使得構(gòu)建非常靈活
  • 后來還能支持插件。

不足之處就是使用 XML 作為腳本配置格式,除非是很小的項目,否則它的 XML 文件很快就大得無法管理。

Maven 

 

 

Maven 

Maven 發(fā)布于 2004 年。目的是解決使用 Ant 所帶來的一些問題。

Maven 也是使用 XML 作為構(gòu)建配置的文件格式,不過文件結(jié)構(gòu)卻有了巨大的變化:

  • Ant 需要開發(fā)者將執(zhí)行 task 所需的全部命令都列出來
  • 而 Maven 依靠約定并提供現(xiàn)成的可調(diào)用的目標

不僅如此,Maven 更重要的一個進步是具備從網(wǎng)絡(luò)上自動下載依賴的能力(當然 Ant 后來通過 Ivy 也具備了這個功能),這革命性地改變了我們開發(fā)軟件的方式。

Maven 的缺點是:

  • 依賴管理不能很好地處理相同庫文件不同版本之間的沖突(Ivy在這方面更好一些)
  • XML 作為配置文件的格式有嚴格的結(jié)構(gòu)層次和標準,定制化目標很困難

Maven 主要解決了依賴管理的問題,然而使用 XML 的錯誤使它重蹈覆轍,實際上用 Maven 很難寫出復(fù)雜、定制化的構(gòu)建腳本,在大型項目中,它經(jīng)常什么“特別的”事還沒干就有幾百行代碼,甚至不如 Ant。

前輩們在反省前兩種構(gòu)建工具的錯誤之后,提出了 DSL (Domain Special Language, 領(lǐng)域?qū)S谜Z言)的概念,目標是設(shè)計一套能夠解決特定領(lǐng)域問題的語言。在構(gòu)建這方面,DSL 的一個成功案例就是 Gradle。

Android 構(gòu)建的新歡:Gradle

 

 

Gradle

 

2012 年發(fā)布的 Gradle 深刻吸取前面幾位前輩的經(jīng)驗和教訓(xùn),集大家之所成,做了很多改進。

Gradle 有約定優(yōu)于配置的原則,即為設(shè)置和屬性提供默認值,這使得它比 Ant 或者 Maven 更容易上手。

Gradle 構(gòu)建腳本不再使用 xml ,而是使用基于 Groovy 的 DSL 進行書寫(Groovy 是一種基于 Java 虛擬機的動態(tài)語言,因此 Android 開發(fā)者看著會很熟悉),從而使得構(gòu)建腳本比用 Ant 和 Maven 寫的更清晰、簡潔,下面是實現(xiàn)同樣目標的 Maven 代碼和 Gradle 代碼對比: 

 

 

Maven 代碼和 Gradle 代碼對比 

Gradle 既有 Ant 的強大和靈活,又有 Maven 的依賴管理,支持插件且易于使用。因此一推出就獲得廣泛關(guān)注,2013 年被 Google 選為 Android Studio 的默認構(gòu)建工具。

Gradle 設(shè)計的方式使得它可以很容易地擴展構(gòu)建和插入到現(xiàn)有的構(gòu)建過程中,Google 推廣 Gradle 和 Android Studio 時,目標是讓代碼復(fù)用、構(gòu)建 variant、配置和定制構(gòu)建過程變得更加簡單。

有人可能擔心是否需要專門去學(xué)習(xí)新語言 Groovy,《Gradle for Android》書中專門提到:

Groovy 代碼非常易讀,如果你學(xué)習(xí)過 Java,那么學(xué)習(xí) Groovy 的曲線不會陡峭。 如果你想構(gòu)建自己的任務(wù)和插件,那么對 Groovy 有更深層次的理解尤為重要。 不過因為 Groovy 是基于 Java 虛擬機的,所以你完全可以用 Java 或者其他基于 Java 虛擬機的語言來編寫你的自定義插件。

Gradle 的關(guān)鍵概念及構(gòu)建生命周期

Gradle 中兩個關(guān)鍵的概念:項目和任務(wù)。

每個 build.gradle 構(gòu)建腳本文件代表一個項目 project: 

 

 

每個 build.gradle 構(gòu)建腳本文件代表一個項目 project 

任務(wù) task 定義在構(gòu)建腳本里: 

 

 

任務(wù) task 定義在構(gòu)建腳本里 

每次構(gòu)建至少包括一個項目,每個項目里又至少包括一個任務(wù)。

構(gòu)建生命周期

一個 Gradle 構(gòu)建通常包括下面三個階段:

1.初始化

項目實例會在這時被創(chuàng)建,如果這個項目里有多個 module,或者依賴多個 library,并且它們都有對應(yīng)的 build.gradle 文件,就會創(chuàng)建多個項目實例

2.配置

在這個階段構(gòu)建腳本被執(zhí)行,并且為每個項目實例創(chuàng)建和配置任務(wù)

3.執(zhí)行

在這個階段 Gradle 將根據(jù)構(gòu)建腳本的配置決定哪些任務(wù)會被執(zhí)行

不同任務(wù)之間可能有 相互依賴,因此在配置階段 Gradle 會生產(chǎn)依賴關(guān)系圖,沒有依賴的任務(wù)通常會被優(yōu)先執(zhí)行,然后一個接一個執(zhí)行其他任務(wù)。一旦一個任務(wù)被執(zhí)行過,就不會被再次執(zhí)行。

Gradle Wrapper

Gradle 在不斷的發(fā)展,有可能存在新版本不兼容舊版本的情況,于是官方為我們提供了 Gradle Wrapper,就是為了兼容和適配不同版本,確保構(gòu)建是可重復(fù)的。

普通的 Gradle 腳本命令是: 

  1. gradle ... 

而 Gradle Wrapper 命令只是在 gradle 后加了個 w:

  1. gradlew ... 

在 Mac 下略微有些不同:

  1. ./gradlew ... 

開發(fā)者或者自動構(gòu)建系統(tǒng)可以通過使用 wrapper 來運行 gradle 命令,由它來搞定兼容等問題。因此我們甚至都不需要安裝 gradle,直接使用 gradle wrapper 即可,就像 Android Studio 里推薦的一樣: 

 

 

 

上圖我并沒有使用 wrapper,是因為當你運行 gradlew 命令時,gradle wrapper 會自動下載需要但是你沒有的 gradle 版本并使用。 這在多人協(xié)作時,很可能因為別人修改了 gradle 版本、上傳到 git,然后導(dǎo)致你運行命令時需要下載半天。

不過官方還是推薦使用 wrapper,畢竟這樣更穩(wěn)定。

總結(jié)

這篇文章對比 Ant 和 Maven 介紹了 Gradle 的一些優(yōu)點和基礎(chǔ)概念,在理解 Gradle 為什么會被使用、它有什么優(yōu)點之后,有助于我們后續(xù)深入學(xué)習(xí) Gradle 的使用。 

責任編輯:龐桂玉 來源: Android開發(fā)中文站
相關(guān)推薦

2013-03-04 10:10:36

WebKit瀏覽器

2024-03-07 10:21:56

2024-01-10 17:04:13

通信模塊通信技術(shù)通信模組

2020-05-25 20:46:59

Python編程語言程序員

2021-06-30 06:56:18

數(shù)據(jù)泄露零信任網(wǎng)絡(luò)安全

2022-07-14 07:17:11

LXCDocker語言

2020-05-06 16:47:59

ServerlessMVC架構(gòu)

2014-10-10 13:46:33

Docker

2017-04-10 14:46:29

AndroidGradleBuild.gradl

2018-07-25 14:36:46

邊緣計算云計算

2024-03-01 17:01:15

GraphQL后端

2020-06-30 14:25:28

MavenGradle Spring

2021-03-26 08:47:01

SD-WAN網(wǎng)絡(luò)5G

2017-04-10 13:43:34

AndroidGradleAS

2017-03-02 14:35:33

Androidgradle常用配置

2013-07-18 17:00:12

Gradle構(gòu)建AndAndroid開發(fā)Android學(xué)習(xí)

2024-02-04 16:51:47

2022-12-22 07:44:04

2020-04-26 12:08:10

Python編程語言開發(fā)

2021-01-25 10:36:32

知識圖譜人工智能
點贊
收藏

51CTO技術(shù)棧公眾號