乐趣区

关于ios:拒绝编译等待-动态研发模式-ARK

作者:字节跳动终端技术——徐纪光

背景

iOS 业界研发模式多为 CocoaPods + Xcode + Git 的多仓组件化开发模型。为谋求极致的研发体验、晋升研发效率,对该研发模式进行了大量优化,但目前遇到了以下瓶颈,亟需冲破:

  • pod install 工夫长:编译优化绝大部分工作放在了 CocoaPods 上,CocoaPods 承当了更多工作,执行工夫因而变长。
  • 编译工夫长:尽管现阶段绝大部分工程曾经从源码编译转型成二进制编译,但编译耗时仍旧在十分钟左右,且现有工程根底上已无更好优化伎俩。
  • 超大型工程通病:Xcode Index 慢、爆内存、甚至卡死,链接工夫长。

如何解决这些问题?

究其实质,产生这些问题的起因在于工程规模宏大。据此咱们停下了对传统模式各节点的优化工作,以 ” 放大工程规模 ” 为切入点,摸索新型研发模式——动静研发模式 ARK。

ARK[1] 是全链路笼罩的动静研发模式,旨在保障工程体验的前提下放大工程规模:通过基线构建的形式,提供线下研发所需物料;同时通过实时的动静库转化技术,保障本地研发仅需下载和编译开发仓库。

Show Case

动静研发模式本地研发流程图如下。接下来就以抖音产品为例,论述如何应用 ARK 做一次本地开发。

演示基于字节跳动本地研发工具 MBox[2]。

流程图

  1. 仓库下载

ARK 研发模式下,本地研发不再拉取主仓代码,取而代之的是 ARK 仓库。ARK 仓库含有与主仓对应的所有配置,一次适配接入前期不须要继续保护。

相较传统 APP 仓库动辄几个 GB 的大小,ARK 仓库贯彻了 缩减代码规模 这一概念。仓库仅有利用配置信息,不蕴含任何组件代码。ARK 仓库大小仅 2 MB,在 1 s 内能够实现仓库下载。

在 MBox 中的应用仅需几步点击操作。首先抉择要开发的产品,而后勾选 ark 模式,抉择开发分支,最初点击 Create 便能够数秒实现仓库下载。

  1. 开发组件

CocoaPods 下进行组件开发个别是将组件仓库下载到本地,批改 Podfile 对应组件 A 为本地援用 pod A, :path =>'./A',之后进行本地开发。而在 MBox 和 ARK 的研发流程中,仅需抉择要开发的组件点击 Add 便可进行本地开发。

动静研发模式 ARK 通过解析 Podfile.lock 反对了 Checkout From Commit 性能,该性能依据宿主的组件依赖信息主动拉取相应的组件版本到本地,带来便捷性的同时也保障了编译成功率。

  1. pod install

传统研发模式下 pod install 必须要经验 解析 Podfile 依赖、下载依赖、创立 Pods.xcodeproj 工程、集成 workspace 四个步骤,其中依赖解析和下载依赖两个步骤尤为耗时。

ARK 研发模式下 Podfile 中没有组件,因而依赖解析、下载依赖这两个环节耗时简直为零。其次因为工程中仅需开发组件步骤中增加的组件,在创立 Pods 工程、集成工程这两个环节中代码规模的升高,对晋升集成速度的成果十分显著。

没有依赖信息,编译、链接阶段显然不能胜利。ARK 解决方案通过自研 cocoapods-ark 及配套工具链来保障编译、链接、运行的胜利,其原理后续会在系列文章中介绍。

  1. 开发组件编译 & 调试

和传统模式一样通过 Xcode 关上工程的 xcworkspace,即可失常开发、调试残缺的利用。

工程中仅保留开发组件,然而仍然有变量、函数、头文件跳转能力;参加 Index、编译的规模变小,Xcode 简直不存在 loading 状态,大型工程也能够秒开;编译速度大幅晋升。在整个动静研发流程中,通过工具链将组件从动态库转化成动静库,链接工夫显著缩短。

  1. 查看全源码

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、运维、产品经理、项目经理以及经营角色,提供一站式整体研发解决方案,助力企业研发模式降级,升高企业研发综合老本。

退出移动版