Android Studio打开新项目卡在Gradle的问题

小提示:如果是开在Indexing这个位置,可以 File--> Invalidate Caches/Restart--> Invalidate and Restart.

 

如果卡在 Gradle,可以往下看:

第一次打开项目提示这个,如果选择下载最新的,会很缓慢,该压缩包现在已经有100MB以上了。

解决办法,选择取消,手动设置gradle的安装目录。

设置

 

如果,选择下载最新的gradle,很可能速度太慢,卡很久。可以先把压缩包下载下来。 比如:

https://downloads.gradle.org/distributions/gradle-4.6-all.zip

然后,不要解压压缩包,直接把压缩包,放到上面的路径下。重启Android Studio即可。

 

使用offline work和Local gradle
在setting->Build,Execution,Deployment->gradle路径下,选择Use local Gradle distribution,把gradle下载到本地,这样本项目和其他项目用到的时候就不需要重新下载了。项目编译运行成功后,如果依赖配置没有修改,可以设置为offline work,这样重新打开项目时,就不会重新编译了。

 

为什么会卡在Gradle

(1) 当项目中引用的第三方模块太多,打开Android Studio的时候就会非常慢,提示一直在解决模块依赖,点击sync按钮同步第三方代码的时候也是巨慢,慢的原因是:
在gradle中引用第三方模块时采用maven方式依赖,每次打开Android Studio或者点击sync按钮时,都会去maven中央仓库去取第三方的库文件,一般是jar或者aar文件

如果本地没有该文件,则下载回来,由于通过网络访问Android Studio默认的maven中央仓库jcenter很慢,因此就导致同步会非常耗时,尤其是第一次同步,或者clean后重新build的时候,一般都会在十分钟左右,

即使库文件已经下载到本地了,也会去访问maven仓库的,因此当过多的通过maven方式依赖第三方库的时候Android Studio就会非常慢


(2) Android Studio为什么编译很慢?
Android Studio在编译的时候,如果没有同步第三方代码,或者任何一个gradle文件发生变化后,没有去同步,那么点击运行按钮会自动先同步,也就是先同步后编译,平时我们感觉编译慢的原因主要是同步代码太慢,真正同步完成后编译其实是很快的

2 maven依赖是啥?
svn用来管理文本文件,但它不擅长管理二进制文件,这个时候maven就登场了,简单点说,maven就是管理二进制文件的svn,这样说应该可以理解了吧。一般我们使用别人的库需要下载jar文件然后依赖到我们的工程,现在作者将jar文件发布到公共的maven仓库中,在gradle中我们只需要简单的像下面这样:

dependencies {
    //使用square开源的网络访问框架okhttp
    compile 'com.squareup.okhttp:okhttp:2.5.0'
}

同步代码时,Android Studio就会自动去下载作者发布的jar(或者aar)文件,如果作者发布了新的版本,则只需要简单的修改一下后面的版本号即可,不要这个库,直接删掉这行代码即可,是不是瞬间觉得相当方便啊 
在web开发中,只需要使用maven插件就能实现同样功能,只是依赖的写法不同。这就是解决不同模块不同版本依赖的方法—maven大法。 
然而由于我们访问国外的服务器太慢,这么先进的生产工具就成了鸡肋,这是造成Android Studio卡、慢的根源


3 解决方法
方法一:
当第一次同步代码后,第三方库都下载到本地了,将gradle设置为offline模式,这样下次就不必访问网络了,这样同步速度从几分钟缩短到几秒钟,但缺点是一旦引入新的maven依赖,本地不存在这个库文件,还是得去访问网络,同样同步慢

方法二:
自己搭建maven仓库,将常用的第三方库放在自己搭建的maven服务器上,这样访问内部的maven服务器就快多了,又方便分模块开发和打包,但这样对服务器的管理麻烦,技术含量高,比较适合需要分模块开发的大型项目,而且当多个模块开发不同步,需要对模块分版本进行依赖、打包、发布的时候,必须采用这种方式,例如:模块A已经开发完毕,模块B正在开发,但这个时候要发版本了,怎么办呢?解决办法就是依赖模块B的上个版本,也就是上个版本的aar文件

方法三:
将第三方库下载到本地,然后将代码复制到自己的项目中,这种方法是在代码级别上直接使用别人的代码,优点是再也不用依赖别人的库,项目模块少,库与自己项目融为一体,缺点是复制的时候太辛苦了,不仅要复制代码文件,还要复制资源文件,容易出错,另外耦合比较严重,删除这个库的时候也非常麻烦,同时别人的代码也破坏了自己的代码风格和命名规范

方法四:
推荐的方法是:尽量使用第三方库的jar、aar文件导入自己的项目,或者将第三方库下载到本地,然后当做一个本地模块导入自己的项目,不要再使用gradle中的maven依赖了

这样就不用苦逼的去复制代码,删除的时候也很方便,只需删除模块即可,实现模块即插即用,缺点是会导致项目的模块太多,不美观,以及很多eclipse写的库导入Android Studio后还要自己修改才能编译通过,很多库是Android工程,不是标准意义的Android library,


其他一些注意事项
(1) 尽量删除不用的module,因为每次sync的时候会去同步所有的gradle文件,即使我们的主工程不使用它也会去同步,sync是全局的
(2) 自己下载gradle到本地,然后在Android Studio指定gradle的位置,避免第一次创建项目时去下载gradle,那也是巨慢的一个过程
(3) 减少同步代码的次数,也就是没事别点sync按钮,每次同步代码都是非常消耗资源的过程,次数多了也就卡了

 

相关知识:

plugin version: 英文给的很直观:插件的版本,这边的插件是指 gradle插件的版本,所以标题才是 plugin for gradle version,gradle的插件版本,这边一般都不会有什么问题,按照上面的图,对应填上就OK.

gradle version: gradle其实就是用Groovy语言(脚本语言)来编写的一个构建工具,用来帮我们构造程序,打包,编译,部署,依赖,签名..等等..(ps:groovy是一个脚步语言,不要把它跟as或者java混在一起,用groovy也可以写android代码...有兴趣的同学,可以去了解一下)

Gradle 的每个 Android 插件版本(Android Plugin for Gradle)需要与特定的 Gradle 版本相匹配才能编译成功。为了获得最佳性能,应该使用最新版本的 Gradle 和 Android 插件。
 

参考:
https://www.jianshu.com/p/6a8014d9ceb9
https://blog.csdn.net/fuchaosz/article/details/51146091 
https://www.jianshu.com/p/942bfda73659

修改时间 2019-06-29

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
版权相关
Node.js 模块概念
JavaScript ES6 模块
JavaScript 键盘事件
JavaScript 事件流
JavaScript 修改内容和属性
Three.js导入3D模型
用 JavaScript 实现数字增加滚动动画