1. 程式人生 > >Android Library的依賴方式及釋出

Android Library的依賴方式及釋出

最近釋出一個專案,發現以前釋出到 JCenter 的步驟都忘光了,又得到處翻資料,真是尷尬…..

還是那句老話,好記性不然爛筆頭,在此整理 Android Studio 依賴相關 以及 如何釋出專案到 JCenter

Android Studio 新增依賴

Module 依賴

module 依賴是指在本地建立一個 module,然後如下步驟,依賴此模組。

圖一

這樣做的好處就是隨時可以修改 module。

上圖可以看到,Android Studio(以下簡稱 AS)提供了三種依賴方式。

本地依賴

本地依賴是指,將 jar 或者 aar 直接拷貝到專案的 libs 資料夾下 ,然後對其進行依賴。

  • jar 的依賴如圖一,拷貝進 libs 目錄後,AS 才能識別到。
  • aar 的本地依賴官方沒有提供解決方案,不過高手在民間。

在講解本地 aar 依賴之前,先科普一下 aar 檔案。

aar 檔案是基於 jar 檔案之上開發的。因為有些Android Library 需要植入一些安卓特有的檔案,比如 AndroidManifest.xml,資原始檔,Assets或者JNI。這些檔案在 Jar 中是沒有的,因此誕生了 aar 檔案。

aar 檔案和 jar 一樣,只是普通的zip檔案。不過具有不同的檔案結構。jar檔案以classes.jar的名字被嵌入到aar檔案中。

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 檔案的生成只能在 Android Library 中,也就是gradle指令碼的宣告是apply plugin: 'com.android.library'的 module,然後編譯後就會在 build/outputs/aar

資料夾裡生成aar檔案。

生成 aar

本地 aar 依賴需要在 app 的 build.gradle 檔案新增如下內容

repositories {
    flatDir {
        dirs 'libs' //this way we can find the .aar file in libs folder
    }
}

之後再其它專案裡面新增 gradle 依賴

dependencies {
    compile(name:'dor', ext:'aar')
}

以上就是 aar 的本地依賴。

遠端依賴

遠端依賴就是在 app 的 build.gradle 中直接新增(當然也可以通過圖一搜索的方式)

dependencies {
  compile 'com.squareup.picasso:picasso:2.5.2'
}

這樣一行程式碼就完成了依賴,也是最常見的依賴方式。

遠端依賴庫的來源

我剛開始也不明白AS 是怎樣憑藉 一行程式碼得到這些library的。

查閱資料才知道,AS 是從專案 build.gradle 檔案裡面定義的Maven 倉庫伺服器上下載library的。

Apache Maven 是 Apache 開發的一個工具,提供了用於貢獻library的檔案伺服器。

總的來說,只有兩個標準的 Android library 檔案伺服器:JCenter 和 Maven Central。

不管是 「JCenter」還是「Maven Central」 ,兩者都是Maven 倉庫,只是他們維護的伺服器不同,由不同的人提供。

JCenter

在專案的build.gradle 檔案中如下定義倉庫,就能使用jcenter了

allprojects {
    repositories {
        jcenter()
    }
}
Maven Centra

在專案的build.gradle 檔案中如下定義倉庫,就能使用Maven Central了

allprojects {
    repositories {
        mavenCentral()
    }
}
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()。

以下是使用Jcenter的原因:

  • jcenter通過 CDN 傳送library,開發者可以享受到更快的下載體驗。
  • jcenter是全世界最大的Java倉庫,因此在Maven Central 上有的,在jcenter上也極有可能有。
  • 上傳library到倉庫很簡單,不需要像在 Maven Central上做很多複雜的事情。
  • 友好的使用者介面
  • 如果你想把library上傳到 Maven Central ,你可以在bintray網站上直接點選一個按鈕就能實現

基於上述原因,我們釋出 Android Library 最好是釋出到 Jcenter 上。

Gradle 下載依賴庫的原理

在專案的 build.gradle 檔案中加入一行程式碼的時候,這些庫是怎樣下載到我們的專案中呢?

一般來說,library 的字串形式,包含3部分

GROUP_ID:ARTIFACT_ID:VERSION

以冒號「:」為分隔

  • GROUP_ID

    library的group,通常以開發者包名 加 library的名稱來命名group。

  • ARTIFACT_ID

    library的真實名稱

  • VERSION

    library 的版本號

例如Android 界大名鼎鼎的 Square 公司的 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'
}

新增上述的依賴庫後,Gradle 會根據專案的build.gradle 檔案中配置的Maven 倉庫,詢問倉庫伺服器這個library是否存在,(如果配置了多個倉庫,會依次詢問這些倉庫)如果存在,Gradle 會獲得 library 的儲存路徑,然後 AS 將下載這些檔案到我們的電腦上,與我們的專案一起編譯。

一般儲存路徑都是這樣的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。

