前言

Google现在最推荐的IDE是Android Studio; 用起来很智能,但是也有占用很多内存,运行起来很卡的缺点,下面,我们就来谈谈Android Studio的优化吧

  • 安装完成后启动卡死 刚刚打开studio就卡在gradle building的界面再也不动了(去连接墙外的网下载),那么这个时候我们就需要把这个联网下载操作屏蔽掉,找到studio安装目录,找到idea.properties文件,打开,加上下面一行配置,作用是在初次打开的时候不让它连接谷歌进行更新
disable.android.first.run=true

或者: 使用墙外代理

  • 更改studio的VM大小 AS限制了Java虚拟机启动的内存大小,限制了最大堆内存,当AS运行越久,内存越不足的时候,就会频繁的触发GC,AS就自然会卡起来了,严重的直接黑屏,所以,我们把对应的所需内存都配置大一些,32位的系统打开studio.exe.vmoptions文件,如果是64位的话打开studio64.exe.vmoptions,改动以下配置,根据各自配置适当调节
-Xms512m
-Xmx4096m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m
  • 使用offline work和Local gradle

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

  • 开启gradle的守护进程 在工程的gradle.properties文件中,添加以下配置:
# 编译时使用守护进程
org.gradle.daemon=true
#JVM最大允许分配的堆内存,按需分配
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m  -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#使用并行编译
org.gradle.parallel=true
org.gradle.configureondemand=true
  • 工程尽量减少对module的直接依赖 将不需要频繁改动的module从setting.gradle中去掉,直接引用module对应的aar文件;工程中有多个module时,会先编译每一个module之后再编译主工程,尽量少的module依赖肯定会加快编译速度

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

Gradle的生命周期

下面说一下 gradle 的生命周期吧,gradle 构建一个工程主要分为三部分(完全掌握了下面这张图,整个 gradle 的构建过程能了解个十之七八了):

  1. 初始化阶段:主要是解析 setting.gradle 文件(因此有人提到减少 setting.gradle 的 module 数量,是很有道理的,但是实际操作过程限制颇多,原因最后会大致说一下);

  2. 读取配置阶段:主要是解析所有的 projects 下的 build.gradle 文件,包括 rootProject 和其他的 subprojects(子项目),检查语法,确定 tasks 依赖以建立 task 的有向无循环图,检查 task 里引用的文件目录是否存在等(这一步也进一步验证了减少 setting.gradle 里的 module 数量可以加快编译速度,因为减少一个 module ,需要解析的 build.gradle 文件就减少一个,第 3 步里就不会执行本属于这个 module 的任务了,但是还是 1 里面说的问题,限制颇多);

  3. 执行阶段:按照 2 中建立的有向无循环图来执行每一个 task ,整个编译过程中,这一步基本会占去 9 成以上的时间,尤其是对于 Android 项目来讲,将 java 转为 class

compileDebugJavaWithJavac/compileReleaseJavaWithJavac

和 将 class 合并成 dex

   transformClassesWithDexForDebug/transformClassesWithDexForRelease

这两步很耗时,第一步还好,第二步会耗时非常久

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

  1. 项目插件化改造,每位业务上的同学只需要编译一个模块即可,这一点基本上从根本上解决了编译慢的问题(对于大多数没有插件化需求的朋友们可以看下面的一些实践),首先 setting.gradle 里的 module 只有自己开发的模块了,而对应的执行阶段的任务也只有这一个 module 的任务了

  2. 执行一次 gradle build ,我们就会发现,在这个过程中,其实是执行了多次打包任务的,在 buildTypes 里配置了多个编译打包类型,默认有 debug 和 release ,我们还可以手动配置其他的类型,而且还有 productFlavor 里的多渠道,这样就会执行多次编译打包,而正常开发过程中,只需要打 debug 包去调试,因此使用 gradle assembleDebug 即可,等发版的时候使用其他方式去打多渠道的包

  3. 既然编译主要时间都集中在 gradle 生命周期的第三步执行 task 任务里,那么我们就可以把一些无关紧要的任务给禁用掉,比如各种 Test ,各种 lint 等,刚好在 gradle 里有这样的指令 -x lint 可以临时禁掉 lint 任务,-x test 可以禁掉 test 任务,事实上对于一个稍微大一点的项目,lint 也是很耗时的,当然也可以通过 gradle 脚本彻底禁用 lint 和 test 任务,但是不太建议这么做,因为有时候 lint 和 test 也是挺有用的

  4. gradle 本身提供了一些指令参数可以加快编译,比如 --daemon ,开启守护进程,–parallel ,开启并行编译等,这个也可以在 gradle.propertites 里配置(编译使用的 jvm 内存也可以在这里配置)

  5. 定制 gradle 编译流程,利用官方提供的 API 完全可以定制一个适合自己的编译流程

上面讲到的几点,现有环境就可以做到的大概是这样(有一点要特别注意,如果工程里有交叉依赖,一定不要使用 --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<Configuration>() {
@Overridevoid execute(Configuration files) {files.resolutionStrategy.cacheDynamicVersionsFor(5, TimeUnit.MINUTES)files.resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)}
})

