中心化决议管理——云端分析

企业AI落地:自上而下与自下而上策略的实战选择指南 企业级AI落地不是算法或算力问题,而是组织推进逻辑的系统性挑战。从基础概念看,自上而下策略强调战略对齐、治理前置与技术债管控,适用于跨系统协同强、合规要求高、失败容忍度低的场景;自下而上策略则以最小可行影响力(MVI)为起点,通过业务价值快速验证、反脆弱架构和显性化归因实现草根创新规模化。二者并非对立,而需基于数据协同性、ROI可测性、资产复用度等维度动态匹配——这正是企业突破PoC到Production死亡谷、构建AI业务价值闭环的核心能力。本文聚焦真实战场中的策略诊断、关键动作与避坑实践,覆盖金融、制造 阅读详情

作者:钱佳卫,研发工程师,产品研发和工程架构部-Client Infrastructure-App Infra-DevOps-Developer Tools

前言

CocoaPods 云端分析能力是字节跳动的终端技术团队(Client Infrastructure) 下 Developer Tools 部门提供的一系列云化基础设施之一, Developer Tools 团队致力于建设下一代移动端云化基础设施,团队通过云 IDE 技术、分布式构建、编译链接等技术,优化公司各业务的研发和交付过程中的质量、成本、安全、效率和体验。

一、背景

iOS 组件化研发模式下,CocoaPods 已然成为 iOS 业界标准的依赖管理工具。但随着业务能力不断拓展迭代,组件数量不断增多,导致App工程复杂度急剧增大,依赖管理效率严重下降,甚至出现潜在的稳定性问题。为了能够更快、更稳定得管理大型项目的组件依赖,iOS build 部门打造了一套中心化依赖管理服务——云端依赖分析,从工具链的层面收敛了依赖管理流程,加速了决议速度,聚合了失败问题。

在这里插入图片描述

二、什么是云端依赖分析

在这里插入图片描述

基于 CocoaPods 的 iOS 工程管理,每次执行 pod install,都需要先将组件索引信息 Spec 仓库同步到本地,一般都依靠于 git 仓库的 clone,然后读取 Podfile、Lockfile 以及其他配置文件,开始进入依赖分析、依赖下载、工程整合等几个步骤。

在这里插入图片描述

云端分析是一个依赖于字节跳动自研制品库平台,通过工具链上传本地工程构建物料,快速返回依赖分析结果,中心化管理 iOS 工程依赖的云端服务。云端分析服务会依赖于制品库提供所有组件索引信息;并且通过云端分析本地工具在环境准备过程中获取本地工程物料,统一上传至云端进行依赖决议任务,云端借助于一系列优化手段以及服务器性能,快速返回一个决议结果,本地接收到决议结果之后进行后续的依赖下载与工程整合过程。

云端分析的接入方式也极其容易,不需要增加配置文件,也不需要修改原有研发模式,以无侵入、无接入成本、不影响研发流程的方式接入到工程项目中。唯一需要做的,仅仅是在 CocoaPods 工具链中加入云端分析的 RubyGem 插件,并在 pod install 命令中增加一个开启优化功能的控制开关参数。

三、如何加速决议

3.1 制品库 (全量组件索引信息)

基于 Cocoapods 的 iOS 开发体系对 iOS 的产物管理是非常粗放的,直接将不同的 git 仓库作为构建产物(podspec 文件)的索引仓库,担当了制品库的角色。随着 iOS 工程的复杂化,git 仓库的文件信息增加导致组件索引信息查询困难,仓库的同步速度缓慢。BitNest 制品库是公司自研的移动端的产物管理系统,用于管理持续集成过程中所产生的构建产物。制品库将分离在各个 git 仓库的 podspec 源进行了中心化的管理,通过一套完整的 CLI 指令,能够快速拉取、查询 podspec 信息。云端分析服务借助于制品库能力的帮助,能够在云端实时访问一个全量完整的 podspec 源信息。每次CocoaPods 任务都不需要再去更新 podspec 源信息,也不会因为不及时更新 podspec 源信息而找不到最新发版的组件 podspec 信息。

