热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android跨平台技术对比

从HybridApp到RN,再到Flutter,跨平台技术的发展十分火热,在平时的业务开发中,跨平台也往往由于其动态性&#x

从HybridApp到RN,再到Flutter,跨平台技术的发展十分火热,在平时的业务开发中,跨平台也往往由于其动态性,开发速度,节省人力而占据越来越大的比重。以下简单对比一下跨平台技术


为什么纯原生开发不占优势了

原生开发的优势


  1. 速度快,性能好。在进行一些复杂的动画绘制时,体验更好。
  2. 一些硬件的访问,像摄像头、GPS都可以直接访问,省去了通过跨平台框架协议兼容的中间件。

它的劣势


  1. 仅支持特定平台,开发成本高(Android、iOS)
  2. 动态化差,改bug基本上只能发版。

但是目前面临的问题是


  1. 动态化需求变多了,发版更加频繁,但是发版审核都需要时间,而且过于频繁的版本更新也会影响用户使用,有点跟不上互联网的高度发展
  2. 需要Android和iOS两端开发,两个技术团队,人力成本高

所以这些跨平台技术越来越流行,大幅度压缩了原生开发的比重。常见的跨平台技术主要有三种


  1. H5+原生:Hybrid
  2. JS+原生渲染:RN
  3. 自绘UI+原生:Flutter

针对原生开发的劣势,其实也有一些解决方案


  1.  布局动态化,服务器下发布局,客户端解析加载
  2. 热修复,如腾讯的thinker等,但是对Android新版本的支持好像不是很好

Hybrid

简单理解为网页,webview执行h5代码,本质上是个浏览器内核,js运行在权限受限的沙箱中,想访问原生的一些功能,如蓝牙,只能通过调起原生的代码实现。基本上主要是JS通过JsBridge调用原生的一些功能。


他的优势在于web技术栈已经很成熟了,资源都很丰富。

劣势也很明显,慢,性能差。复杂的业务界面及动画,卡。

这里也有一些解决方案


  1.  提前将页面的公共资源html,css,js模板化,动态下发到app,在shouldInterceptRequest拦截webview的资源加载,判断本地模板的资源就直接加载本地的,没有则再去加载线上资源
  2. 数据请求由app代理,让数据加载和模板代理并行执行
  3. webivew复用,构建一个webview池,每次进入h5页,从webview池中取出webview
  4. 图片优化,通过shouldInterceptRequest拦截图片资源并下载

RN

RN实际上可以理解为js+映射原生空间绘制。

以下简单理解一下DOM树,文档对象模型是表示和处理一个html和xml文档的标准接口,DOM树就是文档树,与用户界面的控件树相对应,也可以与Android的xml布局文件的控件树相对应

React框架运用的是典型的响应式编程,状态改变则UI随之改变,它是响应用户状态改变的事件而构建用户界面。它的好处是


  1. 开发者只需要关心状态(数据),状态改变了,UI自然会改变
  2. 当接收到用户状态改变的通知时,根据当前渲染树,通过diff算法,算出树中变化的部分,然后只更新改变的部分,避免整个树重构,提高性能

此处,React框架也不会立即就刷新界面,而是抽象出一个虚拟DOM层,改动先同步到虚拟DOM层上,然后再批量同步到真实DOM上,因为浏览器的每次DOM操作都可能引起浏览器的重绘或回流。

RN中的虚拟DOM树最终会通过JavascriptCore映射为原生控件树。JSCore是一个JS解释器,作用跟JSBridge差不多


  1. 为JS提供运行环境
  2. 是JS与原生通信的桥梁

RN中虚拟DOM树映射为原生控件有两步


  1. 布局消息传递:将虚拟DOM布局信息传递给原生
  2. 原生根据布局信息通过对应的原生控件渲染控件树

它的优势在于


  1. web技术栈,社区大,上手快,成本低
  2. 原生渲染,比H5好很多
  3. 动态化好,支持热更新

它的劣势在于


  1. 渲染时需要和JS通信,某些场景下可能造成卡顿,如拖动
  2. JS为脚本语言,执行时需要JIT,效率比AOT慢
  3. 渲染依赖原生控件,不同的平台的控件需要单独维护,并且系统更新,社区控件可能延时,并且收到原生控件的影响,比如存在手势冲突问题

Flutter

Flutter是自绘引擎加原生,在不用的平台实现一个统一的渲染引擎接口来绘制UI

它的优势


  1. 性能高
  2. 灵活,组件库容易维护,UI保真度和一致性高

它的劣势


  1. 动态性不足,Flutter是AOT模式编译的aar包,不能像JIT那样动态下发代码
  2. 开发效率低

Flutter相对一般的自绘引擎的优势在于


  1. 生态原来越丰富了,Flutter社区、Github资源原来越多
  2. Google也在推广Flutter
  3. 开发效率上来讲,Flutter的热重载可以更快的构建UI,添加功能,修复问题

Flutter采用自己的高性能引擎绘制widget,可以保证一致性,也可以避免对原生控件的依赖。在开发时,Flutter是JIT模式,开发效率比较高,在打成release包的产物时,它是AOT模式,它的运行效率比较高。而且因为它是自己的渲染引擎,在滑动和滚动场景下具有明显的优势。


总结


平台优势劣势
原生

1.能访问平台的全部功能

2.速度快,性能高

1.平台特定,开发成本高

2.不支持动态化

Hybridweb技术栈,社区资源丰富性能差,复杂的界面和动画,难以支持
RN

1.web技术栈,社区资源丰富,上手成本低

2.原生渲染,性能比h5高

3.支持动态化,热更新

1.渲染时需要JS和原生通信,拖动时可能因为通信频繁卡顿

2.执行时时JIT,执行效率低

3.渲染依赖原生控件,当系统更新时,RN的更新可能不及时

Flutter

1.Flutter社区生态越来越丰富

2.性能高,支持AOT

3.自绘UI引擎,不同平台展示效果一致

4.开发JIT,编译AOT

1.不支持动态化

2.开发效率低


参考

《Flutter实战》

Android WebView H5 秒开方案总结 - 掘金


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
author-avatar
xXxHolicxXx900
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有