背景

京东换肤,经过两年的演进发展,多次支持11.11、618的大促,以及为用户提供个性化换肤,各项功能已趋近完善。业务发展的同时,我们也在考虑如何提升平台通用性,并且尽可能为其他APP提供相同的能力。为更进一步的发展,节效赋能也成为我们的重要任务。于是我们提出了对换肤PaaS化,为需要此项功能服务的站点提供平台服务,以减少重复搭建平台,避免资源浪费。

调研分析

提出构想后,我们进行了调研分析,首先需要判断目前的方案是否已经存在,并且目前存在的方案是否存在一定的弊端,我们是否可以进行优化互补。

一、我们首先对京东主站现有View更新技术方案进行梳理分析。目前的方式是接口动态下发,前端进行View的更换,各个模块使用自己单独的接口配置,主要用于业务处理。流程图如下:

京东产品api 申请(京东换肤系统赋能实践)(1)

这种方式主要用于各模块的个性化打标服务,且各个模块之间比较独立,当然这样的模式有一定的优势,会更加精细化,也方便独立模块的处理。服务端的压力也会被分散。但是缺少统一性,在大改版或者一些重要的节日氛围控制上不能形成统一,需要调动各个模块一起配合。

二、在我们调研其他APP时,发现其他站点目前并没有对应的系统来支持统一换肤服务。

在梳理现有服务及调研其他APP后,我们觉得提供统一换肤服务的必要性。

系统设计

了解到优缺点,我们决定在对应的方面进行互补,提供统一平台,对于样式统一且固定的View进行下发统一管理,并且进行本地缓存,当有新的View需要变更,我们就更新本地的缓存文件,然后通知业务进行更新操作。

仅仅是这样,并不能使我们的平台更加的通用。针对主站,我们依赖已有的基础功能可以轻松做到,但是,如果接入集团其他站点APP,我们目前已有的功能,并不能快速的接入。于是我们需要对现有的基础功进行梳理,进行SDK抽取,为集团其他站点接入提供便利。

总结以上:

在经过总结讨论,我们初步完成了整个换肤系统的整体设计:

京东产品api 申请(京东换肤系统赋能实践)(2)

我们来了解一下整体的架构:

首先CMS后台支持创建新应用,会分配新应用的唯一标识符code,我们使用code来区分不同站点的应用,应用创建成功后,会有一套默认的皮肤生成,默认皮肤就可认为是应用当前使用的皮肤,针对应用,我们可以创建出很多用途不同的素材,包括Text及属性、Image及属性、lottie、file文件等等。创建好素材后,会自动关联到每个皮肤,每个皮肤都可以使用已经创建出来的素材,设置好素材属性就可以在应用中使用对应素材code的数据了。如果你的应用想支持多个皮肤切换使用,你只需要再新建多个皮肤即可。

其次素材配置中,如果你的应用支持暗黑模式,你在配置素材的同时可以进行暗黑素材的配置,暗黑素材的配置会在你配置创建素材时自动生成,暗黑魔术素材数据会随着这套皮肤正常模式一块下发,同时也会存储到本地数据库中,方便暗黑模式和正常模式的快速切换。素材配置可以进行版本控制。

最后SDK的功能是支持个原生APP的换肤功能,SDK会根据CMS生成应用code进行请求皮肤数据,默认的皮肤可以使用生成的皮肤code,也可以使用0代替,在请求到数据后,会识别需要下载的文件下载并存储到本地,比如图标、lottie文件,下载完成后,统一进行数据库存储,然后通知各个模块的View更新操作。

至此,整个换肤流程设计完成。

具体实现

系统的整体规划已完成,但是具体到每个点仍然需要认真的考虑。既要满足操作者方便操作,又要优雅的完成客户端整体UI的替换。

针对固定View,我们解决资源配置,以皮肤为维度。皮肤的子维度为各个模块,各个模块既互相独立,又可以单独配置,又可相互共享素材,方便配置。

京东产品api 申请(京东换肤系统赋能实践)(3)

可对模块进行如下分类:

京东产品api 申请(京东换肤系统赋能实践)(4)

针对当前使用频率较高View属性进行整理下发,支持属性主要包括以下:

京东产品api 申请(京东换肤系统赋能实践)(5)

并且,为了应对一些特殊场景,比如icon的凸起状态、或者埋点信息等,额外添加extInfo字段,方便配置。

针对原生APP进行了SDK的基础功能抽取,包括网络获取数据、数据中图片及文件下载、登录态、本地数据库存储、通知刷新等一系列基础功能,其中暗黑模式下的素材下发,及各模块的使用也是在SDK中完成,SDK 中会判断当前系统是否为暗黑模式,根据当前的系统模式,给出对应的素材数据。

(1)网络请求。SDK中依赖主站的网络库,只需要你传递在CMS创建的APP code即可,考虑到其他APP可能不需要请求网络进行数据处理,SDK 也可以单独的进行数据设置,SDK 内会自动对数据进行处理。

(2)文件下载。文件下载是单独的下载线程池进行处理的,不需要依赖任何模块,传入的数据,会在解析的过程当中自动区分资源是否需要下载。

(3)登录态。SDK会自动监听登录广播,如果你的APP需要有登录状态下的View属性更新,可添加登录态控制。

(4)暗黑模式。SOA会整合正常态和暗黑模式数据,统一下发,在各模块根据code获取素材资源时,SDK会自动判断当前的系统模式,返回合适数据。

(5)数据存储。数据请求、处理(包括解析,资源文件下载),会统一存入本地数据库中,方便下次的直接调用。

SDK的流程图如下:

京东产品api 申请(京东换肤系统赋能实践)(6)

接入

在了解整个系统框架后,就是接入了,原生的客户端需要接入SDK,进行数据的处理,及文件的下载。

客户端侧,考虑到其他APP如果有网络验签,你可以直接使用SDK中的数据请求功能,只需要在主APP中添加SDK的初始化,及数据请求的时机。如果你的APP没有相应的网络验签,你也可以在打开APP的时候,单独进行数据设置,将请求的数据设置进去,仅使用SDK的下载、存储等基本功能,即可完成换肤服务。

CMS侧,首次配置需要开通配置权限,如果新建的应用,需要进行应用注册,注册完成,即可愉快的进行素材的设置及配置工作。

从CMS到客户端的整体流程图如下:

京东产品api 申请(京东换肤系统赋能实践)(7)

规划发展

道阻且长,行则将至。随着业务在不断的扩展壮大,灵活高效的配置,是当前前端的主流,我们在融入业务的同时,也在汲取、沉淀和总结,以适配更多更广的业务场景,来逐步完善系统。

我们仍旧需要精益求精,探索更加高效、侵入性小的技术方案,以支持客户端一些特殊节日的氛围渲染,也需要简化CMS配置的一些操作,方便一键化操作。

目前我们已在京东极速版,主站长辈版落地实施。以下为主站长辈测试版底部导航正常模式及切换暗黑模式效果展示:

京东产品api 申请(京东换肤系统赋能实践)(8)

,