大量模块壳工程本地如何快速编译?优酷 iOS 工程插件化实践

2022-06-09 14:18 作者: 来源: 本站 浏览: 我要评论大量模块壳工程本地如何快速编译?优酷 iOS 工程插件化实践已关闭评论 字号:

摘要: 随着优酷业务的快速发展,随之而来的是模块数量的爆发式增长,基本每年以大量新增模块的速度增加,到目前为止优酷已经有非常庞大的模块依赖。模块之间通信往往是相互直接依赖调用,以至于耦合十分严重且混乱,每一个库依赖都是一颗“树”,甚至于一张“网”,对日常研发造成很多困...

随着优酷业务的快速发展,随之而来的是模块数量的爆发式增长,基本每年以大量新增模块的速度增加,到目前为止优酷已经有非常庞大的模块依赖。模块之间通信往往是相互直接依赖调用,以至于耦合十分严重且混乱,每一个库依赖都是一颗“树”,甚至于一张“网”,对日常研发造成很多困扰:

iOS模块插件化已经全面在优酷落地,沉淀出各业务线的轻量工程,大量的业务及架构插件,后续可根据不同业务需求,自由组装插件工程。以下是目前插件化工程落地后的一些收益:

a、业务插件工程编译效率提升 显著,本地编译时间大幅降低,相关全部开发已使用起来;

b、通过插件组装生成业务插件工程,插件工程支持模拟器编译调试,并支持热重载;

c、模块工程和整包工程均使用插件作为依赖,彻底解决模块工程和整包工程依赖模块版本不一致情况,并支持依赖模块版本自动更新;

d、业务插件工程依赖库数量大幅减少,且pod直接复用缓存,大幅提升pod成功率及速度,磁盘占用大幅减少;

a、可提供运行内存、app启动、功耗等插件卡口,常态化保持良好的用户体验;

b、所有插件支持自由组装,通过配置中心,提供快速孵化极速版、国际版、Apple Watch、Apple TV等App的能力;

c、依赖减少,swift断点调试时的module树快速生成,断点效率提升;

d、提速打包效率,建立插件工程构建平台,测试同学使用平台动态配置生成插件组合安装包即可进行测试。

和多个业务团队同学沟通后,我们发现大部分的业务在功能调试时,往往只关注涉及到自己需要迭代的业务功能,对于其他业务并不关心。于是我们想到可以基于整包工程,裁剪出一个只有单业务功能的APP,这样编译速度肯定会有极大的提升。

裁剪APP需要对模块进行解耦,如果按模块颗粒度进行解耦,巨量模块进行解耦人力成本过高,而且过大的改动也会对线上稳定性有较大的影响。于是我们对解耦粒度进行了放大,从模块解耦粒度放大到以插件为粒度进行解耦,这样我们只需要解耦插件和插件之间的横向耦合关系,插件允许向下依赖其他插件,且插件内部模块也允许相互耦合,这样极大的的降低解耦的人力成本,也方便后续以插件维度进行依赖关系进行维护。

基于以上插件的概念和使用规范,我们对优酷APP架构进行插件化改造,从集团中间件到业务层,自下而上解耦聚合模块形成插件,最终沉淀了大量插件和如下层级的APP架构。

业务实现层:对优酷现有的业务进行插件化改造,聚合成多个通用业务插件,通过业务插件和其依赖的通用业务插件、架构功能插件等少量插件,能快速组合出一个轻量级业务APP,用于提升业务Pod速度和开发调试速度;

业务接口层:对优酷现有的业务进行横向解耦,形成多个业务接口插件,支撑上层业务插件横向解耦;

通用业务插件:通用业务模块按业务可复用最小集划分边界,聚合成通用业务插件;

架构功能插件:集团中间件模块、优酷中间件模块,按功能最小集划分边界,聚合成架构功能插件。

优酷所有模块已经完成插件化改造,为了保障在后续版本迭代过程中,防止工程腐化,制定了一套低成本管控方案,可以自动更新插件内容,管控插件依赖关系。

插件内容主要包括模块名称和模块版本号,每次版本迭代,插件都面临插件中模块的新增、删除、名称变更、版本变更等问题,优酷每个版本集成大量的模块,如果全部人工手动维护,成本将非常巨大,所以我们部署了一套自动同步及巡检服务,主要有以下目的:

我们基于插件的归属和层级,抽象出标准的模块依赖关系数据,然后在模块构建打包时,增加依赖检测卡口,在每次模块构建过程中,执行依赖检测卡口,只有通过依赖检测的插件才能打包通过。

优酷存在部分模块不支持模拟器,导致优酷整包不支持模拟器,插件化改造后,业务在通过插件组装自己业务调试工程的时候,剔除这部分不支持模拟器的插件,使得业务插件工程可以使用模拟器进行调试。模拟器优势:

在模块插件化改造前,我们只能使用整包工程进行开发,使用整包工程进行日常开发的时候,需要将所有模块下载,而插件化改造完成后,我们从整包工程拆分出了多个业务插件工程,插件工程的模块数量相比整包工程大幅减少,插件工程的磁盘占用相比整包工程大幅减少。下图是整包工程和部分业务插件工程磁盘大小对比:

插件化可提供运行内存、app启动、功耗等插件卡口,常态化保持良好的用户体验,以播放页的运行内存为例,播放页有播放器、页面容器、弹幕、评论等功能,以前是对整个播放页计算内存值,而现在可以按照细碎的功能来计算内存值,分别得到播放器插件、播放页容器插件、弹幕插件、评论插件的内存值。

综上所述,iOS工程插件化是运用分而治之的思想,把一个复杂的App分成多个子App。通过子App可将研发聚焦于需求研发和用户体验提升上。同时,插件化的拆装特性也提高了线上可复现问题的排查效率。因此插件化对研发效率以及开发幸福感的提升都是非常有帮助的。

优酷会员5.9元/月,8.9元/2个月,请点本站上边链接购买

2022年06月09日 14:18:15

 

随机账号机器密码:
47WD983caH45wf OH87ou
65SD677raC12b MC27id843Wfhq5
72PC802zvB QA45v

Comments are closed.

会员登录关闭

记住我 忘记密码

注册会员关闭

小提示: 您的密码会通过填写的"电子邮箱"发送给您.