中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android Studio中緩存的示例分析

發布時間:2021-07-12 14:09:23 來源:億速云 閱讀:144 作者:小新 欄目:移動開發

這篇文章將為大家詳細講解有關Android Studio中緩存的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

先說一下背景。

我負責的一個項目,對一個圖表庫有外部依賴。這個圖表庫是我在維護的,由于新功能在開發中,所以我就使用了 SNAPSHOT 版本發布到 OJO(oss.jfrog.org) 上。我在項目中剛更新了依賴,忽然想到還少幾個 API,于是發布了 SNAPSHOT 版本。

故事就這樣開始了。

這時候回到 AndroidStudio 再去 Sync Project with Gradle Files 肯定是拉不下來的。眾所周知,Gradle 的緩存策略中,對于 SNAPSHOT 版本默認的緩存周期是 24 小時,也就是從我上次更新之后,24小時內都會使用上次的緩存。

不周知的也沒關系,我在這里補充說明一下,在 Gradle 用戶指南的依賴管理一章中,有提到 Gradle 對于動態版本和變化模塊的緩存時間默認是 24 小時。

何為動態版本?你見過的像 3.+ 這種就是動態版本,它會取檢查到的最高的版本號。又比如 latest.integration ,它也是動態版本。

而變化模塊,就是像 0.2-SNAPSHOT 這種后面帶 SNAPSHOT 的版本了。

這兩者的區別就是,前者盡管你代碼中的版本號寫法不變,但實際上它仍然是去取倉庫的最新版本。而后者它在倉庫中的版本號還是一樣,仍然是 xxx-SNAPSHOT ,但實際上這個版本所對應的內容已經變了。

這里再多說幾句,緩存周期也是可以修改的,在 Gradle 用戶指南中同樣有詳細說明,就是添加如下配置:

configurations.all {
  resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes' // 動態版本
  resolutionStrategy.cacheChangingModulesFor 10, 'minutes' // 變化模塊
}

只是這里我一開始就貪省事,在更新依賴懶得去改。

既然如此,那怎么辦?把 ~/.gradle/caches 整個給干掉?

不不不,那樣太小題大做。其實這個問題我早已遭遇過,并且對于“漢化”過一遍 Gradle 用戶指南的我來說太簡單了。命令行下執行:

./gradlew aTD --refresh-dependencies

這里啰嗦一下, aTD 是項目中一個 Gradle 任務的縮寫,全名是 assembleTestingDebug ,其中 Testing 是項目里的一個 ProductFlavor 。這并不重要, 重點是后面的參數 --refresh-dependencies ,加上這個參數,表示強制刷新依賴。

但是回到 AndroidStudio 寫代碼,發現代碼提示中新的 API 還是沒有出來。看來是 Android Studio 沒有更新。不過沒關系,這事我也有經驗。點開右邊的 Gradle 面板,找到 androidDependencies 任務,右鍵, Create xxxxx Configuration ,然后在彈出的面板的 Arguments 一欄中輸入前面提到的參數 --refresh-dependencies ,添加完,在運行那里選擇它執行。

Android Studio中緩存的示例分析

等執行完,按照幾年前的經驗,這時候應該出來了吧?

然而,實際上并沒有。

這時候我忽然想起,我們公司在阿里云服務器上搭建了一個 maven 私服,去年的時候我在上面配置了對 OJO 的代理,這時候拉取的是私服上的版本,是它沒有更新?

沒關系,解決方法很簡單,刪!

于是我登錄到 nexus 上,找到緩存的這個庫,右鍵,整個版本刪掉。刪了服務器上的之后,還覺得不放心,于是再把 .gradle 里的緩存給找出來刪掉,我當時應該是這樣子的:

Android Studio中緩存的示例分析

使用 nexus 搭建 maven 私服有幾種好處,一是可以放公司內部的庫;二是配置對其他 maven 倉庫的代理,當有人去訪問某一個依賴時它就會緩存下來,下次其他人再訪問同一個依賴的話它就會直接取緩存,對于一些在國內訪問不是很友好的倉庫如 jcenter,能有效減少等待時間。當然如果公司內部局域網部署一個的話,提升效果會更顯著。

最后再執行前面步驟。命令行中已經可以看到重新下載了這個依賴了,并且我也檢查了 .gradle/caches/modules-2 下對應的源碼 jar 包,確實是更新了。

再回到 Android Studio,發現依然沒有更新。

這什么情況?

我疑惑了一下,心中一個聲音響起:

啊(這里應讀四聲)!

這時候我想到了,新版的 Android Studio 為了提速,多了一層緩存:對于第三方依賴會把它們解壓出來,放到 ~/.gradle/caches/transforms-1 目錄中。

于是繼續:

刪!

find . -name "hichart*" |xargs rm -rf

