Gradle在Android工程中的運(yùn)用

本篇文章參考資料:
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)備好后,單擊下一步。

歡迎來到Android Studio

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

創(chuàng)建新項(xiàng)目

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

目標(biāo)Android設(shè)備

在“添加活動(dòng)”屏幕上,選擇清空活動(dòng)并單擊下一步。

接受“配置活動(dòng)”屏幕上的所有默認(rèn)設(shè)置,然后單擊完成。

配置活動(dòng)

查看生成的Gradle文件列表

默認(rèn)情況下,Android Studio將以“Android”模式下的“項(xiàng)目視圖”開始,如下圖所示:

項(xiàng)目查看Android

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ù)將刪除buildDirrootProject。兩者都是項(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)建類型,debugrelease。這部分可以讓你配置每個(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,testImplementationandroidTestImplementation配置。

先取最簡單的一個(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布局類。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評(píng)論 19 139
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,373評(píng)論 8 72
  • 1.構(gòu)建Android應(yīng)用程序的Gradle。1.1 使用Gradle Android應(yīng)用程序。默認(rèn)情況下,A...
    Cfvdjnl閱讀 1,221評(píng)論 1 2
  • 今天在和安安,瑤瑤等小伙伴們一起玩烏賊抓美人魚的游戲時(shí),老師扮演烏賊抓住了瑤瑤美人魚,在吃掉她之前,問了在旁邊的美...
    云光帥哥閱讀 263評(píng)論 0 0

友情鏈接更多精彩內(nèi)容