本篇文章參考資料:
1、https://docs.gradle.org/current/userguide/userguide.html
2、《Gradle In Action》
3、《Gradle for Android》
構(gòu)建工具
一個(gè)可編程的工具,用來執(zhí)行一系列有序的任務(wù)來表達(dá)自動(dòng)化需求(編譯源代碼 -> 拷貝文件 -> 組裝構(gòu)建,當(dāng)然這些任務(wù)不是固定的,可能還有其他任務(wù))
熟悉Java開發(fā)的人員都知道,有幾個(gè)流行的Java構(gòu)建工具:Ant、Maven、Gradle。
Ant
Apache Ant(Apache Neat Tool)是一個(gè)用Java編寫的開源構(gòu)建工具。主要目的是在Java項(xiàng)目中為常用任務(wù)提供自動(dòng)化,比如:編譯源代碼、運(yùn)行單元測(cè)試、打包JAR文件、生成Javadoc文檔等。雖然Ant的核心是Java編寫的,但是build文件是通過XML表示的。
Maven
Apache Maven也是一個(gè)Java項(xiàng)目的構(gòu)建工具,Maven要求Maven基于構(gòu)建生命周期的思想,每個(gè)項(xiàng)目都確切的知道有哪些步驟去執(zhí)行構(gòu)建、打包、發(fā)布。和Ant不同Maven要求標(biāo)準(zhǔn)化的項(xiàng)目布局和統(tǒng)一構(gòu)建生命周期。
Gradle
Gradle是新一代的構(gòu)建工具,有幾個(gè)重要特性:方便和其他構(gòu)建工具集成、Groovy語言易接受方便擴(kuò)展、API強(qiáng)大、構(gòu)建腳本不像XML那樣更容易閱讀等等
Gradle構(gòu)建簡介
這里只是簡單介紹,更詳細(xì)的資料去(https://docs.gradle.org/current/userguide/userguide.html)這里看。
Gradle的幾個(gè)核心類型(主要從Android項(xiàng)目的角度)
Project:表示需要構(gòu)建的一個(gè)項(xiàng)目,類似Android項(xiàng)目的一個(gè)module,Project和build.gradle是一一對(duì)應(yīng)的。Project提供了一套api用來查看工程信息。
Task:對(duì)一個(gè)項(xiàng)目的構(gòu)建,就是對(duì)該項(xiàng)目中Task集合的運(yùn)行,每個(gè)Task執(zhí)行一些基本的工作,比如:編譯、運(yùn)行單元測(cè)試、壓縮成apk等
build.gradle:構(gòu)建腳本(相當(dāng)于maven的pom.xml)
gradle.properties:屬性文件,每個(gè)項(xiàng)目可以創(chuàng)建屬性文件也可以不創(chuàng)建。
setting.gradle:聲明所需的配置來實(shí)例化項(xiàng)目的層次結(jié)構(gòu)(意思就類似編譯整個(gè)大工程,需要包含哪些模塊一起編譯)
腳本的結(jié)構(gòu)
構(gòu)建腳本由若干語句和腳本塊組成,以一個(gè)簡單的Android項(xiàng)目為例說明(以下部分是從這里copy過來的(https://guides.gradle.org/building-android-apps/?_ga=2.120415560.152690407.1517379931-1154587000.1517379931))
創(chuàng)建一個(gè)新的Android Studio項(xiàng)目
下載并安裝Android Studio后,啟動(dòng)應(yīng)用程序。在歡迎界面中,點(diǎn)擊標(biāo)題為“開始一個(gè)新的Android Studio項(xiàng)目”的鏈接,如圖所示。準(zhǔn)備好后,單擊下一步。

在“創(chuàng)建Android項(xiàng)目”屏幕上,將應(yīng)用程序名稱設(shè)置為“HelloWorldGradle”,將公司域設(shè)置為您自己的域(在附圖中使用域gradle.org),并為項(xiàng)目位置選擇任何方便的目錄。然后點(diǎn)擊下一步。

在“Target Android Devices”屏幕上,選擇Phone and Tablet并從Minimum SDK下拉列表中選擇任何最近的API級(jí)別。該圖顯示了API 19,這是常見的,但所選的值不會(huì)影響本指南的其余部分。

在“添加活動(dòng)”屏幕上,選擇清空活動(dòng)并單擊下一步。
接受“配置活動(dòng)”屏幕上的所有默認(rèn)設(shè)置,然后單擊完成。

查看生成的Gradle文件列表
默認(rèn)情況下,Android Studio將以“Android”模式下的“項(xiàng)目視圖”開始,如下圖所示:

Android項(xiàng)目是Gradle多項(xiàng)目構(gòu)建,包含一個(gè)頂層build.gradle文件和一個(gè)子目錄app,并帶有自己的build.gradle文件。頂層構(gòu)建文件(Project: HelloWorldGradle)如圖所示,app構(gòu)建文件已(Module: app)附加到該文件中。
可能有兩個(gè)文件被調(diào)用gradle.properties。一個(gè)是本地項(xiàng)目。另一個(gè)只有gradle.properties在.gradle主目錄的子目錄中有全局文件的同名文件才存在。
settings.gradleGradle使用該文件來配置多項(xiàng)目構(gòu)建。它應(yīng)該由一行代碼組成:
include ':app'
這告訴Gradle app子目錄也是一個(gè)Gradle項(xiàng)目。如果在稍后的時(shí)間,您要通過可用的向?qū)ndroid庫添加到此項(xiàng)目中,則會(huì)創(chuàng)建另一個(gè)項(xiàng)目子目錄并將其添加到此文件中。
最后一個(gè)文件被調(diào)用gradle-wrapper.properties,它配置了所謂的Gradle Wrapper。這使您可以構(gòu)建Android項(xiàng)目,而無需首先安裝Gradle。該文件的內(nèi)容應(yīng)該類似于:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
前四行表示當(dāng)包裝首次運(yùn)行時(shí),它將下載Gradle發(fā)行版并將其存儲(chǔ)在主目錄.gradle/wrapper/dists中的目錄中。
最后一行distributionUrl是Gradle的下載地址。
查看頂層Gradle構(gòu)建文件
該項(xiàng)目build.gradle文件應(yīng)該有類似的內(nèi)容:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Gradle為構(gòu)建文件定義了一個(gè)特定于域的語言(DSL)。該buildscript標(biāo)簽是DSL的一部分。它告訴Gradle構(gòu)建需要的資源(第三方插件、依賴項(xiàng)等),并告訴Gradle在哪里找到它。在這種情況下,使用坐標(biāo)語法“group:name:version”指定所需的插件,其中的組是com.android.tools.build,名稱是gradle,版本是3.0.1。
當(dāng)Gradle第一次構(gòu)建這個(gè)項(xiàng)目時(shí),插件將被下載并緩存,所以這個(gè)任務(wù)只執(zhí)行一次。
該allprojects標(biāo)簽保存適用于頂層項(xiàng)目及其包含的任何子項(xiàng)目的配置細(xì)節(jié)。在這種情況下,該塊指定任何所需的相關(guān)性都應(yīng)當(dāng)從以下網(wǎng)站下載google,或jcenter在公共Bintray Artifactory的倉庫https://jcenter.bintray.com。
最后,構(gòu)建文件包含一個(gè)稱為的自定義(或臨時(shí))任務(wù)clean。它使用內(nèi)置的任務(wù)類型Delete,并對(duì)其進(jìn)行配置,該clean任務(wù)將刪除buildDir的rootProject。兩者都是項(xiàng)目屬性,其值默認(rèn)build為該應(yīng)用程序駐留的項(xiàng)目中的目錄。
檢查應(yīng)用程序模塊中的構(gòu)建文件
打開模塊中的build.gradle文件app。第一行是:
apply plugin: 'com.android.application'
這個(gè)“插件”(buildscript在頂級(jí)構(gòu)建文件的部分中提到)應(yīng)用到當(dāng)前項(xiàng)目。Gradle中的插件可以將自定義任務(wù),新配置,依賴關(guān)系和其他功能添加到Gradle項(xiàng)目中。在這種情況下,應(yīng)用Android插件會(huì)添加各種各樣的任務(wù),這些任務(wù)由android接下來顯示的塊配置。
android {
compileSdkVersion 26
defaultConfig {
applicationId "org.gradle.helloworldgradle"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
這些屬性比Gradle構(gòu)建系統(tǒng)更適合于Android,因此只能在這里對(duì)其進(jìn)行簡單的介紹。簡而言之:
在
compileSdkVersion與Android的SDK相關(guān)聯(lián),并應(yīng)始終是最新版本。該
defaultConfig部分擁有應(yīng)用程序的所有變體(構(gòu)建類型和產(chǎn)品風(fēng)格的組合)共享的屬性。這
applicationId是基于創(chuàng)建應(yīng)用程序時(shí)指定的域名和項(xiàng)目名稱,并且在Google Play商店中必須是唯一的。其價(jià)值
minSdkVersion是您愿意使用此應(yīng)用程序支持的最低Android API,并且targetSdkVersion應(yīng)該是最新的Android版本。versionCode在將新版本的應(yīng)用上傳到Google Play商店之前,值應(yīng)該是遞增的整數(shù)。這個(gè)值和applicationIdGoogle 一起告訴Google,這是一個(gè)現(xiàn)有應(yīng)用程序的新版本,而不是一個(gè)新的應(yīng)用程序。該
versionName值用于您自己的內(nèi)部版本跟蹤。該
testInstrumentationRunner屬性被配置為使用為Android應(yīng)用程序配置的JUnit 4測(cè)試運(yùn)行器。
在這部分下面是一個(gè)叫做的塊buildTypes。默認(rèn)情況下,Android應(yīng)用程序支持兩種構(gòu)建類型,debug而release。這部分可以讓你配置每個(gè)你喜歡的。這debug部分沒有在這里顯示,這意味著debug正在使用的所有默認(rèn)設(shè)置。
在android塊之后,有一個(gè)塊顯示用于這個(gè)應(yīng)用程序的庫。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
配置依賴關(guān)系是構(gòu)建Gradle應(yīng)用程序的基礎(chǔ)部分。在這種情況下,dependencies部分顯示的值implementation,testImplementation和androidTestImplementation配置。
先取最簡單的一個(gè),testImplementation依賴關(guān)系只包含最新的JUnit 4穩(wěn)定版本。JUnit類和測(cè)試注釋將在編譯時(shí)在src/test/java層次結(jié)構(gòu)中可用。
該androidTestImplementation依賴性是指咖啡的測(cè)試庫,用于Android應(yīng)用程序的集成測(cè)試。在這種情況下,Espresso在沒有support-annotations通常包含的庫的情況下被請(qǐng)求,因?yàn)橐呀?jīng)通過其他依賴包含了不同的版本。在后面的步驟中,您將看到如何找出該庫的版本以及原因。
最后,有三條線將依賴關(guān)系添加到implementation配置中:
第一個(gè),
fileTree(dir: 'libs', include: ['*.jar'])是一個(gè)fileTree依賴,它將文件libs夾中的所有jar文件添加到編譯類路徑中第二,
com.android.support:appcompat-v7:26.1.0將Android兼容性庫添加到項(xiàng)目中。這使您可以在SDK版本7以前的任何Android應(yīng)用程序中使用材質(zhì)設(shè)計(jì)主題和其他功能。第三,
com.android.support.constraint:constraint-layout:1.0.2將Android約束布局添加到項(xiàng)目中。這允許您在任何像SDK版本9一樣早的Android應(yīng)用程序中使用ConstraintLayout布局類。