关于android:优酷-Android-构建速度优化实践

8次阅读

共计 5125 个字符,预计需要花费 13 分钟才能阅读完成。

作者:苏彦郊(木磊)

Android 我的项目个别应用 gradle 作为构建打包工具,gradle 简洁、动静的性能个性为人津津有味,同样,构建执行速度迟缓的缺点也始终为人诟病。

近年来,随着优酷性能个性日益丰盛,优酷的代码规模也急剧减少,同时,宏大的代码规模也带来了构建耗时的一直减少。整包构建耗时一度高达 35min,重大影响集成与迭代效率。因而构建速度优化势在必行。截止 2021 年 11 月份,优酷构建耗时优化获得较为理想的优化后果(如下),现将构建速度优化的实际计划记录成文。

android 构建类型 2020 年 2021
android debug 包构建耗时 12min 2.5min
android release 包构建耗时 35 min 12min

计划与收益统计图:

优化思路

技术优化类我的项目个别采纳照设定数据指标、技术优化、成绩防腐化三个维度开展。套用技术优化类项拆解可知,咱们须要实现如下三个子项目:

  1. 设定数据指标:即收集与选取外围优化的数据指标,体现成绩价值。本文选取构建耗时、构建失败率、小时维度构建次数等指标作为成绩优化的数据撑持;
  2. 技术优化:通过影响构建速度的影响因素可知,包含软件与硬件两局部,所以构建速度优化可分为软件优化与硬件优化两大方向;
  3. 成绩防腐化: 即维持技术优化指标不好转,保障优化成绩。

接下来,我将依照设定数据指标与后果防腐、技术优化——软件优化、技术优化——硬件优化三个局部开展。

优化计划

设定数据指标与后果防腐

优化类我的项目须要建立健全相应的数据指标体系,借由数据评判体积优化项与优化计划进行有效性断定。进行构建优化前,笔者基于阿里巴巴 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 年)版本。

比照降级前后构建耗时,能够发现构建工具降级后,性能晋升次要源于三个方面:

  1. 随 android gradle plugin 降级,aapt2、proguard 等构建工具也进行了降级,这部分工具降级后,构建性能有小幅晋升;
  2. 更好工作排布与并行化机制:降级 gradle 与 agp 后,agp 3.4.3 版本进行了签名、压缩、对齐工作的整合优化;
  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 性能:

  1. 首先,仅保留 agp 插件进行构建,发现并无构建速度显著晋升。证实:自定义插件无 io 优化空间;
  2. 其次,对 android 构建流程剖析,io 碎片化写入较少,所有采纳 buffered io 解决 io 瓶颈,优化空间不大;
  3. 最初,通过采纳应用 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。

总结

综上所述,为了保护构建速度优化的成绩,咱们能够进行如下方面的工作:

  1. 为了满足数据指标设定与构建优化防腐的需要,咱们须要设置构建优化指标,建设正当的数据评测体系;
  2. 通过对构建模板拆分、冗余工作清理、gradle 降级和 android gradle plugin 降级、正当设定构建相干参数——dx 构建优化等软件优化伎俩,咱们能够取得大部分构建速度优化成绩;
  3. 硬件优化局部须要建设构建流程要害瓶颈的剖析上,各利用构建瓶颈可能不同。

受限于技术手段与稳定性问题, 构建速度优化还有如下未实现局部。

  1. 混同规定管制与清理:混同工作执行速度与混同规定数量存在正相干关系,不合理的混同规定会导致混同工作耗时增长;
  2. 工程腐化水平治理:无用代码规模是工程腐化水平的重要标记,同时无用代码规模是影响构建速度的重要因素。然而如何治理大型项目的工程腐化水平,是利用架构以及整体利用开发须要摸索的下一个重要课题;
  3. 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

咱们招聘啦!

优酷 — 技术核心 — 架构团队招人,形容如下。

【职位形容】

  1. 负责以优酷为外围的 android 基础架构工作,包含根底框架、中间件等。
  2. 负责 app 的稳定性、性能、包瘦身等长效治理工作,晋升根底用户体验。
  3. 钻研挪动端前沿技术工程化,以及技术趋势摸索。
  4. 解决各类疑难问题,撑持业务疾速、稳固、高效迭代。

【职位要求】

  1. 相熟 Android SDK、Framework 等根底技术,并有较好的源码剖析能力。
  2. 精通 Java 语言,基本功扎实,有 Kotlin、C/C++ 开发能力者优先。
  3. 对 Dalvik/Art 虚拟机中,任意局部有教训者优先。
  4. 有关键技术选型、疑难 Bug 修复、内存优化等教训者优先。

简历投至形式:yanjiao.syj@alibaba-inc.com

关注【阿里巴巴挪动技术】微信公众号,每周 3 篇挪动技术实际 & 干货给你思考!

正文完
 0