超全回顾5位抖⾳⼯程师揭秘抖⾳iOS基础技术(附PPT
和回放视频)
动⼿点关注 ⼲货不迷路
2016 年 9 ⽉ 26 ⽇,抖⾳ 1.0.0 版本上线,截⾄⽬前,抖⾳⽇活跃⽤户突破 6 亿,短短 6 年间,抖⾳实现了从零开始的爆发性增长。在业务快速发展、数据海量增长、视频/直播形式对画质提出更⾼要求的背景下,抖⾳基础技术团队如何以技术⾰新应对时代变局、以匠⼈之⼼优化⽤户体验?在不被外界“看好”的 iOS 开发领域,抖⾳团队⼜交出了⼀份怎样的答卷?
1 ⽉ 2
2 ⽇下午,第三期字节跳动技术沙龙以线上直播的⽅式与⼴⼤观众见⾯。本次沙龙以《抖⾳ iOS 基础技术⼤揭秘》为主题,邀请了陈显财、陈⽂欢、舒彪、韩建磊、朱峰 5 位抖⾳ iOS 客户端⼯程师,从不同⾓度阐释了亿级 App 抖⾳在 iOS 客户端开发⽅⾯的实践经验,为近 4 万名在线观众带来了⼀场扎根实践、⾯向前沿的技术盛宴。
陈显财《⼤型 App 开发架构演进及挑战》
架构的优劣决定了⼯程的规模和效率。抖⾳基础技术 iOS 客户端架构师陈显财⽼师介绍了抖⾳团队如何在不影响业务迭代和业务规模扩张的前提下,持续推进抖⾳从模块化、组件化、到插件化的架构演进历程。
模块化
⾯对开发初期代码体量膨胀、业务规模扩⼤、开发⼈员增加与业务正常迭代的⽭盾,技术团队⾸先考虑从提升效率的⾓度出发,从主⼯程中剥离出依赖⼯程、环境配置和 App 资源,并设计了底层代码的基础依赖能⼒,形成⼀个壳⼯程。团队还从源码环境资源⼯具的⾓度设计了相对统⼀的模板,使得模块能够基于统⼀的标准进⾏创建和开发。
在研发流程和⼯具量上,团队⽀持了多仓 MR的开发,为本地研发和 CI/CD 搭建了基本的研发环境。进⽽,团队依据模块标准对整个⼯程进⾏模块化拆分,并确保⼤部分模块可以编译为⼆进制⽬标。模块化⽬标的实现在提升效率的同时,也为后续架构的持续演进奠定了基础。
组件化
在业务持续发展的背景下,单个业务模块内的代码也在加速膨胀;模块化拆分后,不合理的接⼝依赖有待进⼀步分析治理;iOS 新增的扩展插件和基础能⼒推动 Swift 混编落地成为必然……在此背景下,技术⼈员开启了组件化进程,降低团队整体的研发能效。
为解决代码复⽤问题、降低依赖复杂度,团队重新定义了抖⾳的 5 级架构分层:
1. 壳⼯程;
2. 业务层;
3. 接⼝层;
4. 服务层;
下载app里的视频
5. 基础层;
这⼀架构分层将模块化带来的⽹状依赖结构改造成树状依赖结构,降低了依赖的复杂度,保障各层之间的依赖不劣化。
针对成百上千个组件的依赖管理,技术团队打破了常规做法“依赖打平”的局限,⽤容器化⽅案予以改进。⼀个版本的容器包括壳⼯程、依赖列表、依赖变更记录、整体构建历史、产品发布聚合信息。针对依赖链缺失或断开的情况,通过求差集的⽅式,在 mr ⼦仓中校验依赖缺失问题,防⽌⼯程依赖关系劣化。
同时,基于新的分层架构,技术⼈员定义了每⼀层组件的依赖规范,以防⽌不合理的循环依赖,保证整体依赖不劣化。在分层依赖规范中,⾼层可以依赖低层、实现可以依赖接⼝,接⼝层没有依赖,且优先以前向声明为主。终于,抖⾳在经过多个版本的迭代优化后,各组件的依赖度明显下降。
⼆进制化带来的另⼀个问题是接⼝层的变更。为应对接⼝冲突带来的⼆进制污染问题,技术⼈员结合主⼲的语法树信息,通过 mr 直接检查真实的调⽤量,每天拦截⼆进制污染的问题⼤概在 10%左右,有效保障了团队整体开发的稳定性。
为应对配置问题、环境问题、异步 mr 接⼝调⽤和冲突等问题对主⼲稳定性的冲击,技术⼈员引⼊了R
C(Release Candidate)分⽀,合并多个 mr 代码,代码经过检查之后进⼊稳定性主⼲,从⽽规避了本地编译失败、CI 出包失败等问题。
解决了稳定化问题后,新增业务仓不断拆分仓库也成为影响开发效率的问题。技术⼈员引⼊了单仓多组件——⼀个仓库内基于分层架构可以
增加多个组件⽽不⽤拆仓。同时,还在接⼝层上隔离了 Swift 和 OC 代码,以规避组件间的编译依赖传递。
通过适配器隔离到⼆进制中。同时,建设了相关的基础配套设施来监控代码变更,使多个 App 的影响可以被感知量化。
插件化
在组件化演进进程中,抖⾳的业务规模持续扩⼤,组件数量从最初的 100+增⾄ 800+,⼆进制化已经⽆法满⾜效率层⾯的提升需求。与此同时,团队在效率、质量、成本⽅⾯均迎来新的挑战。
在此背景下,为了提⾼线上性能和本地效率,技术⼈员开启了静态⼆进制向动态⼆进制改造的进程。在业务懒加载场景,技术⼈员将⾮⾸页业务代码及其独占的基础库依赖直接打成动态库进⾏懒加载;此外,专项代码通过动态库进⾏隔离,在 iPad 定制业务、⼤业务块重构等具体场景中发挥作⽤。
为降低底层依赖复杂度、提升代码质量,团队还设计了服务框架,⽀持把抽象的接⼝绑定到具体的实现上,并⽀持实现的热切。这项框架极⼤满⾜了解耦服⽤、动态部署、服务组合、编译期抹平底层语⾔差异、运⾏期⽀持服务热切等⽅⾯的能⼒需求。
此外,技术⼈员还在本地多模式研发等⽅⾯做出了积极探索。
陈⽂欢《抖⾳ iOS ⾃动化服务:容器化和规模化探索》

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。