2018-09-06

浅谈应用跨平台开发

名词解释

跨平台

什么是跨平台?——Techopedia

A cross-platform computer product or system is a product or system that can work across multiple types of platforms or operating environments. Different kinds of cross-platform systems include both hardware and software systems, as well as systems that involve separate builds for each platform, as well as other broader systems that are designed to work the same way across multiple platforms.

Cross platform is also known as multiplatform or platform independent.

跨平台计算机产品或系统是可以跨多种类型的平台或操作环境工作的产品或系统。

跨平台开发

什么是跨平台开发?——Techopedia

Cross-platform development is the practice of developing software products or services for multiple platforms or software environments. Engineers and developers use various methods to accommodate different operating systems or environments for one application or product.

跨平台开发是为多平台或软件环境开发软件产品或服务的实践。工程师和开发人员使用各种方法来实现一个应用程序或产品适配不同操作系统或环境。

跨平台移动开发

什么是跨平台移动开发?——Techopedia

Cross-platform mobile development involves creating a codebase for products that are to be supported on multiple mobile operating systems. This most commonly relates to iOS and Android devices, but can include other operating systems as well.

跨平台移动开发涉及为多个移动操作系统支持的产品创建代码库。这通常与iOS和Android设备有关,但也可以包括其他操作系统。跨平台移动开发是指可在多个移动平台上使用的移动应用程序的开发。

为什么跨平台开发?

  • 跨平台开发可以实现大量的代码复用。
  • 跨平台开发可以不需要学习相关平台的语言。

跨平台开发方案

https://www.jianshu.com/p/2df673d0987b

http://fex.baidu.com/blog/2015/05/cross-mobile/

  • Web 流:也被称为 Hybrid 技术,它基于 Web 相关技术来实现界面及功能
  • 代码转换流:将某个语言转成 Objective-C、Java 或 C#,然后使用不同平台下的官方工具来开发
  • 编译流:将某个语言编译为二进制文件,生成动态库或打包成 apk/ipa/xap 文件
  • 虚拟机流:通过将某个语言的虚拟机移植到不同平台上来运行

漫谈跨平台

Java 语言跨平台

一次编译,到处运行。——Java
说的是Java语言跨平台的特性。Java编译器将Java源程序编译成与平台无关的字节码文件(class文件),然后由Java虚拟机(JVM)对字节码文件解释执行。该字节码与系统平台无关,是介于源代码和机器指令之间的一种状态。在后续执行时,采取解释机制将Java字节码解释成与系统平台对应的机器指令。

Java Virtual Machine(Java虚拟机)

运行在所有平台的浏览器

BS模块/CS模块为什么现在

html css JavaScript

前一段时间火热的红芯,浏览器可以说是元老级的角色了,浏览器可以在pc端(win、linux、mac),移动端(andriod)

平台

Windows
MacOS
Web PC+手机适配
iOS
Android
微信端

桌面应用跨平台开发盘点

框架|介绍|技术方案|作品|开发语言|支持平台(领域)
--|--|--|--|--
Qt|Create fluid, high-performance and intuitive UIs, applications, and embedded devices – with the same code base for all platforms. 创建流畅的、高性能与直观的UI及嵌入式设备——不同平台只需一套代码。|编译流|作品汇总 GLP Systems、fman、LG电视等、Tableau商务智能分析软件、AMD绘图软件|C++|嵌入式设备、应用UI与软件、物联网、移动设备、汽车、自动化、机顶盒&智能电视、医疗|c++|Windows、Linux、MAC、Android、iOS、Windows Phone
Electron|Build cross-platform desktop apps with JavaScript, HTML, and CSS 使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用|JavaScript, HTML, CSS|作品汇总 Visual Studio Code、Atom、Github Desktop|Web流|Mac, Windows, Linux
NW.js
(node-webkit)
|Call all Node.js modules directly from DOM/WebWorker and enable a new way of writing applications with all Web technologies.|Web流||JavaScript, HTML, CSS|Mac, Windows, Linux

移动端应用跨平台开发盘点

框架|介绍|技术方案|作品|开发语言|支持平台(领域)
--|--|--|--|--
React Native|Build native mobile apps using JavaScript and React 使用JavaScript和React编写原生移动应用|编译流(简单的说?)|作品汇总 Facebook、Instagram、Pinterest、Uber、Baidu Mobile (手机百度)、JD(手机京东)、Tencent QQ、Skype等|JavaScript|Android, iOS
Flutter|Flutter makes it easy and fast to build beautiful mobile apps.Flutter is Google’s mobile app SDK for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。Flutter是一款移动应用程序SDK,一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。|闲鱼|Android, iOS
Weex|A framework for building mobile cross-platform UI.|Android, iOS, H5

