轉(zhuǎn)載 Gradle基礎(chǔ)

原文地址

作為Android開發(fā)你必須明白的Gradle基礎(chǔ)

作為一個(gè)Android開發(fā)程序員蹬挤,如果你的build.gradle都只能靠IDE生成或者從別的項(xiàng)目中復(fù)制粘貼來完成,那么你該好好的看完這篇文章,掌握一下你不知道的Gradle基礎(chǔ)运吓。

文中的圖片均來自于網(wǎng)絡(luò)演闭,侵刪

Gradle是一個(gè)基于JVM的構(gòu)建工具肤晓,目前Android Studio中建立的工程都是基于gradle進(jìn)行構(gòu)建的耀盗。Gradle的與其他構(gòu)建工具(ant、maven)的特性主要包括:

  • 強(qiáng)大的DSL和豐富的gradle的API
  • gradle就是groovy
  • 強(qiáng)大的依賴管理
  • 可拓展性
  • 與其他構(gòu)建工具的集成

三種構(gòu)建腳本

Gradle的腳本都是配置型腳本房匆。每一種腳本類型實(shí)際上都是某個(gè)具體的gradle的API中的類對(duì)象的委托耸成,腳本執(zhí)行對(duì)應(yīng)的其實(shí)是其委托的對(duì)象的配置。在一個(gè)完整的gradle的構(gòu)建體系中浴鸿,總共有三種類型的構(gòu)建腳本井氢,同時(shí)也分別對(duì)應(yīng)著三種委托對(duì)象

腳本類型 委托對(duì)象
Init script Gradle
Settings script Settings
Build script Project

init.gradle

對(duì)應(yīng)的就是上面的Init script,實(shí)際上就是Gradle對(duì)象的委托岳链,所以在這個(gè)init 腳本中調(diào)用的任何屬性引用以及方法花竞,都會(huì)委托給這個(gè) Gradle 實(shí)例。

Init script的執(zhí)行發(fā)生在構(gòu)建開始之前掸哑,也是整個(gè)構(gòu)建最早的一步约急。

配置Init scrip的依賴

每個(gè)腳本的執(zhí)行都可以配置當(dāng)前腳本本身執(zhí)行所需要的依賴項(xiàng)。Init scrip的配置如下:

// initscript配置塊包含的內(nèi)容就是指當(dāng)前腳本本身的執(zhí)行所需要的配置
// 我們可以在其中配置比如依賴路徑等等
initscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'
    }
}

使用Init scrip

要使用一個(gè)定義好的Init scrip苗分,主要有以下幾個(gè)方式

  • 在執(zhí)行g(shù)radle命令的時(shí)候厌蔽,通過-I--init-script命令選項(xiàng)指定腳本的路徑

    這種方式可以針對(duì)具體的一次構(gòu)建。

  • 把一個(gè)init.gradle文件放到 *USER_HOME*/.gradle/ 目錄

  • 把一個(gè)文件名以.gradle結(jié)尾的文件放到Gradle 分發(fā)包*GRADLE_HOME*/init.d/ 目錄內(nèi)

    以上的兩種方式是全局的摔癣,對(duì)機(jī)器內(nèi)的構(gòu)建都會(huì)起作用

settings.gradle

對(duì)應(yīng)的是Settings script腳本類型奴饮,是Settings對(duì)象的委托。在 腳本中調(diào)用的任何屬性引用以及方法供填,都會(huì)委托給這個(gè) Settings 實(shí)例拐云。

Settings script的執(zhí)行發(fā)生在gradle的構(gòu)建生命周期中的初始化階段罢猪。Settings腳本文件中聲明了構(gòu)建所需要的配置近她,并用以實(shí)例化項(xiàng)目的層次結(jié)構(gòu)。在執(zhí)行settings腳本并初始化Settings對(duì)象實(shí)例的時(shí)候膳帕,會(huì)自動(dòng)的構(gòu)建一個(gè)根項(xiàng)目對(duì)象rootProject并參與到整個(gè)構(gòu)建當(dāng)中粘捎。(rootProject默認(rèn)的名稱就是其文件夾的名稱,其路徑就是包含setting腳本文件的路徑)危彩。

