Android Library的依賴方式及發布(轉)


還是那句老話,好記性不然爛筆頭,在此整理 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 依賴需要在 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
JCenter 是一個由 bintray.com 維護的Maven倉庫 ,整個倉庫的內容在 http://jcenter.bintray.com/

在項目的build.gradle 文件中如下定義倉庫,就能使用jcenter了

allprojects {
repositories {
jcenter()
}
}

Maven Centra
Maven Central 則是由 sonatype.org 維護的Maven倉庫,整個倉庫的內容在 https://oss.sonatype.org/content/repositories/releases/

在項目的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。

例如:

Jcenter庫的地址:http://jcenter.bintray.com/com/squareup/otto/1.3.7

Maven Central 庫的地址:https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/

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

我們可以通過 Gradle 把項目發布到 Maven 庫中,至於選 Maven Central 還是 JCenter,通過前面的介紹,當然是選 JCenter 更好。

整個發布過程如下圖:

 

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

1.注冊 Bintray 並創建私有 Maven 倉庫
JCenter 是由 Bintray 維護的 Maven 庫,所有首先得去 Bintray 網站注冊一個賬號。

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

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

 

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

最后只能重新注冊新的個人賬戶。

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

 

或者直接點擊這個 注冊個人賬戶

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

登錄上之后,點擊右上角的小箭頭 Edit Profile —> 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 = 'deemonser@hotmail.com'//開發者郵箱
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 倉庫。

 

可以看到發布上來的 library 了

 

4.將 Bintray 的項目發布到 JCenter
點擊剛剛上傳的項目,看到下面的詳細信息。

 

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

然后什么也不做,直接點擊Send。

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

最后就是測試 一行代碼 依賴。

如果成功了,那就大功告成啦~
---------------------
作者:Deemons
來源:CSDN
原文:https://blog.csdn.net/Deemons/article/details/77588327?utm_source=copy
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM