Android Gradle 优化APK打包构建速度总结

随着项目工程的不断增大,加之组件化、插件化方案盛行,导致module拆分过多,多module情况下很容易出现依赖关系混乱、过度依赖等问题,致使构建速度成为影响开发效率的瓶颈,想象一下修改一行代码需要抽一根烟的功夫(可能还不够),那一天得多费烟啊!!?

本文针对gradle官方给出的构建优化方案结合日常开发经验,总结了一些简单实用的方法来提升构建速度。

原文链接Improving the Performance of Gradle Builds

另外由于目前build apk的瓶颈基本都在transformClassesWithDexBuilderForDebug这个任务(稳定占用build时长的一半),它将所有class文件的jar包转换为dex,class文件越多转换的越慢,目前有一些开源项目做了一些dex的预创建和差分合并dex的方案,简直黑科技fastdex了解一下,再比如instant run这些动态化的技术我们暂不讨论。

整个build过程分为三个阶段

  • initialization 准备阶段
  • configuration 编译脚本和插件,生成task列表
  • execution 执行task

后面的优化项都集中在configuration和execution阶段。

build scans定量分析

发现了构建慢的问题以后应该先找到一些工具来定量分析。

gradle在4.3版本发布了build scans工具,构建时通过--scan参数完成build扫描,比如./gradlew assembleDebug --scan。当构建完成,控制台会打印链接,点击链接在浏览器中预览scan结果。

build_scan主界面.jpg

scan结果中含有build过程的所有细节信息,比如构建日志、构建时长、构建时间轴、task耗时分析、依赖关系、gradle插件等等,最后还会给出一些改进建议。这些信息对优化构建非常有帮助。

另外gradle构建时可以使用profile参数生成简易的report profile。

./gradlew assembleDebug --profile

打开profile网页长这个样子,可以做基本的耗时分析。

build_profile.png

使用最新版本的Gradle

目前最新的gradle版本为5.4.1,gradle插件版本最新为3.4.0,使用新版gradle可以有效利用编译方面的优化,简单说有新版本更新就是了。

开启并行编译

task默认是串行执行,开启并行执行提高构建速度org.gradle.parallel=true(在项目根目录gradle.properties文件中声明),在build scan界面Timeline模块可以直观的看到多任务在并发执行。

并行执行.png

调整java堆大小

gradle默认为构建预留1G的堆空间,但对于一个相对较大的app来说还远远不够,可通过下面的配置动态调整。

org.gradle.jvmargs=-Xmx2048M

当然如果你的机器性能很好,还可以调到4G甚至更高。

开启缓存build缓存

org.gradle.caching=true

开启后台进程

此选项在gradle 3.0之后默认开启

org.gradle.daemon=true

去掉无用的library

未使用的依赖库会增加编译时间和apk大小,应尽量将引用去掉。

那如何排查那些不需要引用的依赖库呢?这里提供一个,gradle-lint-plugin完成,集成插件可排查项目中的未使用的依赖库库。

有些时候需要排查间接依赖,即一个library中依赖了另一个项目中不需要使用库,可以通过gradle命令检查依赖关系。

./gradlew -q :<moduleName>:dependencies

减少引用仓库的数量

gradle会从用户配置的repositories中顺序的查找并下载依赖库,build过程dependency resolution阶段会执行此操作,它需要访问网络,因此合理配置repositories可减少依赖库查找时间。

合理的apply插件

应用的插件到底是全局的还是局部的。
应该配置到合理的位置,allprojects {} or subprojects {},不必要的插件不要apply。

不要使用动态的版本号

(Minimize dynamic and snapshot versions),例如“2.+”。它会迫使gradle访问远程仓库判断是否有新版本可用。
可以去build scan界面dependencies tab下按dynamic vesion进行过滤排查。

检查动态版本.png

开启R8

R8是新一代的代码压缩工具,它的职能与Proguard相对应。在R8之前,gradle采用D8+Proguard的形式构建,R8则将混淆和D8工具整合(D8编译器在gradle 3.1版本默认开启),旨在加快构建时间和output apk大小。

R8的兼容模式可兼容proguard配置的混淆规则,性能方面也优于proguard。它可以更快地缩减代码,同时改善输出大小。这篇文章Android代码压缩工具R8详解 还总结了具体的优化数据。

R8前


d8+proguard.png

R8


compile_with_r8.png

R8从gradle3.3开始引入,gradle 3.4及以后默认开启。若想在gradle3.3版本下开启R8,gradle.properties里添加如下配置:

android.enableR8 = false

总结

在上述优化完成后,经过脚本的循环测试,编译速度提升50%,而且还有优化空间。

阶段 优化前 优化后
clean build耗时 180s-200s 90-100s

之所以使用clean编译是为了模拟全量编译的场景,如果不使用clean指令,一次编译时间在半分钟以内。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352