下面是一張關(guān)于Settings對(duì)象的類圖:

image.png

每一個(gè)通過include方法被添加進(jìn)構(gòu)建過程的project對(duì)象攒磨,都會(huì)在settings腳本中創(chuàng)造一個(gè)ProjectDescriptor的對(duì)象實(shí)例。

因此汤徽,在settings的腳本文件中娩缰,我們可以訪問使用的對(duì)象包括:

  • Settings對(duì)象
  • Gradle對(duì)象
  • ProjectDescriptor對(duì)象

獲取settings文件

在gradle中,只要根項(xiàng)目/任何子項(xiàng)目的目錄中包含有構(gòu)件文件谒府,那么就可以在相應(yīng)的位置運(yùn)行構(gòu)建拼坎。而判斷一個(gè)構(gòu)建是否是多項(xiàng)目的構(gòu)建浮毯,則是通過尋找settings腳本文件,因?yàn)樗甘玖俗禹?xiàng)目是否包含在多項(xiàng)目的構(gòu)建中泰鸡。

查找settings文件的步驟如下:

  1. 在與當(dāng)前目錄同層次的master目錄中搜索setting文件
  2. 如果在1中沒有找到settings文件债蓝,則從當(dāng)前目錄開始在父目錄中查找settings文件。

當(dāng)找到settings文件并且文件定義中包含了當(dāng)前目錄盛龄,則當(dāng)前目錄就會(huì)被認(rèn)為是多項(xiàng)目的構(gòu)建中的一部分饰迹。

build.gradle

對(duì)應(yīng)的就是前面提到的Build script腳本類型,是gradle中Project對(duì)象的委托余舶。在腳本中調(diào)用的任何屬性引用以及方法啊鸭,都會(huì)委托給這個(gè) Project 實(shí)例。

配置腳本依賴

在build.gradle文件中有一個(gè)配置塊buildScipt{}是用于配置當(dāng)前腳本執(zhí)行所需的路徑配置等的(與initScript形似)欧芽。

buildscript {
    // 這里的repositories配置塊要與Project實(shí)例當(dāng)中的repositories區(qū)分開來
    // 這里的repositories配置是指腳本本身依賴的倉庫源莉掂,其委托的對(duì)象實(shí)際上是ScriptHandler
    repositories {
        mavenLocal()
        google()
        jcenter()
    }
    // 與前面的repositories配置塊相同,也要與Project當(dāng)中的dependencies配置塊區(qū)分開來
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
    }
}

這里補(bǔ)充關(guān)鍵的一點(diǎn)千扔,在build.gradle文件中憎妙,不管buildScript{}配置塊被放在哪個(gè)位置,它總是整個(gè)腳本文件中最先被執(zhí)行的

三個(gè)構(gòu)建塊

每個(gè)gradle構(gòu)建都包含三個(gè)基本的構(gòu)件塊:

  • project
  • task
  • property

每個(gè)構(gòu)建包含至少一個(gè)project曲楚,進(jìn)而又包含一個(gè)或者多個(gè)task厘唾。project和task暴露的屬性(property)可以用來控制構(gòu)建。

Project

我們對(duì)project的理解更多來源于項(xiàng)目目錄中的build.gradle文件(因?yàn)樗鋵?shí)就是project對(duì)象的委托)龙誊。Project對(duì)象的類圖如下所示:

image.png

項(xiàng)目配置

在build.gradle腳本文件中抚垃,我們不僅可以對(duì)單獨(dú)project進(jìn)行配置,也可以定義project塊的共有邏輯等趟大,參考下面的定義鹤树。


image.png

常見的例子比如:

// 為所有項(xiàng)目添加倉庫源配置
allprojects {
    repositories {
        jcenter()
        google()
    }
}
// 為所有子項(xiàng)目添加mavenPublish的配置塊
subprojects {
    mavenPublish {
        groupId = maven.config.groupId
        releaseRepo = maven.config.releaseRepo
        snapshotRepo = maven.config.snapshotRepo
    }
}

Task

任務(wù)是gradle構(gòu)建的基礎(chǔ)配置塊之一,gradle的構(gòu)建的執(zhí)行就是task的執(zhí)行逊朽。下面是task的類圖罕伯。

