今天遇到一個無法 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