背景
Android Studio 引用的第三方庫來自倆種網(wǎng)絡(luò)倉庫顷锰,一種是 Maven Center,另一種是 JCenter亡问,倆種倉庫功能沒有區(qū)別官紫。
由于 Maven Center 的種種問題,新版本的 AS 已將默認(rèn)倉庫替換為 JCenter州藕,新項(xiàng)目會(huì)默認(rèn)配置 jcenter()
而不是 mavenCentral
束世。
除此之外,Maven 倉庫和 Gradle 會(huì)將經(jīng)常使用的第三方庫緩存到本地床玻,不用每次使用都下載毁涉,因與遠(yuǎn)程倉庫功能相似,這里稱之為本地倉庫笨枯。Android Studio 中存在倆種本地倉庫:Gradle 和 Maven薪丁。
下面分別針對本地倉庫(Maven、Gradle)馅精、遠(yuǎn)程倉庫(Maven严嗜、JCenter)作解析。
1 本地倉庫
作用:本地倉庫將經(jīng)常使用的第三方庫緩存到本地洲敢,不用每次使用都重新下載漫玄。
1.1 Maven 本地倉庫
1.1.1 Maven 本地庫配置方式
buildscript {
repositories {
mavenLocal()
}
}
allprojects {
repositories {
mavenLocal()
}
}
1.1.2 Maven 本地庫默認(rèn)地址
/Users/用戶名/.m2
該地址為 mac 地址,默認(rèn)是隱藏的,只有在配置后才會(huì)緩存睦优。
倉庫的查找有優(yōu)先級渗常,如果在引用倉庫中找到了目標(biāo)庫,則不會(huì)在下面配置的地址倉庫中查詢汗盘。
所以如果配置應(yīng)將 mavenLocal 填寫為引用的第一個(gè)倉庫皱碘,保證先從本地 Maven 庫獲取。
1.1.3 上傳 aar 至 Maven 本地庫
這里新建 Android Library隐孽,并命名為 library癌椿。上傳 Module 生成的 library-debug.aar 文件需要在 library module 的 build.gradle 如下配置:
apply plugin: 'maven-publish'
publishing {
publications {
maven(MavenPublication) {
//上傳到倉庫的庫文件
artifact "${buildDir}/outputs/aar/library-debug.aar"
groupId "com.app.xz.library"
artifactId "librarytest"
version "1.0.0"
}
}
}
配置完并點(diǎn)擊 sync,Gradle 一欄會(huì)新出現(xiàn)下圖標(biāo)注的 Task:
點(diǎn)擊 publishToMavenLocal菱阵,即將 aar 文件發(fā)布到本地 Maven 庫踢俄。
下面的配置方式可以實(shí)現(xiàn)和 publishToMavenLocal 同樣的效果,二者選其一即可晴及。
apply plugin: 'maven' uploadArchives { repositories.mavenDeployer { //倉庫路徑 def depath = file('/Users/xuzheng/.m2/repository') repository(url: "file://${depath.absolutePath}") pom.groupId = "com.app.xz.library"; pom.artifactId = "librarytest"; pom.version = "1.0.0"; } }
Gradle 一欄會(huì)添加 upload-uploadArchives 命令都办。
1.1.4 依賴 Maven 本地庫 aar
依賴配置方式與傳統(tǒng)方式?jīng)]有區(qū)別。
implementation 'com.app.xz.library:librarytest:1.0.0'
1.1.5 調(diào)試
Q :當(dāng) Module 有內(nèi)容更新時(shí)虑稼,重新發(fā)布更新后(沒有升級版本)的 aar 到 Maven 本地庫琳钉,然后項(xiàng)目 Rebuild动雹,發(fā)現(xiàn)項(xiàng)目依賴的 aar 并沒有如預(yù)期更新槽卫,這是為什么呢?
A :查看項(xiàng)目依賴歼培。躲庄,可以發(fā)現(xiàn)項(xiàng)目依賴的本地庫是 Gradle,下文將接著介紹 Gradle 本地庫钾虐。
1.2 Gradle 本地倉庫
1.2.1 Gradle 本地庫默認(rèn)地址
/Users/用戶名/.gradle/caches/modules-2/files-2.1
該路徑也是被隱藏的噪窘。
1.2.2 Gradle 本地庫解析
首先,Gradle 本地倉庫不需要額外配置效扫。
然后倔监,Gradle 本地倉庫類似于 Maven 本地倉庫,它會(huì)將網(wǎng)絡(luò)下載的第三方庫緩存到本地倉庫里菌仁,下次使用時(shí)則直接從本地倉庫獲取浩习。注意:Gradle 本地倉庫不會(huì)緩存 Maven 本地倉庫的依賴。
既然如此济丘,為什么【Maven 本地倉庫--調(diào)試】中會(huì)顯示 Gradle谱秽,且 aar 沒有更新呢洽蛀?
原來,Android Studio Gradle 為了提速疟赊,多增加了一層緩存:對于三方依賴郊供,會(huì)把它們解壓出來放到
/Users/用戶名/.gradle/caches/transforms-1
或 /Users/用戶名/.gradle/caches/transforms-2
中,Maven 本地庫雖然更新了近哟,但是該層緩存還沒有更新驮审,所以解決辦法是:刪除依賴 → sync → 重新引入依賴,這樣 AS 的緩存就會(huì)刪除并重新從本地庫解壓椅挣,實(shí)現(xiàn)更新头岔。
擴(kuò)展
不知道大家有沒有遇到下面描述的問題:
公司有自己的 sdk 倉庫,頻繁調(diào)試時(shí)鼠证,每次將 aar 發(fā)布到公司內(nèi)網(wǎng)倉庫里,如果版本不變靠抑,本地項(xiàng)目依賴時(shí)量九,aar 不會(huì)更新。會(huì)出現(xiàn)這種情況的原因是:
Maven 本地倉庫的 aar 更新颂碧,是因?yàn)槲覀兪謩?dòng) publishToMavenLocal 的結(jié)果荠列,而上面的描述只是手動(dòng)更新了公司的遠(yuǎn)程倉庫,Gradle 本地倉庫并沒有更新载城。所以解決辦法是:
首先將 Gradle 本地倉庫內(nèi)的該依賴刪除(本地沒有依賴才能重新從網(wǎng)絡(luò)拉取依賴)肌似,然后 build.gradle 刪除依賴 → sync → 重新引入依賴(刷新 AS 自身緩存)。經(jīng)過上面?zhèn)z步操作诉瓦,將倆層本地緩存徹底刷新川队,項(xiàng)目依賴才能得到正確更新。下文將會(huì)有遠(yuǎn)程倉庫的分析睬澡,這段內(nèi)容不理解可以后續(xù)回顧固额。
2 遠(yuǎn)程倉庫
2.1 JCenter 遠(yuǎn)程倉庫
作用:三方庫資源共享。
關(guān)于 JCenter 網(wǎng)上教程很多煞聪,或者也可以自行去 官網(wǎng) 注冊學(xué)習(xí)斗躏。
2.2 Maven 遠(yuǎn)程倉庫
作用:通過搭建 Maven 私人遠(yuǎn)程倉庫,提升多人協(xié)作開發(fā)效率昔脯。
Github 搭建私人 Maven 遠(yuǎn)程倉庫
1.在 GitHub 創(chuàng)建倉庫啄糙。(我這里由于創(chuàng)建過同名倉庫所以會(huì)有紅色警告)
2.將 Github 倉庫與本地文件夾綁定。
Github 的基礎(chǔ)用法云稚,不清楚的可以參考下面說明隧饼,了解請?zhí)^。
Github 倉庫的初始化
1.首先在Github新建倉庫碱鳞,不要勾選init
2.在本地新建文件夾桑李,依次如下執(zhí)行命令:
2.1.initgit init
2.2.創(chuàng)建 README 文件
touch README.md
2.3.首次 commit
git add README.md git commit -m "first commit"
3.4.添加遠(yuǎn)程主機(jī) git remote add <主機(jī)名> <網(wǎng)址>
git remote add origin https://github.com/zhxyComing/MyMaven.git
<5.首次push
git push -u origin master
這步首次要求輸入 github 的用戶名和密碼.
3.之后就可以正常 commit、push 了
git push origin master
3.將 aar 上傳到 Github 本地庫。
apply plugin: 'maven'
uploadArchives {
repositories.mavenDeployer {
//Github 本地庫文件夾路徑
def depath = file('/Users/用戶名/MyMaven')
repository(url: "file://${depath.absolutePath}")
pom.groupId = "com.app.xz.library";
pom.artifactId = "librarytest";
pom.version = "1.0.0";
}
}
執(zhí)行 Gradle - uploadArchives 上傳贵白。
4.使用 Git 命令將我們的 aar 提交到遠(yuǎn)程倉庫率拒。
5.引用遠(yuǎn)程倉庫依賴。
如下配置私人遠(yuǎn)程 Maven 倉庫地址禁荒,將 github.com
替換為 raw.githubusercontent.com
猬膨,末尾追加需要的分支名。
buildscript {
repositories {
maven { url "https://raw.githubusercontent.com/zhxyComing/MyMaven/master" }
// mavenLocal()
}
...
}
allprojects {
repositories {
maven { url "https://raw.githubusercontent.com/zhxyComing/MyMaven/master" }
// mavenLocal()
}
}
至此從上傳到依賴配置完畢呛伴。
題外話
組件化開發(fā)中勃痴,將 Module 打包成 aar 上傳至遠(yuǎn)程倉庫,如果 Module(aar) 還依賴了其它第三方庫热康,則這些第三方庫不會(huì)打包到 aar 中沛申。如果主工程也不存在這些第三方庫的依賴,那么項(xiàng)目運(yùn)行中就會(huì)報(bào) ClassNotDefFoundError姐军。
針對上面問題铁材,可以在主工程中引入依賴解決,但終究不夠優(yōu)雅奕锌。后續(xù)將會(huì)探討如何將 module 的依賴庫一并打入 aar著觉,以及它的原理。
[toc]