例如:

上傳 Library 到 JCenter

我們總是用別人的庫,如果自己寫一個庫分享給別人用,那樣不是更酷嘛!

我們可以通過 Gradle 把專案釋出到 Maven 庫中,至於選 Maven Central 還是 JCenter,通過前面的介紹,當然是選 JCenter 更好。

整個釋出過程如下圖:

上傳到 JCenter 的過程

可以看到整個過程還是挺清晰的,但不親自去試試,就不知道有多少坑!

1.註冊 Bintray 並建立私有 Maven 倉庫

JCenter 是由 Bintray 維護的 Maven 庫,所有首先得去 Bintray 網站註冊一個賬號。

就是因為註冊這一步有個巨坑,害得自己填了好久。

開啟 Bintray官網 ,天真的我就直接點了 START YOUR FREE TRIAL ,然後欲哭無淚。

Bintray 組織註冊

Bintray 官網在2016年底改版了,直接點註冊是組織使用者,而非個人使用者,這將導致最後一直提交失敗。

最後只能重新註冊新的個人賬戶。

個人賬戶註冊在首頁的底部,要把頁面拉下去才看得到。

Bintray 個人註冊

後邊註冊的步驟就很簡單了,有 github或者 google 賬戶的直接登入就行了,如果需要註冊這裡的郵箱不能是國內的郵箱。

登入上之後,點選右上角的小箭頭 Edit Profile —> API Key —> 輸入密碼 —> 複製 API Key。

獲取 API Key

這個 API Key 在後面會有用到。

然後建立私有的 Maven 倉庫,在個人首頁點選 Add New Repository

新增倉庫

然後按照下圖填寫內容

建立倉庫

最後點選 Create 建立,這樣就建立了倉庫。

2. 配置專案

接下來就是配置要釋出的專案。

首先是在專案的根目錄 build.gradle 中配置如下:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        //首先新增這兩個路徑
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

//新增下面的配置以便在 module 中引用
ext {
    bintrayRepo = 'maven' //倉庫名
    publishedGroupId = 'com.deemons.dor' //引用時 第一部分
    libraryDescription = 'android network'//描述
    siteUrl = 'https://github.com/Deemonser/Download'//專案地址
    gitUrl = 'https://github.com/Deemonser/Download.git'//gitUrl
    developerId = 'deemons'//註冊的使用者名稱
    developerName = 'deemonser'//開發者名稱
    developerEmail = '[email protected]'//開發者郵箱
    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
    allLicenses = ["Apache-2.0"]
}

//開源庫中有中文註釋,新增下面這些
allprojects {
    tasks.withType(Javadoc) {
        options {
            encoding "UTF-8"
            charSet 'UTF-8'
            links "http://docs.oracle.com/javase/7/docs/api"
        }
    }
}

然後在將要釋出的 module 下的 build.gradle 中新增如下配置

//for upload
ext {

    publishedGroupId = rootProject.publishedGroupId //引用時的第一部分
    artifact = 'dor'//引用時的第二部分
    libraryVersion = '0.1.0'//引用時的第三部分
    libraryName = 'dor'//本module名稱
    bintrayName = 'dor'//Jcenter 上顯示的專案名



    bintrayRepo = rootProject.bintrayRepo
    libraryDescription = rootProject.libraryDescription



    siteUrl =rootProject.siteUrl
    gitUrl = rootProject.gitUrl

    developerId = rootProject.developerId
    developerName =rootProject.developerName
    developerEmail = rootProject.developerEmail

    licenseName = rootProject.licenseName
    licenseUrl = rootProject.licenseUrl
    allLicenses = rootProject.allLicenses
}

apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'

最後,在專案的 local.properties 檔案中新增如下配置

bintray.user=YOUR_BINTRAY_USERNAME  //填寫註冊的使用者名稱
bintray.apikey=YOUR_BINTRAY_API_KEY //填寫前面獲取的 API Key

完成上面三個地方的配置後,就可以通過命令上傳專案到 Bintray 。

3.提交專案到 Bintray

分別執行下面兩個命令

./gradlew install
./gradlew bintrayUpload

如果兩次都沒報錯,並且看到BUILD SUCCESS,就表示上傳成功了。

這時候在自己的 Bintray 上,點選前面建立的 maven 倉庫。

maven 倉庫

可以看到釋出上來的 library 了

上傳的 library

4.將 Bintray 的專案釋出到 JCenter

點選剛剛上傳的專案,看到下面的詳細資訊。

釋出到 JCenter

這時候,點選右下角的 Add to JCenter 按鈕後,跳轉到一個提交頁面。

然後什麼也不做,直接點選Send。

然後就是漫長的等待Bintrary 的稽核,如果請求稽核通過,會收到一封郵件。

最後就是測試 一行程式碼 依賴。

如果成功了,那就大功告成啦~