GradleWrapper本地倉庫緩存損壞問題解決方案及原理

今天在github上下載了一個開源項目,然后AndroidStudio打開,報了以下錯誤:

Failed to open zip file. Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) 

Re-download dependencies and sync project (requires network)

Re-download dependencies and sync project (requires network)

雖然系統(tǒng)給出了解決方案,但是點擊它重新下載依然沒有什么用處,百度搜了搜,發(fā)現(xiàn)幾篇博客千篇一律給出的都不是本質(zhì)上的解決方案。所以就有了這篇東西。
我知道有些人只想解決問題而不想管原因,所以先上解決方案:

解決方案

首先看一下你報錯工程的gradlewrapper設(shè)置:

gradlewrapper設(shè)置

然后windows資源管理器打開C:\Users\Administrator\.gradle\wrapper\dists這個目錄,直接刪掉跟上面版本一致的文件夾,然后再次build工程,它會重新下載gradle,這個可能會耗時比較長,下載完畢后,問題就解決了。

為什么?

這里要扯到一個概念:gradlewrapper。
gradle作為一個構(gòu)建工具,它本身的版本也是在不斷迭代更新的,這就可能出現(xiàn)一種情況:一個團隊合作的項目,每個人的電腦上gradle版本不一定相同,如果這樣,由于升級帶來的接口或?qū)崿F(xiàn)不一致問題就會很嚴重(接口的破壞性升級會導(dǎo)致無法編譯,實現(xiàn)不同則有可能帶來隱患)。
為了避免出現(xiàn)這種情況,gradle采用了一種策略,就是gradlewrapper。每個工程下都有g(shù)radlewrapper配置文件,上面記錄了這個工程使用的gradle版本,當(dāng)有新成員下載了這個工程時,并不需要在電腦上手動安裝gradle,而是在編譯時由gradle-wrapper.jar根據(jù)gradle-wrapper.properties中的配置到gradle本地倉庫去檢索對應(yīng)版本的gradle作為本工程的構(gòu)建工具,如果本地倉庫沒有對應(yīng)版本的gradle,則通過網(wǎng)絡(luò)到遠程倉庫(gradle官方)去下載。
說到這里,大家肯定都明白了,上面提到的C:\Users\Administrator\.gradle\wrapper\dists這個就是gradle本地倉庫。而為什么會出現(xiàn)本文提到的錯誤?那是因為,本地倉庫中對應(yīng)版本的gradle文件壓縮包出現(xiàn)了問題,可能是這個壓縮包本身損壞了,也可能是這個壓縮包是很早期的版本,過后被替換過,但又沒換名字(后面這種是我自己猜測的,官方應(yīng)該不至于干這種不專業(yè)的事吧。。。)。
為了驗證我的猜測,我首先到本地倉庫中找到對應(yīng)版本的文件夾(本工程是4.6版本gradle),文件夾里面只有一個亂七八糟字符的文件夾(應(yīng)該是某種規(guī)則的唯一編碼),點進去,發(fā)現(xiàn)了以下兩個文件:

gradle4.6版本目錄

然后我再回到本地倉庫,對比一下完全沒問題的4.4版本,發(fā)現(xiàn)內(nèi)容是這樣:
gradle4.4版本目錄

觀察一下就能發(fā)現(xiàn),4.4目錄里那個文件夾就是把壓縮包給解壓了,那為什么4.6沒有解壓?我回到4.6的文件夾里用壓縮工具手動解壓那個安裝包,在解壓的最后,解壓工具報了幾個錯誤,不過還是解壓出了一些文件。我們知道,gradle是用groovy來解壓zip文件,如果這個過程中報錯了,它會遵守事務(wù),把殘缺的解壓結(jié)果刪掉,所以就有了本文描述的錯誤。
ok。我把有問題的4.6改個名字,重新編譯,這樣跟刪除是一個效果,目的是看看新下載的文件跟老的有什么區(qū)別。
有問題的老壓縮包

新下載的壓縮包

看到區(qū)別了么?新的比老的大一些,至于是不是老的在傳輸過程中受損那就不得而知了。
最后,我用解壓工具解壓這個新壓縮包,也并不會報任何錯誤。
這才是真正解決了問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容