
Bug 出現(xiàn)
事情是這樣的,昨天早晨我正做著項目,坐在我旁邊的小伙伴呼喚了我一下,說項目運行不起來了。
我納悶著,前天下班的時候還好好的,怎么過了一晚就出問題了。我問他是不是改了什么配置,或者添加了什么東西。他說,沒有啊,剛打開 AndroidStudio,運行就報錯,昨天晚上還是好的。
Bug 真身
好吧,我也沒多想,看了下報錯的 log 提示,額,沒見過。怎么辦?直接百度一下吧!
Error:Could not read entry ':xxx:packageDebug' from cache taskArtifacts.bin (xxx.gradle\2.10\taskArtifacts\taskArtifacts.bin).
com.android.build.gradle.tasks.PackageApplication$DexPackagingPolicy
開始 Debug
首先,在百度上(鄙視我吧,我就是用百度搜的...哈哈)試著搜了下“Could not read entry ':xxx:packageDebug' from cache taskArtifacts.bin”,無果。
那好刪點內(nèi)容,繼續(xù)搜“Could not read entry from cache taskArtifacts.bin”。還是無果,那好,來看看是不是配置改動了。
對比了下兩臺機器上項目中所有和項目構(gòu)建相關(guān)的配置文件,我這邊是好的啊,那按我這邊的來。改完后,重新編譯,運行,依舊報錯。
這都折騰十幾分鐘了,果斷不能忍了。仔細(xì)看看報錯的提示信息:“Could not read entry ':xxx:packageDebug' from cache taskArtifacts.bin.”。這里說的不能從什么 bin 中讀取 entry。嗯,那應(yīng)該可能是文件壞了,讀不了;或者權(quán)限變化了,不讓讀了。
OK,這好辦,讓我看看你的屬性。一看,想簡單了,屬性中看不出什么異常。那好,用我機器上的給你替換了,這回該行了吧!于是將整個“.gradle”文件夾替換掉,我再試。額,還不行。
Debug 三板斧
網(wǎng)上找不到解決方案(當(dāng)然沒有 Google 試一下),試了這么久又沒見效果。咋辦?好吧!逼我使出殺手锏 —— 重裝、重啟、還原,對就是我以前修電腦的那套。
重裝,在這里用不好,為什么?因為其他的項目是好用的,說明 AndroidStudio 應(yīng)該沒“壞”。
重啟,這個可以試一下。說干就干,把 AndroidStudio 關(guān)了,重新打開,一個樣,還是報同樣的錯。
只剩下還原大法沒用了,這個貌似也不符合目前的場景?。ú坏侥且徊轿铱刹幌胫匦聫膫}庫 down 代碼來構(gòu)建個新工程,這是“下策”,有木有)。
重整旗鼓再戰(zhàn)
第一招殺手锏失效了,不怕,我可不是程咬金,就這三板斧。雖然,還有很多招數(shù)沒有使出來,但我知道,該坐下來好好分析下問題了。下面,看看我的分析思路:
- 定位報錯位置,這好辦,就是這個taskArtifacts.bin
- 查看報錯原因,Could not read entry ...
- 綜合上述現(xiàn)象,推測可能的原因 —— 不能從這個什么 bin 中讀出東西來(這還用你說,人家就是這樣提示的,呵呵)
- 等一下,少了個關(guān)鍵點,這個文件是哪里來的
想到這,我有點眉目了。這個文件不是我們自己寫的,是工具幫我們生成的(這個我沒有深入研究是哪個工具生成的,姑且認(rèn)為是 AndroidStudio 中的某個工具吧)。那問題來了,既然都不是我寫的,你給我報錯,那應(yīng)該是你生成的時候出問題了(相信大家以前在使用 Eclipse 的時候都遇到過 R 文件不存在的問題,想想這個一般都是怎么解決的)。那好那我讓你重新給我生成一下,這下該可以了吧!
要怎么讓 AndroidStudio 給我們重新生成這個 taskArtifacts.bin 是個問題。為什么這么說?因為很顯然重新編譯的時候這個文件沒有更新的說,至少目前現(xiàn)象來看,它沒有更新。這也好辦,我把你全部刪了,這回該給我生成新的了吧!
Bug 解決
沒錯,把項目中 .gradle 文件夾下面的所有內(nèi)容刪除,然后 clean 一下項目,就好了。如下圖:


說明:到這里,本文應(yīng)該告一段落了。雖然最后解決了問題,但是卻有個不爽的事 —— 自始至終沒找出問題出在哪里。
當(dāng)時也沒有截圖,只是保存了當(dāng)時報錯的信息。我想還是應(yīng)該記錄一下這個問題,為減少以后再采坑里去。
下面,我演示一下如何模擬復(fù)現(xiàn)這個問題,權(quán)當(dāng)是一次記錄。
在文件夾中定位到 taskArtifacts.bin 文件

修改屬性

錯誤復(fù)現(xiàn)
這里請不要較真,當(dāng)時的場景已經(jīng)沒有辦法復(fù)現(xiàn),這里僅僅是模擬...

解決問題
在這里只要把只讀屬性去掉就好了。
說明:這里想提醒自己,以后要是遇到類似的問題,首先要仔細(xì)閱讀錯誤 log 提示,然后,冷靜思考問題出現(xiàn)的可能原因,不要過于依賴搜索引擎,要養(yǎng)成勤思考的習(xí)慣。