那有人会问,插件化里,每个人开发一个模块,对于每个模块的维护不也是要打包上传到 maven ,每次一有修改,哪怕是非常微小的修改,也要做一次上传,同样会遇到 SNAPSHOT 不好使的问题

基本上关于 Android Studio 的编译慢的问题就到这里完结了,希望认真看完的朋友能有所收获!如有不正之处还望指正!

需要本文中底层源码的同学

可以 点击 “此处” 即可 免费获取 完整代码 以及 更多Android学习笔记+源码解析+面试视频

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

Android 架构师之路还很漫长,与君共勉

PS:有问题欢迎指正,可以在评论区留下你的建议和感受;

欢迎大家点赞评论,觉得内容可以的话,可以转发分享一下

硬核分享:优化 “Android Studio” 编译速度的10个小技巧相关推荐

  1. 优化android studio编译的apk大小

    默认生成的apk(release版)太大(只打印helloworld的apk大小就有1MB多),需要优化编译,如下,修改build.gradlebuildTypes { release {minify ...

  2. 一分钟帮你提升Android studio 编译速度

    版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758. https://blog.csdn.net/u013132758/article/deta ...

  3. 提升苹果电脑速度的10个小技巧

    众所周知,随着时间的流逝,包括Mac在内的所有计算机的速度都会降低.除了换电脑,还是有许多简单的调整可以提高计算机的性能并加快运行速度较慢的Mac,而且这些调整不会花费一分钱.1.升级macOS 许多 ...

  4. android编译很慢,Android Studio编译很慢该怎么办

    我们使用电脑和手机时候最不能忍受就是设备又卡又慢了,严重影响我们工作或者游戏体验.在windows系统中Android Studio编译速度很慢,该怎么解决呢?下面我们就来看看详细的教程,需要的朋友可 ...

  5. 如何优化 Android Studio 启动、编译和运行速度?

    作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Google 的 Android Studio来进行开发,但使用起来有时会出现卡顿等问题.本文介 ...

  6. Android studio编译跑步运动app一个安卓的跑步软件实时记录速度,画出跑步路径, 管理跑步数据履历,查看数据详细等

    Android studio编译跑步运动app一个安卓的跑步软件实时记录速度,画出跑步路径, 管理跑步数据履历,查看数据详细等 效果图: 效果视频: 安卓运动跑步APP android studio编 ...

  7. 我的Android进阶之旅------解决Android Studio编译后安装apk报错:The APK file does not exist on disk...

    1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_64 ...

  8. 解决Android Studio编译后安装apk报错:The APK file does not exist on disk

    1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_64 ...

  9. android studio真机测试不生成apk,Android应用开发Android Studio编译出来的APK无法安装如何解决?...

    本文将带你了解Android应用开发Android Studio编译出来的APK无法安装如何解决?,希望本文对大家学Android有所帮助. Android Studio编译出来的APK无法安装如何解 ...

最新文章

  1. uboot readme 文件 (1)
  2. CSS设置透明边框解决浏览器兼容性问题
  3. CAS 4.0.0RC 配置MD5验证功能
  4. 与其雇人杀虫不如购买杀虫剂
  5. linux主频限制服务,linux抵御DDOS攻击 通过iptables限制TCP连接和频率
  6. JEECG 3.6 自定义表单版本发布,智能快速开发平台
  7. [BZOJ1877][SDOI2009]SuperGCD
  8. 58天 -算法 openJudge百炼 2787-凑24 - 递归
  9. ios中input输入无效
  10. Python 源代码代码打包成 whl 文件
  11. Matlab求解空间曲线的切线和法平面
  12. 那些让我印象深刻的bug--02
  13. mp4压缩视频不改变画质?怎么压缩视频大小不改变清晰度?
  14. linux创建新的虚拟环境,并安装指定版本的包
  15. java批处理框架 pdf_《Spring Batch 批处理框架》PDF 下载
  16. CMake教程之构建Qt平台
  17. photoshopcs6 安装
  18. 大连理工大学计算机学院陈教授,软件学院三项成果被计算机顶级会议INFOCOM 2020录用...
  19. CIO与CISO的角色演变
  20. Java手机号码正则表达式验证,手机号段根据2020年最新号段所做参考

热门文章

  1. d-link路由器虚拟服务器,两台D-Link路由器之间如何桥接上网
  2. Python Flask教程学习02
  3. 常见中间件介绍和分析
  4. 大数据平台的搭建教程及软件工具!
  5. 不讲武德!为击破苹果的“隐私高墙”,谷歌、Facebook 竟然“二打一”?
  6. mqtt haproxy 代理及负载搭建
  7. LSTM 无法预测股票价格
  8. TCL校园招聘——软件开发工程师(java) 只招5个。。。
  9. ModelCheckpoint详解
  10. jmeter ip 欺骗