作者:字节跳动终端技术——徐纪光
背景
iOS 业界研发模式多为 CocoaPods + Xcode + Git 的多仓组件化开发模型。为谋求极致的研发体验、晋升研发效率,对该研发模式进行了大量优化,但目前遇到了以下瓶颈,亟需冲破:
- pod install 工夫长:编译优化绝大部分工作放在了 CocoaPods 上,CocoaPods 承当了更多工作,执行工夫因而变长。
- 编译工夫长:尽管现阶段绝大部分工程曾经从源码编译转型成二进制编译,但编译耗时仍旧在十分钟左右,且现有工程根底上已无更好优化伎俩。
- 超大型工程通病:Xcode Index 慢、爆内存、甚至卡死,链接工夫长。
如何解决这些问题?
究其实质,产生这些问题的起因在于工程规模宏大。据此咱们停下了对传统模式各节点的优化工作,以 ” 放大工程规模 ” 为切入点,摸索新型研发模式——动静研发模式 ARK。
ARK[1] 是全链路笼罩的动静研发模式,旨在保障工程体验的前提下放大工程规模:通过基线构建的形式,提供线下研发所需物料;同时通过实时的动静库转化技术,保障本地研发仅需下载和编译开发仓库。
Show Case
动静研发模式本地研发流程图如下。接下来就以抖音产品为例,论述如何应用 ARK 做一次本地开发。
演示基于字节跳动本地研发工具 MBox[2]。
流程图
-
仓库下载
ARK 研发模式下,本地研发不再拉取主仓代码,取而代之的是 ARK 仓库。ARK 仓库含有与主仓对应的所有配置,一次适配接入前期不须要继续保护。
相较传统 APP 仓库动辄几个 GB 的大小,ARK 仓库贯彻了 缩减代码规模 这一概念。仓库仅有利用配置信息,不蕴含任何组件代码。ARK 仓库大小仅 2 MB,在 1 s 内能够实现仓库下载。
在 MBox 中的应用仅需几步点击操作。首先抉择要开发的产品,而后勾选 ark 模式,抉择开发分支,最初点击 Create 便能够数秒实现仓库下载。
-
开发组件
CocoaPods 下进行组件开发个别是将组件仓库下载到本地,批改 Podfile 对应组件 A 为本地援用 pod A, :path =>'./A'
,之后进行本地开发。而在 MBox 和 ARK 的研发流程中,仅需抉择要开发的组件点击 Add 便可进行本地开发。
动静研发模式 ARK 通过解析 Podfile.lock
反对了 Checkout From Commit
性能,该性能依据宿主的组件依赖信息主动拉取相应的组件版本到本地,带来便捷性的同时也保障了编译成功率。
-
pod install
传统研发模式下 pod install
必须要经验 解析 Podfile 依赖、下载依赖、创立 Pods.xcodeproj
工程、集成 workspace 四个步骤,其中依赖解析和下载依赖两个步骤尤为耗时。
ARK 研发模式下 Podfile
中没有组件,因而依赖解析、下载依赖这两个环节耗时简直为零。其次因为工程中仅需开发组件步骤中增加的组件,在创立 Pods 工程、集成工程这两个环节中代码规模的升高,对晋升集成速度的成果十分显著。
没有依赖信息,编译、链接阶段显然不能胜利。ARK 解决方案通过自研 cocoapods-ark 及配套工具链来保障编译、链接、运行的胜利,其原理后续会在系列文章中介绍。
-
开发组件编译 & 调试
和传统模式一样通过 Xcode 关上工程的 xcworkspace
,即可失常开发、调试残缺的利用。
工程中仅保留开发组件,然而仍然有变量、函数、头文件跳转能力;参加 Index、编译的规模变小,Xcode 简直不存在 loading 状态,大型工程也能够秒开;编译速度大幅晋升。在整个动静研发流程中,通过工具链将组件从动态库转化成动静库,链接工夫显著缩短。
-
查看全源码
ARK 工程下默认只有开发组件的源码,查看全源码是开发中的刚需。动静研发流程提供了 pod doc
异步命令实现该能力,此命令能够在开发时执行,命令执行实现后重启工程即可通过 Document Target 查看工程中其余组件源码。
pod doc 长处:
- 反对异步和同步,执行过程中不影响本地开发。
- 执行指令时跳过依赖解析环节,从服务端获取依赖信息,下载源码。
- 通过
xcodegen
异步生成 Document 工程,大幅升高pod install
工夫。 - 仅复用
pod installer
中的资源下载、缓存模块。 - 反对仓库对立鉴权,主动跳过无权限组件仓库。
收益
体验上: 与传统模式开发流程统一,零老本切换动静研发模式。
工具上: 站在伟人的肩膀上,CocoaPods 工具链相干优化在 ARK 同样失效。
工夫上: 传统研发模式中,历经各项优化后尽管能将全链路开发工夫管制在 20 分钟左右,但这样的研发体验仍旧不够敌对。开发非常容易在这个工夫距离内被其余事件打断,良好的研发体验应该是连贯的。联合本地开发体验咱们认为,一次连贯的开发体验应该将工程集成工夫管制在分钟级,以后研发模式胜利做到了这一点,将全链路开发工夫管制在 5 分钟以内。
成功率: 成功率始终是研发效率中容易被忽视的一个指标。据不齐全数据统计,团体内利用的本地全量编译成功率有余五成。一半的同学会在首次编译后执行重试。显然,对于工程老手来说就是噩梦,这意味着很长时间将在这一环节中节约。而 ARK 从平台基线到本地工具链贯彻 Sandbox 的理念,整体上进步编译成功率。
写在最初
ARK 以后曾经在字节跳动外部多业务落地应用。从初期技术计划的摸索到理论落地利用,遇到了很多技术难点,也对研发模式有了新的思考。
相干技术文章将陆续分享,敬请期待。
扩大浏览
[1] ARK: https://github.com/kuperxu/Kw…
[2] MBox: https://mp.weixin.qq.com/s/5_…
字节跳动终端技术团队 (Client Infrastructure) 是大前端根底技术的全球化研发团队(别离在北京、上海、杭州、深圳、广州、新加坡和美国山景城设有研发团队),负责整个字节跳动的大前端基础设施建设,晋升公司全产品线的性能、稳定性和工程效率;反对的产品包含但不限于抖音、今日头条、西瓜视频、飞书、懂车帝等,在挪动端、Web、Desktop 等各终端都有深入研究。
火山引擎利用开发套件 MARS 是字节跳动终端技术团队过来九年在抖音、今日头条、西瓜视频、飞书、懂车帝等 App 的研发实际成绩,面向挪动研发、前端开发、QA、运维、产品经理、项目经理以及经营角色,提供一站式整体研发解决方案,助力企业研发模式降级,升高企业研发综合老本。