1. 程式人生 > >Android Studio之maven Central,JCenter

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

轉自:原文地址