App跨平台框架VS原生开发深度评测之2023版App跨平台框架历史悠久,从cordovareactnativef

App跨平台框架历史悠久,从cordova、reactnative、flutter,直到最近的uni-appx。江山代有才人出,每个都试图颠覆原生,但过去却一直未成功。

过去的问题到底在哪里?

我们先捋一捋各种技术路线,分析这些跨平台开发框架和原生应用的差别具体在哪里。

上表中,uni-appx和原生应用是一样的,逻辑层和渲染层都是原生,都是强类型;而其他跨平台框架或者在逻辑层、或者在渲染层与原生不一致。

webview不行已经是业内常识了,启动慢、渲染慢、内存占用高。这块本文不再详述。

但那些非web-view的框架到底哪里不如原生?

reactnative、weex等抛弃webview,改由原生渲染的跨平台方案,2014年就推出了。如今手机硬件也越来越好了,为什么性能还达不到原生?

js+原生渲染的方案主要有2点缺陷:

所以很多开发者即便使用这类方案,首页也还是原生来写。

弱类型在编译期可优化的幅度有限,还是需要一个运行时来跑,无法像强类型那样直接深入底层。

以数字运算为例,js的number运算确实比强类型的int慢,内存开销也更大。

每个语言有自己的内存空间,跨语言通信都有折损,每次通信几十到几百毫秒不等,视手机当时的状态。一旦频繁通信,就会明显卡顿。

逻辑层的js,即要和原生渲染层通信,还要和原生API通信:

举个简单的场景例子,在js里监听滚动,根据滚动变化实时调整界面上某些元素的高度变化。这个问题能难倒一大批跨平台开发框架。

虽然小程序和uni-app都是js,但实际上逻辑层在独立js引擎里,通过原生桥来控制web-view,通信成本很高。

weex提供了bindingx技术,这是一种弱编程,渲染层预先定义了一些操作UI的方式,调用时全部在渲染层运行,不会来回与逻辑层通信。但这种预定义方式的适应面有限,无法做到在js里高性能、自由的操作所有UI。

操作系统和三方SDK的API都是原生的,js调用这些能力也需要跨语言通信。比如js调用原生的Storage或IO,数据较多时遍历的性能非常差。

flutter在2018年发布,第一次统一了逻辑层和渲染层,而且使用了强类型。

它没有使用原生渲染,而是使用由dart驱动的渲染引擎,这样逻辑层的dart代码操作UI时,再也没有延时了!bindingx、wxs这种补丁方案再也不需要了。

并且dart作为强类型,编译优化很好做,启动速度和运行速度都胜过js。

100个slider同时滑动,非常考验逻辑和UI的通信。如果在webview内部,html和js写100个这样的slider,在新的手机上表现也还ok。但在小程序和reactnative这种逻辑和UI分离的模式下,100个slider是灾难。

flutter看起来很完美。但为什么也没有成为主流呢?很多大厂兴奋的引入后为何又不再扩大使用范围呢?

别忘了上面1.2.2提到的原生API通信。flutter虽然在逻辑层和渲染层都是dart,但要调用原生API时,还是要通信。

操作系统和三方SDK的API是原生的,让dart调用需要做一层封装,又落到了跨语言通信的坑里。

项目里面有源码,大家可自行编译;根目录有打包好的apk,也可以直接安装体验。

这个项目首先在kotlin中构建了包含不同数据量的class,传递到dart然后渲染在界面上,并且再写回到原生层。

有0.1k和1k两种数据量(点击界面上的1k数字可切换),有读和读并写2个按钮,各自循环1000次。

以下截图的测试环境是华为mate305G,麒麟990。手机上所有进程杀掉。如下图:

为什么会这样?因为dart和kotlin不是一种编程语言,不能直接调用kotlin的class,只能先序列化成字符串,把字符串数据从原生传到dart,然后在dart层再重新构造。

当然也可以在原生层为dart封装API时提供wx.batchGetStorageSync这类批处理API,把数据一次读好再给dart,但这种又会遇到灵活性问题。

而在uni-appx中,这种跨语言通信是不存在的,不需要序列化,因为uni-appx使用的编程语言uts,在android上就编译为了kotlin,它可以直接调用kotlin的class而无需通信和封装。示例如下,具体uni-appx的原理后续章节会专题介绍。

很多人都知道iPhone上跨平台框架的应用,表现比android好。但大多数人只知道是因为iPhone的硬件好。

其实还有一个重要原因,iOS的jscore是c写的,OS的API及渲染层也都是ObjectC,js调用原生时,某些类型可以做共享内存的优化。但复杂对象也还是无法直接丢一个指针过去共享使用内存。

而android,不管java还是kotlin,他们和v8、dart通信仍然需要跨语言通信。

flutter的自渲染引擎,在技术上是不错的。但在生态兼容上有问题。

很多三方软件和SDK是原生的,原生渲染和flutter自渲染并存时,问题很多。

flutter开发者都知道的一个常见坑是输入法,因为输入法是典型的原生UI,它和flutter自绘UI并存时各种兼容问题,输入框被遮挡、窗体resize适应,输入法有很多种,很难适配。

这里没有提供开源示例,因为flutter官方是承认这个问题的,它提供了2种方式:混合集成模式和虚拟显示模式模式。

视频中手机切换暗黑主题后,这个UI却还是白的,而且flutter的父容器原生view已经变黑了,它又在黑底上绘制了一个白色界面,体验非常差。

这个小程序首页界面很简单,没有输入框,规避了混合渲染,点击搜索图标后又跳转到了黑色的原生渲染的界面里。

注:如何识别一个界面是不是用flutter开发的?在手机设置的开发者选项里,有一个GPU呈现模式分析,flutter的UI不触发这个分析。且无法审查布局边界。

flutter的混合渲染的问题,在所有使用原生渲染的跨平台开发框架中都不存在,比如reactnative、weex、uni-appx。

总结下flutter:逻辑层和UI层交互没有通信折损,但逻辑层dart和原生api有通信成本,自绘UI和原生ui的混合渲染问题很多。

flutter除了上述提到的原生通信和混合渲染,还有3个问题:dart生态、热更新、以及比较难用的嵌套写法。

其实这是让人困惑的行为。因为这又回到了reactnative和weex的老路了,只是把原生渲染换成了flutter渲染。

flutter最大的优势是dart操作UI不需要通信,以及强类型,而改成js,操作UI再次需要通信,又需要js运行时引擎。

上述视频中,注意看手指按下的那1个slider,和其他99个通过数据通讯指挥跟随一起行动的slider,无法同步,并且界面掉帧。

不过自渲染由于无法通过Android的开发者工具查看GPU呈现模式,所以无法从条状图直观反映出掉帧。

注意ArkUI-x不支持Android8.0以下的手机,不要找太老的手机测试。

很多人以为自渲染是王道,但其实自渲染是坑。因为flutter的UI还会带来混合渲染问题。

也就是说,js+flutter渲染,和js+原生渲染,这2个方案相比,都是js弱类型、都有逻辑层和渲染层的通信问题、都有原生API通信问题,而js+flutter还多了一个混合渲染问题。

可能有的同学会说,原生渲染很难在iOS、Android双端一致,自渲染没有这个问题。

但其实完全可以双端一致,如果你使用某个原生渲染框架遇到不一致问题,那只是这个框架厂商做的不好而已。

是的,很遗憾reactnative在跨端组件方面投入不足,官方连slider组件都没有,导致本次评测中未提供reactnative下slider-100的示例和视频。

2022年,uts语言发布。2023年,uni-appx发布。

uts语言是基于typescript修改而来的强类型语言,编译到不同平台时有不同的输出:

而uni-appx,是基于uts语言重新开发了一遍uni-app的组件、API以及vue框架。

如下这段示例,前端的同学都很熟悉,但它在编译为AndroidApp时,变成了一个纯的kotlinapp,里面没有js引擎、没有flutter、没有webview,从逻辑层到UI层都是原生的。