image.png

task的配置和動(dòng)作

當(dāng)我們定一個(gè)一個(gè)task的時(shí)候,會(huì)包含配置和動(dòng)作兩部分的內(nèi)容叽讳。比如下面的代碼示例:

task test{
    println("這是配置")

    doFirst{
        // do something here
    }
    doLast(){
        // do something here
    }
}

目前task的動(dòng)作(action)聲明主要包含兩個(gè)方法:

  • doFirst
  • doLast

這些動(dòng)作是在gradle的構(gòu)建生命周期中的執(zhí)行階段被調(diào)用追他。值得注意的是,一個(gè)task可以聲明多個(gè)doFirstdoLast動(dòng)作岛蚤。也可以為一些已有的插件中定義的task添加動(dòng)作邑狸。比如:

// 為test任務(wù)添加一個(gè)doLast的動(dòng)作
test.doLast{
    // do something here
}

在task的定義之中,除了動(dòng)作塊以外的是配置塊涤妒,我們可以聲明變量单雾、訪問屬性、調(diào)用方法等等。這些配置塊的內(nèi)容發(fā)生在gradle的構(gòu)建生命周期中的配置階段硅堆。因此task中的配置每次都會(huì)被執(zhí)行蜂奸。(動(dòng)作塊只有在實(shí)際發(fā)生task的調(diào)用的時(shí)候才會(huì)執(zhí)行)。

task的依賴

gradle中任務(wù)的執(zhí)行順序是不確定的硬萍。通過task之間的依賴關(guān)系扩所,gradle能夠確保所依賴的task會(huì)被當(dāng)前的task先執(zhí)行。使用task的dependsOn()方法朴乖,允許我們?yōu)閠ask聲明一個(gè)或者多個(gè)task依賴祖屏。

task first{
    doLast{
        println("first")
    }
}

task second{
    doLast{
        println("second")
    }
}

task third{
    doLast{
        println("third")
    }
}

task test(dependsOn:[second,first]){
    doLast{
        println("first")
    }
}

third.dependsOn(test)

task的類型

默認(rèn)情況下,我們常見的task都是org.gradle.api.DefaultTask類型买羞。但是在gradle當(dāng)中有相當(dāng)豐富的task類型我們可以直接使用袁勺。要更改task的類型,我們可以參考下面的示例

task createDistribution(type:Zip){

}

更多關(guān)于task的類型畜普,可以參考gradle的官方文檔

Property

屬性是貫穿在gradle構(gòu)建始終的期丰,用于幫助控制構(gòu)建邏輯的存在。gradle中聲明屬性主要有以下兩種方式:

  • 使用ext命名空間定義拓展屬性
  • 使用gradle屬性文件gradle.properties定義屬性

ext命名空間

Gradle中很多模型類都提供了特別的屬性支持吃挑,比如Project.在gradle內(nèi)部钝荡,這些屬性會(huì)以鍵值對(duì)的形式存儲(chǔ)。使用ext命名空間舶衬,我們可以方便的添加屬性埠通。下面的方式都是支持的:

//在project中添加一個(gè)名為groupId的屬性
project.ext.groupId="tech.easily"
// 使用ext塊添加屬性
ext{
    artifactId='EasyDependency'
    config=[
            key:'value'
    ]
}

值得注意的是,只有在聲明屬性的時(shí)候我們需要使用ext命名空間逛犹,在使用屬性的時(shí)候端辱,ext命名空間是可以省略的。

屬性文件

正如我們經(jīng)常在Android項(xiàng)目中看到的虽画,我們可以在項(xiàng)目的根目錄下新建一個(gè)gradle.properties文件舞蔽,并在文件中定義簡(jiǎn)單的鍵值對(duì)形式的屬性。這些屬性能夠被項(xiàng)目中的gradle腳本所訪問码撰。如下所示:

# gradle.properties
# 注意文件的注釋是以#開頭的
groupId=tech.easily
artifactId=EasyDependency