3.2 缓存机制

在这里插入图片描述

在介绍缓存机制之前,先简单介绍一下 pod install 中依赖分析的运行流程。在第一次执行的时候(忽略 lockfile),CocoaPods 会通过 DSL 从 Podfile 中读取具体的 plugin,source,target,pod 等内容,创建相应的对象完成准备阶段。在每个 Target 对象中每个 pod 都创建成了 Dependency 对象,并且都会有具体的 Requirements 对象。所有 Target 对象的所有 Dependency 对象都逐个被加入到堆栈中,并创建一个 Graph 依赖节点图。每个 Dependency 对象根据其 Requirements 去对应的 Source 仓库寻找对应的 pod,如果 Requirements 中没有仓库信息,就从 podfile 公共 Source 中遍历寻找。找到对应的 pod 之后,会先建立一个版本列表,并从版本列表中找出所有符合 Requirements 要求的 pod,然后读取对应是 podspec 文件内容。决议中会对 Spec 对象中隐式的 pod 创建新的 Dependency 加入到分析堆栈和 Graph 中。如果某个版本的 Spec 在遍历 Graph 依赖图时不满足另一个同名依赖的 Requirements,就会进行出栈回撤和依赖图回撤,直至所有 Dependency 都被找到对应的 Spec 对象为止,分析就完成了。可见,在 CocoaPods 依赖管理过程中,有大量重复的对象创建和排序查找过程,极大的降低了研发效率。试想,让 CocoaPods 任务所需的对象一直保持就绪状态,每当收到任务请求立即执行依赖分析工作,就可以快速返回结果。云端分析服务集中化了所有 CocoaPods 的依赖管理任务,针对重复的工作搭建了对象缓存机制。采用懒加载的模式,对新增对象进行缓存,在下一次任务进来之后立刻进入依赖决议过程。

3.2.1 排序 Version 缓存

在这里插入图片描述

在分析每个 pod 时,为了能获取最新版本的 pod 依赖,CocoaPods 会对 source 仓库中的所有版本号建立对应的 Version 对象,并进行排序。目前,公司内部大部分制品版本已经达到上万的数量级,而且在不指定 source 源的情况下,二进制版本和源码版本都会被排序并读取,最终获取一个满足要求且最新的版本。由于组件版本号都以 “.” 和 “-” 分段,大部分组件版本都存在4个或者5个字段以上。这也致使上万个组件在进行排序的过程中,每次排序对比都需要遍历4次以上,使时间复杂度提升了好几倍,极大得增加了耗时。

为了更快得获取到有序的版本列表,由制品库服务维护了所有 pod 组件从大到小排序的版本文件;每增加一个新的 pod 版本,制品库都会向文件中插入一个新版本;删除时,则会删除相应的版本字段。

有了有序的版本文件,云端分析增加 Version 缓存的主要目的是为了将版本分段信息一直维持在 Version 对象中,可以快速判断当前 Version 是否满足依赖的要求。Version 缓存可以让依赖管理过程提速大约10-12秒左右

云端分析在无版本缓存的情况下,会优先读取版本文件中的数据,直接获得有序的版本列表;如果版本列表长度与 source 中组件版本目录长度不一致,会回退到原始方法(版本列表出错,确保分析的正确性)。在缓存命中的情况下,也需要判断缓存版本列表长度是否与 pod 版本目录长度相等(有新增版本,缓存未新增),则会从版本列表数组中查找出差异版本,并对缓存进行修正。

3.2.2 Spec 对象缓存

在这里插入图片描述

