又要開啓一個新系列了,這個系列咱們來學習Gradle,它是一個基於JVM的新一代構建工具,關於Gradle徹底能夠寫一本書,這個系列會針對Android開發來對Gradle的知識進行精簡講解。Gradle目前已經應用於多個Android開發的技術體系中,好比構建系統、插件化、熱修復和組件化等等,若是你不瞭解Gradle,那麼你對於上述技術體系的瞭解會大打折扣。爲了讓你們可以更好的學習Gradle,這篇文章不會介紹Gradle具體的技術細節,而是先介紹爲何如今要用Gradle?php
Gradle是一個構建工具,那麼爲何要用構建工具,這就須要先從項目自動化開始講起。 在咱們開發軟件時,會面臨類似的狀況就是,咱們須要去用IDE來進行編碼,當完成一些功能時會進行編譯、單元測試、打包等工做,這些工做都須要開發人員手動來實現。而通常的軟件都是迭代式開發的,一個版本接着一本版本,每一個版本又可能有不少的功能,若是開發每次實現功能時都須要手動的進行編譯、單元測試和打包等工做,那顯然會很是耗時並且也容易出現問題,所以項目自動化應運而生,它有如下優勢:html
構建工具用於實現項目自動化,是一種可編程的工具,你能夠用代碼來控制構建流程最終生成可交付的軟件。構建工具能夠幫助你建立一個重複的、可靠的、無需手動介入的、不依賴於特定操做系統和IDE的構建。這麼說可能有些抽象,這裏拿APK的構建過程來舉例。前端
APK的構建過程能夠根據官方提供的流程圖以下圖所示。 java
這個APK構建的過程主要分爲如下幾步:apache
從以上步驟能夠看出,APK的構建過程是比較繁瑣的,並且這個構建過程又是時常重複的,若是沒有構建工具,手動去完成構建工做,無疑對於開發人員是個折磨,也會產生諸多的問題,致使項目開發週期變長。 在Gradle出現以前,有三個基於Java的構建工具:Ant、Gant和Maven,它們被應用於Java或者Android開發中,咱們來看看它們都有什麼特色。編程
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
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。
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的優勢:
Maven的缺點:
Gradle是一款基於JVM的專一於靈活性和性能的開源構建工具。
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與競爭對手不一樣的特性。
Gradle 有很是良好的拓展性。若是你想要在多個構建或者項目中分享可重用代碼,Gradle的插件會幫助你實現。將Gradle插件應用於你的項目中,它會在你的項目構建過程當中提供不少幫助:爲你的添加項目的依賴的第三方庫、爲你的項目添加有用的默認設置和約定(源代碼位置、單元測試代碼位置)。其中Android Gradle插件繼承Java Gradle插件,在本系列後續的文章會介紹插件的內容。
Ant和Maven的構建腳本是由XML來編寫的,若是XML邏輯複雜內容太多就不容易維護。Gradle可使用Groovy DSL來實現構建腳本,Groovy 是基於Jvm一種動態語言,它的語法和Java很是類似併兼容Java,所以你無需擔憂學習Groovy的成本。Groovy在Java的基礎上增長了不少動態類型和靈活的特性,比起XML,Gradle更具備表達性和可讀性。
Gradle提供了可配置的可靠的依賴管理方案。一旦依賴的庫被下載並存儲到本地緩存中,咱們的項目就可使用了。依賴管理很好的實現了在不一樣的平臺和機器上產生相同的構建結果。
Gradle能夠爲構建你的項目提供引導和默認值,若是你使用這種約定,你的Gradle構建腳本不會有幾行。比起Ant,Gradle不只僅提供了約定,還可讓你輕鬆的打破約定。
Gradle Wrapper是對Gradle 的包裝,它的做用是簡化Gradle自己的下載、安裝和構建,好比它會在咱們沒有安裝Gradle的狀況下,去下載指定版本的Gradle並進行構建。Gradle的版本不少,因此有可能出現版本兼容的問題,這時就須要Gradle Wrapper去統一Gradle的版本,避免開發團隊由於Gradle版本不一致而產生問題。
Gradle能夠和Ant、Maven和Ivy進行集成,好比咱們能夠把Ant的構建腳本導入到Gradle的構建中。
Gradle顯然沒法知足全部企業級構建的全部要求,可是能夠經過Hook Gradle的生命週期,來監控和配置構建腳本。
Gradle是一個開源的項目,它遵循了Apache License 2.0協議。Gradle的優良特性吸引了不少開發者並造成了Gradle社區,不少開源軟件開發者爲Gradle的核心代碼作出了共享。
本篇文章從項目自動化開始講起,介紹了經常使用的構建工具: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和移動前端相關技術,還有行業動態、技術資訊、面經和我的感悟。