有的時(shí)候渗柿,我們可能需要在代碼中動(dòng)態(tài)的創(chuàng)建屬性文件并讀取文件中的屬性(比如自定義插件的時(shí)候),我們可以使用java.util.Properties類灸拍。比如:

void createPropertyFile() {
    def localPropFile = new File(it.projectDir.absolutePath + "/local.properties")
    def defaultProps = new Properties()
    if (!localPropFile.exists()) {
        localPropFile.createNewFile()
        defaultProps.setProperty("debuggable", 'true')
        defaultProps.setProperty("groupId", GROUP)
        defaultProps.setProperty("artifactId", project.name)
        defaultProps.setProperty("versionName", VERSION_NAME)
        defaultProps.store(new FileWriter(localPropFile), "properties auto generated for resolve dependencies")
    } else {
        localPropFile.withInputStream { stream ->
            defaultProps.load(stream)
        }
    }
}

關(guān)于屬性很重要的一點(diǎn)是屬性是可以繼承的做祝。在一個(gè)項(xiàng)目中定義的屬性會(huì)自動(dòng)的被其子項(xiàng)目繼承砾省,不管我們是用以上哪種方式添加屬性都是適用的鸡岗。

構(gòu)建生命周期

前面提及到了gradle中多種腳本類型,并且他們都在不同的生命周期中被執(zhí)行编兄。

三個(gè)階段

在gradle構(gòu)建中轩性,構(gòu)建的生命周期主要包括以下三個(gè)階段:

  • 初始化(Initialization)

    如前文所述队询,在這個(gè)階段,settings腳本會(huì)被執(zhí)行蛉签,從而Gradle會(huì)確認(rèn)哪些項(xiàng)目會(huì)參與構(gòu)建拒迅。然后為每一個(gè)項(xiàng)目創(chuàng)建 Project 對(duì)象。

  • 配置(Configuration)

    配置 Initialization 階段創(chuàng)建的Project 對(duì)象卸察,所有的配置腳本都會(huì)被執(zhí)行脯厨。(包括Project中定義的task的配置塊也都會(huì)被執(zhí)行)

  • 執(zhí)行(Configuration)

    這個(gè)階段Gradle會(huì)確認(rèn)哪些在 Configuration 階段創(chuàng)建和配置的 Task 會(huì)被執(zhí)行,哪些 Task會(huì)被執(zhí)行取決于gradle命令的參數(shù)以及當(dāng)前的目錄坑质,確認(rèn)之后便會(huì)執(zhí)行

監(jiān)聽生命周期

在gradle的構(gòu)建過程中合武,gradle為我們提供了非常豐富的鉤子,幫助我們針對(duì)項(xiàng)目的需求定制構(gòu)建的邏輯涡扼,如下圖所示:

image.png

要監(jiān)聽這些生命周期稼跳,主要有兩種方式:

  • 添加監(jiān)聽器
  • 使用鉤子的配置塊

關(guān)于可用的鉤子可以參考GradleProject中的定義,常用的鉤子包括:

Gradle

  • beforeProject()/afterProject()

    等同于Project中的beforeEvaluateafterEvaluate

  • settingsEvaluated()

    settings腳本被執(zhí)行完畢吃沪,Settings對(duì)象配置完畢

  • projectsLoaded()

    所有參與構(gòu)建的項(xiàng)目都從settings中創(chuàng)建完畢

  • projectsEvaluated()

    所有參與構(gòu)建的項(xiàng)目都已經(jīng)被評(píng)估完

TaskExecutionGraph

  • whenReady()

    task圖生成汤善。所有需要被執(zhí)行的task已經(jīng)task之間的依賴關(guān)系都已經(jīng)確立

Project

  • beforeEvaluate()
  • afterEvaluate()

依賴管理

在前面提及的Gradle的主要特性之中,其中的一點(diǎn)就是強(qiáng)大的依賴管理票彪。Gradle中具備豐富的依賴類型红淡,兼容多種依賴倉庫。同時(shí)Gradle中的每一項(xiàng)依賴都是基于特定的范圍(scope)進(jìn)行分組管理的降铸。

在gradle中添加為項(xiàng)目添加依賴的方式如下所示:

// build.gradle

