跃迁引擎

空気を読んだ雨降らないでよ

iOS Research & Development


洋葱学园 iOS 端组件化重构之路[三]-重构完成

概述

以下数据均已脱敏

当前,洋葱学园移动端工程的组件化完成度较低,在影响工程师开发效率的同时,又难以兜住持续集成的影响范围,不利于整体工程的高质量建设,已无法满足日益增长的工程预期与精细化控制的需求,更是掣肘了对公司业务快速扩展的响应速度。

当前问题

业务侧影响
  • 业务组件独立度的低,难以快速部署到其他业务线,影响交付周期
  • 为兼容业务特性所残留的冗余代码等问题,造成了组件在不同业务上的表现分歧,增加了 PM 等产品同学的梳理和理解成本,从而影响产品的在迭代过程中的表现统一性
技术侧影响

以 iOS 端为例,现存主要问题如下:

  • 缺乏组件必要的独立运作能力,难以快速部署到其他业务场景。
  • 缺乏统一中间件进行调度,组件间必须进行强依赖才可以使用,这也是难以进行快速部署的痛点之一。
  • 由于以上两点,导致无法进行单元测试,回归测试成本居高不下。
  • 现存组件间依赖链紊乱,维护成本高。
  • 组件化颗粒度过粗,服务下沉不达标,多端引用成本高。

项目目标

我们期望组件化重构完成后,达成以下目标

  • 解决实现单元集成的各项阻碍
    • 工程各业务组件可独立运行
    • 工程各业务组件可独立迭代
    • 工程各业务组件可独立测试
  • 各业务组件通过中间件调度解除横向依赖,达成横向业务完全脱钩解耦,纵向依赖垂直下沉
    • 完成垂直依赖下沉
    • 构建统一中间件,补充组件化缺失的关键调度环节
  • 主工程壳化

产出 / 收益

项目预期收益已全部达成 🎊

  • 迭代周期内的工程平均 构建编译时间预期减少 80% 以上。 ✅ 已达成
  • 组件之间的横向依赖完全解耦,纵向依赖垂直下沉,依赖链维护复杂度由 (2^n) 降为 O(1)。 ✅ 已达成
  • 各组件支持独立测试,100% 阻绝非迭代代码的测试边界干扰,降低测试成本保证非迭代代码的稳定性。✅ 已达成
  • 各组件支持单元集成,能够显著提高业务的快速部署响应速度,预期 Jenkins 打包速度提升 50 %,提升测试效能。✅ 已达成
  • 各组件支持独立迭代,能够完成独立的版本追踪,进行更详细的质量监控,以及为各业务线提供差异化配置。✅ 已达成
  • 壳工程基建完成,业务代码将在组件下沉过程中被完全解耦。✅ 已达成

升级后的架构

iOS

架构图

Android

NewFlow

经过升级的工程架构,双端(iOS & Android)都需要一套全新的架构规范,从而衍生出一套新的工作流来使团队工程师适应和学习过渡

iOS

构建全新 Pod 库流程

构建流程图

如上图所示,经过架构升级后的 iOS 端构建新 Pod 库时的工作流如下:

开发 Flow
  1. 从单元测试工程 Unit-Test 远程仓库 main 分支 check 出基于开发的新分支(以下简称 new branch)
  2. 将 new branch 拉到本地,编写 podfile,处理基本定制化环境配置(非必要)
  3. 新库对应库配套的 YCMediator 分类库 通过 pod install 命令载入到单元测试工程
  4. 进行库开发
  5. 开发、测试完毕后,分别 push 到各自库的远程仓库中
  6. 在发版/部署平台升级 pod 库版本号并进行部署
  7. 修改主工程 podfile 文件,执行 pod install 命令,部署至主工程
  8. 主工程测试回归完毕后,改动库合入其 master 分支(新构建的库无需此环节)
