Gradle之爲什麼現在要用Gradle(一)

筆記來源於以下文章
1. http://liuwangshu.cn/application/gradle/1-study-gradle.html
2. https://blog.csdn.net/singwhatiwanna/article/details/76084580

1. 爲什麼是Gradle

Gradle是目前Android主流的構建工具,不管你是通過命令行還是通過AndroidStudio來build,最終都是通過Gradle來實現的,所以學習Gradle非常重要。

目前國內對Android領域的探索已經越來越深,不少技術領域如插件化、熱修復、組件化、構建系統等都對Gradle有迫切的需求,不懂Gradle將無法完成上述事情,所以Gradle必須要學習。

2. 項目自動化

Gradle是一個構建工具,爲什麼要用構建工具,這裏就需要先從項目自動化開始講起。
在我們開發軟件時,會面臨相似的情況就是,我們需要去用IDE來進行編碼,當完成一些功能時會進行編譯、單元測試、打包等工作,這些工作都需要開發人員手動來實現。而一般的軟件都是迭代式開發的,一個版本接着一本版本,每個版本又可能有很多的功能,如果開發每次實現功能時都需要手動的進行編譯、單元測試和打包等工作,那顯然會非常耗時而且也容易出現問題,因此項目自動化應運而生,它有以下優點:

  1. 它可以儘量防止開發手動介入從而節省了開發的時間並減少錯誤的發生。
  2. 自動化可以自定義有序的步驟來完成代碼的編譯、測試和打包等工作。
  3. IDE可能受到不同操作系統的限制,而自動化構建是不會依賴於特定的操作系統和IDE的,具有平臺無關性。

3. 構建工具

構建工具用於實現項目自動化,是一種可編程的工具,你可以用代碼來控制流程,最終生成可交付的軟件。構建工具可以幫助你創建一個重複的、可靠地、無需手動介入的、不依賴於特定操作系統和IDE的構建。下面拿APK的構建過程來舉例。

3.1 APK的構建過程

APK的構建過程可根據官方提供的流程圖如下圖所示

image

 

APK的構建過程主要分爲以下幾步:

  1. 通過AAPT(Android Asset Packaging Tool)打包res資源文件,比如AndroidManifest.xml、xml佈局文件,並將這些xml文件編譯爲二進制,其中assets和raw文件夾的文件不會被編譯爲二進制,最終會生成R.java和resource.arsc文件。
  2. AIDL工具會將所有的aidl接口轉化爲對應的Java接口。
  3. 所有的Java代碼,包括R.java和Java接口都會被Java編譯器編譯成.class文件。
  4. Dex工具會將上一步生成的.class文件、第三方庫和其他.class文件編譯成.dex文件。
  5. 上一步編譯生成的.dex文件、編譯過的資源、無需編譯的資源(如圖片等)會被ApkBuilder工具打包成APK文件。
  6. 使用Debug Keystore或者Release Keystore對上一步生成的APK文件進行簽名。
  7. 如果是對APK正式簽名,還需要使用zipalign工具對APK進行對齊操作,這樣應用運行時減少內存的開銷。

以上步驟可以看出,APK的構架過程是比較繁瑣的,而且這個構建過程又是時常重複的,如果沒有構建工具,手動去完成構建工作,無疑對於開發人員是個折磨。也會可能在過程中產生很多問題,導致項目開發週期變長。
在Gradle出現之前,有三個基於Java的構建工具:Ant、Gant和Maven,他們被應用於Java或者Android開發中,下面簡單介紹一下:

2.2 Apache Ant

官網:http://ant.apache.org/

image

Ant在這裏不是螞蟻的意思(雖然它的圖標是螞蟻),而是Another Neat Tool的意思。
它是由 James Duncan Davidson 開發的(Tomcat 最初的開發者),最初是用來構建 Tomcat。在2000年,Ant成爲一個獨立的項目並被髮布出來。Ant 是由 Java 編寫的構建工具,它的核心代碼是由Java編寫的,因此具有平臺無關性,構建腳本是XML格式的(默認爲bulid.xml),如果你熟悉XML,那麼Ant 就比較容易上手。

