导语
App工厂,顾名思义,是一个能根据各种素材和组织形式生成App的工厂。更专业一点的描述,是根据一个具有完备组件库以及这些组件的依赖关系,组合成一个个App。
以往的单App研发架构,由于每次打包编译、版本发布都是一个全量的代码集合,所以不会也不需要考虑每一个组件之间的依赖和耦合关系。在多App场景下,由于存在一套代码,按需生成不同App所需要的代码,原有的架构、代码依赖关系、工程代码组织方式都需要相应的改变。
App工厂的目标是在特定架构和业务场景下,基于一套代码,按需生成目标App所需的代码。一套代码和按需生成是核心,缺一不可。特别是按需生成,意味着不携带任何不需要的代码,这个在实现的过程中非常具有挑战性。本文从iOS视角,分享58App在App工厂方面的理论和实践的探索。
App工厂产生背景
业务的快速试错催生多App
移动互联网不论是在上半场,还是在下半场,业务的创新从来没有停歇过。从微博到团购,从共享汽车到共享单车,从长视频到短视频,业务和模式的创新不断。近几年尤以头条系的业务试错见诸于各报端,从资讯到直播,再到短视频,是一波接一波。
当前不论是大的互联网公司,还是创业性的小公司,要想在新的领域摸索出一番天地,必须不断试错。移动领域的业务不断试错,要求能快速产出各业务对应的创新App。
集团业务的逐步扩大与细化催生多App
互联网江湖早已三分天下,巨头已经建立,大的互联网平台很难形成。但越是大的互联网平台,越担心垂直细分业务的进攻。为应对进攻,集团业务也需要在一些领域逐步扩大和细化,垂直App应运而生。
垂直App与创新App的差距在于,垂直App是基于现有平台业务细分而来,而创新App是平台业务所没有的。
另外,为了应对应用市场的分发和对包大小敏感的用户,这几年极速包几乎成为各大公司的必备App。
集团业务的合并融合催生多App交叉
业务的收购、合并也是大型互联网公司常有的事。收购合并后的业务如何融合,如何既能保持业务的独立性,又能节省集团研发资源,还能支持一套交叉业务(又称垂直业务)代码在各独立App运行,是一个重要又复杂的问题。比如今年58集团内安居客房产业务和原58房产业务的融合就是一个典型的案例。
App工厂目标、架构与实施方法
App工厂的实施目标
1.App工厂有以下目标:
- 标准化能力的产出,为App研发提效增速
标准化能力是实现App工厂的基础,标准化能力与App业务代码无耦合关系,比如React Native SDK,网络库、缓存库等。
- 支持创新App、垂直App、极速App的生成和迭代
同一套代码,根据配置,能按需生成不同App所需的代码。按需生成是关键和核心,不给App工厂生成的App代码携带任何无用代码,增加包大小。
- 支持垂直业务在独立App上的平移
App工厂依附于58App框架代码上,马甲包、极速包与App工厂(58App)是一个子集与全集的关系。但类似安居客App与58App是两个独立App,有交集(公共底层代码或某些业务代码),业务代码集合不一样。
针对独立App的公共业务代码,定义为垂直业务。App工厂在统一底层服务的前提下,也要支持垂直业务在独立App上的平移。即一套业务代码,能在两个或多个独立App上运行。
App工厂架构
![546ee041e68e31ce7e80f3f7ee3481f7.png](https://img-blog.csdnimg.cn/img_convert/546ee041e68e31ce7e80f3f7ee3481f7.png)
名词解释
PODS:
在iOS领域,pods特指cocoapods,是其缩写。cocoapods是对OC或swift Cocoa 工程的依赖管理。(CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. )
中间件:
中间件在软件领域的通用解释是:连接软件组件和应用的程序。在这里中间件体现的是连接和共用。连接的是业务层和基础库层,共用体现在业务层的公共服务。
中间件按照业务强相关与否分为业务中间件和标准中间件。
- 业务中间件:
与业务强相关的中间件,在某一个独立App中通用。由于对当前App其它功能的过多依赖,所以不适用于其他独立App。
- 标准中间件:
与业务弱相关的中间件,不仅在某一个独立App中通用,在其它独立App中也通用,与App中的业务弱相关。最常见的是标准版的RNSDK。
基础库:
对其它pod不产生依赖的独立库。比如一些开源的三方库,是常见的基础库。除了第三方开源的,58集团内自封装的sdk,如果对其它pod不产生依赖,也可以归入基础库范围,比如Passport SDK,WPush SDK等;
入口工程:
主要负责对App工厂生成的App所需代码进行配置。
入口工程pods:主要负责对App工厂生成的App所需代码进行配置,入口工程中包括的功能有:
- APPInfo:对App基础信息的设置,比如App名称,bundle identifier,版本号,证书等;
- Podfile:当前App对所需工程代码的依赖,比如招聘马甲包会依赖招聘业务pod以及其他基础服务pod和三方库pod;
- Regen.sh: 一个可执行文件(本地RD研发调试用),读取podfile配置,拷贝App所需代码及配置,然后生成App所需代码;
- Reng_jenkins.sh: 一个可执行文件(Jenkins服务打包用),读取podfile配置,拷贝App所需代码及配置,然后生成App所需代码;
工程库池:
工程池是App工厂总