本文記錄的是今天在群里提到的昨天所踩的一個(gè)坑,有關(guān) AndroidStudio 緩存的。
夏河網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,夏河網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為夏河上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的夏河做網(wǎng)站的公司定做!
先說(shuō)一下背景。
我負(fù)責(zé)的一個(gè)項(xiàng)目,對(duì)一個(gè)圖表庫(kù)有外部依賴。這個(gè)圖表庫(kù)是我在維護(hù)的,由于新功能在開(kāi)發(fā)中,所以我就使用了 SNAPSHOT 版本發(fā)布到 OJO(oss.jfrog.org) 上。我在項(xiàng)目中剛更新了依賴,忽然想到還少幾個(gè) API,于是發(fā)布了 SNAPSHOT 版本。
故事就這樣開(kāi)始了。
這時(shí)候回到 AndroidStudio 再去 Sync Project with Gradle Files
肯定是拉不下來(lái)的。眾所周知,Gradle 的緩存策略中,對(duì)于 SNAPSHOT 版本默認(rèn)的緩存周期是 24 小時(shí),也就是從我上次更新之后,24小時(shí)內(nèi)都會(huì)使用上次的緩存。
不周知的也沒(méi)關(guān)系,我在這里補(bǔ)充說(shuō)明一下,在 Gradle 用戶指南的依賴管理一章中,有提到 Gradle 對(duì)于動(dòng)態(tài)版本和變化模塊的緩存時(shí)間默認(rèn)是 24 小時(shí)。
何為動(dòng)態(tài)版本?你見(jiàn)過(guò)的像3.+
這種就是動(dòng)態(tài)版本,它會(huì)取檢查到的最高的版本號(hào)。又比如latest.integration
,它也是動(dòng)態(tài)版本。
而變化模塊,就是像0.2-SNAPSHOT
這種后面帶SNAPSHOT
的版本了。
這兩者的區(qū)別就是,前者盡管你代碼中的版本號(hào)寫(xiě)法不變,但實(shí)際上它仍然是去取倉(cāng)庫(kù)的最新版本。而后者它在倉(cāng)庫(kù)中的版本號(hào)還是一樣,仍然是xxx-SNAPSHOT
,但實(shí)際上這個(gè)版本所對(duì)應(yīng)的內(nèi)容已經(jīng)變了。
這里再多說(shuō)幾句,緩存周期也是可以修改的,在 Gradle 用戶指南中同樣有詳細(xì)說(shuō)明,就是添加如下配置:
configurations.all { resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes' // 動(dòng)態(tài)版本 resolutionStrategy.cacheChangingModulesFor 10, 'minutes' // 變化模塊}1234
只是這里我一開(kāi)始就貪省事,在更新依賴懶得去改。
既然如此,那怎么辦?把 ~/.gradle/caches
整個(gè)給干掉?
不不不,那樣太小題大做。其實(shí)這個(gè)問(wèn)題我早已遭遇過(guò),并且對(duì)于“漢化”過(guò)一遍 Gradle 用戶指南的我來(lái)說(shuō)太簡(jiǎn)單了。命令行下執(zhí)行:
./gradlew aTD --refresh-dependencies1
這里啰嗦一下,aTD
是項(xiàng)目中一個(gè) Gradle 任務(wù)的縮寫(xiě),全名是 assembleTestingDebug
,其中 Testing
是項(xiàng)目里的一個(gè) ProductFlavor
。這并不重要,重點(diǎn)是后面的參數(shù) --refresh-dependencies
,加上這個(gè)參數(shù),表示強(qiáng)制刷新依賴。
但是回到 AndroidStudio 寫(xiě)代碼,發(fā)現(xiàn)代碼提示中新的 API 還是沒(méi)有出來(lái)??磥?lái)是 Android Studio 沒(méi)有更新。不過(guò)沒(méi)關(guān)系,這事我也有經(jīng)驗(yàn)。點(diǎn)開(kāi)右邊的 Gradle 面板,找到 androidDependencies
任務(wù),右鍵,Create xxxxx Configuration
,然后在彈出的面板的 Arguments 一欄中輸入前面提到的參數(shù) --refresh-dependencies
,添加完,在運(yùn)行那里選擇它執(zhí)行。
原來(lái)是在 .idea/libraries 里會(huì)記錄每一個(gè)第三方庫(kù)的 classes, javadoc 以及 sources 所對(duì)應(yīng)的路徑。其中 classes 對(duì)應(yīng)的正是前面所提到的 transforms-1 里的目錄,同樣也正如前面所說(shuō),其中包含的路徑是有 hash 值的,更新了依賴之后,hash 值不同,新的緩存路徑也就不同了,而這里還是用的原來(lái)被刪的那個(gè)路徑,找不到對(duì)應(yīng)的文件當(dāng)然編輯器里就提示 cannot resolve symbol
了。所以正確而直接的解決方案應(yīng)該是刪除 .idea/libraries/
里對(duì)應(yīng)該第三方庫(kù)的 xml 文件讓它重新生成,或者是直接修改該 xml 文件的內(nèi)容,改為更新依賴之后的路徑。