Android 倉庫解析

背景

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:

Gradle-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ì)有紅色警告)

Github 創(chuàng)建倉庫

2.將 Github 倉庫與本地文件夾綁定。

Github 的基礎(chǔ)用法云稚,不清楚的可以參考下面說明隧饼,了解請?zhí)^。

Github 倉庫的初始化

1.首先在Github新建倉庫碱鳞,不要勾選init
2.在本地新建文件夾桑李,依次如下執(zhí)行命令:
2.1.init

git 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]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惊暴,一起剝皮案震驚了整個(gè)濱河市亭引,隨后出現(xiàn)的幾起案子肉微,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件知残,死亡現(xiàn)場離奇詭異知允,居然都是意外死亡练湿,警方通過查閱死者的電腦和手機(jī)番枚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來村砂,“玉大人烂斋,你說我怎么就攤上這事〈》希” “怎么了汛骂?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長评腺。 經(jīng)常有香客問我帘瞭,道長,這世上最難降的妖魔是什么蒿讥? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任蝶念,我火速辦了婚禮抛腕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媒殉。我一直安慰自己担敌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布廷蓉。 她就那樣靜靜地躺著全封,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桃犬。 梳的紋絲不亂的頭發(fā)上刹悴,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音攒暇,去河邊找鬼土匀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扯饶,可吹牛的內(nèi)容都是我干的恒削。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尾序,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躯砰?” 一聲冷哼從身側(cè)響起每币,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琢歇,沒想到半個(gè)月后兰怠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡李茫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年揭保,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄宏。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秸侣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宠互,到底是詐尸還是另有隱情味榛,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布予跌,位于F島的核電站搏色,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏券册。R本人自食惡果不足惜频轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一垂涯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧航邢,春花似錦耕赘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秽之,卻和暖如春当娱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背考榨。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工跨细, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人河质。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓冀惭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掀鹅。 傳聞我的和親對象是個(gè)殘疾皇子散休,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355