Gradle for Android系列之四 依賴包管理

ChuckChenLw發表於2017-01-07

  在Gradle for Android系列之二 build.gradle檔案 中已經初步介紹過依賴包。為什麼我們這裡還要在專門介紹呢,因為我們在專案中往往需要用到各種依賴方式,對我們來說很重要。掌握Gradle依賴包管理,可以讓我們事半功倍。
  接下來我們就直接開始介紹了
  
  倉庫
  倉庫是平時引用第三方庫時使用最多的方式,非常的方便,往往都是通過一句話compile來引用。倉庫又可以分為遠端倉庫和本地倉庫。
  遠端倉庫又包括中央倉庫JCenter,私服,Jboss倉庫和Java.net倉庫。我們開發Android時用的最多的應該就是JCenter了。我們個人也是可以把自己的庫釋出到JCenter,這樣別人也可以一句話引用你的庫了,是不是很爽?具體過程可以參考我的這篇部落格手把手教你在JCenter釋出開源庫
  那麼遠端倉庫幫我們做了什麼呢,為什麼需要它?這是因為手動管理依賴是一個非常麻煩的事情。如果是手動管理依賴,那麼首先你必須先定位到該依賴檔案位置,然後下載jar檔案,複製該檔案到你的專案,然後引用它們。通常這些jar檔案沒有具體的版本號,所以還必須去搞清楚它們的版本號,這樣當需要更新的時候,我們才會知道需要替換成哪個版本。同時還必須將該依賴包放在svn或者git上,這樣其他同事才可以不用手動去下載這些依賴jar。這簡直是噩夢。使用遠端倉庫可以解決這些問題,一個倉庫可以被視為很多依賴檔案的集合。我們可以通過Gradle輕鬆的獲取到這些依賴。
  那麼Gradle怎麼獲取這些依賴呢,首先Gradle預設不會為我們的專案新增任何倉庫。所以我們需要把它們新增到repositories方法體內:
  

buildscript {
    repositories {
        jcenter()
    }
    ...
}

  就是這麼的簡單,配置好了之後,依賴包會在執行build構建的時候從這些遠端倉庫下載,Gradle會為我們在本地快取,所以一個版本的依賴包只需要下載一次。釋出到JCenter倉庫的依賴一般需要定義三個元素:group,name和version。group意味著建立該library的組織名,通常這會是包名,name是該依賴的唯一標示。version是該依賴的版本號,而我們在引用時也是通過這三個元素來定位依賴包的:

compile 'group:name:version'

  就像這樣:

compile 'com.android.support:appcompat-v7:25.1.0'

  group:com.android.support
  name:appcompat-v7
  version:25.1.0
  以上就是Android中經常使用的引用JCenter倉庫中依賴的方法。當然遠端倉庫遠遠不僅僅指這些。如果我們公司或者自己不想把依賴放在JCenter而是我們制定的伺服器中,應該怎麼引用呢?
  很簡單,只需要在maven方法中加入url地址就好::
  

repositories {
       maven {
           url "http://xxx.xxx.xxx"
        } 
   }

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

  本地依賴

  如果我們已經在網上下載好了jar,aar,so等依賴,不再需要聯網下載了,我們可以通過本地依賴方式,在專案中引用。在 Gradle for Android系列之二 build.gradle檔案 中我們已經介紹過jar,file,project依賴引入方式:
  1.compile fileTree(dir, ‘libs’ ,include : ‘*.jar’) 依賴本地libs目錄下的所有jar檔案
  2.compile file(‘libs/xxx.jar’) 依賴當個libs目錄(可以自己指定路徑,不一定要是libs)下的單個jar檔案。
  3. compile project(:xx:xx) 依賴某個工程。
  那麼aar檔案應該怎麼引用呢?其實也不難,將你要使用的aar檔案放到指定的目錄,我們可以命名為aars,接著在repositories中宣告:
  

repositories {
    flatDir {
        dirs 'aars' 
    }
}

  這樣就可以把該aars資料夾下的所有aar檔案作為依賴,同時,我們還可以引用名字叫做libraryname的aar檔案:
  

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

  so檔案的引入,稍微要複雜一點,一般情況下,我們需要先將so包放在app/src/main/JniLibs目錄下,然後在需要引入so的模組對應的build.gradle檔案的android模組中加入如下程式碼:
  

 sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/JniLibs']
        }
    }

  這樣就可以通過jni呼叫到so中的內容。

  使用依賴模組
  
  我們有兩種方式去引用一個依賴工程。一個就是通過在工程中直接引用,另外一個就是建立一個aar檔案,通過aar的方式引用。如果是通過直接引用的話,並且還想把其當著一個module就像這樣:
  這裡寫圖片描述
  首先需要在作為依賴的module的build.gradle檔案中將外掛引用改為(如圖中的紅框所示):

 apply plugin: 'com.android.library'

  接著在root目錄下的setting.gradle檔案中新增wheelview:

include ':app', ':wheelview'

  然後在app的build.gradle檔案的依賴中新增
  

dependencies {
    compile project(':wheelview')
}

  這樣就可以引用成功了。
  在一些情形中,我們可能想使用最新的依賴包,我們可以使用動態版本來解決這個問題。下面是幾種不同的動態控制版本方式:

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

  第一種方式,使用最新的生產版本。
  第二種方式,使用最新的minor版本,並且其最小的版本號是2.
  第三種方式,使用最新的Library。
  在使用動態版本的時候要注意,有可能使用的版本是最新版,但不一定是穩定版,也就是可能是α或者β版。因為不確定版本,那麼在不同的主機上可能使用的版本不同步,這一風險還是需要考慮的。所以,如果在build.gradle中使用了動態版本,Android Studio將會警告,避免使用動態版本:
  這裡寫圖片描述
  除了在gradle檔案中新增依賴,我們也可以藉助Android Studio中視覺化操作:
  這裡寫圖片描述
  在Project Structure中可以設定個Modules的依賴。很方便,設定完成之後,Android Studio會自動的在你的gradle檔案中新增相應的內容。

  依賴包管理差不多就是這些內容了。下一篇準備分析一下多渠道打包。

相關文章