Gradle for Android 第三篇( 依賴管理 )

segmentfault發表於2016-01-06

依賴管理

依賴管理是Gradle最閃耀的地方,最好的情景是,你僅僅只需新增一行程式碼在你的build檔案,Gradle會自動從遠端倉庫為你下載相關的jar包,並且保證你能夠正確使用它們。Gradle甚至可以為你做的更多,包括當你在你的工程裡新增了多個相同的依賴,gradle會為你排除掉相同的jar包。在這一章我們將學習以下內容:

  • 倉庫
  • 本地依賴
  • 詳解依賴這一概念

Gradle for Android 第一篇( 從 Gradle 和 AS 開始 )

Gradle for Android 第二篇( Build.gradle入門 )

Gradle for Android 第四篇( 構建變體 )

Gradle for Android 第五篇( 多模組構建 )

倉庫

當我們討論依賴的時候,我們通常說的是遠端倉庫,就像那些依賴庫專門用來提供給其他開發者使用的依賴庫。手動管理依賴將會為你帶來很大麻煩。你必須定位到該依賴檔案位置,然後下載jar檔案,複製該檔案到你的專案,然後引用它們。通常這些jar檔案還沒有具體的版本號,所以你還必須去記憶它們的版本號,這樣當需要更新的時候,你才會知道需要替換成哪個版本。你同時必須將該依賴包放在svn或者git上,這樣你的其他同事才可以不用手動去下載這些依賴jar。

使用遠端倉庫可以解決這些問題,一個倉庫可以被視為一些檔案的集合體。Gradle不會預設為你的專案新增任何倉庫。所以你需要把它們新增到repositories方法體內。如果是使用的是Android studio,那麼工具已經為你準備好了這一切:

repositories {
    jcenter()
}

Gradle支援三種不同的倉庫,分別是:Maven和Ivy以及資料夾。依賴包會在你執行build構建的時候從這些遠端倉庫下載,當然Gradle會為你在本地保留快取,所以一個特定版本的依賴包只需要下載一次。

一個依賴需要定義三個元素:group,name和version。group意味著建立該library的組織名,通常這會是包名,name是該library的唯一標示。version是該library的版本號,我們來看看如何申明依賴:

dependencies {
       compile 'com.google.code.gson:gson:2.3'
       compile 'com.squareup.retrofit:retrofit:1.9.0'
}

上述的程式碼是基於groovy語法的,所以其完整的表述應該是這樣的:

dependencies {
      compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
      compile group: 'com.squareup.retrofit', name: 'retrofit'
           version: '1.9.0'
     }

為你的倉庫預定義

為了方便,Gradle會預設預定義三個maven倉庫:Jcenter和mavenCentral以及本地maven倉庫。你可以同時申明它們:

repositories {
       mavenCentral()
       jcenter()
       mavenLocal()
   }

Maven和Jcenter倉庫是很出名的兩大倉庫。我們沒必要同時使用他們,在這裡我建議你們使用jcenter,jcenter是maven中心庫的一個分支,這樣你可以任意去切換這兩個倉庫。當然jcenter也支援了https,而maven倉庫並沒有。

本地maven庫是你曾使用過的所有依賴包的集合,當然你也可以新增自己的依賴包。預設情況下,你可以在你的home檔案下找到.m2的資料夾。除了這些倉庫外,你還可以使用其他的公有的甚至是私有倉庫。

遠端倉庫

有些組織,建立了一些有意思的外掛或者library,他們更願意把這些放在自己的maven庫,而不是maven中心庫或jcenter。那麼當你需要是要這些倉庫的時候,你只需要在maven方法中加入url地址就好:

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
       }
}

同樣的,Ivy倉庫也可以這麼做。Apache Ivy在ant世界裡是一個很出名的依賴管理工具。如果你的公司有自己的倉庫,如果他們需要許可權才能訪問,你可以這麼編寫:

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
           credentials {
               username 'user'
               password 'secretpassword'
           }
        } 
   }

注意:這不是一個好主意,最好的方式是把這些驗證放在Gradle properties檔案裡,這些我們已經介紹過在第二章。

本地依賴

可能有些情況,你需要手動下載jar包,或者你想建立自己的library,這樣你就可以複用在不同的專案,而不必將該library publish到公有或者私有庫。在上述情況下,可能你不需要網路資源,接下來我將介紹如何是使用這些jar依賴,以及如何匯入so包,如何為你的專案新增依賴專案。

檔案依賴

如果你想為你的工程新增jar檔案作為依賴,你可以這樣:

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

如果你這麼做,那會很愚蠢,因為當你有很多這樣的jar包時,你可以改寫為:

dependencies {
       compile fileTree('libs')
 }

預設情況下,新建的Android專案會有一個lib資料夾,並且會在依賴中這麼定義(即新增所有在libs資料夾中的jar):

dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
}

這也意味著,在任何一個Android專案中,你都可以把一個jar檔案放在到libs資料夾下,其會自動的將其新增到編譯路徑以及最後的APK檔案。

native包(so包)

用c或者c++寫的library會被叫做so包,Android外掛預設情況下支援native包,你需要把.so檔案放在對應的資料夾中:

app
   ├── AndroidManifest.xml
   └── jniLibs
       ├── armeabi
       │   └── nativelib.so
       ├── armeabi-v7a
       │   └── nativelib.so
       ├── mips
       │   └── nativelib.so
       └── x86
           └── nativelib.so