然后再構建,讓它重新緩存,這時候應該就可以了吧。

在 Android Studio 中執行了構建,然后發現它確實重新緩存了。但是——

悲劇就此發展,深坑就此塌陷!

這時候,我發現不單是新加的 API 沒有出來,編輯器里有關這個庫的代碼全都變紅了!盡管!項目還是能跑起來!當時的屏幕是這樣的:

Android Studio中緩存的示例分析

不對不對。咋回事?

這時候我又機智地想到,這里緩存的路徑有包含 hash 作為名稱的文件夾,更新了之后,hash 值也不同了,所以應該是哪里的索引沒有對應上。于是找啊找,就在 transforms-1/metadata-1.1 中發現了一個叫 results.bin 的文件。再搜一下里面有沒有包含那個庫的內容:

cat results.bin| grep "hichart"

提示是二進制文件。哦,那就加個參數:

cat results.bin| grep -a "hichart"

結果出來了,果然有。那好,那就再刪!

等等——我這時謹慎了一下,還是重命名一下好了。于是重命名,然后再執行構建,然后看到這個文件重新生成了,看起來正朝預料中的發展。然而,有關這個庫的引用還是報錯。

這時候的我陷入了一番沉思,再試其他方法:

  1. Sync with File System

  2. Sync Project with Gradle Files

  3. File -> Invalidate Caches / Restart

還是無效。帶著郁悶,我下班了。

雖然這問題此刻表現得如此頑固,但是最終它還是被我解決了。

早上一來,我覺得我應該是有點急了,畢竟項目的開發時間由此被我拖多了一天了,但是作為一名有著一顆運維的心的程序員,自己踩陷的坑無論怎樣也要把它踩平。

于是我開始往其他緩存方面上考慮,也沒有去想合不合邏輯。我想到了 Gradle 在構建時會對一個任務的輸入做快照,于是找到項目里的 .gradle/buildOutputCleanup 目錄,刪!

還不行,那就 .gradle/4.4 (當前使用的 Gradle 版本),刪!

還不對,那就整個 .gradle ,刪!

甚至, ~/.gradle/caches/transforms-1/ ,刪!

依然不對,那就 Android Studio 的配置文件夾, ~/.AndroidStudio3.1 ,刪!

刪完重新打開 Android Studio 導入配置,這時候發現已經不是之前的問題了,你以為問題解決了嗎?不!是問題升級了!這時候已經不是那個庫報紅了,而是所有引用第三方庫的地方都報紅了!!!盡管,還是可以運行起來!!

百般無奈之下,繼續 google,看到的還是前面提到的 Invilate Cache 的方法。忽然在 Stackoverflow 中看到了一個看起來不是很常見的回答:

退出 Android Studio,刪除所有的 .iml 文件以及 .idea 目錄,打開 Android Studio 重新導入項目。

咦?這方法沒試過。那就試試吧:

find . -name "*.iml" |xargs rm
find . -name ".idea" |xargs rm -rf

然后重新打開 Android Studio,點 Sync with File System ,這時候奇跡終于出來了,應該說,Android Studio 終于正常了,編輯器不報紅了!

壓抑著心中的萬分激動,有著打破沙鍋問到底精神的我,對此問題仍不放棄思考。

所以,究竟是什么原因呢?

我看了一下 .iml 文件,沒什么異常。那就再看.idea 目錄。

find .idea -type f |xargs grep "hichart"

結果如下:

Android Studio中緩存的示例分析

原來是在 .idea/libraries 里會記錄每一個第三方庫的 classes, javadoc 以及 sources 所對應的路徑。其中 classes 對應的正是前面所提到的 transforms-1 里的目錄,同樣也正如前面所說,其中包含的路徑是有 hash 值的,更新了依賴之后,hash 值不同,新的緩存路徑也就不同了,而這里還是用的原來被刪的那個路徑,找不到對應的文件當然編輯器里就提示 cannot resolve symbol 了。所以正確而直接的解決方案應該是刪除 .idea/libraries/ 里對應該第三方庫的 xml 文件讓它重新生成,或者是直接修改該 xml 文件的內容,改為更新依賴之后的路徑。

關于“Android Studio中緩存的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳普湖县| 亳州市| 广南县| 辽宁省| 准格尔旗| 太原市| 育儿| 临朐县| 双柏县| 咸丰县| 宁化县| 唐河县| 新巴尔虎左旗| 延安市| 桃园县| 华容县| 正定县| 吉水县| 梧州市| 台中县| 江达县| 镶黄旗| 东台市| 西峡县| 宁波市| 江城| 阿瓦提县| 富源县| 永善县| 竹山县| 五常市| 连山| 玉溪市| 公安县| 富裕县| 囊谦县| 华阴市| 呼玛县| 新闻| 绥棱县| 井冈山市|