但是开发者也不要误解之前的uni-app代码可以无缝迁移。

了解了uni-appx的基本原理,我们来看下uni-appx下的100个slider效果怎么样。

如下视频,打开了GPU呈现模式,可以看到没有一条竖线突破那条红色的掉帧安全横线,也就是没有一帧掉帧。

uni-appx在app端,不管逻辑层、渲染层,都是kotlin,没有通信问题、没有混合渲染问题。不是达到了原生的性能,而是它本身就是原生应用,它和原生应用的性能没差别。

这也是其他跨平台开发框架做不到的。

DCloud做了很多年跨平台开发,uni-app在web和小程序平台取得了很大的成功,不管规模大小的开发者都在使用;但在app平台,大开发者只使用uni小程序sdk,中小开发者的app会整体使用。

究其原因,uni-app在web和小程序上,没有性能问题,直接编译为了js或wxml,uni-app只是换了一种跨平台的写法,不存在用uni-app开发比原生js或原生wxml性能差的说法。

但过去基于小程序架构的app端,性能确实不及原生开发。

那么App平台,为什么不能像web和小程序那样,直接编译为App平台的原生语言呢?

uni-appx,目标不是改进跨平台框架的性能,而是给原生应用提供一个跨平台的写法。

这个思路的转换使得uni-appx超越了其他跨平台开发框架。

在web端编译为js,在小程序端编译为wxml等,在app端编译为kotlin。每个平台都只是帮开发者换种一致的写法而已,运行的代码都是该平台原生的代码。

然而在2年前,这条路线有2个巨大的风险:

没有人确定这个产品可以做出来,DCloud内部争议也很多。

还好,经历了无数的困难和挑战,这个产品终于面世了。

换个写法写原生应用,还带来另一个好处。

同样业务功能的app,使用vue的写法,比手写纯原生快多了。也就是uni-appx对开发效率的提升不只是因为跨平台,单平台它的开发效率也更高。

其实google自己也知道原生开发写法太复杂,关于换种更高效的写法来写原生应用,他们的做法是推出了composeUI。

不过遗憾的是这个方案引入了性能问题。我们专门测试使用composeUI做100个slider滑动的例子,流畅度也掉帧。

既然已经把不同开发框架的slider-100应用打包出来了,我们顺便也比较了不同框架下的包体积大小、内存占用:

包体积数据说明:

内存占用数据说明:

跨语言通信、弱类型、混合渲染、包体积、内存占用,这些都是过去跨平台框架不如原生的地方。

这些问题在uni-appx都不存在,它只是换了一种写法的原生应用。

另外,原生Android中一个界面不能有太多元素,否则性能会拉胯。flutter的自渲染和composeui解决了这个问题。而原生中解决这个问题需要引入自绘机制来降低元素数量,这个在uni-appx里对应的是draw自绘API。

uni-appx这个技术路线是产业真正需要的东西,随着产品的迭代完善,它能真正帮助开发者即提升开发效率又不牺牲性能。

让跨平台开发不如原生,成为历史。

欢迎体验uni-appx的示例应用,感受它的启动速度,渲染流畅度。

这个示例里有几个例子非常考验通信性能,除了也内置了slider-100外,另一个是“模版-scroll-view自定义滚动吸顶”,在滚动时实时修改元素top值始终为一个固定值,一点都不抖动。

我们不游说您使用任何开发技术,但您应该知道它们的原理和差别。

欢迎指正和讨论。

DCloud是一个纯粹的工程师团队,公司90%的职员都是写代码的工程师,无需见客户、写方案,大部分都有原始股权,欢迎有好奇心、追求卓越的极客加盟。