Ant構建腳本的樣式如下所示。

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="hello">
    <echo message="running build.xml which is equivalent to build.gant"/>
    <property file="build.properties"/>    
    <target name="init"  description="init target" > 
        <echo message="Executing init target"/>
    </target> 
    <target name="hello" depends="init" description="say hello target"> 
        <echo message="${echo.msg}"/>
    </target>
</project>

Ant的構建腳本由三個基本元素組成:一個project(工程)、多個target(目標)和可用的task(任務)。
Apache Ant有以下缺點:

  1. Ant無法獲取運行時的信息。
  2. XML作爲構建腳本的語言,如果構建邏輯複雜,那麼構建腳本就會又長又難以維護。
  3. Ant需要配合lvy(一種管理項目的依賴工具),否則Ant很難管理依賴。
  4. Ant在如何組織項目結構方面沒有給出任何知道,這導致Ant雖然靈活性高,但這樣的靈活導致每個構建腳本都是唯一的而且很難被破解。

3.3 Gant

官網:https://gant.github.io/

[圖片上傳失敗...(image-fa2b53-1551348478092)]

Gant 是一個基於Ant 的構建工具,它在Ant的基礎上用Groovy寫的DSL(領域特定語言)。如果用Ant 實現構建,但是不喜歡用XML來編寫構建腳本或者現有的XML構建腳本很難維護和管理,那麼Gant 是一個不錯的選擇。

Gant構建文件的樣式如下所示。
build.gant

Ant.echo(message : 'running build.gant')
Ant.property(file : 'build.properties')
def antProperty = Ant.project.properties
target(init : 'init target') {
    echo(message : 'Executing init target')
}
target(hello : 'say hello target') {
    depends(init)
    echo(message : antProperty.'echo.msg')
}
setDefaultTarget(hello)

這個build.gant等同於此前Ant的bulid.xml

3.4 Apache Maven

官網:http://maven.apache.org/

image

 

Maven於2004年發佈,它的目標是改進開發人員在使用Ant時面臨的一些問題。Maven最初是爲了簡化Jakarta Turbine項目的構建,它經歷了Maven到Maven3的發展,Maven作爲後來者, 繼承了Ant的項目構建功能, 同樣採用了XML作爲構建腳本的格式。Maven具有依賴管理和項目管理的功能,提供了中央倉庫,能幫助我們自動下載庫文件。
Maven的構建腳本樣式如下
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Maven相比Ant的優點:

  1. Ant是過程式的,開發者需要顯示的指定每個目標,以及完成該目標鎖需要執行的任務。每一個項目,開發着都需要重新編寫這一過程,這樣會產生大量的重複。Maven是聲明式的,項目的構建過程和過程中的各個階段都由插件實現,開發者只需要聲明項目的基本元素就可以了,這很大程度消除了重複。
  2. Ant本身是沒有依賴管理,需要配合Ivy來管理依賴,而Maven本身就提供了依賴管理。
  3. Maven 使用約定而不是配置,它爲工程提供了合理的默認行爲,項目會知道去哪個目錄尋找源代碼以及構建運行時有那些任務去執行,如果你的項目遵從默認值,那麼只需要寫幾行XML配置腳本就可以了。而Ant是使用配置且沒有默認行爲的。

Maven的缺點:

  1. Maven提供了默認的結構和生命週期,這些可能不適合你的項目。
  2. 爲Maven寫定製的擴展過於累贅。
  3. Maven的中央倉庫比較混亂,當無法從中央倉庫中的帶需要的類庫時,我們可以手工下載複製到本地倉庫中,也是建立組織內部的倉庫服務器。
  4. 國內連接Maven的中央倉庫比較慢,需要連接國內的Maven鏡像倉庫。
  5. Maven缺乏文檔,不便於使用和理解。

4. Gradle的特性

Gradle是一款基於JVM的專注於靈活性和性能的開源構建工具。

image

 

build.gradle

apply plugin:'java'
group='com.mycompany.app'
archivesBaseName='my-app'
version='1.0-SNAPSHOT'