CocoaPods 在从排序版本中查找满足依赖要求的 podspec 时,会将所有满足依赖要求的 podspec 版本内容全部读取进来,进行依赖决议遍历。如果在不注明具体版本的情况下,所有版本的 podspec 文件都将被读取,并且在不注明具体 source 源的情况下,所有 source 存在的 pod 也都会被读取。一万个 podspec 文件读取就需要花费 30 秒左右(据不同磁盘而定)

云端分析会对每次分析任务 IO 读取的 podspec 文件内容进行缓存。在下次任务获取 Spec 对象时,可以根据 source,pod_name,version 三个字段直接得到对应的Spec对象。

同时,为了确保 Spec 的正确性,防止 Spec 在不改变版本而更改内容的情况出现。Spec 对象缓存是以一个多维数组的形式存在,通过判断 podspec 文件的修改时间,来更新缓存中的 podspec 内容为最新提交的,确保 checksum 计算与本地拉仓依赖分析的计算值相同,实现云端依赖分析的正确性。后续,也会增加 Spec 缓存命中次数,Spec 对象过期时间等,实现 Spec 缓存的清理策略。

3.2.3 缓存复用

在这里插入图片描述

云端分析也会对分析结果进行缓存,下一次遇到相同的分析任务能够直接复用。云端在获取一次物料之后,会对物料做一次全局 hash 计算和一次分段 hash 计算,分别缓存完整的分析结果分析结果图 Graph。针对下一次分析任务,如果是完全相同的物料可以直接返回一个可用的完整分析结果;如果未匹配,会通过一些 target,platform 等信息计算出一级平台信息 key,来确定具体 app 信息;再对所有target 下的组件依赖逐个计算 hash 值,获得二级 hash 数组 key,并对应一个分析结果图 Graph value;通过模糊匹配的方式对 hash 数组 key 进行匹配,匹配到依赖个数相同最多的相近图,来替换物料中的 locked_dependencies,来加速分析。当然,模糊匹配能力也有一定的局限性,无法对原本上传 lockfile 物料的分析任务进行加速。

3.3 物料剪枝

云端分析会将 CocoaPods 对象转变为字节流进行传输。具体的上传物料与分析结果具体如下:

在这里插入图片描述

1. 上传物料

云端分析工具链会将 Podfile 对象、lockfile 生成的 Molinillo Graph 对象、指定的 Source 对象、插件适配器,所有的外部源 Specs 对象(具体为指定 git,path 和 podspec 的 pre-release 对象)作为上传物料。但其实,云端分析并不需要这些本地对象的全部信息,可以对这些对象进行剪枝,例如 Podfile 对象仅需要 target_definitions 的链表即可;Molinillo Graph 对象仅需要所有 pod 对应的节点,而不需要记录操作节点的 log;Source 对象仅需要知道 name 和 repo_dir 即可,等等。其中,部分决议优化插件需要通过插件适配器额外传输一些配置 Config 对象。

2. 结果返回

云端分析返回的结果为以 Target 为 key,相应的 Specs 数组为 value 的 hash 对象。结果返回之前,会先对所有 Spec 的 Source 进行剪枝。由于每个 Spec 对应的 Source 在后续流程中仅使用到 url 的字段进行分类与生成 lock 文件。因此,可以删除 Source 对象其他无用的字段,最小化传输内容,加快响应时间。对返回结果进行剪枝后,传输内容大小可以减少大约10MB以上

在这里插入图片描述

3.4 决议策略兼容

为了确保决议结果的正确性和唯一性(single truth),云端分析兼容了字节跳动内部各 CocoaPods 决议策略优化的工具链。根据工程中构建配置参数,云端分析本地插件识别出具体的决议策略,并传递到云端分析服务器并激活对应决议策略算法进行快速决议。同时,结合已有的决议优化策略和云端的优化加速机制,让 CocoaPods 的依赖管理流程达到秒级返回

四、总结