// 添加依賴倉庫源
repositories {
    google()
    mavenCentral()
}
// 添加依賴
// 依賴類型包括:文件依賴锉屈、項(xiàng)目依賴、模塊依賴
dependencies {
    // local dependencies.
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ...
}

四種依賴類型

Gradle中的依賴類型有四類:

  • 模塊依賴

    這是gradle中比較常見的依賴類型垮耳, 它通常指向倉庫中的一個(gè)構(gòu)件颈渊,如下所示:

    dependencies {
        runtime group: 'org.springframework', name: 'spring-core', version: '2.5'
        runtime 'org.springframework:spring-core:2.5',
                'org.springframework:spring-aop:2.5'
        runtime(
            [group: 'org.springframework', name: 'spring-core', version: '2.5'],
            [group: 'org.springframework', name: 'spring-aop', version: '2.5']
        )
        runtime('org.hibernate:hibernate:3.0.5') {
            transitive = true
        }
        runtime group: 'org.hibernate', name: 'hibernate', version: '3.0.5', transitive: true
        runtime(group: 'org.hibernate', name: 'hibernate', version: '3.0.5') {
            transitive = true
        }
    }
    
    

    模塊依賴對(duì)應(yīng)于gradle的API中的 ExternalModuleDependency對(duì)象

  • 文件依賴

    dependencies {
        runtime files('libs/a.jar', 'libs/b.jar')
        runtime fileTree(dir: 'libs', include: '*.jar')
    }
    
    
  • 項(xiàng)目依賴

    dependencies {
        compile project(':shared')
    }
    
    

    項(xiàng)目依賴對(duì)應(yīng)于gradle的API中的 ProjectDependency對(duì)象

  • 特定的Gradle發(fā)行版依賴

    dependencies {
        compile gradleApi()
        testCompile gradleTestKit()
        compile localGroovy()
    }
    
    

管理依賴配置

gradle中項(xiàng)目的每一項(xiàng)依賴都是應(yīng)用于一個(gè)特定的范圍的,在gradle中用 Configuration對(duì)象表示终佛。每一個(gè)Configuration對(duì)象都會(huì)有一個(gè)唯一的名稱俊嗽。Gradle的依賴配置管理如下所示:

image.png

自定義Configuration

在gradle中,自定義Configuration對(duì)象是非常簡(jiǎn)單的铃彰,同時(shí)定義自己的Configuration對(duì)象的時(shí)候绍豁,也可以繼承于已有的Configuration對(duì)象,如下所示:

configurations {
    jasper
    // 定義繼承關(guān)系
    smokeTest.extendsFrom testImplementation
}

repositories {
    mavenCentral()
}

dependencies {
    jasper 'org.apache.tomcat.embed:tomcat-embed-jasper:9.0.2'
}

管理傳遞性依賴

在實(shí)際的項(xiàng)目依賴管理中存在這樣的一種依賴關(guān)系:

  • 模塊b依賴于模塊c
  • 模塊a依賴于模塊b
  • 模塊c成為了模塊a的傳遞依賴

在處理上面這種傳遞性依賴的時(shí)候牙捉,gradle提供了強(qiáng)大的管理功能

使用依賴約束

依賴約束可以幫助我們控制傳遞性依賴以及自身的依賴的版本號(hào)(版本范圍)竹揍,比如:

dependencies {
    implementation 'org.apache.httpcomponents:httpclient'
    constraints {
        // 這里httpclient是項(xiàng)目本身的依賴
        // 這個(gè)約束表示,不管是項(xiàng)目本身的依賴是還是傳遞依賴都強(qiáng)制使用這個(gè)指定的版本號(hào)
        implementation('org.apache.httpcomponents:httpclient:4.5.3') {
            because 'previous versions have a bug impacting this application'
        }
        // commons-codec并沒有被聲明為項(xiàng)目本身的依賴
        // 所以僅當(dāng)commons-codec是傳遞性依賴的時(shí)候這段邏輯才會(huì)被觸發(fā)
        implementation('commons-codec:commons-codec:1.11') {
            because 'version 1.9 pulled from httpclient has bugs affecting this application'
        }
    }
}

排除特定的傳遞性依賴

