android源码编译模块慢,有赞Android秒级编译优化实践

1. 有赞Android秒级编译优化实践

有赞-明天

2. ⽬目录

背景

⽅方案调研

有赞⽅方案

实践成果

未来规划

3. 背景

Android端现状

Kotlin

33%

客户端

Phone

Pad

每周发版

业务

账户

交易易

商品

45W

库存

共26个⼦子业务模块

导购

⽉月均上线功能 50+

Java

67%

4. 遇到的问题

编译时间

18

18

团队开发效率下降

15

13.5

12

新⼈人⼊入⻔门成本提⾼高

9

8

不不利利于紧急问题修复

4.5

0

2016

编译时间⻓长,开发体验差

2017

2018

2019

必须要解决编译慢的问题

5. ⽅方案调研

框架 优点 不不⾜足

BUCK 强⼤大的编译体系 配置复杂,部分特性不不⽀支持

Freeline 极致的部署速度 语⾔言只⽀支持Java

InstantRun 兼容性最好 部分场景不不适⽤用,加速不不明显

6. 需要⼀一个适合有赞的⽅方案

7. 场景分析

A同学需要对某个模块进⾏行行需求开发

全量量编译运⾏行行

增量量编译运⾏行行

开发完成

8. 场景分析

过程 耗时问题点 优化点

全量量编译 所有模块都是源码编译 ⽆无关模块⼆二进制集成

增量量编译 修改部分⽂文件需编译整个模块 修改⽂文件单独编译

安装运⾏行行 Android版本,机器器之间差别⼤大 利利⽤用热修复去除安装时间

9. 优化⽅方向

基于热修复与部分编译增量量加速⽅方案 基于模块⼆二进制化全量量加速⽅方案

• 如何实现修改识别?

如何⽀支持源代码/⼆二进制⽆无缝切换?

• 如何⽀支持代码、资源⽂文件编译?

如何降低⼆二进制发布操作成本?

• 如何⽆无缝对接热修复?

如何管理理⼆二进制版本?

• 如何降低使⽤用成本? •

如何实现发布流程⾃自动化?

10. 增量量加速⽅方案

Savitar

11. Savitar

Savitar能够有效减少模块修改编译时间,配套IDE插件,使⽤用⽅方便便。

主要特点

• ⽀支持主流开发语⾔言(Java & Kotlin)

• 集成、使⽤用简单

• ⽀支持调试

• ⽀支持多分⽀支管理理

12. Features

代码 Java、kotlin

资源 layout、values、assets、images

扩展 kotlinx

操作 GUI界⾯面

其他 调试、多分⽀支管理理(基于GIT)

13. GUI插件

版本更更新器器

任务执⾏行行器器

脚本执⾏行行器器

可运⾏行行Jar

配置检查器器

⽂文件分析器器

⼯工程⽀支持

补丁加载器器

Gradle插件

脚本⽣生成器器

外部依赖

Javac

Watchman

Git

14. 运⾏行行流程

获取改动信息

改动代码

改动资源

获取⼯工程信息 ⽣生成编译产物 依赖信息 Java编译 dex加载

⽬目录信息 kotlin编译 资源加载

GIT信息 资源编译

dex⽣生成

apk⽣生成

重启加载产物

15. 改动获取

改动检测

Watchman + Git:基于 watchman 实现⽂文件修改监控,并且增加对于 GIT 提交记录。

多 Flavor ⽀支持:提前获取⼯工程每个 Flavor 的 source set,过滤掉⾮非当前 Flavor 的代码。

避免分⽀支切换导致识别到有⼤大量量⽂文件修改

上次构建成功Git

提交ID

Git Diff⽂文件集合

Flavor过滤

修改⽂文件集合

本地未提交修改

Watchman Diff⽂文

件集合

结果修改集合

16. ⽂文件改动限制

⼤大量量⽂文件修改的情况

GitLab

⼤大量量⽂文件改动影响

pull

本地⽂文件

其他分⽀支

merge

存在不不⽀支持的修改

本地产物可靠性变差

检测成本⾼高,出现频率低

增量量效果不不明显

解决策略略

⽬目前限制最⼤大⽀支持50个⽂文件

超过最⼤大限制⾛走原有Gradle流程

17. 资源⽀支持

资源ID固定

aaptOptions

generateResValues

generateResources

checkManifest

processManifest

mergeResources

—emit-ids

理理

实现资源 ID 固定和记录,保证后期对于资源的修改

时不不会出现错乱

18. 资源⽀支持

资源的编译

对于⾮非 values 资源,基于 AAPT2 的 link 模式,将资源编译后的 flat ⽂文件替换之前的 flat ⽂文件,在

使⽤用 link 命令完成打包即可。

对于 values 资源,因为之前全量量编译的产物是已经合并过的,所以不不能使⽤用单个修改 flat 替换合

并过的 flat,对于这种场景⽬目前是采⽤用重新执⾏行行⼀一次处理理资源的 gradle task。

⾮非values资源

AAPT Compile

.flat⽂文件替换