测试 Flow
  1. 基于 UnitTest-iOS Job 进行打包测试,测试环境(平时开发测试均使用该环境)使用 Test Job,线上环境(仅对线上问题做单元回归排查使用,不做测试用)使用 Online Job。
  2. 打包完成后,可根据单元测试工程 App 内置的环境监测对测试内容进行校验确认无误后进行测试(防止环境污染)。
  3. 单元测试完毕后,功能即可算测试验收通过,开发合入主工程后,进行一次主工程回归测试即可。
  4. 单元测试期间,所有代码被限制在测试范围内,仅针对单元工程中存在的测试内容项进行测试,禁止提出与该次单元测试内容无关 bug 或要求问题排查(严重影响测试和开发效率)。

Android

构建流程图

开发 Flow
  1. 找到对应需要开发的库,拉取最新代码,创建到新分支进行需求开发。
  2. 在单元测试工程中从Main分支切换新分支,引入开发的snapshot库,增加测试所需要的环境。
  3. 在测试工程中打包提交给测试。
  4. 测试过程有问题,重复1,2步操作,直到没有新bug出现。
  5. 开发、测试完毕后,在主工程内,将改动的库升级到最新版本,提供回归测试
  6. 回归测试完成之后,在发版前,所有库打正式版本且合入主分支。
测试 Flow
  1. 在测试工程中,选择对应环境,名称及版本,进行打包。
  2. 测试过程中有问题,提交给开发,重复第1步。
  3. 单元功能测试通过后,等待开发合入主工程后,进行一次主工程回归测试
  4. 单元测试期间,所有代码被限制在测试范围内,仅针对单元工程中存在的测试内容项进行测试,禁止提出与该次单元测试内容无关 bug 或要求问题排查(严重影响测试和开发效率)。

性能指标

iOS

  • 全量编译时间缩短 64.92%开发效率提升 2.35 倍
  • 增量编译时间缩短 **80.02%**,开发效率提升 5
  • 应用冷启动时间缩短 **99.87%**,开发效率提升 814.7
  • 业务目标落地页触达时间缩短 **45.01%**,测试效率提升 1.82
  • Jenkins 打包耗时缩短 58.84%测试效率提升 2.43 倍

Android

  • 全量编译时间缩短 65.77%开发效率提升 2.92 倍
  • 增量编译时间缩短 **88.86%**,开发效率提升 8.98
  • 应用冷启动时间缩短 **58.17%**,开发效率提升 2.39
  • 业务目标落地页触达时间缩短 **62.77%**,测试效率提升 2.69

总结

关键词:显著提效质量稳定成果突出

  • 移动端工程架构进行了一次彻底的升级,解决了长久以来困扰研发工程师的依赖链问题。
  • 极大的提升了开发效率,使单位开发时间得以成倍缩短。
  • 稳固了测试边界,保障了测试的安全性和稳定性,同样对测试的单位时间内效率提升十分显著。
  • 移动端借此契机解决了诸多历史遗留工程性问题,并突破性的解决了一系列工程性的老大难问题。
  • 本次架构升级各项性能数据指标超额完成,非常优异。
最近的文章

「端智能」神经网络/机器学习在 iOS 端的应用与场景落地

端智能简介 相比云侧智能,端智能具有低延时、保护数据隐私、节省云端计算资源等显著优势。 近年来,以深度学习为代表的新一代人工智能技术得到了快速发展和广泛应用,模型训练和模型推断基本都在云侧完成。但随着移动设备算力的提升、模型压缩技术的成熟,模型推断在终端设备运行成为可能,端智能(On-Devi …

, , , 开始阅读
更早的文章

iOS 集成 Copilot 至 Xcode 实现智能化编程辅助

1. 前言GitHub 推出了一个强大的 AI 代码工具 Copilot(副驾驶),它能提供很好的代码建议,大大加快编程的开发速度。 Copilot 支持许多编程语言,包括 Swift,并可以在IDE上安装相应的扩展插件,方便地在 IDE 上使用 Copilot。 2. CopilotForXc …

, , , , 开始阅读
comments powered by Disqus