今天在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è)置:

然后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)了以下兩個文件:

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

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


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