客户端跨端动态化方案现状

news2024/11/28 19:01:59

前言

客户端现状

  工作中,经常遇到产品想尽快上线看数,CR业务也总是倒排期状态,native 的发版窗口是他们经常要关注的,往往因为窗口时间问题,导致某个需求业务迭代周期长,客户端开发在业务动态化方面多有被动。由于线上升级不存在强制升级,老版本占比依然在 5%到10%之间,用户无法及时体验到最新的功能更新或Bug fix。目前端上的动态化诉求越来越多,市面上的方案也呈‘百家争鸣‘的局面。

动态化的必要性

为什么需要动态化技术呢? 客户端定期发版的方式存在一些问题,比如:

  1. 审核周期长, 且可能审核不通过。 周期长导致发版本不够灵活, 紧急的业务需求不能及时上线。
  2. 线上出现急需修复的bug时,需要较长修复周期,影响用户体验。
  3. 安装包过大, 动辄几十兆几百兆的应用升级可能会让用户比较抗拒。
  4. 即使上线了,也无法达到全部用户升级, 服务端存在兼容多版本App的问题。

面对这些问题,如果能实现app增量、无感知更新,实现功能同步。对公司还是用户是非常重要的需求,能实现app动态化更新就显得非常重要,能很好的解决以上问题:

  1. 随时实现功能升级,不存在应用市场长时间审核和拒绝上线问题,达到业务需求快速上线的目的。
  2. 线上bug可以实时修复,提高用户体验。
  3. 可以减小发版功能包体积,只需要替换新增功能即可。
  4. 功能保持一致,类似网页一样,发版后用户同步更新,不存在旧版本兼容问题。

  这里简单说下目前市面上已有跨端动态化方案,在公司中也使用了Flutter,React 和千人千面,这里也算是为下一篇React学习RoadMap 做一个简单的开场和前情提要。

image.png

image.png

图片引用张绍文极客课程

跨端分类

Hybrid

  移动端初期比较流行的方式,通过WebView为载体,客户端中嵌套使用 就具备跨平台、动态更新、扩展性强等优点。但是由于Web 一个页面由HTML + CSS + JavaScript组成,在客户端加载中,往往需要渲染引擎预热,资源缓存等手段进行优化,来提升Hybrid 在客户端使用体验不佳、秒开不达标等情况,不过因为自带动态化特性,互联网初期还是很多页面都是这样使用的,也是后续小程序等跨端类型的基础。

小程序

  这里我们以微信小程序为主,其实可以小程序看做是Hybrid的一种,微信小程序视图渲染依然使用H5 和Webview进行渲染,逻辑层吸收了虚拟运行环境的优点,使用JavascriptCore进行桥接,两者都是独立的模块,其实就是两个线程,并不具备数据直接共享的通道。视图层和逻辑层的数据传输,要由 Native 的 JSBrigde 做中转。但小程序好在对这一模式进行了很彻底的优化,包括但不限于:分包技术,Diff视图刷新,数据预拉取,分屏渲染,非关键渲染后移,长列表优化等手段。

image.png

虚拟运行环境

  目前市面上比较知名的方案有阿里的Weex、Google的Flutter和FaceBook的React Native。React Native底层利用JavaScriptCore/V8,通过系统原生的渲染流程进行渲染,Weex早期思路也是如此,但是他们都存在一个问题就是渲染强依赖 Android/iOS 的系统 UI,这样虽然可以降低实现成本,系统 UI 的性能和稳定性也是最好的,但是不同的系统 UI 的实现原理也有差异,还有双端版本碎片化问题,这也是导致此类方案坑越来越多的原因,维护成本太高。 Weex2已经优化了渲染管道部分,使用Flutter 引擎底层使用skia异步渲染。

image.png

  相较于以上两种方案,Flutter可能也不太算虚拟运行环境这一分类下的,但是这里还是放在了一起。Flutter 底层也是内置的Runtime 解析器,一套Dart代码可以编译生成Android 和 iOS两套原生代码,在渲染上基于skia 通过GPU做光栅化,在发布正式版本时使用AOT编译,不再需要通过解析器解释执行或者JIT。并且支持Tree Shaking无用代码删除,减少发布包的体积等方面做出优化,目前Flutter是跨端方案中使用者最多,并且比较被看好的,但是Flutter 抛弃了Web的兼容性,虽然保持了跨端的性能,但是在动态化方面没有一点优势。

  各个公司对于Flutter动态化也都有自己的方案和想法,这里主要说一下美团的方案思路,58同城的动态化方案已经开源,感兴趣的可以移步 Fair Github,美团的方案大概思路是:布局,逻辑依然都是使用Dart, 通过静态生产 DSL+Runtime 解释运行的思路,解决布局和逻辑的动态化,虽说实现了动态化,不过因为添加了一层Runtime解析层,个人认为是为了完成动态化,牺牲了性能,怎么说呢有得有失。

