倉庫
- 一個倉庫可以被視為一些文件的集合體。Gradle不會默認為你的項目添加任何倉庫。所以你需要把它們添加到repositories方法體內。如果是使用的是Android studio,那么工具已經為你準備好了這一切:
repositories {
jcenter()
}
Gradle支持三種不同的倉庫,分別是:Maven和Ivy以及文件夾。依賴包會在你執行build構建的時候從這些遠程倉庫下載,當然Gradle會為你在本地保留緩存,所以一個特定版本的依賴包只需要下載一次。
- 為了方便,Gradle會默認預定義三個maven倉庫:Jcenter和mavenCentral以及本地maven倉庫。你可以同時申明它們:
repositories {
mavenCentral()
jcenter()
mavenLocal()
}
Maven和Jcenter倉庫是很出名的兩大倉庫。我們沒必要同時使用他們,在這里我建議你們使用jcenter,jcenter是maven中心庫的一個分支,這樣你可以任意去切換這兩個倉庫。當然jcenter也支持了https,而maven倉庫并沒有。
本地maven庫是你曾使用過的所有依賴包的集合,當然你也可以添加自己的依賴包。默認情況下,你可以在你的home文件下找到.m2的文件夾。除了這些倉庫外,你還可以使用其他的公有的甚至是私有倉庫。
- 一個依賴需要定義三個元素: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'
}
- 有些組織,創建了一些有意思的插件或者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'
}
}
}
本地依賴
- 文件依賴
如果你想為你的工程添加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')
}
- 如果你想復用你的library,那么你就可以創建一個aar文件,并將其作為你的工程依賴。當你構建你的library項目,aar文件將會在 build/output/aar/下生成。把該文件作為你的依賴包,你需要創建一個文件夾來放置它,我們就叫它aars文件夾吧,然后把它拷貝到該文件夾里面,然后添加該文件夾作為依賴庫:
repositories {
flatDir {
dirs 'aars'
}
}
這樣你就可以把該文件夾下的所有aar文件作為依賴,同時你可以這么干:
dependencies {
compile(name:'libraryname', ext:'aar')
}
這個會告訴Gradle,在aars文件夾下,添加一個叫做libraryname的文件,且其后綴是aar的作為依賴。
依賴動態版本
在一些情形中,你可能想使用最新的依賴包在構建你的app或者library的時候。實現他的最好方式是使用動態版本。我現在給你們展示幾種不同的動態控制版本方式:
dependencies {
compile 'com.android.support:support-v4:22.2.+' //得到最新的生產版本
compile 'com.android.support:appcompat-v7:22.2+' //得到最新的minor版本,并且其最小的版本號是2
compile 'com.android.support:recyclerview-v7:+' //得到最新的library
}
你應該小心去使用動態版本,如果當你允許gradle去挑選最新版本,可能導致挑選的依賴版本并不是穩定版,這將會對構建產生很多問題,更糟糕的是你可能在你的服務器和私人pc上得到不同的依賴版本,這直接導致你的應用不同步。