作者:苏彦郊(木磊)
Android 我的项目个别应用 gradle 作为构建打包工具,gradle 简洁、动静的性能个性为人津津有味,同样,构建执行速度迟缓的缺点也始终为人诟病。
近年来,随着优酷性能个性日益丰盛,优酷的代码规模也急剧减少,同时,宏大的代码规模也带来了构建耗时的一直减少。整包构建耗时一度高达35min,重大影响集成与迭代效率。因而构建速度优化势在必行。截止 2021年 11 月份,优酷构建耗时优化获得较为理想的优化后果(如下),现将构建速度优化的实际计划记录成文。
android构建类型 | 2020年 | 2021 |
---|---|---|
android debug 包构建耗时 | 12min | 2.5min |
android release 包构建耗时 | 35 min | 12min |
计划与收益统计图:
优化思路
技术优化类我的项目个别采纳照设定数据指标、技术优化、成绩防腐化三个维度开展。套用技术优化类项拆解可知,咱们须要实现如下三个子项目:
- 设定数据指标:即收集与选取外围优化的数据指标,体现成绩价值。本文选取构建耗时、构建失败率、小时维度构建次数等指标作为成绩优化的数据撑持;
- 技术优化:通过影响构建速度的影响因素可知,包含软件与硬件两局部,所以构建速度优化可分为软件优化与硬件优化两大方向;
- 成绩防腐化: 即维持技术优化指标不好转,保障优化成绩。
接下来,我将依照设定数据指标与后果防腐、技术优化——软件优化、技术优化——硬件优化三个局部开展。
优化计划
设定数据指标与后果防腐
优化类我的项目须要建立健全相应的数据指标体系,借由数据评判体积优化项与优化计划进行有效性断定。进行构建优化前,笔者基于阿里巴巴Aone FaaS( Severless 服务)平台搭建了数据评判与监控大盘。该大盘有构建类型、构建工夫、构建成功率、构建工作耗时等多项指标,满足构建优化我的项目须要依据类型、工作频率、高耗时工作排查的需要。
实现相干数据能力建设后,通过构建要害数据指标——构建耗时与构建成功率的追踪和剖析,进而得出构建耗时的次要影响因素为高耗时工作,构建成功率的次要影响因素为不合理的构建工作。因而,咱们能够通过高耗时工作报警与不合理工作报警,疾速发现并剖析构建速度好转情景,进而保障构建耗时优化成绩。
软件优化
构建侧去atlas
Atlas是随同着手机淘宝的一直倒退,进而衍生进去的一个运行于android零碎上的容器化框架,咱们也叫动静组件化(Dynamic Bundle)框架。它次要提供理解耦化、组件化、动态性的反对。笼罩了工程师的工程编码期、Apk运行期以及后续运维期的各种问题。
依靠于深度定制的产物构造与高度简单、深度hook 的运行时框架,Atlas能够视为挪动端 OSGI 实现计划与组件化计划。但随着优酷挪动端架构调整与自研近程化计划落地,Atlas运行时框架逐步丢失了OSGI框架作用,遂在运行期去除Atals 框架。
当运行期将Atlas依赖去除后,Atlas的简单构建流程(如下图所示)也失去了存在意义。随即,优酷启动了构建侧Atlas 去除我的项目,指标是将Atlas构建插件去除、构建原生化、污浊化、精简化。通过产物原生化、构建工作清理、工具链降级等一系列动作,在实现了构建侧Atlas去除指标的同时,构建性能也有局部晋升。
收益:debug 包构建耗时升高 3min左右。release 包构建耗时升高4min-5min。
gradle 降级和android gradle plugin 降级
gradle 团队始终在继续优化gradle 的构建速度等性能指标, 同时 google 团队也在继续优化 android gradle plugin 构建工具性能。为了进一步晋升优酷android 端构建性能,决定对优酷android构建零碎进行降级,将android gradle plugin 构建工具版本由3.0.1(2017年)晋升至3.4.3(2019年)版本,将gradle构建工具由4.4(2017)至5.5 (2019年)版本。
比照降级前后构建耗时,能够发现构建工具降级后,性能晋升次要源于三个方面:
- 随android gradle plugin 降级,aapt2、proguard 等构建工具也进行了降级,这部分工具降级后,构建性能有小幅晋升;
- 更好工作排布与并行化机制:降级gradle 与agp 后,agp 3.4.3 版本进行了签名、压缩、对齐工作的整合优化;
- 配置按需加载与异步化策略:android gradle plugin 3.4.3 采纳资源的异步加载策略,即configuaration 阶段仅做依赖拉取工作,不再进行产物的解压、过滤、合并工作,这样能够无效防止io 拥塞问题,防止cpu 忙等景象。
收益:debug 包构建耗时升高 2min左右 。release 包构建耗时升高4min左右。
dx 构建优化
降级到 android gradle plugin 3.4.2 版本后,agp 新增了三个个dx构建参数,通过测试能够显著晋升dx解决class文件速度。通过测试 设置如下三个属性升高构建耗时。
android.dexingNumberOfBuckets=16 android.dexingWriteBuffer.size=256 android.dexingReadBuffer.size=256
仔细阅读agp源码可知,这几个参数构建构建内存中dx 缓存大小、dex 读取写入片大小。默认dexingNumberOfBuckets 为cpu个数的一半、读取写入大小为1KB。这样就造成高io情景下,cpu 忙等情景。采纳升高磁盘写入次数、减少缓存形式可能明显降低构建耗时。
收益:debug release 包构建耗时升高3min左右。
冗余工作整顿
随着咱们一直迭代、平台降级,一些 构建工作、构建性能等曾经废除,但因为构建零碎的特殊性——无产物回滚能力,导致构建零碎的工作始终处于单增状态。且因为构建零碎高风险、低收益、逻辑性能简单古老的特点,导致构建速度治理能源有余。
针对上述问题,通过构建逻辑梳理、构建配置项清理、 单任务调试等伎俩,逐渐摸清构建每个构建工作的性能,并对postPackageDebug等30+ 无用工作进行清理、对transform治理、工作治理等外围性能进行简化。下表为构建冗余工作清理列表。
工作名 | 作用产出 | 是否保留 |
---|---|---|
postPackageDebug | apk后处理 | 能够废除 |
remoteSignAppDebug | 近程签名 | 能够废除 |
DexCountDebug | dex个数 | 能够废除 |
ChannelPackageDebug | 渠道包构建 | 能够废除 |
generateAppInfoDebug | appinfo生成 | 能够废除 |
uploadBuildFilesDebug | 文件上传 | 能够废除 |
buildPatchBaseApkDebug | 热修复构建 | 能够废除 |
.... |
收益:debug 包构建耗时升高 15s+ ,release 包构建耗时升高20s+。
工作pipeline化
gradle 采纳工作情景进行构建工作排布,基于这一拓展个性能够对产物进行后置解决。例如对 apk 后置解决有渠道解决、arsc 解决、对齐、签名、分包解决、图片压缩等工作,每一个工作都须要apk进行重复的解压、压缩、拷贝操作,节约cpu 、零碎io,徒增构建耗时。
为了升高apk构建耗时、简化apk产物操作简单,咱们对现有工作进行重整与拓展、实现了一种低拷贝、一次解压、一次压缩的产物pipeline解决机制,下图为构建过程apk后处理机制流程图。
收益:debug 包耗时升高21s,release 包耗时升高11s。
构建模版优化
依照用处辨别 android 有多种构建变种,debug版本、release版本、近程与非近程等。对于开发阶段来说,一些插件的优化性能如turbo dex 缩减、7zip 压缩齐全无必要,能够间接禁止掉。
收益:debug 缩短1-2min 左右,release 包无变动。
缩减代码规模
构建耗时中 java 代码混同耗时约占整体构建耗时的60%,同时混同耗时与代码规模正相干。所以构建耗时与代码规模成正相干关系。
代码规模的收缩一部分来源于业务扩张,一部分来源于冗余代码的工程腐化。自2020年下半年至 2021年上半年期间,优酷进行了常态化的包体积治理,包体积获得了较为优异的成绩,代码腐化问题也失去了局部缓解。
如下图所示优酷android 端自2020下半年至今,可知 android 端 java 代码规模升高25%,构建速度奉献约为45s+。
收益:release 包构建耗时升高约为45s+。debug 包构建耗时约为5s-10s。
硬件优化
公有构建租户池
采纳iostat、tsar 等linux 性能剖析工具对优酷android 端构建过程剖析(如下图)可知。整个构建流程cpu io-wait 景象重大,即构建过程中存在大量的io操作,因为构建机器io性能有余,导致构建耗时偏长, 侧面印证软件优化中升高io可能构建速度的有效性。
针对io瓶颈问题,次要有两种解决办法:采纳buffered io 解决、晋升 Io 性能:
- 首先,仅保留agp插件进行构建,发现并无构建速度显著晋升。证实:自定义插件无io 优化空间;
- 其次,对android 构建流程剖析,io 碎片化写入较少,所有采纳buffered io 解决 io 瓶颈,优化空间不大;
- 最初,通过采纳应用SSD 替换机械硬盘成果较好。物理机构建比拟数据如下:
机器类型 | 非首次构建 (依赖缓存情景) 次要情景 | 首次构建(无依赖缓存情景) | 硬件状况 |
---|---|---|---|
组一(台式机) | 12min57s | 21 min | SSD Ex900 521G / 写入峰值约900Mb/s / intel 2.9Ghz 16线程 /16G内存 |
组二(Dell R740 刀片服务器) | 25min | 40min | 机械硬盘 /写入峰值约254Mb/s / 骁龙 2.1Ghz 24线程/ 48G内存 |
组三(Dell WorkStation) | 19min58s | 27min | SSD EX900 521G / 写入峰值约900Mb/s /骁龙 2.2Ghz 20线程 /32G内存 |
组四(台式机) | 10min10s | 23min | SSD 512G / 写入峰值约1G/s AMD 3.5Ghz 24线程 32G内存 |
组五(devops集群) | 23min | 40min | 多为机械硬盘,视调度具体机器而定 |
收益:debug 缩小5min 左右,release 包缩小10min。
总结
综上所述,为了保护构建速度优化的成绩,咱们能够进行如下方面的工作:
- 为了满足数据指标设定与构建优化防腐的需要,咱们须要设置构建优化指标,建设正当的数据评测体系;
- 通过对构建模板拆分、冗余工作清理、gradle 降级和android gradle plugin 降级、正当设定构建相干参数——dx构建优化等软件优化伎俩,咱们能够取得大部分构建速度优化成绩;
- 硬件优化局部须要建设构建流程要害瓶颈的剖析上,各利用构建瓶颈可能不同。
受限于技术手段与稳定性问题, 构建速度优化还有如下未实现局部。
- 混同规定管制与清理:混同工作执行速度与混同规定数量存在正相干关系,不合理的混同规定会导致混同工作耗时增长;
- 工程腐化水平治理:无用代码规模是工程腐化水平的重要标记,同时无用代码规模是影响构建速度的重要因素。然而如何治理大型项目的工程腐化水平,是利用架构以及整体利用开发须要摸索的下一个重要课题;
- r8构建优化:通过对android dex 构建工具链——r8 的降级测试发现,优酷release 包构建有较为显著的构建速度晋升。但因为局部google bug 导致r8 优化delay。
将来,优酷技术团队也将针对上述问题,继续优化构建耗时,欢送大家随时与咱们交换探讨。
【相干文档】
- linux 性能优化指南:https://www.processon.com/vie...
- r8 相干问题:https://issuetracker.google.c...
- Atlas:https://github.com/alibaba/atlas
咱们招聘啦!
优酷 — 技术核心 — 架构团队招人,形容如下。
【职位形容】
- 负责以优酷为外围的android基础架构工作,包含根底框架、中间件等。
- 负责app的稳定性、性能、包瘦身等长效治理工作,晋升根底用户体验。
- 钻研挪动端前沿技术工程化,以及技术趋势摸索。
- 解决各类疑难问题,撑持业务疾速、稳固、高效迭代。
【职位要求】
- 相熟Android SDK、Framework等根底技术,并有较好的源码剖析能力。
- 精通Java语言,基本功扎实,有Kotlin、C/C++开发能力者优先。
- 对Dalvik/Art虚拟机中,任意局部有教训者优先。
- 有关键技术选型、疑难Bug修复、内存优化等教训者优先。
简历投至形式:yanjiao.syj@alibaba-inc.com
关注【阿里巴巴挪动技术】微信公众号,每周 3 篇挪动技术实际&干货给你思考!