android 优化编译apk,Android Gradle 优化APK打包构建速度总结

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

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

另外由于目前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结果。

2ca033970b1b

build_scan主界面.jpg

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

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

./gradlew assembleDebug --profile

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

2ca033970b1b

build_profile.png

使用最新版本的Gradle

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

开启并行编译

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

2ca033970b1b

并行执行.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 ::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进行过滤排查。

2ca033970b1b

检查动态版本.png

开启R8

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

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

R8前

2ca033970b1b

d8+proguard.png

R8

2ca033970b1b

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指令,一次编译时间在半分钟以内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值