分享好友 最新动态首页 最新动态分类 切换频道
抖音 iOS 工程架构演进(1)
2024-11-07 23:07

抖音 iOS 工程架构演进(1)

图2:抖音流水线式迭代发版

抖音工程架构演进

========

阶段一:抖音原始工程架构(Original architecture of project


图3:抖音项目原始工程架构图

抖音项目一开始是单体架构+Cocoapods,业务代码、工程配置、资源文件全部放在一个大业务仓库。由 Podfile 文件描述第三方仓库的依赖版本。

图4:抖音项目原始工程架目录结构

阶段二:分离壳工程后的工程架构(After splitting of host shell pod


图5:拆分壳工程后的工程架构

分离壳工程后,工程配置、部分系统资源、工程主入口被拆分到主宿主壳工程。

Podfile 拆分出版本依赖管理文件 Podfile.seer,由依赖管理平台进行各个版本的容器化管理,业务仓跟随宿主集成发版,打平依赖,解决版本依赖决议耗时问题。

大业务仓中的代码和资源被拆分到各个业务线的仓库下,由 podspec 文件描述内外依赖。业务线仓库增加 ModuleInterface subspec,存放对外接口,采用依赖注入方式实现接口隔离,初步建立接口层。

业务仓库之间规定只能依赖其他业务仓库的 ModuleInterface subspec,通过 lint 进行编译检查。

部分基础能力代码被拆分成基础仓库,跟第三方仓库一样独立发版。本地研发工具支持单仓开发和多仓开发,不参与代码修改的仓库通过二进制的方式进行链接。同时 CI 流程上也支持通过二进制打测试包,提高打包效率。

图6:抖音项目拆分壳工程后目录结构

壳工程

图7:壳工程抽象

为了满足一个工程同时支持多个项目、部分业务线功能复用、部分业务线中台化发展的需求,我们把所有业务线抽象成独立的 Pod,所有业务 Pod 必须通过宿主的壳工程进行集成发版。

壳工程包含了项目依赖的 Pod 信息描述,同时还包括工程的配置、部分系统级别的资源文件、工程主入口代码。基于多份宿主壳工程,一份代码可以打包出抖音、抖音极速版等项目。

同时,基于宿主壳工程,一些业务线可以通过自动化同步生成自己的子壳工程,实现业务线自己的 Example 工程,进行独立开发,比如有语音通话的 Example 工程,有工具的 Example 工程,有直播的 Example 工程等等。

图8:子壳工程配置同步同步

接口层

接口层顾名思义,只提供依赖的抽象接口,所有接口都是 protocol 协议声明。

接口层限制了所有其他依赖,类、枚举、 外部协议都采用前向声明,podspec 上只允许声明对 DI(依赖注入)框架的依赖。接口层满足封装、隔离和组合的原则。

  • 业务层面对外封装了实现代码

  • 编译层面隔离了组件间依赖传递,减少头文件 import 嵌套提高编译缓存的命中率,对于 swift 业务组件,还能达到减少编译传递的问题

  • 架构层面声明抽象协议支持接口组合

  • DI 容器框架同时支持 stateless DI 容器,也支持 stateful DI 容器。

依赖打平

  • 采用 Cocoapods 本身自带的版本依赖决议进行版本分析会消耗大量的时间

  • Podfile.lock 过于繁琐,可读性很差,难以解决 Podfile.lock 的冲突

  • 隐式依赖被动/不符合预期地升级,难以确定性地声明所有依赖,防止隐式依赖被升级

  • 依赖版本在 Podfile/Podfile.lock 重复声明,增加了解决冲突的成本

  • Podfile.lock 参与依赖版本决议流程比较复杂,会出现不符合预期的情况。

图9:把版本管理和仓库源信息迁移到 Podfile.seer 文件

  • hook 掉 Cocoapods 采用 podfile.lock 进行版本决议的逻辑,采用 Podfile.seer 文件直接描述所有组件的版本信息,打平依赖。

阶段三:单仓多组件工程架构(Multicomponents in single repo


图10:拆分单仓多组件后的工程架构

采用单仓多组件后,每个业务线仓库支持添加 podspec 增加组件,实现更小粒度的二进制依赖。业务线仓库内划分业务实现层、业务接口层、服务层和基础层,都是通过集成方式发版。

新增的服务层主要存放公共的业务逻辑和通用服务,限制 UI,一是满足业务逻辑复用,二是满足子壳工程最小化二进制依赖。同时服务层的服务接口也达到隔离依赖传递的目的,在不同的宿主上,支持通过改变服务层实现替换后台能力或者底层能力。建立分层间的依赖准入规则,完善 lint 编译链接检查。

图11:单仓多组件目录结构

编译链接完备性校验

  • 编译校验:分开编译各个 subspec,确保每个 subspec 的依赖是正确的(由于 subspec 没有编译隔离)

  • 接口符号校验:校验当前接口组件(ModuleInterface)中符号是否完备的,以保证其他组件单独引用是否能正常使用。如 extern 声明的全局变量。

分层依赖准入规则

  • 高层依赖低层

  • 实现依赖接口

  • 接口层无依赖

  • 前向声明优先

  • 服务层去"UI"

以下动画展示了业务实现层和服务实现允许依赖的分层

图12:组件依赖关系示意图动画

阶段四:Example 子壳工程架构(Subshell for bizcomponent in example project


图13:子壳工程架构

每个业务仓从宿主同步工程配置构建子壳工程。增加 AWELaunchKit 为子壳工程提供运行时的基础能力。通过服务层提供业务间运行时共享的服务能力,满足代码复用和更小二进制依赖。

图14:子壳工程目录结构

AWELaunchKit

AWELaunchKit 框架为宿主和其他子壳工程提供了基础服务的依赖和初始化配置。同时提供了一套启动加载的 BootTasks 管理框架,部分业务涉及启动相关的逻辑可以在业务仓对应的服务层中实现,并通过 BootTasks 管理框架注册到启动加载器里面。

同时框架还提供了一套宿主 UI 入口和自定义入口框架。为了方便测试和调试,也整合了整套测试调试框架。

图15:子壳工程依赖关系

组件化探索过程中遇到的一些问题

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。

另外一部分原因在于资料也还没有看完,一面时凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛,于是自我感觉良好,资料就没有怎么深究下去了。

之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。

下一步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!一定要看完

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取 步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!一定要看完 [外链图片转存中…(img-k5svXWaT-1715313638732)]

[外链图片转存中…(img-jmMQ1tET-1715313638733)]

最新文章
最新寄生虫站群 揭秘最新寄生虫站群:网络生态新威胁
警惕“最新寄生虫站群”:一场网络黑帽SEO的隐秘之战在当今这个数字化时代,互联网已经成为人们获取信息、交流思想、开展业务的重要平台然而,随着网络技术的飞速发展,一些不法分子也利用技术手段进行非法活动,其中,“最新寄生虫站群”
百度蜘蛛池优化:深度解析搜狗收录蜘蛛池代运营,助力网站优化,提升流量转化
深度解析搜狗收录蜘蛛池代运营,助力网站优化。通过百度蜘蛛池优化,有效提升网站流量和转化率,实现高效SEO推广。本文目录导读:什么是搜狗收录蜘蛛池代运营?搜狗收录蜘蛛池代运营的优势搜狗收录蜘蛛池代运营的操作方法如何有效提升网站
四、怎么样选择适合本身的文档智能写作软件
文档智能写作软件盘点:哪些软件更胜一筹?在数字化时代的浪潮中人工智能()技术正以前所未有的速度发展渗透到了咱们生活的各个领域。在写作领域文档智能写作软件以其高效、智能的特点成为了广大写作者和创作者的得力助手。本文将为您介绍
Android apk md5获取 安卓手机如何打开.md5文件
视频消重软件吾爱伪原创 安卓手机怎么看视频md5 或者看标题中的文章,赞美这篇文章,机器人会认为你可能会喜欢这篇文章,我们将来会推荐类似的文章。。视频消重软件吾爱伪原创 安卓手机怎么看视频md5 自媒体运营技巧:短视频优质素材选题方
SEO百度快排工具,提升排名效率的秘密武器
《SEO百度快排工具:优化你的网站排名利器》随着互联网的发展,越来越多的企业和个人开始重视网站的建设和运营,而SEO优化作为提升网站流量和排名的重要手段,更是备受关注,在众多的SEO工具中,百度快排工具因其高效、便捷的特点,成为了
17种免费网店推广方法
现在,做网店不仅仅需要货物的质量,更重要是推广。如果没有好的推广方法,那么就算你的东西再好也没有人知道。推广的好坏决定网店和网站的信誉度和知名度,有的网店前期推广不顾实际的情况,为了有吸引力而推出很多优惠,最后导致达不到实
微信公众号写作软件有哪些:免费、好用、推荐列表
在数字化时代微信公众号已经成为、个人和企业传播信息的必不可少平台。为了提升内容优劣和写作效率,多写作软件应运而生,它们不仅可以帮助客户优化文章结构,还能提供丰富的编辑功能让写作变得更加轻松。本文将为您推荐部分免费且好用的微
AI发布文章:如何让您的内容更智能、更具吸引力
如何让您的文章在茫茫网海中脱颖而出?如何抓住读者的注意力,并保持他们的兴趣?这些问题是每一位内容创作者都必须面对的挑战。随着人工智能(AI)的快速发展,我们迎来了一个全新的内容创作和发布方式——AI发布文章。AI发布文章并不是单
浏览器特定指定内容手动搜索技巧,GitHub高级搜索项目
site: 仅从特定网站或网域获得搜索结果(定网站) link: 查找链接到某个特定网页的网页 related: 查找与该网站相似的网站 info: 同时查看某网站以上4种信息 inurl: 查找在URL地址里有搜索关键词的页面 intext: 查找搜索的内容出现在也正文里
快速建站新体验轻松打造专业网站助你成就在线梦想
在这个数字化的时代,拥有一个专业的网站已成为每个人、每个企业的必备工具。无论你是创业者、自由职业者,还是希望展示个人作品的艺术家,网站都是你在线展示自我的最佳平台。传统的建站过程往往复杂而繁琐,需要专业的技术知识和大量的时
相关文章
推荐文章
发表评论
0评