image.png

动态化方案

  市面上包括开源的和不开源的其实每家大厂几乎都有自己的动态化方案,这里我主要归类下Native动态化和布局动态化

Native 动态化方案

  Native动态化方案主要分为热修复、插件化布局动态化两种。

  热修复、插件化动态化:插件化是将一个apk根据业务功能拆分成不同的子apk,插件化更关注动态加载、热更新 热修复。 热修复更关注于修复线上bug。因为热修复和插件化,国内 Android 生态也带来一些不太好的影响,比如增加用户 ROM 体积占用、App 启动变慢 15%、OTA 首次卡顿等。Android Q 之后,动态加载的 Dex 都只使用解释模式执行,会加剧对启动性能的影响笨重的插件化框架不仅影响应用的启动速度,而且多团队协作的时候并没有想象得那么和谐,接口混乱、仓库不好管理、编译速度慢这些问题都会存在,其实现在很多大厂都是逐渐去插件化,阿里内部大都使用Weex 在非核心页面落地。

关于插件化和热修复原理这里不展开说了 网上也有很多不错的文章
https://juejin.cn/post/6973888932572315678 # 浅谈Android插件化
https://www.jianshu.com/p/08748b128ce3 # Android热更新技术总结

  布局动态化:在淘宝、美团和饿了么首页存在很多入口的场景,强运营。首页考虑到性能问题和流量的聚集地,大多使用 Native 实现,“提增长、提留存、提转化”都要求我们有强大的运营能力,淘宝天猫也有类似的千人千面一说,动态化布局在这种场景下应运而生。以Virtualview为例,使用xml来描述布局,压缩成二进制格式,通过资源管理平台进行下发,客户端获取后解析并渲染为原生View 并商品,其他方案与Virtualview大同小异,后续有人总结这方面有三个能力:ui容器化,能力接口化,数据通道化。虽然布局动态化可以实现ui的动态新增和修改,并且有着良好的体验和性能,但是关于逻辑动态化部分能力比较差。

思考

  本篇文章站在自己的角度,对市面上存在的跨端和动态化现状做了不算全面的总结,对于早期的Hybrid方案和后续Native动态化方案,到现在大厂更流行的虚拟环境运行方案,阿里的Weex思路也是如此,大多App首页使用动态化ui进行渲染,非核心页面使用Weex或者Flutter进行改造,Weex在性能和适配方面和Native还存在一定的差距,Flutter虽然性能和双端适配更好,但是动态化方面需要自己单独建设。

  从目前来看每个方案都有一定的优点和缺点,没有十全十美的方案,只有是否适合自己的方案。

参考文档

小程序原理和优化

Tinker:技术的初心与坚持 张绍文

移动开发的罗曼蒂克消亡史 徐川

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

毫米波雷达系列 | 传统CFAR检测(有序统计类)

毫米波雷达系列 | 传统CFAR检测(有序统计类) 1.OS-CFAR 有序统计类CFAR检测器(OS-CFAR)与均值类CFAR检测器处理过程不同,在对背景杂波功率进行估计时,需要将所有参考单元进行升序排列得到一个新的有序数列,在新序列中选取第k个值…

【Python | 深度学习】safetensors 包的介绍和使用案例(含源代码)

safetensors 是一种用于安全存储张量(与 pickle 相反)的新型简单格式,并且仍然很快(零拷贝)。 safetensors 真的很快。 一、安装 1.1 pip 安装 pip install safetensors1.2 conda 安装 conda install -c huggingf…

【HTML5系列】第二章 · HTML5新增功能

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

我写了一套uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) 实战课程,免费分享给CSDN的朋友们

大家好,我是锋哥,最近写了一套前后端分离的uniapp微信小程序投票系统,逼格略高,专门为Java初学者提升技术层次和方便就业而精心打造。希望你们喜欢!(文末领取) 一,Java就业实战课程简…

STC单片机使用示例分别介绍 CCP/PCA在4种工作模式下的使用