有的時(shí)候邪铲,我們所依賴的項(xiàng)目/模塊會(huì)引入多個(gè)傳遞性依賴芬位。而其中部分的傳遞性依賴我們是不需要的,這時(shí)候可以使用exclude排除部分的傳遞性依賴带到,如下所示:

dependencies {
    implementation('log4j:log4j:1.2.15') {
        exclude group: 'javax.jms', module: 'jms'
        exclude group: 'com.sun.jdmk', module: 'jmxtools'
        exclude group: 'com.sun.jmx', module: 'jmxri'
    }
}

強(qiáng)制使用指定的依賴版本

Gradle通過選擇依賴關(guān)系圖中找到的最新版本來解決任何依賴版本沖突昧碉。 可是有的時(shí)候,某些項(xiàng)目會(huì)需要使用一個(gè)較老的版本號(hào)作為依賴。這時(shí)候我們可以強(qiáng)制指定某一個(gè)版本被饿。例如:

dependencies {
    implementation 'org.apache.httpcomponents:httpclient:4.5.4'
    // 假設(shè)commons-codec的最新版本是1.10
    implementation('commons-codec:commons-codec:1.9') {
        force = true
    }
}

要注意的是四康,如果依賴項(xiàng)目中使用了新版本才有的api,而我們強(qiáng)制使用了舊版本的傳遞依賴之后狭握,會(huì)引起運(yùn)行時(shí)的錯(cuò)誤

禁止傳遞性依賴

dependencies {
    implementation('com.google.guava:guava:23.0') {
        transitive = false
    }
}

在android plugin升級(jí)到3.0以后闪金,提供了一種新的依賴配置項(xiàng)implement,它的作用就是解決了依賴傳遞性的問題论颅。模塊本身的依賴并不會(huì)暴露給被引用的項(xiàng)目

依賴關(guān)系解析

使用依賴關(guān)系解析規(guī)則

依賴關(guān)系解析規(guī)則提供了一種非常強(qiáng)大的方法來控制依賴關(guān)系解析過程毕泌,并可用于實(shí)現(xiàn)依賴管理中的各種高級(jí)模式。比如:

  • 統(tǒng)一構(gòu)件組的版本

    很多時(shí)候我們依賴一個(gè)公司的庫會(huì)包含多個(gè)module嗅辣,這些module一般都是統(tǒng)一構(gòu)建撼泛、打包和發(fā)布的,具備相同的版本號(hào)澡谭。這個(gè)時(shí)候我們可以通過控制依賴關(guān)系的解析過程做到版本號(hào)統(tǒng)一愿题。

    configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'org.gradle') {
                details.useVersion '1.4'
                details.because 'API breakage in higher versions'
            }
        }
    }
    
    
  • 處理自定義的版本scheme

    configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.version == 'default') {
                def version = findDefaultVersionInCatalog(details.requested.group, details.requested.name)
                details.useVersion version.version
                details.because version.because
            }
        }
    }
    
    def findDefaultVersionInCatalog(String group, String name) {
        //some custom logic that resolves the default version into a specific version
        [version: "1.0", because: 'tested by QA']
    }
    
    

關(guān)于更多依賴關(guān)系解析規(guī)則的使用實(shí)例可以參考gradle的API中的 ResolutionStrategy

使用依賴關(guān)系的替代規(guī)則

依賴關(guān)系的替換規(guī)則和上面的依賴關(guān)系解析規(guī)則有點(diǎn)相似。實(shí)際上蛙奖,依賴關(guān)系解析規(guī)則的許多功能可以通過依賴關(guān)系替換規(guī)則來實(shí)現(xiàn)潘酗。依賴關(guān)系的替換規(guī)則允許項(xiàng)目依賴(Project Dependency)和模塊依賴(Module Dependency)被指定的替換規(guī)則透明地替換。

// 使用項(xiàng)目依賴替換模塊依賴
configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module("org.utils:api") with project(":api") because "we work with the unreleased development version"
        substitute module("org.utils:util:2.5") with project(":util")
    }
}
// 使用模塊依賴替換項(xiàng)目依賴
configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute project(":api") with module("org.utils:api:1.3") because "we use a stable version of utils"
    }
}