本文主要分享了目前字节跳动内部的一种 CocoaPods 云端化的优化方案,针对大量重复的 iOS 工程流水线构建任务进行了收敛和复用,在保证依赖决议正确性的前提下加速了依赖管理速率,提升了研发效能。目前云端分析服务已经完成第一阶段的开发并落地使用,已被公司内部几个核心的生产线使用。如头条接入云端分析服务后,pipeline 的依赖分析阶段耗时加速60%以上。后续,对于 CocoaPods 的下载优化,工程缓存服务也已经在技术探索中,相关技术文章将陆续分享,敬请期待!

扩展阅读

CocoaPods原理详解:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzA5MTM1NTc2Ng==&action=getalbum&album_id=1477103239887142918&scene=173&from_msgid=2458325057&from_itemidx=1&count=3&nolastread=1#wechat_redirect

CocoaPods优化:https://www.infoq.cn/article/adqsbwtvsyzuvh429p8w

加入我们

我们是字节的 Client Infrastructure 部门下的 Developer Tools 团队,团队成员由 IDE 专家及构建系统专家组成,团队致力于通过客户端云化技术以及编译构建技术,优化公司各业务的研发和交付过程中的质量、成本、安全、效率和体验。同时,在实践的过程中我们也看到了很多令人兴奋的新机会,希望有更多对编译工具链技术感兴趣的同学加入我们一起探索。

职位链接

https://jobs.bytedance.com/referral/pc/position/detail/?token=MTsxNjYzMTM3NTEwNTU2OzY2ODgyMDc4MjQ2MDQyMzUyNzI7Njc5OTgyMjIzMjczNTQ1MTQwMA

图片

【扫码投递简历】

数字学习系统压力测试实战:从疫情应急到教育韧性建设 数字学习是教育数字化转型的基础形态,其核心在于保障教学连续性与学习有效性。在突发公共事件等极端场景下,系统需经受网络带宽、终端兼容、教师负荷、家庭支持与心理适配的全链路压力考验。本文基于2800人规模K12学校的72小时紧急上线实践,揭示‘可用性悬崖’原理——即技术方案必须向下兼容老旧设备与弱网环境,而非追求高端功能堆砌;强调‘Complete Analysis’的真实内涵是覆盖真实终端光谱与失败预案验证。内容涵盖分层熔断机制、学习流再造、三段式网络诊断、教师认知减负设计及家庭最小可行支持单元等关键策略,为 阅读详情

相关推荐

【审计专栏】【法律领域】【社会科学】 第五十六篇 企业管理层互动形态分析01 AI分析

战略官试图塑造公司“战略现实”S_s(如“未来在于AI”),业务总裁固守“运营现实”S_o(如“现金为王”)。

weixin_49199313的博客 438

cocoapods-chillax-swift:CocoaPods插件,用于禁用特定Pod的编译器优化

CocoaPods的“ Chillax,Swift”插件 一个CocoaPods插件,用于禁用特定Pod的所有编译器优化。 为什么? 因此,您正在编写一个受欢迎的新应用,并且需要一个外部依赖项。 您想使用的库可作为CocoaPod使用-太棒了! 但这是用Swift编写的。 好东西CocoaPods 0.36 Beta 1版本支持Swift Pod! 使用CocoaPods的Beta版,您可以安装该库,尝试进行编译,然后对编译器段进行BAM处理。 Command failed due to signal: Segmentation fault: 11 0 swift 0x0000000104a9bb68 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 swift 0x0

【审计专栏-监督监管领域】【财务管理】第五十七篇 反洗钱

本列表严格基于国际及中国反洗钱法律法规、金融行动特别工作组(FATF)建议、公开的司法案例及金融监管报告整理,旨在为金融机构、监管机构、法律从业者及公众提供识别、防范和打击洗钱犯罪的知识参考。任何个人或组织不得利用本信息从事非法活动。

weixin_49199313的博客 736

CocoaPods的资源管理以及优化