aar檔案

如果你想分享一個library,該依賴包使用了Android api,或者包含了Android 資原始檔,那麼aar檔案適合你。依賴庫和應用工程是一樣的,你可以使用相同的tasks來構建和測試你的依賴工程,當然他們也可以有不同的構建版本。應用工程和依賴工程的區別在於輸出檔案,應用工程會生成APK檔案,並且其可以安裝在Android裝置上,而依賴工程會生成.aar檔案。該檔案可以被Android應用工程當做依賴來使用。

建立和使用依賴工程模組

不同的是,你需要加不同的外掛:

 apply plugin: 'com.android.library'

我們有兩種方式去使用一個依賴工程。一個就是在你的工程裡面,直接將其作為一個模組,另外一個就是建立一個aar檔案,這樣其他的應用也就可以複用了。

如果你把其作為模組,那你需要在settings.gradle檔案中新增其為模組:

   include ':app', ':library'

在這裡,我們就把它叫做library吧,如果你想使用該模組,你需要在你的依賴裡面新增它,就像這樣:

   dependencies {
       compile project(':library')
  }

使用aar檔案

如果你想複用你的library,那麼你就可以建立一個aar檔案,並將其作為你的工程依賴。當你構建你的library專案,aar檔案將會在 build/output/aar/下生成。把該檔案作為你的依賴包,你需要建立一個資料夾來放置它,我們就叫它aars資料夾吧,然後把它拷貝到該資料夾裡面,然後新增該資料夾作為依賴庫:

repositories {
    flatDir {
        dirs 'aars' 
    }
}

這樣你就可以把該資料夾下的所有aar檔案作為依賴,同時你可以這麼幹:

 dependencies {
       compile(name:'libraryname', ext:'aar')
}

這個會告訴Gradle,在aars資料夾下,新增一個叫做libraryname的檔案,且其字尾是aar的作為依賴。

依賴的概念

配置

有些時候,你可能需要和sdk協調工作。為了能順利編譯你的程式碼,你需要新增SDK到你的編譯環境。你不需要將sdk包含在你的APK中,因為它早已經存在於裝置中,所以配置來啦,我們會有5個不同的配置:

  • compile
  • apk
  • provided
  • testCompile
  • androidTestCompile

compile是預設的那個,其含義是包含所有的依賴包,即在APK裡,compile的依賴會存在。

apk的意思是apk中存在,但是不會加入編譯中,這個貌似用的比較少。

provided的意思是提供編譯支援,但是不會寫入apk。

testCompile和androidTestCompile會新增額外的library支援針對測試。

這些配置將會被用在測試相關的tasks中,這會對新增測試框架例如JUnit或者Espresso非常有用,因為你只是想讓這些框架們能夠出現在測試apk中,而不是生產apk中。

除了這些特定的配置外,Android外掛還為每個構建變體提供了配置,這讓debugCompile或者releaseProvided等配置成為可能。如果你想針對你的debug版本新增一個logging框架,這將很有用。這些內容的詳細介紹,我會在下一個部落格裡詳細介紹。

動態版本

在一些情形中,你可能想使用最新的依賴包在構建你的app或者library的時候。實現他的最好方式是使用動態版本。我現在給你們展示幾種不同的動態控制版本方式:

dependencies {
       compile 'com.android.support:support-v4:22.2.+'
       compile 'com.android.support:appcompat-v7:22.2+'
       compile 'com.android.support:recyclerview-v7:+'
}

第一行,我們告訴gradle,得到最新的生產版本。第二行,我們告訴gradle,我們想得到最新的minor版本,並且其最小的版本號是2. 第三行,我們告訴gradle,得到最新的library。

你應該小心去使用動態版本,如果當你允許gradle去挑選最新版本,可能導致挑選的依賴版本並不是穩定版,這將會對構建產生很多問題,更糟糕的是你可能在你的伺服器和私人pc上得到不同的依賴版本,這直接導致你的應用不同步。

如果你在你的build.gradle中使用了動態版本,Android studio將會警告你關於動態版本的潛在問題,就像你下面看到的這樣:

Android studio UI操作依賴庫

在使用Android studio中,最簡單的新增新依賴包的方法是使用工程結構彈框。從檔案按鈕中開啟介面,導航到依賴包導航欄,然後你就可以看到你當前的依賴包了:

當你想新增新的依賴包的時候,可以點選綠色的小按鈕,你可以新增其他模組,檔案,甚至是上網搜尋。

使用Android studio的介面讓你能夠很簡單的瀏覽你專案中的所有依賴,並且新增新的依賴包。你不必在build.gradle中手動的新增程式碼了,並且你可以直接搜尋JCenter庫中的依賴資源。

總結

在這一章裡,我們瞭解了多種方式新增依賴,我們學習了什麼是倉庫,以及如何使用他們,同時學習瞭如何在不使用倉庫的情況下使用jar檔案。

你現在知道了依賴包的屬性配置,動態版本控制等。

我們也談到了關於在多個環境下構建app變種,在下一章,我們將會學習到什麼是構建變種,以及為什麼他們很重要,構建變種將會使得開發測試以及分發app變得更加容易。理解變種的工作原理可以加快你的開發和分發效率。

相關文章