Android开发Android开发经验谈Android技术知识

开发跨平台 App 推荐 React Native 还是 Flu

2020-07-07  本文已影响0人  e240c12aa0ad

作者:hijiangtao
链接:https://www.zhihu.com/question/307298908/answer/569471390

不论是 React Native 还是 Flutter 都可以用于开发跨平台应用,选哪个看你自身需求,但首先得了解清楚两者都是什么。

React Native 能够跨平台是因为它允许你使用 React/JavaScript/JSX 的写法写原生应用,而在底层他会替你调用相应的 iOS 原生组件或者 Android 原生组件,又或者直接生成适用于 Web 的 DOM 树。所以他做的事情是,用 JavaScript 调用对应系统渲染器进行渲染展示。

那么,Flutter 又是怎么跨平台的呢——Skia。当你使用 Flutter 框架(Dart)开发应用时,其底层渲染由 Skia 接管,没有什么 Android runtime、Chromium 或者其他中间层了,是的,Skia 的下层便是 CPU/GPU 了,一个受控的画布,基本上意味着你想画什么就画什么了,不再需要调用原生 Widgets,而这便是 Flutter 能够跨平台的原因。

除此外,还可以提供一些有用信息供你参考。

  1. 谁更快:React Native 这种从使用 JavaScript 到解析调用 Native 的过程中间显然要经过多个环节,而 Flutter 里将 Dart 代码 AOT 编译为本地代码,所以 Flutter 应用是直接使用本机指令集运行,这就不涉及解释器这一层。关于 Flutter 为什么这么快 Google 的工程师在 Google I/O、GDD 以及刚结束的 D2 上都有介绍,这里贴一张图可以简要说明「Flutter 相比 Android 与 其他跨平台框架相比为何那么快」的原因,见[注1]
  2. 支持平台:React Native 支持 iOS/Android/Web 是毋庸置疑的,但 Flutter 现在还只能「成熟」的支撑 iOS/Android,即便上个月 Flutter Live 1.0 说到 Flutter for Desktop 以及 HummingBird,但这些都还处于初期,至少在明年 Google I/O 前还不能报有希望。
  3. 渲染控制:React Native 做的时候是利用 JavaScript「调用」原生 Widgets,那么不同平台 Widgets 的差异势必使得 React Native 只能取两者的公共子集,「Write once, run everywhere」不假,但「Control every pixel on the screen」是做不到的;Flutter 不调用原生组件,相反,有一组自己的Widgets,而他们都由 Flutter 的 Framework 和 Engine 管理和渲染,按 Google 的话来说就是Control every pixel on the screen」,你不再需要因为不同端的差异而在实现上进行妥协[注2]
  4. 成熟/生态:Dart 生态相比移动端/前端生态远小的多,看看 Flutter Live 上那些截图就知道 Flutter (+Dart) 的开发人员也远不及 Android / iOS / Chromium 等平台的开发人员,是的,是远远不及,即便加上 Dart 相关开发人员。往外扩再想想社区,React Native 经过多年发展,其现在的社区规模或者是生态完善性都是 Flutter 近期根本无法追赶上的,虽然 React Native 依旧有不少「坑」。
  5. 开发上手:是个前端开发就一定知道 HTML / CSS / JavaScript,但是用 Flutter 你需要学习一门新语言 Dart,而如果你的编程习惯不好或者不善于抽象,你的 Flutter 代码很容易一层套一层,like callback hell,所以你说哪个更容易上手呢?

Flutter 风光很足,且官方回应非常迅速(GitHub Issues),但生态远远没到成熟的地步,这对于资源有限的应用开发团队来说是很致命的,且现在在开发调试上还是有些痛苦的,比如无法准确定位错误堆栈等;但 React Native 为了达到跨平台而对 UI 上的一妥协与牺牲也是被人们所熟知的。

但如果说两边现在最让人期待的事情,Flutter 无疑是 Flutter for desktop 与 HummingBird,而 React Native 则无疑是 Facebook 正在进行的重构工作。现在说谁将最终获胜还为时尚早。

React Native 大家熟悉多一些,所以最后多安利一下 Flutter。Flutter 整体架构主要分三层[注3]:Framework,Engine 与 Embedder,前两层结构见下图。

  1. Framework 是框架使用者需要直接面对的,包含文本/图片/按钮等基础 Widgets、渲染、动画、手势等。如果你写 Flutter 应用,那么大致可以理解为调用这些 package 然后再用 Dart 「拼装」些自己的代码。
  2. Engine 使用 C++ 实现,这一层包含 Skia,Dart 和 Text。后两个不太熟,说说 Skia。这是一个二维图形库,提供了适用于多种软/硬件平台的通用 API,既是 Chrome,Chrome OS,Android,Firefox,Firefox OS 等产品的图形引擎,也支持 Windows 7+,macOS 10.10.5+,iOS8+,Android4.1+,Ubuntu14.04+ 等平台;Dart 包含 Dart Runtime 等(JIT/AOT),Text 则负责文字渲染部分。
  3. Embedder 是一个嵌入层,做的事情是 Flutter to Platforms。比如渲染 Surface,线程设置,插件等。Flutter 的平台层很低,比如 iOS 只是提供一个画布,剩余的所有渲染相关的逻辑都在 Flutter 内部,而这就是 Flutter 所宣传的可以精准控制每一个像素的原因;但不可否认,对于插件部分,还是需要特定操作系统底层的建设(比如支付、地图等),而在 React Native 上(开发应用)则不需要相关背景。

关于 Flutter 更加详尽的介绍可见分享 让我们在2019年重新认识 Flutter

以上,供参考。

注1 (from What makes Flutter fast, Yuqian Li on D2)


注2:Google 的原话是「Flutter lets you control every pixel on the screen, and its powerful compositing capabilities let you overlay and animate graphics, video, text and controls without limitation.」

注3:Flutter 系统架构详情可见 https://docs.google.com/presentation/d/1cw7A4HbvM_Abv320rVgPVGiUP2msVs7tfGbkgdrTy0I/edit#slide=id.gbb3c3233b_0_162

如何系统化学习Android高级架构技术?

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。


Android高级工程师Flutter系统学习知识体系

Flutter进阶学习全套手册

详细整理在石墨文档可以见;

Android架构视频+BAT面试专题PDF+学习笔记​
【Android高级工程师进阶系统面试题】:下载链接

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

上一篇下一篇

猜你喜欢

热点阅读