分享嘉宾:张仙华 美图 资深开发工程师
分享嘉宾:张仙华,美图秀秀android团队资深研发工程师,负责编译加速、性能优化、架构设计等公共基础相关工作
导读:本文的主题是美图秀秀的Android编译速度实践指南,通过对本文整体方案的演进的阅读,读者也可以把方案快速落地到自己公司的产品中;首先会和大家介绍一下做编译加速优化的背景,以及我们在做优化过程中,每一期是如何演进升级的,以及我们最终在开发上形成的约束和规范,最终谈一谈未来那些方向我们可以继续深挖,保持持续更新和迭代。
01
背景介绍
由于美图秀秀Android 工程庞大,优化前全量编译 8m45.2s、增量编译2m35.8s,造成在开发期间研发同学需长时间等待编译构建完成,严重影响研发效率,因此针对工程进行编译优化势在必行。
目前优化后全量编译(耗时 1m49.8s、降幅达 79.1%),增量编译(耗时 40.6s、降幅达 73.9%)。
编译加速优化1期包含jvm优化、aspectjx和firebase任务屏蔽、res精简,编译加速优化2期包含AGP升级和模块aar发布;编译加速优化3期包含动态版本依赖、自动发布以及模块安全隔离;编译加速优化4期包含静态版本、动态计算、依赖查询和配置切换自动化;通过上述1-4期优化,我们可以做到和日常开发流程一样,不用关注各种模块版本号、源码和aar之类,全局自动检测和适配。该方案已经在美图公司多数产品线Android 项目上落地,为此希望借此机会,和各位交流美图秀秀Android的整体编译优化方案。
02
优化演进
1. 编译优化第1期
编译优化第1期通过屏蔽aspectjx、lint、测试相关任务、jvm内存优化、resConfigs精减等手段,增量编译整体耗时降低22.4%,但整体降幅有限,因此也为我们后续做二期优化埋下伏笔。
(1)Task任务分析
通过上述任务数据截图,我们知道类似aspectjx等transforms任务是相对比较耗时,达30s+,因此自然我们可以在本地开发环境下针对类似的任务进行屏蔽,从而降低编译耗时。
(2)jvm优化
根据官方的描述,我们使用并行垃圾回收期要比G1垃圾回收器性能更高,所以可以-XX:+UseParallelGC把这块配置加速。
在我们电脑设备硬件条件允许下,可以适当增加包括dexOptions中maxProcessCount以及线程数、jvm内存等。
2. 编译优化第2期
编译优化第2期通过把工程中所有子模块发布仓库后进行外部依赖及升级AGP至4.0.2版本等手段,增量编译速度从2m35.8s降低至40.6s,降幅达73.9%,全量编译速度从8m45.2s降低至1m49.8s,降幅达79.1%,优化效果十分明显,但由于每次都要改版本号,操作比较繁琐,因此我们在编译优化三期对应做了升级和调整。
(1)模块内部依赖和外部依赖对比
// 内部依赖方式
implementation project(':app:base')
// 外部依赖方式
implementation "com.x