生命力强的跨平台框架需要具备的特点:

  1. 框架本身优越的性能、良好的兼容性
  2. 较低的学习成本
  3. 优秀清晰的文档,以及丰富的语言支持

ReactNative 工作原理

React Native应用启动时发生了什么。启动应用时有以下三个任务并行完成:

加载JavaScript打包文件,React Native的打包工具会像Webpack和Browserify一样把代码连同全部依赖打包成单个文件。

与此同时,React Native开始加载原生模块。一旦某个原生模块完成加载就在桥接层注册,桥接层确认该模块。此时整个应用便知道该模块已可用并能创建该模块的实例。

启动JavaScript虚拟机,提供JavaScript代码的执行环境。

React Native的工作原理

Flutter 工作原理

Flutter架构

Flutter的架构主要分成三层:Framework,Engine和Embedder。

Framework使用dart实现,包括Material Design风格的Widget,Cupertino(针对iOS)风格的Widgets,文本/图片/按钮等基础Widgets,渲染,动画,手势等。此部分的核心代码是:flutter仓库下的flutter package,以及sky_engine仓库下的io,async,ui(dart:ui库提供了Flutter框架和引擎之间的接口)等package。

Engine使用C++实现,主要包括:Skia,Dart和Text。Skia是开源的二维图形库,提供了适用于多种软硬件平台的通用API。其已作为Google Chrome,Chrome OS,Android, Mozilla Firefox, Firefox OS等其他众多产品的图形引擎,支持平台还包括Windows7+,macOS 10.10.5+,iOS8+,Android4.1+,Ubuntu14.04+等。Dart部分主要包括:Dart Runtime,Garbage Collection(GC),如果是Debug模式的话,还包括JIT(Just In Time)支持。Release和Profile模式下,是AOT(Ahead Of Time)编译成了原生的arm代码,并不存在JIT部分。Text即文本渲染,其渲染层次如下:衍生自minikin的libtxt库(用于字体选择,分隔行)。HartBuzz用于字形选择和成型。Skia作为渲染/GPU后端,在Android和Fuchsia上使用FreeType渲染,在iOS上使用CoreGraphics来渲染字体。

Embedder是一个嵌入层,即把Flutter嵌入到各个平台上去,这里做的主要工作包括渲染Surface设置,线程设置,以及插件等。从这里可以看出,Flutter的平台相关层很低,平台(如iOS)只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性。

深入理解flutter的编译原理与优化

Flutter看起来很有前途。它快速且高效,是Google即将推出的Fuchsia OS的默认UI框架。基本上,Flutter似乎有能力在可预见的将来成为有价值的React Native竞争对手。

ReactNative VS Flutter

现在主流的移动开发平台是Android和iOS,之前还有过windows phone,每个平台的开发技术都不太一样。大家都是针对每个平台开发应用。自然有人就会觉得这样效率低下,想进行跨平台开发。从最开始的Hybrid混合开发技术,到RN的桥接技术,到现在新兴的Flutter技术,跨平台开发技术一直在演进。以往最早的Hybrid开发,主要依赖于WebView。但是WebView是一个很重的控件,很容易产生内存问题,而且复杂的UI在WebView上显示的性能不好。react-native技术抛开了WebView,利用JavaScriptCore来做桥接,将js调用转为native调用,只牺牲了小部分性能获取的跨平台开发,这是一大进步。所以现在react-native很流行。
Flutter实现跨平台采用了更为彻底的方案。它既没有采用WebView也没有采用JavaScriptCore,而是自己实现了一套UI框架,然后直接系统更底层渲染系统上画UI。所以它采用的开发语言不是JS,而Dart。据称Dart语言可以编译成原生代码,直接跟原生通信。
Flutter将UI组件和渲染器从平台移动到应用程序中,这使得它们可以自定义和可扩展。Flutter唯一要求系统提供的是canvas,以便定制的UI组件可以出现在设备的屏幕上,以及访问事件(触摸,定时器等)和服务(位置、相机等)。这是Flutter可以做到跨平台而且高效的关键。另外Flutter学习了RN的UI编程方式,引入了状态机,更新UI时只更新最小改变区域。
系统的UI框架可以取代,但是系统提供的一些服务是无法取代的。Flutter在跟系统service通信方式,采用的是一种类似插件式的方式,或者有点像远程过程调用RPC方式。这种方式据说也要比RN的桥接方式高效。

