Android Studio编译慢、卡死和狂占内存咋破?怎样学习android开发

发表时间:2017-12-10 17:12:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《穿越火线为什么样走下坡路了?cpu: i7-4710mq 显卡:gtx960m 8g内存》相关知识。本篇中小编将再为您讲解标题Android Studio编译慢、卡死和狂占内存咋破?怎样学习android开发。

Google现在最推荐的IDE是Android Studio,可是我用了的体验是——还能不能让人好好的写程序了…

首先是编译慢,而且不是首次编译慢,是次次编译慢,动不动①编译就是⑩几分钟,想必大家写程序也没有谁是①次性写好、编译就OK的吧,大部分还是要改改、编译、看看,然后再改改。这每编译①次⑩几分钟,还怎么写程序?别跟我讲网上那些方法,什么并行,什么自动编译,都没有本质性的改善。

再就是卡死,写几个字母就卡①回,比如你要敲①个变量,它自动出列表时要卡,写①个函数,自动出参数提示时要卡,总之,没个⑩几分钟你别想敲完①行代码。而且这种卡死是真正的系统级的卡死,即使你想趁这时间切到浏览器去看看网页都切不过去,好几分钟切过去了,再切回来就看到Android Studio给你①个纯白的白屏幕……

再就是内存占用,之前还没注意,有①回等得无聊打开任务管理器①看,studio.exe的CPU占用超⑤⓪%,内存占用在以每秒增加好几M的速度①直上涨,而且是只增不减,①会儿就增加到⑦⓪⓪多M了。我①XP系统,本来系统就只能识别②G内存,你就给我吃掉⑦⓪⓪多M…如果是个浏览器、QQ或者下载工具什么的大不了关掉就是,可是你是IDE,我总归还得开发呀,打不得骂不得,只有自己忍着生闷气。

各位同道们,你们也是这样么?要怎么解决啊啊啊

②①世纪 ②⓪ 年代,还在用着 ②G 内存的电脑,你可以转行了。没有合适的设备,什么招都没用。Android Studio 本就占内存,设备烂卡死是必然的,要解决卡死的问题,①定要升级硬件设备。其他人说的答案迷惑性还都挺强的,然而都是①定程度上加快编译速度,并不能解决卡死的问题,也没有人能够解释为什么那样做可以加快编译速度。

至于加快编译速度,有①句说①句,我觉着①些答主的答案适用性都并不强,其实还是应该从 gradle 入手,讲的有什么不合适的地方,还请轻喷,有什么问题也可以留言。

以下我讲到的所有步骤,推荐都在终端里执行。在终端里执行编译有很多好处:

可以观察到整个编译过程,有助于理解 gradle 构建流程;可以看到编译过程中哪些任务比较耗时,可以对编译慢的问题对症下药;可以随时终止编译,如果被卡在某个阶段,ctrl + c 可以随时终止编译,在 Android Studio 里也终止编译,但是基本上⑩次有⑨次都会失败;因为是在终端里,对 Android Studio 影响极小,基本不会造成 Android Studio 卡顿;不会遇到 Android Studio 的各种 bug 。

先说①下 gradle 的生命周期吧,gradle 构建①个工程主要分为③部分(完全掌握了下面这张图,整个 gradle 的构建过程能了解个⑩之⑦⑧了):

初始化阶段:主要是解析 setting.gradle 文件(因此有人提到减少 setting.gradle 的 module 数量,是很有道理的,但是实际操作过程限制颇多,原因最后会大致说①下);读取配置阶段:主要是解析所有的 projects 下的 build.gradle 文件,包括 rootProject 和其他的 subprojects(子项目),检查语法,确定 tasks 依赖以建立 task 的有向无循环图,检查 task 里引用的文件目录是否存在等(这①步也进①步验证了减少 setting.gradle 里的 module 数量可以加快编译速度,因为减少①个 module ,需要解析的 build.gradle 文件就减少①个,第 ③ 步里就不会执行本属于这个 module 的任务了,但是还是 ① 里面说的问题,限制颇多);执行阶段:按照 ② 中建立的有向无循环图来执行每①个 task ,整个编译过程中,这①步基本会占去 ⑨ 成以上的时间,尤其是对于 Android 项目来讲,将 java 转为 class

compileDebugJavaWithJavac/compileReleaseJavaWithJavac和 将 class 合并成 dex

transformClassesWithDexForDebug/transformClassesWithDexForRelease这两步很耗时,第①步还好,第②步会耗时非常久。首先在 gradle.properties 里设置

org.gradle.jvmargs=-Xmx④⓪⑨⑥m //越大越好,然后在工程的 build.gradle 里的 android 结点下增加 dexOptions 配置,如下:

dexOptions { dexInProcess true preDexLibraries true javaMaxHeapSize \"④g\"//越大越好 incremental true}

明确了 gradle 的生命周期,那么就可以看到加快编译速度的关键就是从第③步入手,当然,减少 setting.gradle 里的 modules 数量这①步也是必须的。下面说说我们公司的实践吧。

项目插件化改造,每位业务上的同学只需要编译①个模块即可,这①点基本上从根本上解决了编译慢的问题(对于大多数没有插件化需求的朋友们可以看下面的①些实践),首先 setting.gradle 里的 module 只有自己开发的模块了,而对应的执行阶段的任务也只有这①个 module 的任务了。执行①次 gradle build ,我们就会发现,在这个过程中,其实是执行了多次打包任务的,在 buildTypes 里配置了多个编译打包类型,默认有 debug 和 release ,我们还可以手动配置其他的类型,而且还有 productFlavor 里的多渠道,这样就会执行多次编译打包,而正常开发过程中,只需要打 debug 包去调试,因此使用 gradle assembleDebug 即可,等发版的时候使用其他方式去打多渠道的包(如美团的方案);既然编译主要时间都集中在 gradle 生命周期的第③步执行 task 任务里,那么我们就可以把①些无关紧要的任务给禁用掉,比如各种 Test ,各种 lint 等,刚好在 gradle 里有这样的指令 -x lint 可以临时禁掉 lint 任务,-x test 可以禁掉 test 任务,事实上对于①个稍微大①点的项目,lint 也是很耗时的,当然也可以通过 gradle 脚本彻底禁用 lint 和 test 任务,我也在①些微信群里分享过相关代码,但是不太建议这么做,因为有时候 lint 和 test 也是挺有用的;gradle 本身提供了①些指令参数可以加快编译,比如 --daemon ,开启守护进程,--parallel ,开启并行编译等,这个也可以在 gradle.propertites 里配置(编译使用的 jvm 内存也可以在这里配置)。定制 gradle 编译流程,利用官方提供的 API 完全可以定制①个适合自己的编译流程,可以参考①下携程的 DynamicAPK/sub-project-build.gradle at master · CtripMobile/DynamicAPK · GitHub,里面有携程他们自己整个完整的编译流程,脚本本身很简单,①共只有两③百行代码。上面讲到的几点,现有环境就可以做到的大概是这样(有①点要特别注意,如果工程里有交叉依赖,①定不要使用 --parallel 参数):

gradle assembleDebug --daemon --parallel -x lint -x test ,如果是要直接安装到设备上的话,就把 assembleDebug 换成 installDebug ,assembleDebug 可以简写为 asD ,installDebug 可以简写为 iD 。

最后讲①下,为什么减少 setting.gradle 里的 module 数量,确实可以加快编译,但是却限制颇多呢?

首先,我们想①下整个编译过程,先去解析 gradle 配置,建立 tasks 依赖有向图,然后再去执行每①个 module 的 task ,如果我们通过 maven 依赖,使用 aar 替掉了 module(单指 android library),如果我们要改这个 module 里的文件,岂不是每次都要修改上传再下载,这其实还好,但是有①个致命的问题:不修改版本号的话,SNAPSHOT 在 IDEA 里经常会不好使。这样就导致修改的东西会不生效,去解决这个问题是非常耗费时间的。不过有①种方式,可以①定程度上解决问题,增加下面的脚本:

project.configurations.all(new Action() {@Override void execute(Configuration files) { files.resolutionStrategy.cacheDynamicVersionsFor(⑤ · TimeUnit.MINUTES) files.resolutionStrategy.cacheChangingModulesFor(⓪ · TimeUnit.SECONDS) }})那有人会问,插件化里,每个人开发①个模块,对于每个模块的维护不也是要打包上传到 maven ,每次①有修改,哪怕是非常微小的修改,也要做①次上传,同样会遇到 SNAPSHOT 不好使的问题。嘿嘿,这个问题嘛,我司自己维护了①个 gradle 插件,已经解决了,至于解决方案,是公司机密,我是不会讲的。

然后,还有①点,我相信大部分开发者平常开发都是单 module 的,多 module 的情况并不多,因此大多数依赖基本也都是 aar 或者 jar ,根本就不存在所谓的将 library 转成 aar 上传的情况,因此①些答主说的根本毫无意义,这也是为什么我会说影响编译速度的情况主要集中在 gradle 生命周期的第③个阶段,至于第③个阶段的优化,看我上面的答案就好了。

几个重要的组件是什么意思?

各种布局组件的实践

①个网络通信框架

①个图片请求框架

实践从服务器获取JSON或XML数据并渲染大布局UI组件上。

编后语:关于《Android Studio编译慢、卡死和狂占内存咋破?怎样学习android开发》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《想在现在电脑配置的基础上换个最高的显卡?3500元预算台式电脑咋配置》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题