STC单片机使用示例分别介绍 CCP/PCA在4种工作模式下的使用 📍针对利用PCA对上升或下降沿捕获功能,可以看这篇有关脉宽测量《STC15单片机利用PCA功能测量脉宽应用示例》 🍁应用场景: 🎉STC15系列部分单片机集成了3路可编程计数器阵列(CCP/PCA)模块(STC15W4K32S4系列单…

DOM事件模型与事件委托

事件 JS与HTML之间的交互通过事件实现。 事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。 可以使用监听器来预定事件,以便事件发生时执行相应的代码。这种在传统软件工程中被称为观察者模式 事件流 事件流描述的是从页面中接受事件的顺序 事件冒泡 微软…

【李老师云计算】实验三:在Docker中部署Hadoop集群

索引 0. 前言1. Docker1.1 安装Docker1.2 启动Docker 2. Dokcer部署Hadoop2.1 设计Hadoop集群结构2.2 拉取Hadoop镜像2.3 ★解决拉取镜像时 - no space left on device2.4 创建Docker容器2.5 ★解决docker ps没有内容2.6 通过终端进入容器2.7 关闭防火墙2.8 配置SSH2.8.1 设置主…

springboot+vue留守儿童爱心网站(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的留守儿童爱心网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

这个代码生成器火了…SmartSoftHelp

火了,火了…SmartSoftHelp 开源C#代码生成器,专注.NET,Sqlserver,最简单,最干净,支持自编码的开源工具,SmartSoftHelp 开发辅助优化工具! 下载地址:https://pan.baidu.…

PC端网页特效

元素偏移量offset系列:(使用其相关属性可以动态的得到该元素的位置(偏移)、大小 (1)获得元素距离带有定位父元素的位置 …

sqlserver 中的表值函数和标量函数

目录 一、表值函数 1.内联表值函数 1.创建函数 2.调用函数 3.返回结果 2.多语句的表值函数 2.调用函数 3.返回结果 3.内联表值函数和多语句的表值函数的区别 1.语法上 2.结构上 二、标量函数 1.创建函数 2.调用函数 2.返回结果 总结 一、表值函数 表值函数是返回一个Table类型…

2023年必备!这些值得信赖的问卷调查工具

随着我们进入2023年,可靠的调查问卷工具对研究和数据收集的重要性比以往任何时候都更加明显。随着在线调查和远程数据收集的兴起,越来越多的用户和企业都开始注重数据安全,所以使用值得信赖和有效的工具至关重要。在这篇文章中,小…

Spring的第十六阶段:数据库的事务隔离级别

数据库事务隔离级别 1、为什么会出现数据库的隔离级别呢? 数据库隔离级别是为了解决数据库并发访问过程中产生的各种数据安全问题. 四种事务隔离级别: 一:读未提交 read uncommitted 二:读已提交 read committed ( oracle默认 ) 三&…

教大家如何使用VS Code远程开发ubuntu和服务器项目

目录 前提条件 一、ubuntu中安装openssh服务器 二、配置本地VSCode 三、本地查看、编辑ubuntu中的代码 前提条件 1.本地已经安装了Visual Studio Code IDE软件, 2.ubuntu虚拟机安装完成 一、ubuntu中安装openssh服务器 1.1使用如下命名进行安装: …

测试老鸟总结,性能测试常见测试缺陷,卷出高级突破测试圈...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试&#xf…

【机器学习】LightGBM 解读 (集成学习_Boosting_GBM)

【机器学习】LightGBM 解读 (集成学习_Boosting_GBM) 文章目录 【机器学习】LightGBM 解读 (集成学习_Boosting_GBM)1. 介绍2. 数据预处理2.1 基于梯度的单边采样(GOSS)2.2 互斥特征捆绑(EFB&am…

免费安装注册 IDM 使用流程,简单方便易操作 IDM 在B站没有显示下载按钮

文章目录 下载 IDM运行脚本winr快捷键调出运行窗口输入powershell并运行上述脚本开始注册注册成功IDM 在B站没有显示下载按钮 下载 IDM 官网链接:Internet Download Manager: The fastest download accelerator 运行脚本 # Enable TLSv1.2 for compatibility wi…

多目标优化算法求解无人机三维路径规划

一、无人机模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节,无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上,计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找起飞点和目…

Python学习19:输出斐波拉契数列的前n项

描述: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列&a…

Unity2019配置JDK、SDK、NDK、Gradle

用Unity开发了一个使用AR Foundation的小项目,导出项目需要在安卓手机上进行测试。在导出时遇到了配置环境的问题,查找了很多方法终于解决。记录一下。 我所使用的unity版本是2019.2.12f。在完成项目需要导出时,在首选项设置中需要设置JDK、…