CocoaPods的资源管理和Asset Catalog优化 Asset Catalog和App Thinning Asset Catalog Asset Catalog是Xcode提供的一项图片资源管理方式。每个Asset表示一个图片资源,但是可以对应一个或者多个实际PNG图,比如可以提供@1x,@2x,@3x多张尺寸的图以适配;还可以通过指定日间和夜间不同Appearances的两套图片,这种资源,在编译时会被压缩,然后在App运行时,可以通过API动态根据设备scale factor来选择对应的真实的

ly410726的专栏 1327

抖音研发效能建设 - CocoaPods 优化实践

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

2301_79655576的博客 1125

CocoaPods,快点我的宝贝!

1. 遇到的问题 我们在编写 ios 项目的时候,一般使用 CocoaPods管理第三方库。 那么你有没有遇到如下问题! 在使用的过程中,有没有遇到过下载仓库很慢,慢到你思考人生? 如何不使用--no-repo-update来对仓库进行加速?使用的时候快到你想象不到? CocoaPods1.9.0+版本优化流程,想要使用的话,应该怎么升级? 1.1 macOS 10.14.4 ...

若云_bai的专栏 301

细聊 Cocoapods 与 Xcode 工程配置

前言 文章比较长,所以在文章的开头我打算简单介绍一下这篇文章将要讲述的内容,读者可以选择通篇细度,也可以直接找到自己感兴趣的部分。 既然是谈 Cocoapods,那首先要搞明白它出现的背景。有经验的开发者都知道 Cocoapods 在实际使用中,经常遇到各种问题,存在一定的使用成本,因此衡量 Cocoapods 的成本和收益就显得很关键。 Cocoapods 的本质是一套自动化工具。那么了解自动化...

weixin_33877885的博客 317

中心化决议管理 —— 云端分析

CocoaPods 云端分析能力是字节跳动的终端技术团队 (Client Infrastructure) 下 Developer Tools 部门提供的一系列云化基础设施之一, Developer Tools 团队致力于建设下一代移动端云化基础设施,团队通过云 IDE 技术、分布式构建、编译链接等技术,优化公司各业务的研发和交付过程中的质量、成本、安全、效率和体验。

博客 292

PolyClawster:基于AI与自然语言的预测市场自动化交易实战指南

在去中心化金融领域,智能合约与自动化交易正成为提升效率的关键技术。其核心原理在于通过预设的算法与链上交互,实现无需人工干预的资产管理与决策执行。这项技术的价值在于能够7x24小时捕捉市场机会,降低人为情绪干扰,并整合多源信息进行快速响应。典型的应用场景包括套利、做市、以及基于事件驱动的预测市场交易。本文聚焦的PolyClawster项目,正是这一趋势下的前沿实践。它构建了一个能理解自然语言指令的AI智能体,通过集成大语言模型进行信号分析和信心评分,并采用“分析云端,签名在本地”的非托管安全架构,让用户能以

weixin_42554162的博客 290

2026企业级AI编程:重构软件交付的五大能力图谱

AI编程已从个人辅助工具演进为支撑企业软件全生命周期的核心能力。其本质是将大模型能力深度嵌入需求分析、架构设计、安全审查、跨栈协同与知识治理等工程环节,核心价值在于提升交付确定性、降低协作熵增、强化合规可审计性。技术原理上依赖代码图谱+知识图谱双驱动、三层约束引擎(语法/规范/上下文)、契约中心化管理及零信任执行沙箱等关键技术。在金融、制造、SaaS等强流程、高合规要求场景中,已实现需求到代码端到端映射、遗留系统渐进改造、实时安全嵌入、全栈契约同步与团队知识活化等落地应用。本文聚焦2026年真实可用的企业级

weixin_33831196的博客 405

【系统架构设计师】综合知识篇