repositories{
   mavenCentral()
}

dependencies{
   testCompile 'junit:4.11'
}

這個build.gradlet等同於此前Maven的pom.xml。可以看出Groovy編寫構建腳本代碼量更少,可讀性更強。

下面列出Gradle與競爭對手不同的特性。

4.1 輕鬆地可擴展性

Gradle有非常良好的拓展性。如果想要在多個構建或者項目中分享可重用代碼,Gradle的插件會幫助你實現。將Gradle插件應用於你的項目中,它會在你的項目構建過程中提供很多幫助:爲你的添加項目的依賴的第三方庫、爲你的項目添加有用的默認設置和約定(源代碼位置、單元測試代碼位置)。其中Android Gradle插件繼承Java Gradle插件,在本系列後續的文章會介紹插件的內容。

4.2 採用了Groovy

Ant和Maven的構建腳本是由XML來編寫的,如果XML邏輯複雜內容太多就不容易維護。Gradle可以使用Groovy來實現構建腳本,Groovy是基於Jvm一種動態語言,它的語法和Java非常相似併兼容Java,因此你無需擔心學習Groovy的成本。Groovy在Java的基礎上增加了很多動態類型和靈活的特性,比起XML,Gradle更具有表達性和可讀性。

4.3 強大的依賴管理

Gradle提供了可配置的可依靠的依賴管理方案。一旦依賴的庫被下載並存儲到本地緩存中,我們的項目就可以使用了。依賴管理很好的實現了在不同的平臺和機器上產生相同的構建結果。

4.4 靈活的約定

Gradle可以爲構建你的項目提供引導和默認值,如果你使用這種約定,你的Gradle構建腳本不會有幾行。比起Ant,Gradle不僅僅提供了約定,還可以讓你輕鬆的打破約定。

4.5 Gradle Wrapper

Gradle Wrapper是對Gradle的包裝,它的作用是簡化Gradle本身的下載、安裝和構建,比如它會在我們沒有安裝Gradle的情況下,去下載指定版本的Gradle並進行構建。Gradle的版本很多,所以有可能出現版本兼容的問題,這時就需要Gradle Wrapper去統一Gradle的版本,避免開發團隊因爲Gradle版本不一致而產生問題。

4.6 可以和其他構建工具繼承

Gradle可以和Ant、Maven和lvy進行繼承,比如我們可以把Ant的構建腳本導入到Gradle的構建中。

4.7 底層API

Gradle顯然無法滿足所有企業級構建的所有要求,但是可以通過Hook Gradle的生命週期,來監控和配置構建腳本。

4.8 社區的支持和推動

Gradle是一個開源的項目,它遵循了Apache License2.0協議。Gradle的優良特性吸引了很多開發者並形成了Gradle社區,很多開源軟件開發者爲Gradle的核心代碼做出了分享。

5. 如何學習Gradle

大部分人對Gradle表示一臉懵逼,每當遇到一個問題的時候都需要從網上去查,這是一個誤區。

Gradle不單單是一個配置腳本,它的背後是幾門語言,如果硬讓我說,我認爲是三門語言。

Groovy Language
Gradle DSL
Android DSL
DSL的全稱是Domain Specific Language,即領域特定語言,或者直接翻譯成“特定領域的語言”,算了,再直接點,其實就是這個語言不通用,只能用於特定的某個領域,俗稱“小語言”。因此DSL也是語言。

在你不懂這三門語言的情況下,你很難達到精通Gradle的程度。這個時候從網上搜索,或者自己記憶的一些配置,其實對你來說是很大的負擔。但是把它們當做語言來學習,則不需要記憶這些配置,因爲語言都是有文檔的,我們只需要學語法然後查文檔即可,沒錯,這就是學習方法,這就是正道。

6. 總結

本篇文章從項目自動化開始講起,介紹了常用的構建工具:Ant、Gant和Maven,最後介紹了Gradle的特性,這些特性和其他競爭的構建工具相比有着很大的優勢和吸引力,這也是爲什麼我們現在要用Gradle的原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章