闲鱼技术2022年度白皮书-KUN主题-三代终端容器KUN的首次大考【架构演进】(中)

简介: 闲鱼技术2022年度白皮书-KUN主题-三代终端容器KUN的首次大考【架构演进】

接上篇:https://developer.aliyun.com/article/1225889?spm=a2c6h.13148508.setting.16.595d4f0eudDbz0


三、 为什么用KUN渲染?

 

1. 闲鱼号端侧主要问题

 

为对症下药,对闲鱼号端容器(Weex)侧进行了全面的诊断。问题集中在性能、渲染质量、扩展能力、终端体验一致性四个方面

 

1) 性能:闲鱼号首屏(700ms)和交互性能不错,性能问题主要在内存上,Weex页面重度访问是闲鱼客户端OOM的主要场景之一。启动Weex容器会产生较大的增量内存,部分控件无回收机制也会导致内存增加,如waterfall组件加载5页带来了3000个未释放内存节点、40M内存增量

 


image.png

2) 渲染质量:在基础样式、布局、事件体系等方面和前端预期不一致,如:

 

不支持overflowvisible

不支持z-index,层叠只能通过节点位置先后实现

不支持displayinline,替代方案rich-text标签不支持line-height等基础样式控制

 

3) 终端体验一致性:闲鱼号工程中充斥着大量形如if(isIOS){xxxx}else if(isAndroid){xxx}的代码,主要作用之一按端处理,以规避渲染差异。尽管如此,目前两端仍存在不小差异。

 

4) 扩展能力:前端标准和生态起源于PC,无线设备相对于PC存在不少特性,无线端原生能力相对于纯前端也更加丰富。受容器扩展能力(成本)限制,前端无法(标准)实现部分业务认为理所当然的体验:

 

无法在元素上屏前获取元素布局信息(宽、高、位置)。大多折叠场景需要

高频动画性能不佳。绑定滚动的动画如曝光、导航透明度渐变等场景

基础控件能力缺失。如:输入框无法自动聚焦、控制聚焦时距离键盘空间;增强控件定制困难,如在嵌套滚动容器上添加回到顶部

 

为从根本解决上述问题,我们进行了新容器调研。

 

2. 渲染容器选型

 

在无线前端容器演进过程中,前端侧比较固定,框架(React、Rax等)驱动业务代码生成Virtual DOM以抽象视图结构,特定Driver/容器内置JS Module将Virtual DOM翻译为容器对应的渲染指令;容器侧主要历经Webview容器渲染->客户端渲染衍生->自绘渲染(衍生)三个阶段。其中:

 

1) Webview渲染容器。为解决Native页面双端研发成本、双端渲染不一致、无动态化、页面与客户端耦合的问题,Webview容器开始承载无线业务

 

2) 客户端渲染衍生容器(React Native、Weex 1.0)。Webview解决问题的同时引入了新的问题,渲染性能和能力边界明显逊色,故在2.0时代诞生了客户端渲染衍生容器,对接起了前端、客户端生态,用前端生态写,用客户端能力渲染。

 

 

3) 自绘渲染衍生(基于Flutter/完全自绘)。客户端渲染一定程度了解决Webview渲染性能、能力边界的问题,但将前端标准/生态“翻译”为Android/IOS标准/生态的过程,存在明显的失真,实际渲染与预期不一致,Android与IOS不一致。由此,更彻底的方法是重写渲染能力以进行统一。

 

image.png


自绘渲染方案一方面性能优于Webview,一方面渲染一致性优于Weex,闲鱼号新容器往自绘(衍生)类选型便是自然的方向。在自绘容器中,基于Kraken,闲鱼技术团队自研了KUN容器,整体思路是对接前端和Flutter生态,用前端写,在Flutter渲染。对于上文提到闲鱼号端侧的4个问题,KUN对应的解决原理如下:

 

1) 性能(内存)

 

对于已接入Flutter的客户端,打开KUN页面的增量内存只有KUN引擎本身,没有Flutter负担,KUN引擎较为轻量,内存增量相对于Webview、客户端衍生方案较少

Flutter自身提供了良好的回收能力(sliver),在无限流(瀑布流)场景,内存占用不会随内容加载无限上涨

 

2) 染质量借助Flutter像素级渲染能力,上述overflowvisible、z-index、rich-text等问题均能解决

 

3) 终端体验一致性前端对接的生态从两套变成了一套,以React Native和KUN中Text组件渲染为例:下图中,Text业务组件在 React Native下被转为了JS元素,在UIManager.js中转为RN Element RCTVirtualText。接下来就是客户端部分,RCTVirtualText在C++层通过Bridge将指令传递给Native UIManager,UIManager根据所处不同的系统环境进行组件映射,IOS映射到UITextView,Android映射到TextView。相对之下KUN则是一套映射,呈现Flutter基础组件,便能有更好的终端一致性

 

image.png


4) 扩展能力经过一层KUN Element抽象,自定义Flutter组件也可视为基础组件同等公民开放给KUN前端。如此,通过低成本对接前端、Flutter生态等方式,KUN有了灵活强大的扩展能力,以嵌套滚动容器为例:

 

