从github上下载项目MVPDemo,在导入Android Studio时遇到这样的编译问题,报错如下图所示:
Error:Failed to open zip file.
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
<a href="syncProject">Re-download dependencies and sync project (requires network)</a>
<a href="syncProject">Re-download dependencies and sync project (requires network)</a>
翻译过来就是:
错误:未打开zip文件。
Gradle的依赖项缓存可能是腐败的(这有时发生在网络连接超时之后)。
<a href="syncProject" >重新下载依赖项和同步项目(需要网络)< /a>
<a href="syncProject" >重新下载依赖项和同步项目(需要网络)< /a>
分析原因:
问题可能出在gradle-wrapper.properties,查看MVPDemo项目里面的gradle-wrapper.properties文件,发现是:
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
也就是说,出现报错,可能是这个gradle-2.8-all.zip没有下载下来。
这时我想到的是,我们平时在导入项目时,如果某个项目使用的是Gradle1.5进行的编译,而本地又没有该版本的Gradle的时候,Android Studio就会去下载这个版本的Gradle,而有时,我们无法正常访问到这些资源,所以经常导致Android Studio卡死,为了避免这个问题,首先在本地用当前版本的Gradle创建一个正常的项目,保证可以编译通过即可,然后,用本地项目中的“gradle”文件和“build.gradle”文件,去替换要导入项目中的这两个文件夹,接下来,再打开这样的项目,就可以使用本地的Gradle对项目进行编译了。
我们知道,第一次创建项目时,Android Studio会去下载Gradled的相关配置文件,默认下载地址是 C:\Users\Administrator.gradle,下载的等待时间较长。不过,我们也准备了解决方案,打开C:\Users\Administrator.gradle 下的C:\Users\Administrator.gradle\wrapper\dists\gradle-2.2-all\1vevkra640w3rb9hkuw50q5we 文件夹,这串很奇怪的数字文件夹是随机生成的,我们看到下面gradle-2.2-all.zip的.part文件,知道了这个版本号,我们就可以使用迅雷这样的下载软件到官网上快捷下载。下载好的gradle-2.2-all.zip文件,就放到这个奇怪的数字文件夹下,不用解压,Android Studio 运行的时候会自动解压,重启Android Studio之后,再创建新工程就只需要下载一些jcenter的依赖包,这些都很小。
解决方案:
现在我们知道主要是缺少了gradle-2.8-all.zip文件,不信的话可以打开.gradle文件里面,如图所示:
其中,虽然有gradle-2.8-all.zip文件,但是大小只有15.2MB,显然没有完全下载,如果查看gradle-4.1-all.zip文件夹,会发现大小有236MB,闲话少说,只要在本地新建一个可以编译的正常的项目,然后从该项目中的gradle-wrapper.properties文件里面复制distributionUrl替换掉MVPDemo项目里面的distributionUrl即可。
本地正常可以编译的项目里面的gradle-wrapper.properties文件,如图所示:
MVPDemo项目里面的gradle-wrapper.properties文件,如图所示:
只要将:
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
改为:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
即可解决问题。
注意事项:
我们要避免这些问题,最好平时注意导入项目到Android Studio 时,用本地项目中的“gradle”文件和“build.gradle”文件,去替换要导入项目中的这两个文件夹。