Gradle學(xué)習(xí)筆記(一)基本配置

簡(jiǎn)介

Gradle構(gòu)建腳本的書寫沒有基于傳統(tǒng)的XML文件,而是基于Groovy的領(lǐng)域?qū)S谜Z言(DSL)。Groovy是一種基于Java虛擬機(jī)的動(dòng)態(tài)語言。Gradle團(tuán)隊(duì)認(rèn)為,基于動(dòng)態(tài)語言的DSL語言與Ant或者任何基于XML的構(gòu)建系統(tǒng)相比,優(yōu)勢(shì)都十分顯著。

一、Gradle基礎(chǔ)

1、構(gòu)建生命周期

一個(gè)Gradle的構(gòu)建通常有如下三個(gè)階段。

  • 初始化:項(xiàng)目實(shí)例會(huì)在該階段被創(chuàng)建。如果一個(gè)項(xiàng)目有多個(gè)模塊,并且每一個(gè)模塊都有其對(duì)應(yīng)的build.gradle文件,那么就會(huì)創(chuàng)建多個(gè)項(xiàng)目實(shí)例。
  • 配置:在該階段,構(gòu)建腳本會(huì)被執(zhí)行,并為每個(gè)項(xiàng)目實(shí)例創(chuàng)建和配置任務(wù)。
  • 執(zhí)行:在該階段,Gradle將決定哪個(gè)任務(wù)會(huì)被執(zhí)行。哪些任務(wù)被執(zhí)行取決于開始該次構(gòu)建的參數(shù)配置和該Gradle文件的當(dāng)前目錄。

2、構(gòu)建配置文件

Android的構(gòu)建文件中,有一些元素是必需的:

buildscript {
    repositories {
        jcenter()
      }
    dependencies {
        classpath'com.android.tools.build:gradle:3.0.1'
    }
}

構(gòu)建腳本代碼塊在Android構(gòu)建工具上定義了一個(gè)依賴,就像Maven的artifact。這就是Android插件的來源,Android插件提供了構(gòu)建和測(cè)試應(yīng)用所需要的一切。每一個(gè)Android項(xiàng)目都應(yīng)該申請(qǐng)?jiān)摬寮?/p>

apply plugin: 'com.android.application'

如果你正在構(gòu)建一個(gè)依賴庫,那么你需要聲明'com.android.library',而不是‘com.android.application’。你不能在一個(gè)模塊中同時(shí)使用它們,因?yàn)檫@會(huì)導(dǎo)致構(gòu)建錯(cuò)誤。一個(gè)模塊可以是一個(gè)Android應(yīng)用模塊,或者是一個(gè)Android依賴模塊,但不能二者都是。

3、運(yùn)行基本構(gòu)建任務(wù)

使用terminal或命令提示符,可以導(dǎo)航到項(xiàng)目根目錄,運(yùn)行帶有tasks的GradleWrapper命令:

$ gradlew tasks

這將打印出所有可用的任務(wù)列表。如果你添加了--all參數(shù),那么你將獲得每個(gè)任務(wù)對(duì)應(yīng)依賴的詳細(xì)介紹。

$ gradlew assembleDebug

這個(gè)任務(wù)會(huì)為這個(gè)應(yīng)用創(chuàng)建一個(gè)debug版本的APK。

除了assemble外,還有其他三個(gè)基本任務(wù)。

  • Check:運(yùn)行所有的檢查,這通常意味著在一個(gè)連接的設(shè)備或模擬器上運(yùn)行測(cè)試。
  • Build:觸發(fā)assemble和check。
  • Clean:清除項(xiàng)目的輸出。

二、認(rèn)識(shí)Gradle文件

1、Settings.gradle文件

對(duì)于一個(gè)只包含一個(gè)Android應(yīng)用的新項(xiàng)目來說,settings.gradle應(yīng)該是這樣的:

Include ':app'

