Import Android Library 的各種方式

今天遇到一個無法 build apk 的 Error:

Error:Failed to resolve: :AirWatchSDK-release

發生的原因是因為 aar 檔案的檔案沒有被 comiple 成功。解法是把 aar 放到 /app/libs/ 目錄下,就可以正常抓到。

 


常見的Android Studio 如何 import library,有這在種方式,分別如下:

  • Import module
  • Import jar file
  • Import aar file
  • Import maven repository
  • Import jitpack repository

1. Import module

// build.gradle


dependencies {
  compile project(':map-controller')
}

這算是最基本的 import 方式了,先將 library project “複製”到 main project 根目錄下面。然後直接使用下面的方式就可以 import 成功了,缺點是 library project 有更新時,無法同步更新。

而在 settings.gradle 設定 module 的 projectDir 雖然可以同步原始碼 (如下程式碼),但是我實測之後沒辦法產生 R.java,對於 library project 來說,若沒辦法產生 R.java 的話那這個方式就沒用了。

// settings.gradle


include ':map-controller', ':app'
project(':map-controller').projectDir = new File('../map-controller')

2. Import jar file

// build.gradle


dependencies {
  compile fileTree(dir: 'libs', include: '*.jar')
  compile files('libs/SOME-LIBRARY.jar')
}

也算是蠻基本的方式,就是指定 jar file 的路徑,如果你找到的 library 只有 jar file 的話,用這個方式就對了,但一樣對於 library 的更新要重新手動下載 jar file 才行。

3. Import aar file

// build.gradle


repositories {
  flatDir {
    dirs 'libs'
  }
}

dependencies {
  compile(name: 'map-controller', ext: 'aar')
}

aar file 是 Android 改用新的 build system 之後類似於 jar file 的檔案格式,全名為 Android Archive Library,簡單說就是把 Android Library Project build 完之後壓縮為一個檔案,原始的 jar file 無法將 Android 的 res 目錄壓縮起來,而 aar 可以,所以只要你所使用或開發的 library project 有用到 res 目錄的話,就要用 aar 打包起來才行。

而上面這種 import 方式就是將所產生的 aar file 複製到 libs 目錄,跟 jar file 是相同方式,只不過要多做一些設定就是了,當然這個更新方式也是要手動處理。

4. Import Maven repository

// build.gradle


repositories {
  mavenCentral()
}

dependencies {
  compile 'tw.kewang:map-controller:v2.1.0'
}

最常見的 import 方式,因為 library 受到 Maven 管理,所以使用 library 的使用者可以容易地取得更新,也可以用類似 semver 的表示法來管理版本,非常方便。

但對於 library 的開發者來說 Maven release 真的是一個很麻煩的事情,審核、GPG、Nexus……等一大堆事情要做,以開發 library 的開發者來說,我其實不太推 mavenCentral 的上傳機制。

5. Import jitpack repository

// build.gradle


repositories {
  maven {
    url "https://jitpack.io"
  }
}

dependencies {
  compile 'com.github.kewang:map-controller:v2.1.0'
}

因為重寫 map-controller 的關係,想讓大家都透過 Maven 很方便的使用 library,但我又不想在更新的時候這麼麻煩,這時突然想到我既然已經有 GitHub repo 了,那應該有方式也可以拿來作為 Maven repo 才對,找了一下真的有神器出現,就叫做 https://jitpack.io

我只要將 jitpack.io 與 GitHub repo 連結在一起,就可以用上面的方式 import 我的 map-controller 了,release 非常方便!下一篇我再來用開發者的角度介紹一下如何使用 jitpack 做為你的 Maven repo。

References

AAR Format:http://tools.android.com/tech-docs/new-build-system/aar-format

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *