第 4 章 依賴關(guān)系,Android 庫(kù)和多項(xiàng)目設(shè)置

2018-04-13 18:24 更新
  • 依賴二進(jìn)制包
    • 本地包
    • 遠(yuǎn)程文件
    • 多項(xiàng)目設(shè)置
    • 庫(kù)項(xiàng)目
      • 創(chuàng)建一個(gè)庫(kù)項(xiàng)目
      • 普通項(xiàng)目和庫(kù)項(xiàng)目之間的區(qū)別
      • 引用一個(gè)庫(kù)項(xiàng)目
      • 庫(kù)項(xiàng)目發(fā)布

Gradle項(xiàng)目可以依賴于其它組件。這些組件可以是外部二進(jìn)制包,或者是其它的Gradle項(xiàng)目。

依賴二進(jìn)制包

本地包

配置一個(gè)外部庫(kù)的jar包依賴,你需要在compile配置中添加一個(gè)依賴。

dependencies {
    compile files('libs/foo.jar')
}

android {
    ...
}

注意:
這個(gè)dependencies DSL標(biāo)簽是標(biāo)準(zhǔn)Gradle API中的一部分,所以它不屬于android標(biāo)簽。

這個(gè)compile配置將被用于編譯main application。它里面的所有東西都被會(huì)被添加到編譯的classpath中,同時(shí)也會(huì)被打包進(jìn)最終的APK。以下是添加依賴時(shí)可能用到的其它一些配置選項(xiàng):

  • compilemain application(主module)。
  • androidTestCompiletest application(測(cè)試module)。
  • debugCompiledebug Build Type(debug類型的編譯)。
  • releaseCompilerelease Build Type(發(fā)布類型的編譯)。

因?yàn)闆]有可能去構(gòu)建一個(gè)沒有關(guān)聯(lián)任何Build Type(構(gòu)建類型)的APK,APK默認(rèn)配置了兩個(gè)或兩個(gè)以上的編譯配置:compile和< buildtype >Compile.創(chuàng)建一個(gè)新的Build Type將會(huì)自動(dòng)創(chuàng)建一個(gè)基于它名字的新配置。

這對(duì)于debug版本需要使用一個(gè)自定義庫(kù)(為了反饋實(shí)例化的崩潰信息等)但發(fā)布版本不需要,或者它們依賴于同一個(gè)庫(kù)的不同版本時(shí)會(huì)非常有用。

遠(yuǎn)程文件

Gradle支持從Maven或者Ivy倉(cāng)庫(kù)中拉取文件。

首先必須將倉(cāng)庫(kù)添加到列表中,然后必須在依賴中聲明Maven或者Ivy聲明的文件。

repositories {
    mavenCentral()
}


dependencies {
    compile 'com.google.guava:guava:11.0.2'
}

android {
    ...
}

注意:
mavenCentral()是指定倉(cāng)庫(kù)URL的簡(jiǎn)單方法。Gradle支持遠(yuǎn)程和本地倉(cāng)庫(kù)。

注意:
Gradle會(huì)遵循依賴關(guān)系的傳遞性。這意味著如果一個(gè)依賴本身依賴于其它東西,這些東西也會(huì)一并被拉取回來(lái)。

更多關(guān)于設(shè)置依賴關(guān)系的信息,請(qǐng)參考 Gradle 用戶指南DSL 文檔。

多項(xiàng)目設(shè)置

Gradle項(xiàng)目也可以通過(guò)使用多項(xiàng)目配置依賴于其它Gradle項(xiàng)目。

多項(xiàng)目配置的實(shí)現(xiàn)通常是在一個(gè)根項(xiàng)目路徑下將所有項(xiàng)目作為子文件夾包含進(jìn)去。

例如,給定以下項(xiàng)目結(jié)構(gòu):

MyProject/
 + app/
 + libraries/
    + lib1/
    + lib2/

我們可以定義3個(gè)項(xiàng)目。Grand將會(huì)按照以下名字映射它們:

:app
:libraries:lib1
:libraries:lib2

每一個(gè)項(xiàng)目都擁有自己的build.gradle文件來(lái)聲明自己如何構(gòu)建。另外,在根目錄下還有一個(gè)setting.gradle文件用于聲明所有項(xiàng)目。這些文件的結(jié)構(gòu)如下:

MyProject/
 | settings.gradle
 + app/
    | build.gradle
 + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

其中setting.gradle的內(nèi)容非常簡(jiǎn)單:

include ':app', ':libraries:lib1', ':libraries:lib2'

這里定義了哪一個(gè)文件夾才是真正的Gradle項(xiàng)目。

其中:app項(xiàng)目可能依賴于這些庫(kù),這是通過(guò)以下依賴配置聲明的:

dependencies {
    compile project(':libraries:lib1')
}

更多關(guān)于多項(xiàng)目配置的信息請(qǐng)參考 這里 。

庫(kù)項(xiàng)目

在上面的多項(xiàng)目配置中,:libraries:lib1:libraries:lib2可能是一個(gè)Java項(xiàng)目,并且:app這個(gè)Android項(xiàng)目將會(huì)使用它們的jar包輸出。

但是,如果你想要共享代碼來(lái)訪問Android API或者使用Android樣式的資源,那么這些庫(kù)就不能是通常的Java項(xiàng)目,而應(yīng)該是Android庫(kù)項(xiàng)目。

創(chuàng)建一個(gè)庫(kù)項(xiàng)目