异同:

都实现了移动开发跨平台
界面的编写都很类型,采用响应式视图,维护了一个状态机,只更新改变的最小区域界面
都支持热重载hot reload,开发调试非常方便
调用系统的service仍然需要封装接口,仍然还是需要懂得native开发
RN采用JS语言开发,基于React,受众更多。Dart语言受众小
Flutter的UI框架性能貌似更高一些,但是直接丢弃了原生UI框架。而RN还是可以自己利用原生框架,两个各有好处。Flutter的兼容性高,RN可以利用原生已有的优秀UI
Flutter的第三方库还很少,RN发展的早,虽然也还不完善,但是比Flutter好
RN的界面布局更像网页布局,而Flutter的布局更像native布局
Flutter在跨平台这方面做得更彻底一些

react-native框架原理

Flutter框架原理图

Flutter的在调试模式和Release模式下性能差别很大。如果你调试时发现性能差,就最好试试release模式。

Flutter采用Dart语言开发不知道是好是坏。现在可是JS的天下,这是RN的优势之一,web开发人员很容易开发RN的界面,但是Flutter的一切都要从新学习。Dart语言我也还没习惯。

Flutter现在还处理Bata阶段,第三方库还很少。所以很多东西都需要自己开发和封装。RN经过了一段时间积累,好用的库还有不少。现在用Flutter来开发APP,感觉还是有点太早。

Flutter官方吹的很大,说它是革命性的,也有一定道理。但是我觉得RN对于熟悉web开发的人来说,是更好的选择。但是对于纯native开发的移动开发人员,直接学习Flutter会更好,Flutter也比较适合本来就是做native开发的人。

Flutter与React Native的比较
Flutter KO React Native?

FLUTTER与REACT NATIVE的比较矩阵


Flutter VS React Native

Flutter React Native
初始发行 2017年 2015年
UI组件 专有小工具 OS本地组件
原生的外观和感觉 ★★★☆☆ ★★★★★
速度 ★★★★★ ★★★★☆
到期 ★☆☆☆☆ ★★★★★
语言 Dart JavaScript
行业采用
★☆☆☆☆ ★★★★★
生产率 ★★★★★ ★★★★★
有状态的热重新加载 是 是
配置和设置

★★★★★ ★★★☆☆
工装 ★★★☆☆ ★★★★★
硬件特定的API ★★★★☆ ★★★★☆
生命周期管理 ★★★☆☆ ★★★★★
代码结构 ★★★★☆ ★★★★★
社区 ★★★★☆ ★★★★★
文档 ★★★★★ ★★★☆☆

我们的判断:REACT NATIVE在2018年获胜,但给FLUTTER一段时间

性能对比

流言终结者- Flutter和RN谁才是更好的跨端开发方案?

weex

整体架构

Weex 表面上是一个客户端技术,但实际上它串联起了从本地开发、云端部署到分发的整个链路。开发者首先可在本地像编写 web 页面一样编写一个 app 的界面,然后通过命令行工具将之编译成一段 JavaScript 代码,生成一个 Weex 的 JS bundle;同时,开发者可以将生成的 JS bundle 部署至云端,然后通过网络请求或预下发的方式加载至用户的移动应用客户端;在移动应用客户端里,Weex SDK 会准备好一个 JavaScript 执行环境,并且在用户打开一个 Weex 页面时在这个执行环境中执行相应的 JS bundle,并将执行过程中产生的各种命令发送到 native 端进行界面渲染、数据存储、网络通信、调用设备功能及用户交互响应等功能;同时,如果用户希望使用浏览器访问这个界面,那么他可以在浏览器里打开一个相同的 web 页面,这个页面和移动应用使用相同的页面源代码,但被编译成适合Web展示的JS Bundle,通过浏览器里的 JavaScript 引擎及 Weex SDK 运行起来的。

我们在 iOS 下选择了基于 JavaScriptCore 内核的iOS系统提供的 JSContext,在 Android 下也使用了 JavaScriptCore 内核的 JavaScript 引擎。经过长期优化与多种业务场景检验,JavaScriptCore 无论是从性能还是稳定性方面都为Weex提供了强有力的保障,同时也保证了双端 JavaScript 引擎的统一,更有利于开发者调试跨端的 JavaScript 错误。

小程序

微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容