Gradle核心思想(一)爲何如今要用Gradle?

前言

又要開啓一個新系列了,這個系列咱們來學習Gradle,它是一個基於JVM的新一代構建工具,關於Gradle徹底能夠寫一本書,這個系列會針對Android開發來對Gradle的知識進行精簡講解。Gradle目前已經應用於多個Android開發的技術體系中,好比構建系統、插件化、熱修復和組件化等等,若是你不瞭解Gradle,那麼你對於上述技術體系的瞭解會大打折扣。爲了讓你們可以更好的學習Gradle,這篇文章不會介紹Gradle具體的技術細節,而是先介紹爲何如今要用Gradle?php

1.項目自動化

Gradle是一個構建工具,那麼爲何要用構建工具,這就須要先從項目自動化開始講起。 在咱們開發軟件時,會面臨類似的狀況就是,咱們須要去用IDE來進行編碼,當完成一些功能時會進行編譯、單元測試、打包等工做,這些工做都須要開發人員手動來實現。而通常的軟件都是迭代式開發的,一個版本接着一本版本,每一個版本又可能有不少的功能,若是開發每次實現功能時都須要手動的進行編譯、單元測試和打包等工做,那顯然會很是耗時並且也容易出現問題,所以項目自動化應運而生,它有如下優勢:html

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

2.構建工具

構建工具用於實現項目自動化,是一種可編程的工具,你能夠用代碼來控制構建流程最終生成可交付的軟件。構建工具能夠幫助你建立一個重複的、可靠的、無需手動介入的、不依賴於特定操做系統和IDE的構建。這麼說可能有些抽象,這裏拿APK的構建過程來舉例。前端

2.1 APK的構建過程

APK的構建過程能夠根據官方提供的流程圖以下圖所示。 java

這個APK構建的過程主要分爲如下幾步:apache

  1. 經過AAPT(Android Asset Packaging Tool)打包res資源文件,好比AndroidManifest.xml、xml佈局文件等,並將這些xml文件編譯爲二進制,其中assets和raw文件夾的文件不會被編譯爲二進制,最終會生成R.java和resources.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

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

Ant構建腳本的樣式以下所示。服務器

bulid.xmlapp

<?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有如下缺點:maven

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

2.3 Gant

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。

2.4 Apache Maven

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缺少文檔,不便於使用和理解。

3.Gradle的特性

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

從上圖能夠看出,Gradle結合Ant和Maven等構建工具的最佳特性。它有着約定優於配置的方法、強大的依賴管理,它的構建腳本使用Groovy或Kotlin DSL編寫,是Android的官方構建工具。Gradle的構建腳本的樣式以下所示。 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與競爭對手不一樣的特性。

3.1 輕鬆的可拓展性

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

3.2 採用了Groovy

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

3.3 強大的依賴管理

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

3.4 靈活的約定

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

3.5 Gradle Wrapper

Gradle Wrapper是對Gradle 的包裝,它的做用是簡化Gradle自己的下載、安裝和構建,好比它會在咱們沒有安裝Gradle的狀況下,去下載指定版本的Gradle並進行構建。Gradle的版本不少,因此有可能出現版本兼容的問題,這時就須要Gradle Wrapper去統一Gradle的版本,避免開發團隊由於Gradle版本不一致而產生問題。

3.6 能夠和其餘構建工具集成

Gradle能夠和Ant、Maven和Ivy進行集成,好比咱們能夠把Ant的構建腳本導入到Gradle的構建中。

3.7 底層API

Gradle顯然沒法知足全部企業級構建的全部要求,可是能夠經過Hook Gradle的生命週期,來監控和配置構建腳本。

3.8 社區的支持和推進

Gradle是一個開源的項目,它遵循了Apache License 2.0協議。Gradle的優良特性吸引了不少開發者並造成了Gradle社區,不少開源軟件開發者爲Gradle的核心代碼作出了共享。

4.總結

本篇文章從項目自動化開始講起,介紹了經常使用的構建工具:Ant、Gant和Maven,最後介紹了Gradle的特性,這些特性和其餘競爭的構建工具相比有着很大的優點和吸引力,這也是爲何咱們如今要用Gradle的緣由。

感謝
《實戰Gradle》
《Android Gradle權威指南》
technologyconversations.com/2014/06/18/…
www.w3cschool.cn/gradle/6qo5…
blog.csdn.net/singwhatiwa…
www.w3cschool.cn/ant/
wiki.jikexueyuan.com/project/mav…
www.raychase.net/863
blog.csdn.net/coloriy/art…


這裏不只分享Android、Java和移動前端相關技術,還有行業動態、技術資訊、面經和我的感悟。

相關文章
相關標籤/搜索