一個(gè)庫(kù)項(xiàng)目與通常的Android項(xiàng)目非常類似,只是有一點(diǎn)小區(qū)別。

盡管構(gòu)建庫(kù)項(xiàng)目不同于構(gòu)建應(yīng)用程序,它們使用了不同的plugin。但是在內(nèi)部這些plugin共享了大部分相同的代碼,并且它們都由相同的com.android.tools.build.gradle.jar提供。

buildscript {

    repositories {
        mavenCentral()
    }


    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.6'
    }

}

apply plugin: 'android-library'

android {
    compileSdkVersion 15
}

這里創(chuàng)建了一個(gè)使用API 15編譯SourceSet的庫(kù)項(xiàng)目,并且依賴關(guān)系的配置方法與應(yīng)用程序項(xiàng)目的配置方法一樣,同樣也支持自定義配置。

普通項(xiàng)目和庫(kù)項(xiàng)目之間的區(qū)別

一個(gè)庫(kù)項(xiàng)目的main輸出是一個(gè).aar包(它代表Android的歸檔文件)。它組合了編譯代碼(例如jar包或者是本地的.so文件)和資源(manifest,res,assets)。一個(gè)庫(kù)項(xiàng)目同樣也可以獨(dú)立于應(yīng)用程序生成一個(gè)測(cè)試用的apk來(lái)測(cè)試。

標(biāo)識(shí)Task同樣適用于庫(kù)項(xiàng)目(assembleDebugassembleRelease),因此在命令行上與構(gòu)建一個(gè)項(xiàng)目沒有什么不同。

其余的部分,庫(kù)項(xiàng)目與應(yīng)用程序項(xiàng)目一樣。它們都擁有build type和product flavor,也可以生成多個(gè)aar版本。記住大部分Build Type的配置不適用于庫(kù)項(xiàng)目。但是你可以根據(jù)庫(kù)項(xiàng)目是否被其它項(xiàng)目使用或者是否用來(lái)測(cè)試來(lái)使用自定義的sourceSet改變庫(kù)項(xiàng)目的內(nèi)容。

引用一個(gè)庫(kù)項(xiàng)目

引用一個(gè)庫(kù)項(xiàng)目的方法與引用其它項(xiàng)目的方法一樣:

dependencies {
    compile project(':libraries:lib1')
    compile project(':libraries:lib2')
}

注意:
如果你要引用多個(gè)庫(kù),那么排序?qū)⒎浅V匾?。這類似于舊構(gòu)建系統(tǒng)里面的project.properties文件中的依賴排序。

庫(kù)項(xiàng)目發(fā)布

一般情況下一個(gè)庫(kù)只會(huì)發(fā)布它的release Variant(變種)版本。這個(gè)版本將會(huì)被所有引用它的項(xiàng)目使用,而不管它們本身自己構(gòu)建了什么版本。這是由于Gradle的限制,我們正在努力消除這個(gè)問題,所以這只是臨時(shí)的限制。

你可以控制哪一個(gè)Variant版本作為發(fā)行版:

android {
    defaultPublishConfig "debug"
}

注意這里的發(fā)布配置名稱引用的是完整的Variant版本名稱。Relesae,debug只適用于項(xiàng)目中沒有其它特性版本的時(shí)候使用。如果你想要使用其它Variant版本取代默認(rèn)的發(fā)布版本,你可以:

android {
    defaultPublishConfig "flavor1Debug"
}

將庫(kù)項(xiàng)目的所有Variant版本都發(fā)布也是可能的。我們計(jì)劃在一般的項(xiàng)目依賴項(xiàng)目(類似于上述所說(shuō)的)情況下允許這種做法,但是由于Gradle的限制(我們也在努力修復(fù)這個(gè)問題)現(xiàn)在還不太可能。默認(rèn)情況下沒有啟用發(fā)布所有Variant版本??梢酝ㄟ^(guò)以下啟用:

android {
    publishNonDefault true
}

理解發(fā)布多個(gè)Variant版本意味著發(fā)布多個(gè)arr文件而不是一個(gè)arr文件包含所有Variant版本是非常重要的。每一個(gè)arr包都包含一個(gè)單一的Variant版本。發(fā)布一個(gè)變種版本意味著構(gòu)建一個(gè)可用的arr文件作為Gradle項(xiàng)目的輸出文件。無(wú)論是發(fā)布到一個(gè)maven倉(cāng)庫(kù),還是其它項(xiàng)目需要?jiǎng)?chuàng)建一個(gè)這個(gè)庫(kù)項(xiàng)目的依賴都可以使用到這個(gè)文件。

Gradle有一個(gè)默認(rèn)文件的概念。當(dāng)添加以下配置后就會(huì)被使用到:

compile project(':libraries:lib2')

創(chuàng)建一個(gè)其它發(fā)布文件的依賴,你需要指定具體使用哪一個(gè):

dependencies {
    flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
    flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}

重要:
注意已發(fā)布的配置是一個(gè)完整的Variant版本,其中包括了build type,并且需要像以上一樣被引用。
當(dāng)啟用非默認(rèn)發(fā)布,maven發(fā)布插件將會(huì)發(fā)布其它Variant版本作為擴(kuò)展包(按分類器分類)。這意味著不能真正的兼容發(fā)布到maven倉(cāng)庫(kù)。你應(yīng)該另外發(fā)布一個(gè)單一的Variant版本到倉(cāng)庫(kù)中,或者允許發(fā)布所有配置以支持跨項(xiàng)目依賴。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)