settings文件在初始化階段被執(zhí)行,并且定義了哪些模塊應(yīng)該包含在構(gòu)建內(nèi)。在本例中,app模塊被包含在內(nèi)。單模塊項(xiàng)目并不一定需要setting文件,但是多模塊項(xiàng)目必須要有setting文件,否則,Gradle不知道哪個(gè)模塊應(yīng)包含在構(gòu)建內(nèi)。

2、Project級(jí)別的build.gradle文件

默認(rèn)情況下其包含如下兩個(gè)代碼塊:

buildscript {           //實(shí)際構(gòu)建配置代碼塊
    ext.kotlin_version = '1.2.10'
    repositories {      //依賴倉庫,每個(gè)倉庫意味著一系列的依賴包
        jcenter()          //JCenter是一個(gè)很有名的Maven庫
        mavenCentral()
        maven { url 'https://maven.google.com' }
        google()
    }
    dependencies {    //配置構(gòu)建過程中的依賴包
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {          //聲明那些需要被用于所有模塊的屬性,甚至可以在allprojects中創(chuàng)建task,這些任務(wù)最終被運(yùn)用到所有Module
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
        google()
    }
}

請(qǐng)注意,只要你使用了allprojects,模塊就會(huì)被耦合到項(xiàng)目。這意味著,其很可能在沒有主項(xiàng)目構(gòu)建文件的情況下,無法獨(dú)立構(gòu)建模塊。最初,這看起來可能不是一個(gè)問題,但是如果你后面想要分離一個(gè)內(nèi)部依賴庫到自己的項(xiàng)目,那么你將需要重構(gòu)你的構(gòu)建文件。

3、Module級(jí)別的build.gradle文件

Module層的build.gradle文件的屬性只能應(yīng)用在Androidapp模塊,它可以覆蓋Project層build.gradle文件的任何屬性。

apply plugin: 'com.android.application'
android {
    compileSdkVersion 25
    buildToolsVersion '25.0.3'

    defaultConfig {
        applicationId "com.qingmei2.gradle.demo"
        minSdkVersion 14
        targetSdkVersion 22
        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile 'com.android.support:multidex:1.0.1'
}

記錄以下三點(diǎn):

插件

第一行用到了Android應(yīng)用插件,谷歌的Android工具團(tuán)隊(duì)負(fù)責(zé)Android插件的編寫和維護(hù),并提供構(gòu)建、測(cè)試和打包Android應(yīng)用以及依賴項(xiàng)目的所有任務(wù)。

Android

  • compileSdkVersion(必須):編譯應(yīng)用Android API的版本

  • buildToolsVersion(必須):構(gòu)建工具及編譯器的版本號(hào)

  • applicationId

該屬性覆蓋了manifest文件中的packagename,但applicationId和packagename有一些不同。在Gradle被用作默認(rèn)的Android構(gòu)建系統(tǒng)之前,AndroidManifest.xml中的packagename有兩個(gè)用途:作為一個(gè)應(yīng)用的唯一標(biāo)志,以及在R資源類中被用作包名。使用構(gòu)建variants,Gradle可更容易地創(chuàng)建不同版本的應(yīng)用。

  • minSdkVersion 應(yīng)用最小API級(jí)別
  • targetSdkVersion

targetSdkVersion用于通知系統(tǒng),該應(yīng)用已經(jīng)在某特定Android版本通過測(cè)試,從而操作系統(tǒng)不必啟用任何向前兼容的行為。

Dependencies

定義依賴包

?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,324評(píng)論 25 708
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,372評(píng)論 8 72
  • 轉(zhuǎn)載注明出處:http://m.itdecent.cn/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,754評(píng)論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 咖啡,煙草,甚至戀愛都不曾給過的安慰,讓一勺豆豉牛肉打開心扉一發(fā)不可收拾……忘不了,放不下……
    佰鹽佰味閱讀 302評(píng)論 1 0

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