Android Studio之maven Central,JCenter
Android studio 是從哪裡得到庫的?
Android Studio是從build.gradle裡面定義的Maven 倉庫伺服器上下載library的。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的檔案伺服器。總的來說,只有兩個標準的Android library檔案伺服器:jcenter 和 Maven Central。
jcenter
jcenter是一個由 bintray.com維護的Maven倉庫 。你可以在這裡看到整個倉庫的內容。
我們在專案的build.gradle 檔案中如下定義倉庫,就能使用jcenter了:
allprojects {
repositories {
jcenter()
}
}
Maven Central
Maven Central 則是由sonatype.org維護的Maven倉庫。你可以在這裡看到整個倉庫。
注:不管是jcenter還是Maven Central ,兩者都是Maven倉庫
我們在專案的build.gradle 檔案中如下定義倉庫,就能使用Maven Central了:
allprojects {
repositories {
mavenCentral()
}
}
注意,雖然jcenter和Maven Central 都是標準的 android library倉庫,但是它們維護在完全不同的伺服器上,由不同的人提供內容,兩者之間毫無關係。在jcenter上有的可能 Maven Central 上沒有,反之亦然。
除了兩個標準的伺服器之外,如果我們使用的library的作者是把該library放在自己的伺服器上,我們還可以自己定義特有的Maven倉庫伺服器。Twitter的Fabric.io 就是這種情況,它們在https://maven.fabric.io/public上維護了一個自己的Maven倉庫。如果你想使用Fabric.io的library,你必須自己如下定義倉庫的url。
repositories {
maven { url 'https://maven.fabric.io/public' }
}
然後在裡面使用相同的方法獲取一個library。
dependencies {
compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
}
但是將library上傳到標準的伺服器與自建伺服器,哪種方法更好呢?當然是前者。如果將我們的library公開,其他開發者除了一行定義依賴名的程式碼之外不需要定義任何東西。因此這篇文章中,我們將只關注對開發者更友好的jcenter 和 Maven Central 。
實際上可以在Android Studio上使用的除了Maven 倉庫之外還有另外一種倉庫:Ivy 倉庫
理解jcenter和Maven Central
為何有兩個標準的倉庫?
事實上兩個倉庫都具有相同的使命:提供Java或者Android library服務。上傳到哪個(或者都上傳)取決於開發者。
起初,Android Studio 選擇Maven Central作為預設倉庫。如果你使用老版本的Android Studio建立一個新專案,mavenCentral()會自動的定義在build.gradle中。
但是Maven Central的最大問題是對開發者不夠友好。上傳library異常困難。上傳上去的開發者都是某種程度的極客。同時還因為諸如安全方面的其他原因,Android Studio團隊決定把預設的倉庫替換成jcenter。正如你看到的,一旦使用最新版本的Android Studio建立一個專案,jcenter()自動被定義,而不是mavenCentral()。
有許多將Maven Central替換成jcenter的理由,下面是幾個主要的原因。
- jcenter通過CDN傳送library,開發者可以享受到更快的下載體驗。
- jcenter是全世界最大的Java倉庫,因此在Maven Central 上有的,在jcenter上也極有可能有。換句話說jcenter是Maven Central的超集。
- 上傳library到倉庫很簡單,不需要像在 Maven Central上做很多複雜的事情
友好的使用者介面
基於上面的原因以及我自己的經驗,可以說替換到jcenter是明智之舉。
gradle是如何從倉庫上獲取一個library的?
我們在 build.gradle輸入如下程式碼的時候,這些庫是如果奇蹟般下載到我們的專案中的。
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'
一般來說,我們需要知道library的字串形式,包含3部分
GROUP_ID:ARTIFACT_ID:VERSION
上面的例子中,GROUP_ID是com.inthecheesefactory.thecheeselibrary ,ARTIFACT_ID是fb-like,VERSION是0.9.3。
GROUP_ID定義了library的group。有可能在同樣的上下文中存在多個不同功能的library。如果library具有相同的group,那麼它們將共享一個GROUP_ID。通常我們以開發者包名緊跟著library的group名稱來命名,比如com.squareup.picasso。然後ARTIFACT_ID中是library的真實名稱。至於VERSION,就是版本號而已,雖然可以是任意文字,但是我建議設定為x.y.z的形式,如果喜歡還可以加上beta這樣的字尾。
下面是Square library的一個例子。你可以看到每個都可以很容易的分辨出library和開發者的名稱。
dependencies {
compile 'com.squareup:otto:1.3.7'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
下獲得com.squareup:otto:1.3.7的library檔案。
然後Android Studio 將下載這些檔案到我們的電腦上,與我們的專案一起編譯。整個過程就是這麼簡單,一點都不復雜。
我相信你應該清楚的知道從倉庫上下載的library只是儲存在倉庫伺服器上的jar 或者aar檔案而已。有點類似於自己去下載這些檔案,拷貝然後和專案一起編譯。但是使用gradle依賴管理的最大好處是你除了新增幾行文字之外啥也不做。library一下子就可以在專案中使用了。
瞭解aar檔案
我剛才說了倉庫中儲存的有兩種型別的library:jar 和 aar。jar檔案大家都知道,但是什麼是aar檔案呢?
aar檔案時在jar檔案之上開發的。之所以有它是因為有些Android Library需要植入一些安卓特有的檔案,比如AndroidManifest.xml,資原始檔,Assets或者JNI。這些都不是jar檔案的標準。
因此aar檔案就時發明出來包含所有這些東西的。總的來說它和jar一樣只是普通的zip檔案,不過具有不同的檔案結構。jar檔案以classes.jar的名字被嵌入到aar檔案中。其餘的檔案羅列如下:
- /AndroidManifest.xml (mandatory)
- /classes.jar (mandatory)
- /res/ (mandatory)
- /R.txt (mandatory)
- /assets/ (optional)
- /libs/*.jar (optional)
- /jni//*.so (optional)
- /proguard.txt (optional)
- /lint.jar (optional)
可以看到.aar檔案是專門為安卓設計的。因此這篇文章將教你如何建立與上傳一個aar形式的library。
build.gradle與gradle-warpper 的區別和聯絡
如圖中圈出位置所示,這倆個檔案在專案中的位置。
build.gradle 檔案制定編譯時的一些條件和依賴關係。
gradle-warpper.properties主要用來制定當前使用的gradle版本從哪裡獲取。以及一些其他的引數。
下面來分析一下這倆檔案中的內容:
- build.gradle
這個檔案的內容並不是固定的,根據專案的需要會有不同的設定。這裡給出一般情況下的內容:
這是Module的gradle檔案
//這裡指明這是一個android工程,也可以填com.android.library
//指明這是一個類庫
apply plugin: 'com.android.application'
android {
//使用的編譯版本SDK21
compileSdkVersion 21
//buildtool版本 指定為21.1.1
buildToolsVersion 21.1.1
defaultConfig {
//最小SDK17
minSdkVersion 17
//目標版本19
targetSdkVersion 19
}
// 打包簽名
signingConfigs {
//指定debug模式下使用的簽名檔案
debug { storeFile file("debug.keystore") }
release {
//釋出正式版本模式下的使用的簽名檔案
storeFile file('release.keystore')
storePassword 'thisiskeystorepassword'
keyAlias 'nim_demo'
keyPassword 'thisiskeypassword'
}
}
//編譯時指令碼執行環境
buildTypes {
debug {
signingConfig signingConfigs.debug
manifestPlaceholders = [AMAP_KEY: "09fd4efd3e28e9bf1f449ecec7d34bfe"]
}
//正式版本要混淆
release {
minifyEnabled true
zipAlignEnabled true
proguardFile('proguard.cfg')
signingConfig signingConfigs.release
manifestPlaceholders = [AMAP_KEY: "ee20324fba1c7f4ad7a4a207e7f08e8d"]
}
}
sourceSets {
main {
//指定檔案對映關係
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res', 'res-avchat', 'res-chatroom']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs', 'libs-sdk']
}
}
//防止lint時報錯
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
//新增依賴jar,庫工程
dependencies {
//依賴資料夾下的所有檔案
compile fileTree(dir: 'libs', exclude: ['android-support-*.jar'], include: '*.jar')
compile project(path: ':uikit')
compile 'com.android.support:appcompat-v7:21.0.3'
}
一個根目錄下的gradle檔案,這個檔案的設定對project下的所有module都是有效的
buildscript {
//指定要使用的gradle版本
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
// apply from: 'script.gradle', to: buildscript
}
//指定遠端倉庫,建議使用jcenter
allprojects {
repositories {
jcenter()
}
}
一個gradle-wrapper。properties檔案。只要設定gradle的快取地址和下載地址。
#Wed May 18 07:57:25 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#指定gradle的下載地址
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
轉自:原文地址