Android --- Gradle是什么?
威哥學(xué)習(xí)Java寫了大半年的Android,今天打開項目,一直疑惑著項目里面這么多后綴.gradle,到底是干嘛的呢?汗顏啊!!!
所有網(wǎng)上總結(jié)了下,和初學(xué)Android的同學(xué)一起分享下。
首先我們的Android項目中會發(fā)現(xiàn)很多的后綴.gradle文件,如圖:
?
現(xiàn)在威哥先介紹下這些.gradle是啥東東。
Gradle官方定義:
Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構(gòu)建開源工具。它使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項目設(shè)置,拋棄了基于XML的各種繁瑣配置。
面向Java應(yīng)用為主。當前其支持的語言限于Java、Groovy、Kotlin和Scala,計劃未來將支持更多的語言。
在威哥看來,就是集 九陽真經(jīng),葵花寶典,六脈神劍,凌波微步 于大成者:如來神掌。
目錄
- Android工程中的Gradle
- 常用的Gradle Task
- 動態(tài)參數(shù)配置
- Project:build.gradle
- 全局屬性配置
- 整體結(jié)構(gòu)和描述
- Module: build.gradle
- defaucltConfig
- signConfigs
- buidlTypes
- sourceSets
- productFlavors
- compileOptions
- lintOptions
- build.gradle圖形化配置
- dependencies項目依賴
- 自定義方法def
- Gradle編譯提速優(yōu)化
- 性能檢測
- 禁用Task達到提速
- AAPT
- Gradle編譯優(yōu)化
- 認識Task
- 自定義Plugin
- build.gradle中直接定義
- 當前工程中定義
- 獨立Module自定義插件
Android工程中的Gradle
下面簡述對我們工程最重要的幾個Gradle文件,后續(xù)也會圍繞他們進行詳細講解和補充
(請仔細看代碼中的注釋哈)
- 工程Project 中的 build.gradle : 工程控制Gradle編譯配置
- 模塊module中的 build.gradle : 控制每個Module的編譯過程
- gradle.properties : gradle動態(tài)參數(shù)的配置文件
- local.properties : 本地的配置,如:SDK位置
- gradle-wrapper.properties :gradle本地代理,聲明了指向目錄和版本
- distributionUrl : 指定gradle版本不存在時,就從Value的地址中去下載。很多時候,我們只要版本換成我們本地存在的gradle版本就可以了
- settings.gradle : 配置Gradle中的Module管理
常用Gradle Task
- ~ 表示 gradlew
gradlew是包裝器,自動下載包裝里定義好的gradle 版本,保證編譯環(huán)境統(tǒng)一
gradle 是用本地的gradle - gradlew task -all : 羅列出所有Task ,同時攜帶具體作用和相互關(guān)系
- gradlew assembleDebug : 導(dǎo)出所有渠道測試包
- ~ assembleRelease : 導(dǎo)出所有渠道正式包
- ~ assembleBaiduDebug --stacktrace : 導(dǎo)出指定渠道測試包,同時攜帶異常信息
- ~ --stop : 立即停止編譯
- ~ check : 檢查任務(wù)
- ~ build : 執(zhí)行了 check和assemble
- ~ clean : 清除所有中間編譯結(jié)果
現(xiàn)在威哥和大家一起看看:為什么現(xiàn)在要用Gradle?
Gradle,它是一個基于JVM的新一代構(gòu)建工具,關(guān)于Gradle完全可以寫一本書,這個系列會針對Android開發(fā)來對Gradle的知識進行精簡講解。Gradle目前已經(jīng)應(yīng)用于多個Android開發(fā)的技術(shù)體系中,比如構(gòu)建系統(tǒng)、插件化、熱修復(fù)和組件化等等,如果你不了解Gradle,那么你對于上述技術(shù)體系的了解會大打折扣。為了讓大家能夠更好的學(xué)習(xí)Gradle,這篇文章不會介紹Gradle具體的技術(shù)細節(jié),而是先介紹為什么現(xiàn)在要用Gradle?
1.項目自動化
Gradle是一個構(gòu)建工具,那么為什么要用構(gòu)建工具,這就需要先從項目自動化開始講起。
在我們開發(fā)軟件時,會面臨相似的情況就是,我們需要去用IDE來進行編碼,當完成一些功能時會進行編譯、單元測試、打包等工作,這些工作都需要開發(fā)人員手動來實現(xiàn)。而一般的軟件都是迭代式開發(fā)的,一個版本接著一本版本,每個版本又可能有很多的功能,如果開發(fā)每次實現(xiàn)功能時都需要手動的進行編譯、單元測試和打包等工作,那顯然會非常耗時而且也容易出現(xiàn)問題,因此項目自動化應(yīng)運而生,它有以下優(yōu)點:
1. 它可以盡量防止開發(fā)手動介入從而節(jié)省了開發(fā)的時間并減少錯誤的發(fā)生。
2. 自動化可以自定義有序的步驟來完成代碼的編譯、測試和打包等工作,讓重復(fù)的步驟變得簡單。
3. IDE可能受到不同操作系統(tǒng)的限制,而自動化構(gòu)建是不會依賴于特定的操作系統(tǒng)和IDE的,具有平臺無關(guān)性。
2.構(gòu)建工具
構(gòu)建工具用于實現(xiàn)項目自動化,是一種可編程的工具,你可以用代碼來控制構(gòu)建流程最終生成可交付的軟件。構(gòu)建工具可以幫助你創(chuàng)建一個重復(fù)的、可靠的、無需手動介入的、不依賴于特定操作系統(tǒng)和IDE的構(gòu)建。這么說可能有些抽象,這里拿APK的構(gòu)建過程來舉例。
2.1 APK的構(gòu)建過程
APK的構(gòu)建過程可以根據(jù)官方提供的流程圖如下圖所示。
這個APK構(gòu)建的過程主要分為以下幾步:
1. 通過AAPT(Android Asset Packaging Tool)打包res資源文件,比如AndroidManifest.xml、xml布局文件等,并將這些xml文件編譯為二進制,其中assets和raw文件夾的文件不會被編譯為二進制,最終會生成R.java和resources.arsc文件。
2. AIDL工具會將所有的aidl接口轉(zhuǎn)化為對應(yīng)的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進行對齊操作,這樣應(yīng)用運行時會減少內(nèi)存的開銷。
從以上步驟可以看出,APK的構(gòu)建過程是比較繁瑣的,而且這個構(gòu)建過程又是時常重復(fù)的,如果沒有構(gòu)建工具,手動去完成構(gòu)建工作,無疑對于開發(fā)人員是個折磨,也會產(chǎn)生諸多的問題,導(dǎo)致項目開發(fā)周期變長。
在Gradle出現(xiàn)之前,有三個基于Java的構(gòu)建工具:Ant、Gant和Maven,它們被應(yīng)用于Java或者Android開發(fā)中,我們來看看它們都有什么特點。
2.2 Apache Ant
Ant在這里不是螞蟻的意思(雖然它的圖標是螞蟻),而是Another Neat Tool的意思。
它是由 James Duncan Davidson 開發(fā)的(Tomcat 最初的開發(fā)者),最初是用來構(gòu)建 Tomcat。在2000年,Ant成為一個獨立的項目并被發(fā)布出來。Ant 是由 Java 編寫的構(gòu)建工具,它的核心代碼是由Java編寫的,因此具有平臺無關(guān)性,構(gòu)建腳本是XML格式的(默認為bulid.xml),如果你熟悉XML,那么Ant 就比較容易上手。
Ant構(gòu)建腳本的樣式如下所示。
bulid.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的構(gòu)建腳本由三個基本元素組成:一個project(工程)、多個target(目標)和可用的task(任務(wù))。
Apache Ant有以下缺點:
1. Ant無法獲取運行時的信息。
2. XML作為構(gòu)建腳本的語言,如果構(gòu)建邏輯復(fù)雜,那么構(gòu)建腳本就會又長又難以維護。
3. Ant需要配合Ivy(一種管理項目依賴工具),否則Ant很難管理依賴。
4. Ant在如何組織項目結(jié)構(gòu)方面沒有給出任何指導(dǎo),這導(dǎo)致Ant雖然靈活性高,但這樣的靈活導(dǎo)致每個構(gòu)建腳本都是唯一的而且很難被理解。
2.3 Gant
Gant 是一個基于Ant 的構(gòu)建工具,它在Ant的基礎(chǔ)上用Groovy寫的DSL(領(lǐng)域特定語言)。如果用Ant 實現(xiàn)構(gòu)建,但是不喜歡用XML來編寫構(gòu)建腳本或者現(xiàn)有的XML構(gòu)建腳本很難維護和管理,那么Gant 是一個不錯的選擇。
Gant構(gòu)建文件的樣式如下所示。
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年發(fā)布,它的目標是改進開發(fā)人員在使用Ant時面臨的一些問題。Maven最初是為了簡化Jakarta Turbine項目的構(gòu)建,它經(jīng)歷了Maven到Maven3的發(fā)展,Maven作為后來者, 繼承了Ant的項目構(gòu)建功能, 同樣采用了XML作為構(gòu)建腳本的格式。Maven具有依賴管理和項目管理的功能,提供了中央倉庫,能幫助我們自動下載庫文件。
Maven的構(gòu)建腳本的樣式如下所示。
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的優(yōu)點:
1. Ant是過程式的,開發(fā)者需要顯示的指定每個目標,以及完成該目標鎖需要執(zhí)行的任務(wù)。每一個項目,開發(fā)著都需要重新編寫這一過程,這樣會產(chǎn)生大量的重復(fù)。Maven是聲明式的,項目的構(gòu)建過程和過程中的各個階段都由插件實現(xiàn),開發(fā)者只需要聲明項目的基本元素就可以了,這很大程度消除了重復(fù)。
2. Ant本身是沒有依賴管理,需要配合Ivy來管理依賴,而Maven本身就提供了依賴管理。
3. Maven 使用約定而不是配置,它為工程提供了合理的默認行為,項目會知道去哪個目錄尋找源代碼以及構(gòu)建運行時有那些任務(wù)去執(zhí)行,如果你的項目遵從默認值,那么只需要寫幾行XML配置腳本就可以了。而Ant是使用配置且沒有默認行為的。
Maven的缺點:
1. Maven的提供了默認的結(jié)構(gòu)和生命周期,這些可能不適合你的項目需求。
2. 為Maven寫定制的擴展過于累贅。
3. Maven的中央倉庫比較混亂,當無法從中央倉庫中得到需要的類庫時,我們可以手工下載復(fù)制到本地倉庫中,也可以建立組織內(nèi)部的倉庫服務(wù)器。
4. 國內(nèi)連接Maven的中央倉庫比較慢,需要連接國內(nèi)的Maven鏡像倉庫。
5. Maven缺乏文檔,不便于使用和理解。
3.Gradle的特性
Gradle是一款基于JVM的專注于靈活性和性能的開源構(gòu)建工具。
從上圖可以看出,Gradle結(jié)合Ant和Maven等構(gòu)建工具的最佳特性。它有著約定優(yōu)于配置的方法、強大的依賴管理,它的構(gòu)建腳本使用Groovy或Kotlin DSL編寫,是Android的官方構(gòu)建工具。Gradle的構(gòu)建腳本的樣式如下所示。
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編寫構(gòu)建腳本代碼量更少,可讀性更強。
下面列出Gradle與競爭對手不同的特性。
3.1 輕松的可拓展性
Gradle 有非常良好的拓展性。如果你想要在多個構(gòu)建或者項目中分享可重用代碼,Gradle的插件會幫助你實現(xiàn)。將Gradle插件應(yīng)用于你的項目中,它會在你的項目構(gòu)建過程中提供很多幫助:為你的添加項目的依賴的第三方庫、為你的項目添加有用的默認設(shè)置和約定(源代碼位置、單元測試代碼位置)。其中Android Gradle插件繼承Java Gradle插件,在本系列后續(xù)的文章會介紹插件的內(nèi)容。
3.2 采用了Groovy
Ant和Maven的構(gòu)建腳本是由XML來編寫的,如果XML邏輯復(fù)雜內(nèi)容太多就不容易維護。Gradle可以使用Groovy DSL來實現(xiàn)構(gòu)建腳本,Groovy 是基于Jvm一種動態(tài)語言,它的語法和Java非常相似并兼容Java,因此你無需擔心學(xué)習(xí)Groovy的成本。Groovy在Java的基礎(chǔ)上增加了很多動態(tài)類型和靈活的特性,比起XML,Gradle更具有表達性和可讀性。
3.3 強大的依賴管理
Gradle提供了可配置的可靠的依賴管理方案。一旦依賴的庫被下載并存儲到本地緩存中,我們的項目就可以使用了。依賴管理很好的實現(xiàn)了在不同的平臺和機器上產(chǎn)生相同的構(gòu)建結(jié)果。
3.4 靈活的約定
Gradle可以為構(gòu)建你的項目提供引導(dǎo)和默認值,如果你使用這種約定,你的Gradle構(gòu)建腳本不會有幾行。比起Ant,Gradle不僅僅提供了約定,還可以讓你輕松的打破約定。
3.5 Gradle Wrapper
Gradle Wrapper是對Gradle 的包裝,它的作用是簡化Gradle本身的下載、安裝和構(gòu)建,比如它會在我們沒有安裝Gradle的情況下,去下載指定版本的Gradle并進行構(gòu)建。Gradle的版本很多,所以有可能出現(xiàn)版本兼容的問題,這時就需要Gradle Wrapper去統(tǒng)一Gradle的版本,避免開發(fā)團隊因為Gradle版本不一致而產(chǎn)生問題。
3.6 可以和其他構(gòu)建工具集成
Gradle可以和Ant、Maven和Ivy進行集成,比如我們可以把Ant的構(gòu)建腳本導(dǎo)入到Gradle的構(gòu)建中。
3.7 底層API
Gradle顯然無法滿足所有企業(yè)級構(gòu)建的所有要求,但是可以通過Hook Gradle的生命周期,來監(jiān)控和配置構(gòu)建腳本。
3.8 社區(qū)的支持和推動
Gradle是一個開源的項目,它遵循了Apache License 2.0協(xié)議。Gradle的優(yōu)良特性吸引了很多開發(fā)者并形成了Gradle社區(qū),很多開源軟件開發(fā)者為Gradle的核心代碼做出了共享。
?
總結(jié)
以上是生活随笔為你收集整理的Android --- Gradle是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android --- SDK 和 AP
- 下一篇: Android --- .gradle文