image.png


以上从理论层面推导了KUN能解决上述问题,我们便开始了闲鱼号升级到KUN容器的实践。现阶段已完成升级,经过了一轮技术灰度。回顾升级过程,也像新生事物一样充斥着标准对齐、性能等诸多细节问题,但最终都悉数解决,整体体验符合预期。


接下篇:https://developer.aliyun.com/article/1225885?groupCode=idlefish

相关文章
|
14天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
13天前
|
运维 监控 Cloud Native
自动化运维的魔法书云原生之旅:从容器化到微服务架构的演变
【8月更文挑战第29天】本文将带你领略自动化运维的魅力,从脚本编写到工具应用,我们将一起探索如何通过技术提升效率和稳定性。你将学会如何让服务器自主完成更新、监控和故障修复,仿佛拥有了一本能够自动翻页的魔法书。
|
4天前
|
运维 Cloud Native 云计算
云原生之旅:从容器化到微服务架构的演进之路
在数字化浪潮中,云原生技术如同星辰大海中的灯塔,为航船指引方向。本文将带你穿梭于云计算的世界,探索从容器化技术到微服务架构的变革旅程。我们将一窥云原生如何助力企业灵活应对快速变化的市场需求,以及在这一过程中,开发者和运维人员是如何成为时代变革的弄潮儿。让我们一同启航,驶向云原生的广阔天地。
|
2天前
|
运维 Cloud Native 云计算
云原生之旅:从容器化到微服务架构
【9月更文挑战第9天】在数字化转型的浪潮中,云原生技术成为推动企业IT革新的关键力量。本文将通过浅显易懂的语言和生动的比喻,带领读者探索云原生的核心概念、关键技术及实践路径,揭示如何在云计算时代构建灵活、高效、可靠的应用系统。你将了解到,正如甘地所言“你必须成为你希望在世界上看到的改变”,在云原生的世界里,每一位开发者和技术决策者都扮演着塑造未来的角色。
|
7天前
|
Kubernetes Cloud Native Docker
云原生技术:容器化与微服务架构的融合之道
【9月更文挑战第4天】在数字化时代的浪潮下,企业追求敏捷、高效、可扩展的IT架构成为共识。云原生技术作为现代软件部署的黄金标准,其核心理念在于推动应用的快速迭代与无缝迁移。本文将深入探讨云原生技术的精髓——容器化与微服务架构如何相互促进,共同构建起适应云计算环境的应用生态系统。我们将通过实际案例,揭示如何在云平台上利用这些技术实现服务的解耦、弹性伸缩及自动化管理,进而提升企业的竞争力。
|
13天前
|
Kubernetes Cloud Native 云计算
云原生之旅:从容器化到微服务架构的演进
【8月更文挑战第30天】在数字化浪潮中,企业纷纷寻求更高效、灵活的IT解决方案。云原生技术以其独特的优势成为转型的关键。本文将带你了解云原生的核心概念,探索容器化技术的奇妙之处,深入微服务架构的设计哲学,并分享如何在云平台上实现这一切。准备好,我们将启航进入云原生的世界,解锁数字化转型的秘密。
|
13天前
|
Cloud Native 持续交付 开发者
云原生之旅:从容器化到微服务架构的演进
【8月更文挑战第30天】在数字化浪潮中,企业正面临着前所未有的技术挑战与机遇。云原生技术以其灵活性、可伸缩性和高效率成为推动现代软件开发的关键力量。本文将引导您了解云原生的核心概念,探索从容器化技术到微服务架构的演变过程,并揭示这些技术如何助力企业实现敏捷开发和高效运维。我们将通过实际代码示例,展示如何在云平台上部署和管理微服务,以及如何利用云原生技术构建弹性、可扩展的应用程序。无论您是开发者、架构师还是技术决策者,这篇文章都将为您提供深入云原生世界的独特视角和实用知识。
|
15天前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
16天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务架构探索移动应用开发:从理念到实践
【8月更文挑战第27天】在数字化浪潮中,云原生技术如一艘航船,带领企业乘风破浪。本文将作为你的指南针,指引你探索云原生的核心概念,从容器化技术的基石Docker和Kubernetes,到微服务架构的设计哲学。文章不仅阐述理论,更通过实际代码示例,让你体验从传统应用向云原生应用转变的奇妙旅程。准备好,我们将启航进入一个更高效、更灵活的软件部署和运维新时代。
|
11天前
|
Kubernetes Cloud Native Docker
探索云原生技术:从容器化到微服务架构
【8月更文挑战第31天】云原生技术正改变着软件开发和运维的方式,它让应用更加灵活、可扩展且易于管理。本文将深入探讨容器化如何助力应用快速部署,以及微服务架构在提升系统弹性和可维护性方面的作用。我们将一起学习Docker和Kubernetes的基础使用,并通过实际代码演示如何构建一个简单的微服务应用。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供宝贵的知识和技能。