THE END
1.手机App开发语言选择指南:安卓软件开发必备编程语言推荐即便汇聚了汇编领域的专家,面对重重挑战也难以突破。手机硬件与软件的局限,让汇编语言在手机软件开发中如同用错了钥匙去开锁。在这种集成度高、结构复杂的手机软件环境中,汇编技术几乎派不上用场。 java在手机平台的优势 Java在手机应用开发领域具有显著优势。众多手机设备都配备了Java接口。以那些热销的普通手机为例,Jahttps://www.7claw.com/2800301.html
2.开发APP用什么样的编程语言?开发APP用什么样的编程语言? 运行在不同平台上的APP软件所需要的应用开发语言是不一样的,例如AndroidAPP开发语言是Java,IOSAPP的开发语言是Objective-C,WindowsPhoneAPP的编程语言则主要是C++等。 1、Java语言:这是在Android平台开发APP应用程序做IAP、广告以及特使系统功能时所需要到的开发语言。一般开发安卓APP应用https://www.zbj.com/zx/wz/5186013
3.app编写需要哪种语言原生安卓app开发是什么语言编写移动应用(App)通常需要根据目标平台选择合适的编程语言。主要分为原生开发语言和跨平台框架语言两类。以下是开发不同类型App常用的语言和工具: 1.原生开发语言 iOS应用(适用于iPhone和iPad) Swift:Apple推荐的现代编程语言,专门用于iOS和macOS开发,语法简洁、运行高效。 https://blog.csdn.net/fanying_98/article/details/143337485
4.揭秘:移动App开发的四种主流语言腾讯云开发者社区在当今科技高度发展的时代,移动应用(App)已经成为了人们日常生活中不可或缺的一部分。从社交、购物、出行到娱乐,几乎所有方面都可以通过手机应用来实现。那么,这些琳琅满目的应用究竟是用什么语言开发的呢?本文将为您揭示一些主流的App开发语言。 首先,Java是移动应用开发中最为常见的一种编程语言。Java语言的跨平台特https://cloud.tencent.com/developer/news/1192092
5.Uniapp:基于Vue.js框架的跨平台应用开发神器1. 特点 1. 跨平台开发 可以实现一次编码,同时生成多个应用,包括iOS、H5、小程序等,开发者只需要使用Vue.js框架进行开发,无需考虑不同平台的差异,大大降低了应用开发的难度和复杂度。 2.统一的开发语言和工具 开发语言为Vue.js,是一款基于组件开发、易学易用的前端框架,提供了完善的开发工具,包括Uni-app Cli、http://www.bjhwtx.com/h-nd-154634.html
6.app前端开发用什么语言?App前端开发主要使用的语言有Java、Objective-C、Swift和Kotlin。这些语言分别用于Android和iOS平台的应用开发。下面将详细介绍这些语言的特点和应用场景。 1. Java Java是一种面向对象的编程语言,由Oracle公司开发。它是Android平台的主要开发语言。Java具有跨平台的特性,可以在多种操作系统上运行。它拥有丰富的类库和工具https://www.yimenapp.com/kb-yimen/23083/
7.跨平台app开发框架常用平台推荐技术博客跨平台app开发框架是一种可以让开发wap打包app者使用一种编程语言或技术来创建可以在多种操作系统上运行的移动应用程序的工具。跨平台app开发框架的优点是可以节省开发时间和成本,提高代码的复用性和可维护性,以及实现统一的用户界面和体验。跨平台app开发框架的缺点是可能会牺牲一些性能和效率,以及无法充分利用原生平台的https://www.yimenapp.net/knowledge/blog-1442.html
8.c#xamarin如何打造跨平台App问答要打造跨平台的App,可以使用C#语言结合Xamarin开发工具来实现。Xamarin是一个跨平台移动应用开发工具,它允许开发人员使用C#语言和.NET框架来开发iOS、Android和Windows Phone应用。 下面是一些步骤来帮助您使用C#和Xamarin开发跨平台App: 安装Xamarin开发工具:首先,您需要下载和安装Xamarin开发工具。您可以在官方网站上找到https://www.yisu.com/ask/47412424.html
9.Uniapp是什么?Uniapp跨平台开发框架的优势和应用嘲深度解读由于OpenCart 跨平台 APP 是基于uniapp开发框架,开发的移动端电商解决方案。 它不但继承了OpenCart优秀的多语言、轻量好用、搭建迅速等优秀特点。让跨境卖家,能快速的在多平台上线新的产品功能,适应不断变化的市场需求 重点应用场景 过去,各大电商品牌由于要获取更多客户,需要在多个平台上开发APP应用、小程序、H5。这https://www.guangdawangluo.com/articles/325
10.跨平台APP开发工具都有哪些?总之,跨平台APP开发工具在移动应用开发领域发挥着越来越重要的作用。它们提供了一种高效、便捷的方式,让开发者可以使用熟悉的语言和技术栈来构建同时运行在多个平台的应用。每种跨平台开发工具都有其独特的特点和优势,开发者可以根据项目需求和团队技术栈来选择最适合的工具。无论是React Native、Flutter、Xamarin,还是Vuhttp://www.apppark.cn/t-46705.html
11.跨平台app开发框架lua常用的跨平台开发框架如果每个厂商的小程序都要编写一套代码,那需要的开发周期和成本将是巨大的。然而,小程序的厂商虽然多,但所幸使用的技术都大同小异,所以一些针对小程序的跨平台编程工具应运而生,它们的目的只有一个,就是一套代码,多平台运行。比较具有代表性的小程序跨平台开发框架如:DCloud的uni-app、京东的taro等。针对PC桌面https://blog.51cto.com/u_14125/10900010
12.跨平台开发简介什么是跨平台开发跨平台开发是指“一套代码,多个平台运行”这种开发模式,主要应用于移动APP开发,即“开发一套代码,可以打包成Android APP、iOS APP;同时可以部署到服务器上,允许移动浏览器访问、允许微信浏览器访问”。在详细介绍跨平台开发之前,先介绍下当前常用的几种APP开发模式 http://rayproject.applinzi.com/doc.web.crossPlatformGroup/html/frameworkDoc/doc_frameworkDoc_info.html
13.原生app开发前端用什么技术选择原生App开发的前端技术 当开发原生App时,前端技术的选择是*关重要的。原生App开发通常要求高性能、良好的用户体验和跨平台的兼容性。在选择前端技术时,我们需要考虑以下几个因素: 基于Java的Android开发 对于Android平台的原生App开发,*常用的技术是基于Java语言的Android开发。Java是一种广泛应用于软件开发的编程语言http://keloop.cn/information/art98211.html
14.lua脚本开发app(Lua脚本开发APP大全)技术大全lua脚本是一种轻量级的脚本语言,广泛用于游戏开发领域。随着智能手机的普及,手机游戏市场蓬勃发展,lua脚本也越来越受到开发者的青睐。 2、lua脚本简介 lua脚本具有简单易学、高效灵活以及跨平台等特点,适用于移动端app开发。其语法简洁明了,代码可读性强,非常适合初学者入门。 https://www.szappgs.cn/newsinfo.php?id=2770
15.常见的移动端App开发语言和框架有哪些?举例说明其特点和适用嘲。火山引擎是字节跳动旗下的云服务平台,将字节跳动快速发展过程中积累的增长方法、技术能力和应用工具开放给外部企业,提供云基础、视频与内容分发、数智平台VeDI、人工智能、开发与运维等服务,帮助企业在数字化升级中实现持续增长。本页核心内容:常见的移动端App开发语言https://www.volcengine.com/theme/3908430-C-7-1
16.AngularJS开发你的AppCordova开发语言与工具本文是一篇关于我本人在使用 Cordova + Ionic 以及 AngularJS 开发移动App的过程中的经验的总结,它不是一篇基础入门教程,而是和大家探讨一下关于如何更好的使用这些技术开发一个更好的App,文章会每天抽一点时间完成,如果您有什么问题或者想与我交流的经验,欢迎随时在本文下方评论或者邮件给我:54778899 [at] qq.comhttps://www.open-open.com/lib/view/open1435909407778.html
17.FlutterApp开发:从入门到实战Flutter是谷歌公司推出的跨平台开源UI框架,同时支持Android App与iOS App开发,使用这一框架可以大大提高开发效率。本书共14章,系统讲解Flutter背景、Dart语言的语法基础、Flutter组件、状态管理、事件处理、路由管理、动画、网络编程、数据存储、相机、主题与国际化、混合开发等核心内容,并通过多个案例以及“天气预报”App和https://wap.cnki.net/touch/web/XinKeBook/Article/DZ2208120026.html
18.H5手机App开发入门:技术篇上面的混合技术栈使用 HTML 语言编写页面,再用 WebView 控件加载页面,所以只写一次页面,就能支持多个平台。跨平台技术栈也能做到多平台支持,但是原理完全不同。 跨平台技术栈的框架,都是使用自己的语法编写页面,不使用 Web 技术,编译的时候再将其转为原生控件,或者使用自己的底层控件,生成原生 App。这样就完全解决http://www.ruanyifeng.com/blog/2019/12/mobile-app-technology-stack.html
19.flutter开发的app有哪些,flutter开发的app案例新闻资讯一、Flutter开发的App简介 1. 什么是Flutter? Flutter是一款由Google推出的开源移动应用UI框架,可以帮助开发者轻松地构建漂亮、高性能、跨平台的移动应用。Flutter采用Dart语言,具有丰富的UI组件和强大的渲染引擎,能够实现快速、流畅的应用界面渲染,同时支持快速的热重载,让开发者能够快速地进行UI调试和界面优化。 https://www.ahbfapp.com/news/2107.html
20.HTML5移动webAPP和HybridAPP开发的优缺点分析今天25学堂阅读了相关的HTML5移动webAPP开发的一些资料,刚好最近的一个APP项目是采用原生Native App和HTMl5一起混用的。也就是我们所说的Hybrid开发。 Hybrid开发方法结合了Native开发和Web技术。借助这种方法,开发者就能使用跨平台Web技术,开发应用程序的大部分代码,目前Hybrid开发已经成为一种潮流趋势!到今天为止是非常https://www.25xt.com/html5css3/7208.html
21.快速开发跨平台App的神器——Dart+Flutter最近开始关注前端如何开发跨平台的App。有两个名词非常高频的暴露在视野中,稍作调研,很快就被惊艳到了,那就是Dart语言和Flutter移动UI框架。这两位新星来自于同一个爸爸,那就是Google。 下面简单的介绍一下这两位新星: 1、Dart Dart亮相于2011年10月10至12日在丹麦奥尔胡斯举行的GOTO大会上。可以用于web、服务器、https://www.jianshu.com/p/9da20e7af94f
22.良心开发者微软,竟然有这么多免费好用跨平台的App极客公园在老对手苹果的 App Store 上,微软共为其开发了 61 个 App,而隔壁的 Google Play 应用商店,这个数字竟然达到了 76 个之多,其中不少 App 甚至是全平台通用,从 Windows、Android 到 iOS 甚至 macOS,微软带来了很多免费且相当实用的 App。今天,极客之选(公众号 GeekChoice)就来为你盘点一些好用、免费、颜值高https://www.geekpark.net/news/243401
23.手机应用开发的原生app,WEBAPP,混合app的认识诉说。总体特性更接近Native App但是和Web App区别较大。只是因为同时使用了网页语言编码,所以开发成本和难度比Native App要小很多。因此说,Hybrid App兼具了Native App的所有优势,也兼具了Web App使用HTML5跨平台开发低成本的优势 --- 2012移动开发调查显示Hybrid App开发占据一半以上 最近原生应用、Web应用、混合应用的名字https://www.cnblogs.com/996158041chenlu/p/5740142.html
24.Flutter基础与实战——从入门到APP跨平台开发全本书评同时对React native 、Uni-app、Flutter跨平台发有系统和丰富的发与架构实战经验。 曾在CSDN技术平台撰有“Flutter发的滴积累”系列专栏,通过100多篇技术文章帮助广大发者解决了在Flutter发中遇到的疑难问题。 目录展开 前折页 书名页 版权 前言 UI构建基础篇 第1章 Flutter开发起步 1.1 Dart语言概述 1.1.1 Dart与http://e.dangdang.com/products/1901288896.html