在上一篇文章中,小编为您详细介绍了关于《穿越火线为什么样走下坡路了?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元预算台式电脑咋配置》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器