技术标签: gradle Android studio 编译速度优化 android 构建优化 Android优化
汇总:Android小白成长之路_知识体系汇总【持续更新中…】
公司项目使用Android Studio以及Gradle进行编译,在每次修改代码(哪怕是一行修改),再次编译运行都要耗时三四分钟,甚至更长时间。在初次编译时更是长达十几分钟、极大的影响了开发效率。俗话说工欲善其事,必先利其器。这就对编译速度进行一波优化,让我们一步一步开始吧!
首先了解一下Gradle的构建流程,整体分为三个阶段:
setting.gradle
中读取需要参与构建的模块,并为每个模块创建一个Project实例。build.gradle
等文件大体上了解了这些流程,我们就可以从这些流程上入手进行优化
当前作为验证的电脑相关信息:
验证编译速度的三个角度:
比较数据获取方式:rebuild尝试三次取最低值,修改方法或xml尝试五次取最低值
相关说明:
从整体构建流程可以得知,我们整体上需要从三个方面进行优化:
其中执行的过程占比是最大的,所以重心放在执行速度优化上
一般初始化过程任务较少本身就已经很快了,但仍然可以做一些处理,以达到最佳状态:
setting.gradle
中移除不需要引入的组件模块,可以减少初始化时间setting.gradle
中include之前尽量不写过多代码配置阶段主要是对各个build.gradle
进行解析,因此可以注意以下几点:
build.gradle
的解析build.gradle
中尽量少做耗时操作,例如读取系统时间动态配置apk的名称组成此阶段存在的大量的任务需要执行,因此优化的点也非常的多
开启后会并行执行多个任务,大幅度减少编译时间,只需要在gradle.properties
中添加:
org.gradle.parallel=true
由于大家的电脑配置都不一样,因此具体设置多大内存需要根据个人情况进行合理配置,一般在gradle.properties
里已经有相关配置,可以对该配置进行修改,例如
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
同时在主工程模块的build.gradle
中进行修改:
dexOptions {
javaMaxHeapSize "4g"
}
值得注意的是,javaMaxHeapSize
的值需要比org.gradle.jvmargs
设置的值少512m
以上,而且org.gradle.jvmargs
的值并不是设置越高越好,根据验证,最好配置为系统内存的1/3,最多不要超过1/2。在部分文档中显示,高版本中javaMaxHeapSize
中不再需要配置javaMaxHeapSize
,只需要配置org.gradle.jvmargs
即可,查阅了许多资料都没说清楚,所以暂时都配置好了
对没有更改的模块不再进行编译,非常适合已经组件化的项目,在gradle.properties
中添加:
org.gradle.configureondemand=true
直接使用之前生成的缓存,不再进行构建,在构建时任务后面会显示FROM CACHE
,在gradle.properties
中添加:
org.gradle.caching=true
支持注解增量编译,不会重新触发编译(gradle高版本中需要移除),在gradle.properties
中添加:
android.enableSeparateAnnotationProcessing=true
数据对比(并行编译是优化前已经开启,因此以下时间不包括并行编译的优化):
rebuild | 修改方法 | 修改xml | |
---|---|---|---|
配置优化前 | 4m46s | 46s | 22s |
配置优化后 | 2m39s | 42s | 20s |
收益 | 减少44% | 减少8% | 减少9% |
开启离线模式后不会再开始的时候去检测依赖是否有更新,也不会去下载相关更新的依赖,首次构建不能开启,否则无法完成构建,后续构建可以开启,在某些情况下将大幅度改善编译速度,强烈推荐开发阶段使用。点击下图中的图标的按钮即可开启离线模式,有些版本显示为类似wifi的图标,再次点击取消离线模式:
点击AS的Help
菜单项,选中Change Memory Settings
选项。如图:
弹出如下图弹框,把Maxinum Heap Size
修改为合适值,具体修改值根据自身电脑内存配置选择
数据对比:
rebuild | 修改方法 | 修改xml | |
---|---|---|---|
AS配置修改前 | 2m39s | 42s | 20s |
AS配置修改后 | 2m16s | 37s | 16s |
收益 | 减少14% | 减少11% | 减少20% |
由于gradle在新版本中一般都会对构建速度进行进一步的优化,因此保持最新的gradle版本可以获得最佳的构建体验,更新方式如下:
首先在gradle-wrapper.properties
中进行gradle版本的配置:
distributionUrl=https\:``//services.gradle.org/distributions/gradle-6.7.1-all.zip
然后在根目录下的build.gradle
中更新gradle插件版本:
classpath 'com.android.tools.build:gradle:4.1.1'
更新到6.x以上可能出现的问题和解决方案:
报异常:
FAILURE: Build failed with an exception.
* What went wrong:
文章浏览阅读949次,点赞2次,收藏3次。大家好,我是良许。对于职场新人,特别是应届毕业生,他们拿到offer之后,进入公司后会有一段时间的焦虑感。比如说,不懂公司项目开发流程,代码看不懂,业务流程也不知道,框架不会用,等等还有各种各样的问题。所以很多人一开始都会在担心自己能不能胜任这个职位,会不会连试用期都过不了。其实这个心态是很常见的,每个程序员应该都会经历这么一个过程。就拿我自己来说吧,由于我是自学转行的,我的技术本身就比那些科班出..._进入公司不会写python怎么办
文章浏览阅读1.1k次。AVDictionary* options = nullptr; av_dict_set(&options, "timeout", "3000000", 0); //设置超时断开连接时间 if (avformat_open_input(&pFormatCtx, url, NULL, &options) != 0) { printf("Couldn't open input stream.(无法打开输入流)\n"); ret..._ffmpeg rtmp 超时设置
文章浏览阅读1.7k次。在谷歌商店中评分比较高的xpath插件有XPath Helper(Chrome)SelectorsHub(Chrome)说下两者的使用情况XPath Helper(Chrome) 应该是国内使用比较多的,但是他基本上都是快捷键操作,和我的电脑的快捷键设置有冲突,故而他在我的电脑上是很不好用的,但是它简单易用,很灵活,浏览器开销也比较小,SelectorsHub(Chrome)是在我的快捷键有冲突之后,开代理上商店里边比较出来的一块很好用的xpath插件但是对于浏览器的开销相对要大很多_selectorshub
文章浏览阅读399次。启动操作命令:nginx -c /usr/nginx/conf/nginx.conf-c参数指定了要加载的nginx配置文件 路径。停止操作停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文章)来进行的步骤1:查询nginx主进程号ps -ef | grep nginx在进程列表里 面找master进程,它的编号就是主进程号了。步骤2:发送_ngix 开启结束命令
文章浏览阅读169次。在十月份发布的版本中,Qlik对用户自定义其云分析体验带来了新的可能性。新的图表监控增强功能和对集合的更轻松访问使用户可以直接从云中心轻松组织和访问其最关键的见解和可视化。全新的默认主题提供了更好,外观更现代的应用程序。此版本还包括通过Qlik DataTransfer扩展的数据连接选项,数据重新加载管理以及具有JWT授权的新身份管理配置选项。自定义您的中心和更快地访问关键见解图表监控增强用户拥有更多选择,可以直接从云中心监视最重要的图表。现在,除了用户创建的图表外,用户还可以选择由Insigh_qlik在线体验
文章浏览阅读7k次,点赞7次,收藏4次。IDEA编写程序:spark SQL连接 hive报错:java.lang.NoClassDefFoundError: org/apache/tez/dag/api/SessionNotRunning我的问题出现在:方法一:把hive-site.xml拷贝到idea的resources中后,hive-site.xml中的一个配置需要改:简单来说,把 “hive.execution.eng..._java.lang.noclassdeffounderror: org/apache/tez/dag/api/sessionnotrunning
文章浏览阅读4.9k次,点赞15次,收藏22次。田海立@CSDN 2020-10-20TensorFlow算子space_to_depth是depth_to_space的逆操作。本文用图文的方式来解释该算子运算的方式。一、space_to_depth原型space_to_depth是把space数据(width和height维)移到depth(Channel)维上,与depth_to_space刚好是反向的操作。对应到ML该操作是把width和height维上各取block_size都分给depth上。所以,对应有一个参数block_s._space-to-depth
文章浏览阅读1.7w次,点赞32次,收藏64次。._cl.exe
文章浏览阅读4.6w次,点赞14次,收藏98次。前言在Linux的系统中,kill是我们最常见的命令之一。 kill,英语中为杀死的意思,顾名思义,就是用来杀死一些东西的命令,常用来杀死系统中的进程。就像是Windows系统中的关闭软件的按钮,不过kill最直接,从后台直接停止。下面就介绍一下,kill是如何杀死进程的。kill命令的参数在Linux系统中命令都是有参数的,这给了我们很多的选择,但是kill的重..._kill -g
文章浏览阅读470次。《用inlscape临摹太极图logo》_inkscape 画平行四边形
文章浏览阅读5.4k次,点赞4次,收藏52次。/*** 实验题目:* 实现哈希表的相关运算算法* 实验目的:* 领会哈希表的构造和查找过程及其相关算法设计* 实验内容:* 设计程序,实现哈希表的相关运算,并完成如下功能:* 1、建立关键字序列(16, 74, 60, 43, 54, 90, 46, 31, 29, 88, 77)对应的哈希* 表A[0..1..._建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应的哈希表a[0..12],哈希函
文章浏览阅读3.4w次,点赞2次,收藏6次。systemctl restart kube-apiserver启动失败[root@centos-master yum.repos.d]# systemctl status kube-apiserver.service● kube-apiserver.service - Kubernetes API Server Loaded: loaded (/usr/lib/systemd/syst..._kube-apiserver.service holdoff time over, scheduling restart.