解决 Could not read entry xxx from

作者: diygreen | 来源:发表于2016-04-08 14:06 被阅读796次
    Bug 示意图

    Bug 出现

    事情是这样的,昨天早晨我正做着项目,坐在我旁边的小伙伴呼唤了我一下,说项目运行不起来了。

    我纳闷着,前天下班的时候还好好的,怎么过了一晚就出问题了。我问他是不是改了什么配置,或者添加了什么东西。他说,没有啊,刚打开 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”,无果。
    那好删点内容,继续搜“Could not read entry from cache taskArtifacts.bin”。还是无果,那好,来看看是不是配置改动了。

    对比了下两台机器上项目中所有和项目构建相关的配置文件,我这边是好的啊,那按我这边的来。改完后,重新编译,运行,依旧报错。

    这都折腾十几分钟了,果断不能忍了。仔细看看报错的提示信息:“Could not read entry ':xxx:packageDebug' from cache taskArtifacts.bin.”。这里说的不能从什么 bin 中读取 entry。嗯,那应该可能是文件坏了,读不了;或者权限变化了,不让读了。

    OK,这好办,让我看看你的属性。一看,想简单了,属性中看不出什么异常。那好,用我机器上的给你替换了,这回该行了吧!于是将整个“.gradle”文件夹替换掉,我再试。额,还不行。

    Debug 三板斧

    网上找不到解决方案(当然没有 Google 试一下),试了这么久又没见效果。咋办?好吧!逼我使出杀手锏 —— 重装重启还原,对就是我以前修电脑的那套。

    重装,在这里用不好,为什么?因为其他的项目是好用的,说明 AndroidStudio 应该没“坏”。
    重启,这个可以试一下。说干就干,把 AndroidStudio 关了,重新打开,一个样,还是报同样的错。
    只剩下还原大法没用了,这个貌似也不符合目前的场景啊(不到那一步我可不想重新从仓库 down 代码来构建个新工程,这是“下策”,有木有)。

    重整旗鼓再战

    第一招杀手锏失效了,不怕,我可不是程咬金,就这三板斧。虽然,还有很多招数没有使出来,但我知道,该坐下来好好分析下问题了。下面,看看我的分析思路:

    1. 定位报错位置,这好办,就是这个taskArtifacts.bin
    2. 查看报错原因,Could not read entry ...
    3. 综合上述现象,推测可能的原因 —— 不能从这个什么 bin 中读出东西来(这还用你说,人家就是这样提示的,呵呵)
    4. 等一下,少了个关键点,这个文件是哪里来的

    想到这,我有点眉目了。这个文件不是我们自己写的,是工具帮我们生成的(这个我没有深入研究是哪个工具生成的,姑且认为是 AndroidStudio 中的某个工具吧)。那问题来了,既然都不是我写的,你给我报错,那应该是你生成的时候出问题了(相信大家以前在使用 Eclipse 的时候都遇到过 R 文件不存在的问题,想想这个一般都是怎么解决的)。那好那我让你重新给我生成一下,这下该可以了吧!

    要怎么让 AndroidStudio 给我们重新生成这个 taskArtifacts.bin 是个问题。为什么这么说?因为很显然重新编译的时候这个文件没有更新的说,至少目前现象来看,它没有更新。这也好办,我把你全部删了,这回该给我生成新的了吧!

    Bug 解决

    没错,把项目中 .gradle 文件夹下面的所有内容删除,然后 clean 一下项目,就好了。如下图:

    .grdle 文件夹 clean 项目

    说明:到这里,本文应该告一段落了。虽然最后解决了问题,但是却有个不爽的事 —— 自始至终没找出问题出在哪里。

    当时也没有截图,只是保存了当时报错的信息。我想还是应该记录一下这个问题,为减少以后再采坑里去。

    下面,我演示一下如何模拟复现这个问题,权当是一次记录。

    在文件夹中定位到 taskArtifacts.bin 文件

    定位到 taskArtifacts.bin

    修改属性

    将其改为只读属性

    错误复现

    这里请不要较真,当时的场景已经没有办法复现,这里仅仅是模拟...


    错误复现

    解决问题

    在这里只要把只读属性去掉就好了。

    说明:这里想提醒自己,以后要是遇到类似的问题,首先要仔细阅读错误 log 提示,然后,冷静思考问题出现的可能原因,不要过于依赖搜索引擎,要养成勤思考的习惯。

    相关文章

      网友评论

      • 天接水0001:大神,😊思路清晰
        diygreen: @天接水0001 😊
      • binwin20:昨天看了楼主这篇文章, 今天就报同样的错了. 今天听说 as2.0正式版出来了, 于是下载安装了 as2.0, 把以前的项目导入到as2.0中, debug 没问题. 关闭 as2.0,然后用 as1.5打开这个项目, debug 一下就报跟楼主同样错了.
        binwin20:@diygreen 谢谢楼主, 按照楼主的方法, 解决了.
        diygreen: @binwin20 哈哈😄,解决了吗?
      • binwin20::app:
      • 空心菜的爱:删除那个文件就行了
        diygreen: @空心菜的爱 呵呵,我当时绕进去了
        空心菜的爱: @diygreen 前几天也遇到了😁
        diygreen: @空心菜的爱 是的😁

      本文标题:解决 Could not read entry xxx from

      本文链接:https://www.haomeiwen.com/subject/zhevlttx.html