
概述
以下数据均已脱敏
当前,洋葱学园移动端工程的组件化完成度较低,在影响工程师开发效率的同时,又难以兜住持续集成的影响范围,不利于整体工程的高质量建设,已无法满足日益增长的工程预期与精细化控制的需求,更是掣肘了对公司业务快速扩展的响应速度。
当前问题
业务侧影响
- 业务组件独立度的低,难以快速部署到其他业务线,影响交付周期 。
- 为兼容业务特性所残留的冗余代码等问题,造成了组件在不同业务上的表现分歧,增加了 PM 等产品同学的梳理和理解成本,从而影响产品的在迭代过程中的表现统一性 。
技术侧影响
以 iOS 端为例,现存主要问题如下:
- 缺乏组件必要的独立运作能力,难以快速部署到其他业务场景。
- 缺乏统一中间件进行调度,组件间必须进行强依赖才可以使用,这也是难以进行快速部署的痛点之一。
- 由于以上两点,导致无法进行单元测试,回归测试成本居高不下。
- 现存组件间依赖链紊乱,维护成本高。
- 组件化颗粒度过粗,服务下沉不达标,多端引用成本高。
项目目标
我们期望组件化重构完成后,达成以下目标
- 解决实现单元集成的各项阻碍
- 工程各业务组件可独立运行
- 工程各业务组件可独立迭代
- 工程各业务组件可独立测试
- 各业务组件通过中间件调度解除横向依赖,达成横向业务完全脱钩解耦,纵向依赖垂直下沉
- 完成垂直依赖下沉
- 构建统一中间件,补充组件化缺失的关键调度环节
- 主工程壳化
产出 / 收益
项目预期收益已全部达成 🎊
- 迭代周期内的工程平均 构建编译时间预期减少 80% 以上。 ✅ 已达成
- 组件之间的横向依赖完全解耦,纵向依赖垂直下沉,依赖链维护复杂度由 (2^n) 降为 O(1)。 ✅ 已达成
- 各组件支持独立测试,100% 阻绝非迭代代码的测试边界干扰,降低测试成本,保证非迭代代码的稳定性。✅ 已达成
- 各组件支持单元集成,能够显著提高业务的快速部署和响应速度,预期 Jenkins 打包速度提升 50 %,提升测试效能。✅ 已达成
- 各组件支持独立迭代,能够完成独立的版本追踪,进行更详细的质量监控,以及为各业务线提供差异化配置。✅ 已达成
- 壳工程基建完成,业务代码将在组件下沉过程中被完全解耦。✅ 已达成
升级后的架构
iOS
架构图

Android

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

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

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

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