除了上面兩種之外雁仲,還有其他三種的依賴關(guān)系規(guī)則處理仔夺。因?yàn)闆]有實(shí)際使用過,這里不過多闡述攒砖,想了解更多可以查看官方的文檔Customizing Dependency Resolution Behavior

  • 使用組件元數(shù)據(jù)(meta-data)規(guī)則
  • 使用組件選擇規(guī)則
  • 使用模塊更換規(guī)則

插件開發(fā)

插件開發(fā)是gradle靈活的構(gòu)建體系中的一個(gè)強(qiáng)大工具缸兔。通過gradle中的PluginAPI,我們可以自定義插件吹艇,把一些通用的構(gòu)建邏輯插件化并廣泛的運(yùn)用惰蜜。比如Android項(xiàng)目中都會(huì)使用的:com.android.application,kotlin-android,java等等。

網(wǎng)上關(guān)于插件開發(fā)的文章已經(jīng)很多受神,這里不再贅述抛猖。這里推薦我寫的一個(gè)Gradle插件,也是在我完全看了gradle的官方文檔之后鼻听,結(jié)合前面提及到的依賴管理的知識(shí)寫的:

  • EasyDependency

    一個(gè)幫助提高組件化開發(fā)效率的gradle插件财著,提供的功能包括:

    1. 發(fā)布模塊的構(gòu)件都遠(yuǎn)程maven倉庫
    2. 動(dòng)態(tài)更換依賴配置:對(duì)模塊使用源碼依賴或者maven倉庫的構(gòu)件(aar/jar)依賴

寫在最后

全文基本是在看了gradle的官方文檔及相關(guān)資料之后,按照自己的思路的整理和總結(jié)撑碴。關(guān)于gradle的使用和問題歡迎一起討論撑教。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灰羽,隨后出現(xiàn)的幾起案子驮履,更是在濱河造成了極大的恐慌,老刑警劉巖廉嚼,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玫镐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怠噪,警方通過查閱死者的電腦和手機(jī)恐似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傍念,“玉大人矫夷,你說我怎么就攤上這事”锘保” “怎么了双藕?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阳仔。 經(jīng)常有香客問我忧陪,道長(zhǎng),這世上最難降的妖魔是什么近范? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任嘶摊,我火速辦了婚禮,結(jié)果婚禮上评矩,老公的妹妹穿的比我還像新娘叶堆。我一直安慰自己,他們只是感情好斥杜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布虱颗。 她就那樣靜靜地躺著,像睡著了一般蔗喂。 火紅的嫁衣襯著肌膚如雪上枕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天弱恒,我揣著相機(jī)與錄音辨萍,去河邊找鬼。 笑死返弹,一個(gè)胖子當(dāng)著我的面吹牛锈玉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播义起,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拉背,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了默终?” 一聲冷哼從身側(cè)響起椅棺,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤犁罩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后两疚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體床估,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年诱渤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丐巫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勺美,死狀恐怖递胧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赡茸,我是刑警寧澤缎脾,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站占卧,受9級(jí)特大地震影響赊锚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屉栓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一舷蒲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧友多,春花似錦牲平、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至启绰,卻和暖如春昂儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背委可。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工渊跋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人着倾。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓拾酝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卡者。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒿囤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 說明 本文主要從實(shí)現(xiàn)原理和代碼層面介紹Gradle開發(fā)相關(guān)知識(shí)。關(guān)于本文中提到的崇决、Gradle中的基本概念等內(nèi)容材诽,...
    jzj1993閱讀 7,918評(píng)論 1 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理底挫,服務(wù)發(fā)現(xiàn),斷路器脸侥,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 說明 本文主要介紹和Gradle關(guān)系密切建邓、相對(duì)不容易理解的配置,偏重概念介紹湿痢。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,626評(píng)論 1 62
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 10,996評(píng)論 0 6
  • 齊元愿望:學(xué)習(xí)金剛種子法則涝缝,財(cái)富自由扑庞,家庭關(guān)系和諧美滿譬重,家人身體健康,姐姐生活幸福美滿罐氨。 ...
    齊元滿愿閱讀 168評(píng)論 0 0