gradle merge

values资源

merged资源

AAPT Link

资源Apk⽂文件

19. 源代码⽀支持

源代码编译

借助 javac 与 kotlinc 实现对单个⽂文件的编译,所有的编译依赖会在运⾏行行时收集,根据本次的改动

会⽣生成不不同的编译脚本,保证每次编译的正确性和速度。

关于 Java 与 Kotlin 混编

先 Kotlin 后 Java 原则

Java class

Kotlin 编译 Java 编译

dex

class

20. Kotlinx ⽀支持

kotlin-android-extensions

⽀支持我们在代码⾥里里⾯面直接⽤用

控件的ID即可获取到实例例并

操作调⽤用,但是这并不不是

标准的kotlin语法

21. Demo

22. clean build怎么办?

23. 全量量加速⽅方案

EnjoyDependence

24. EnjoyDependence

EnjoyDependence是集依赖管理理、构建发布⼀一体的 Android 模块⼆二进制化⽅方

灵活的发

布⽅方式

易易⽤用的依

赖管理理

EnjoyDependence

接⼊入成本

25. Features

模块依赖管理理 构建发布管理理

• ⽀支持每个模块源代码/⼆二进制⽆无缝切换

• ⽀支持多 Flavor 发布

• ⽀支持模块卸载

• ⽀支持 CLI 命令参数执⾏行行

• 配套 GUI 插件与扩展配置

• ⽀支持增量量/全量量发布

• ⽀支持⾃自定义⼆二进制版本 • ⽀支持扩展配置

26. GUI

更更新器器

ARR/code 配置

发布服务

Gitlab

MBD

构建发布

发布脚本

依赖管理理

发布配置 依赖配置 配置扩展

发布插件 依赖管理理插件 核⼼心插件

Maven插件 com.android.library 基础依赖

27. 模块依赖管理理

Code/AAR 切换⽆无缝

依赖配置

需要替换的模块

依赖替换

配置的AAR版本

28. 模块依赖管理理

AAR版本配置

卸载配置

AAR配置项

29. 构建发布管理理

发布流程

发布模块确定

发布依赖确定

编译打包

Maven发布

版本回写

实现基线版本⾃自动修改

30. 增量量发布策略略实现

基于 GIT 提交记录上次发布节点,利利⽤用 DIFF 获取修改模块,实现发布内容确定。

源码依赖配置去除

模块之间存在源码依赖,在创建 POM ⽂文件时会⽣生成⽆无效依赖,如果不不加过滤处理理,会导致后期依

赖 AAR 时出现部分依赖找不不到的错误。

业务模块A

基础模块

31. 构建发布管理理

重写发布依赖获取⽅方法排除⾮非法依赖

filterDependency⽀支持配置

32. 构建发布管理理

发布⽅方式⽀支持

Merge Request

⾃自动发布

开发分⽀支

发布分⽀支

CI检查

⼿手动发布

发布流程

33. 全AAR编译 Demo

34. 实践成果

35. Savitar

优化前

110

优化后

110

Q3季度累计使⽤用超过 6800 次,累计节省编

译时间超过 180 个⼩小时。

82.5

55

27.5

0

增量量编译提速 8 倍

15

平均增量量编译时间(秒)

36. EnjoyDependence

优化前

AAR单模块开发

AAR APP

16

15

12

全量量编译速度提升 3 倍

8

4

0

4

平均编译时间(分)

3

37. 未来规划

Savitar

EnjoyDependence

动态⽣生成代码⽀支持

SO⽀支持

完善对⼀一般⼯工程适配

开源

完善对⼀一般⼯工程适配

开源

38. One More Thing

39. iOS 全量量加速⽅方案

EnjoyPod

40. Features

个性化配置,⽆无 Git 侵⼊入

发布流程⾃自动化

本地配置,⽆无需担⼼心污染远程代码

代码提交⾃自动触发⼆二进制打包

Pod⿊黑⽩白名单,源码/⼆二进制⾃自由切换 产物内⽹网存储,下载快速

⽀支持业务模块⼆二进制化

⼀一键完成项⽬目结构适配

⽀支持插件⾃自动更更新

Pod插件更更新⾃自动化,减少通知成本

41. EnjoyPod

Goods.xcodeproj

Stock.xcodeproj

Home.xcodeproj

⼯工程Git

⼆二进制Repo

FTP

服务层

Trade.xcodeproj

Jenkins部署的Packager

AFNetworking SDWebImage Masonry

RetailGoods RetailHome RetailStock

配置⽂文件-开启三⽅方/业务⼆二进制 相应⽩白名单

配置层

Pod插件-读取配置,修改依赖,指向⼆二进制源

Retail.xcworkspace

42. 成果

源码build

10

开启Pod⼆二进制

源码fullbuild

开启业务⼆二进制(保留留1个源码⼦子⼯工程)

30

10

28

7.5 22.5

5 15

3

2.5

0

CI平均编译时间(分)

7.5

0

3

⼯工程平均编译时间(分)

43. 谢谢~

Q&A

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值