1. 程式人生 > >Android Gradle Plugin指南(三)——依賴關系、android庫和多項目配置

Android Gradle Plugin指南(三)——依賴關系、android庫和多項目配置

tool 全部 ocs 共享 項目路徑 多項目配置 path 用戶 so文件

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup


4、Dependencies。Android Libraries and Multi-project setup(依賴關系,Android庫和多項目設置)


Gradle項目能夠依賴於其他組件。這些組件能夠是外部二進制包,或者是其他的Gradle項目。


4.1 Dependencies on binary packages(依賴二進制包)


4.1.1 Local packages(本地包)


配置一個外部庫的jar包依賴。你須要在compile配置中加入一個依賴。

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

    android {
        ...
    }

註意:這個dependencies DSL標簽是標準Gradle API中的一部分。所以它不屬於android標簽。


這個compile配置將被用於編譯main application。它裏面的全部東西都被會被加入到編譯的classpath中,同一時候也會被打包進終於的APK。

下面是加入依賴時可能用到的其他一些配置選項:

* compile:main application(主module)。

* androidTestCompile:test application(測試module)。

* debugCompile:debug Build Type(debug類型的編譯)。

* releaseCompile:release Build Type(公布類型的編譯)。

由於沒有可能去構建一個沒有關聯不論什麽Build Type(構建類型)的APK,APK默認配置了兩個或兩個以上的編譯配置:compile和<buildtype>Compile.

創建一個新的Build Type將會自己主動創建一個基於它名字的新配置。


這對於debug版本號須要使用一個自己定義庫(為了反饋實例化的崩潰信息等)但公布版本號不須要。或者它們依賴於同一個庫的不同版本號時會很實用。


4.2.2 Remote artifacts(遠程文件)


Gradle支持從Maven或者Ivy倉庫中拉取文件。


首先必須將倉庫加入到列表中,然後必須在依賴中聲明Maven或者Ivy聲明的文件。

    repositories {
        mavenCentral()
    }


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

    android {
        ...
    }

註意:mavenCentral()是指定倉庫URL的簡單方法。Gradle支持遠程和本地倉庫。

註意:Gradle會遵循依賴關系的傳遞性。這意味著假設一個依賴本身依賴於其他東西,這些東西也會一並被拉取回來。


很多其它關於設置依賴關系的信息,請參考Gradle用戶指南和DSL文檔。


4.2 Multi project setup(多項目設置)


Gradle項目也能夠通過使用多項目配置依賴於其他Gradle項目。


多項目配置的實現一般是在一個根項目路徑下將全部項目作為子目錄包括進去。



比如,給定下面項目結構:

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


我們能夠定義3個項目。

Grand將會依照下面名字映射它們:

:app

:libraries:lib1

:libraries:lib2


每個項目都擁有自己的build.gradle文件來聲明自己怎樣構建。

另外,在根文件夾下另一個setting.gradle文件用於聲明全部項目。

這些文件的結構例如以下:

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

當中setting.gradle的內容很easy:

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

這裏定義了哪一個目錄才是真正的Gradle項目。


當中:app項目可能依賴於這些庫,這是通過下面依賴配置聲明的:

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


很多其它關於多項目配置的信息請參考這裏。


4.3 Library projects(庫項目)


在上面的多項目配置中。:libraries:lib1和:libraries:lib2可能是一個Java項目,而且:app這個Android項目將會使用它們的jar包輸出。


可是。假設你想要共享代碼來訪問Android API或者使用Android樣式的資源,那麽這些庫就不能是通常的Java項目,而應該是Android庫項目。


4.3.1 Creating a Library Project(創建一個庫項目)


一個庫項目與通常的Android項目很類似,僅僅是有一點小差別。


雖然構建庫項目不同於構建應用程序,它們使用了不同的plugin。可是在內部這些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

    }

這裏創建了一個使用API 15編譯SourceSet的庫項目,而且依賴關系的配置方法與應用程序項目的配置方法一樣,相同也支持自己定義配置。


4.3.2 Differences between a Project and a Library Project(普通項目和庫項目之間的差別)


一個庫項目的main輸出是一個.aar包(它代表Android的歸檔文件)。它組合了編譯代碼(比如jar包或者是本地的.so文件)和資源(manifest。res。assets)。

一個庫項目相同也能夠獨立於應用程序生成一個測試用的apk來測試。


標識Task相同適用於庫項目(assembleDebug,assembleRelease),因此在命令行上與構建一個項目沒有什麽不同。


其余的部分,庫項目與應用程序項目一樣。它們都擁有build type和product flavor,也能夠生成多個aar版本號。

記住大部分Build Type的配置不適用於庫項目。可是你能夠依據庫項目是否被其他項目使用或者是否用來測試來使用自己定義的sourceSet改變庫項目的內容。


4.3.3 Referencing a Library(引用一個庫項目)


引用一個庫項目的方法與引用其他項目的方法一樣:

    dependencies {

        compile project(':libraries:lib1')

        compile project(':libraries:lib2')

    }

註意:假設你要引用多個庫,那麽排序將很重要。這類似於舊構建系統裏面的project.properties文件裏的依賴排序。


4.3.4 Library Publication(庫項目公布)


普通情況下一個庫僅僅會公布它的release Variant(變種)版本號。

這個版本號將會被全部引用它的項目使用,而無論它們本身自己構建了什麽版本號。這是因為Gradle的限制,我們正在努力消除這個問題,所以這僅僅是暫時的限制。


你能夠控制哪一個Variant版本號作為發行版:

    android {

        defaultPublishConfig "debug"

    }

註意這裏的公布配置名稱引用的是完整的Variant版本號名稱.Relesae,debug僅僅適用於項目中沒有其他特性版本號的時候使用。假設你想要使用其他Variant版本號代替默認的公布版本號,你能夠:

    android {

        defaultPublishConfig "flavor1Debug"

    }


將庫項目的全部Variant版本號都公布也是可能的。我們計劃在一般的項目依賴項目(類似於上述所說的)情況下同意這樣的做法,可是因為Gradle的限制(我們也在努力修復這個問題)如今還不太可能。

默認情況下沒有啟用公布全部Variant版本號。能夠通過下面啟用:

    android {

        publishNonDefault true

    }


理解公布多個Variant版本號意味著公布多個arr文件而不是一個arr文件包括全部Variant版本號是很重要的。每個arr包都包括一個單一的Variant版本號。

公布一個變種版本號意味著構建一個可用的arr文件作為Gradle項目的輸出文件。

不管是公布到一個maven倉庫,還是其他項目須要創建一個這個庫項目的依賴都能夠使用到這個文件。


Gradle有一個默認文件的概念。當加入下面配置後就會被使用到:

    compile project(':libraries:lib2')


創建一個其他公布文件的依賴,你須要指定詳細使用哪一個:

    dependencies {

        flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')

        flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')

    }


重要:註意已公布的配置是一個完整的Variant版本號。當中包含了build type,而且須要像以上一樣被引用。

重要:當啟用非默認公布,maven公布插件將會公布其他Variant版本號作為擴展包(按分類器分類)。這意味著不能真正的兼容公布到maven倉庫。

你應該另外公布一個單一的Variant版本號到倉庫中,或者同意公布全部配置以支持跨項目依賴。

Android Gradle Plugin指南(三)——依賴關系、android庫和多項目配置