本文是软考系统架构设计师备考笔记,系统梳理了考试核心知识点,重点涵盖中间件技术、缓存问题和解决方案。主要内容包括: 中间件概述:定义位于OS与应用间的软件层,分类包括数据库访问、RPC、消息队列等,分析7大技术优点。 消息中间件:对比RabbitMQ/Kafka/RocketMQ特性,详解点对点和发布订阅模型,列举异步解耦、流量削峰等典型场景。 Redis缓存:介绍单线程模型、5种数据结构,重点分析RDB/AOF持久化机制和集群高可用方案。 缓存三大问题:通过流程图解析雪崩(随机过期时间/熔断降级)、穿透(

你的博客 748

【信息科学与工程学】计算机科学与自动化——第八十四篇 C++分布式软件高并发/高可用算法01

4. 提交:协调者选择提交时间戳(>所有读时间戳),两阶段提交:a) 写意图预提交到所有参与者,b) 参与者持久化后确认,c) 协调者决定提交,异步清理意图。:客户端请求发送到协调节点,协调节点根据路由转发到主分片所在节点。Span有父子关系。1. 索引文档:客户端发送PUT请求到协调节点,协调节点路由到主分片节点,主分片写入本地,然后并行复制到副本分片,等待确认后响应客户端。3. 搜索:客户端发送搜索请求到协调节点,协调节点广播到所有相关分片,每个分片执行查询,返回结果,协调节点合并、排序、分页后返回。

weixin_49199313的博客 1045

【信息科学与工程学】【解决方案体系】第二十六篇 利益链评估解决方案01

记录 1:编号: 1算法名称: 晋升决策中的资源置换算法算法参数: 推理与方程式:目标识别: 决策者A有项目G,依赖关键客户资源。资源评估: A持有筹码 ,B持有资源 。交换计算: 构建交换物X(晋升机会)。计算价值:,,,。交换盈余 。决策: 在非正式场合(E2)发起延时、隐性资源互换(E3)。。应用场景: 管理者为完成关键项目,用未来晋升机会交换下属掌控的核心客户关系支持。记录 2:编号: 2算法名称: 跨部门预算争夺的联盟形成算法算法参数: 推理与方程式:目标识别: 部门主管A需在年度预算会上争取超额

weixin_49199313的博客 1088

陪产假救了某美股半导体大厂千万战略规划,年终奖只给6k

个人现实经历文章: 1. 技术圈层:GPL 合规 + 非职务发明 + 构建系统架构的经典教学案例 2. 法律圈层:GPL + MIT 协议的"现实具象化",活生生的开源时代软件许可的样本 3. 职场圈层:系统部 7 个月失败 vs 非系统部门员工陪产假救场,年终奖 6000 无升职加薪 vs VP 2023年晋升副总裁——打工人的集体共鸣点 4. 社会圈层:上海封控、陪产假、孩子黄疸、沪漂压力——2022 年特定时代的集体记忆

weixin_43149888的博客 360

我的CocoaPods建设过程中的那些坑

这是一篇介绍一个iOS开发中的一个依赖库管理工具CocoaPods 什么是CocoaPods? 在iOS开发中势必会用到一些第三方依赖库,比如大家都熟悉的AFNetworking、Reachability等。使用这些第三方类库能极大的方便项目的开发,但是,集成这些依赖库需要我们手动去配置,例如集成ASIHTTPRequets库时除了加入源码以外还需要手动去添加一些系统的framewor

u013625163的专栏 1194

cocoapods本地私有库优化(创建pod的模板库)

目的: 创建一个仓库,存储在本地,在本地的其他工程这种直接使用。 实现步骤如下 桌面创建文件夹:名字为“cocoapods本地私有库的使用” 然后文件夹里创建文件夹:LocalLib文件夹,里面创建文件夹TestPerson 文件夹里再创建 Classes文件夹 然后 cd 进入Classes文件夹 执行终端命令: touch Person.h Person.m 创建这两个文件 Local...

黑码哥的技术博客 723
上一篇: 字节跳动 DanceCC 工具链系列之Xcode LLDB耗时监控统计方案
下一篇: 前端监控系列4 | SDK 体积与性能优化实践
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值