写点什么

现代移动开发哪家强:原生还是跨平台?JetBrains 专家:我选 Flutter

作者:Sebastiano Poggi

  • 2023-06-13
    北京
  • 本文字数:4328 字

    阅读完需:约 14 分钟

现代移动开发哪家强:原生还是跨平台?JetBrains专家:我选Flutter

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

本文整理自 QCon Plus 演讲,Sebastiano Poggi 是 JetBrains 的开发专家,这次演讲他主要讨论了在原生和跨平台移动开发之间进行选择所需的技术知识和工具。

 

原生还是跨平台?


是时候抛开一切纷纷扰扰,专心聊聊原生和跨平台这个老大难选题了。从某种意义上讲,原生永远有自己的比较优势,其性能永远是任何跨平台框架都望尘莫及的。原生应用也能更好地跟操作系统、第三方库相集成,拥有更庞大且技术支持更给力的社区生态。另外,人家“原生”二字可不是白讲的,能够更好地访问操作系统上的 API 和功能,支持 tvOS 乃至各种可穿戴设备。如果大家更关注这些需求,那原生开发就是最正确的答案。另外,原生开发工具也在不断改进,甚至 Xcode 如今也变得不那么恼人了。当然,原生开发也有自己的问题,否则跨平台框架根本就不会出现。

 

原生的头号难题,就是成本更高,企业需要为每种操作系统筹建专门的开发团队,具体考虑基础设施和流程中的注意事项。例如,我们可能需要为 Android 和 iOS 设置不同的持续集成(CI)流程。当然,这种情况在跨平台开发那头也存在,毕竟两种平台间的工具存在很大差异。此外,在把应用程序部署和发布到苹果 App Store 或者 Google Play Store,乃至 Android 平台上千奇百怪的软件商店时,都有相应的规章制度需要遵守。他们各有不同的发布标准、周期和要求,必须早做打算。

 

结合实际情况,跨平台可能才是大多数开发者最务实的选项。毕竟跨平台框架的效果基本够用,有时候甚至不比原生移动平台差。而且经过多年发展,跨平台框架也迎来了巨大改进,比如说 Flutter 和 React Native 都开始支持热重载,这样大家就能像在 Web 上那样测试各种变更,无需将应用程序重新部署到设备或虚拟机上。但在选择跨平台时,我强烈建议大家先选择一种强大的设计语言,要明确跟 Android 和 iOS 区分开来。因为一旦你的设计太偏向于其中一种,那就会跟另外一种显得格格不入。另外,如果不用原生控件,大家会很难模仿平台上的原生观感和体验。总之,软件开发就是这样一道 80%都较简单,但最后 20%完善部分异常困难的大题。感兴趣的朋友不妨试试 Duolingo——这虽然是一款原生应用,但却能给跨平台开发者们好好上一节设计语言课。

 

以可穿戴设备为例,来一场虚构案例的头脑风暴


假定有这么一家可穿戴设备厂商,他们想要搞一款配套应用。比如说智能手表吧,他们希望在这款设备上进行通信、数据下载、显示历史趋势。没错,这肯定是需要应用来实现的,用户不可能总跑去浏览网页。下面问题就来了:我们需要的是原生应用吗?其中是否大量访问操作系统 API?毕竟这就是原生代码的优势所在。而答案是肯定的,智能设备需要在后台执行大量操作,所以肯定会经常访问操作系统 API。跨平台框架虽然能在蓝牙等少部分匹配机制上表现良好,但要对应用的所有功能有更好的把控力,原生恐怕才是正确答案。所以可穿戴设备这类场景的判断就很简单,原生是要好过跨平台开发的。

 

框架选择:React Native、Xamarin 还是 Flutter


我们总在讨论原生和跨平台,但这里所说的“跨平台”到底对应哪种框架?目前的三大主流选项分别是 React Native、Xamarin 和 Flutter,当然还有基于 Web 的框架,比如 Cordova、Ionic 和 PhoneGap 等。这里还有 Kotlin 值得一提,这是由 JetBains 设计并与其他公司合作开发的语言。但至少在基于 Web 的跨平台开发方面,我会尽量避免使用后面这几种选项,毕竟它们往往过于陈旧且性能不佳。其中比较特殊的是 Kotlin 多平台,它跟 React Native、Xamarin 和 Flutter 有很大不同,相对更侧重共享业务逻辑而非 UI 设计。所以在本文的讨论中,我们就专注于 React Native、Xamarin 和 Flutter 这三位。

 

React Native

 

React Native 是 Facebook 开发的一项技术,并以同样来自 Facebook 的 ReactJS 为基础。这样做的好处是,如果您的企业中已经拥有经验丰富的 ReactJS 开发团队,那完全可以向 Web 团队分享一些技能甚至是代码。React Native 还对桌面、可穿戴设备和智能电视等拥有实验性的第三方支持。但大家千万别因为关注这些元素而贸然选择 React Native,因为这方面功能还远称不上成熟。React Native 本身倒是既强大又完善,完全可以用来开发 B2C 应用。实际上,市面上已经有很多大型 React Native 应用可供选择。虽然在性能方面仍在局限,但 React Native 最近几年来一直在探索和改进。不过如果各位开发的应用里有大量动画元素,那建议先别考虑 React Native。另外要注意的是,如果想要自定义 UI 组件,就得为不同的平台分别创建实现,这个过程相当枯燥。可好处是 React Native 确实能让 UI 充满了“原生范”,毕竟它确实用了不少原生的资产。最后说点坏消息,近年来不少知名应用都放弃了 React Native,其中的典型案例当数 Airbnb。但这跟我们自己的开发需求可能并无关系,结合自身实际才有指导意义。

 

Xamarin

 

Xamarin 走的完全是另一个路子。它是由微软开发的工具,之前曾经收费,现在已经免费开放且开源。如果贵公司在 C#资产上投入了很多,而且也用过 ASP.NET 和 C#,那 Xamarin 将助您建立起从后端到前端的完整.NET 栈。从某种意义上讲,Xamarin 的 UI 实现方法相当独特。大家可以使用 Xamarin.Forms 探索多平台,也可以像 React Native 那样采取原生视图(但后者其实用得不多)。总之,Xamarin 跟 React Native 和 Flutter 的脾性正相反,强调贴近源操作系统 API。也就是说,开发者必须也了解操作系统,才能玩转 Xamarin,毕竟后者的作用就是自动打包来自 Native SDK 的现有 API 并在 C#中公开。Xamarin 的第三方支持有限,可用的原生 Xamarin 库不多。就个人来看,Xamarin 可能更适合那些内部应用,或者相对复杂度不高的应用程序。它更多面向企业,在开发 B2C 应用时最好别用。

 

Flutter

 

自谷歌的 Flutter 这套框架的人气正在迅速上涨。谷歌对 Flutter 投入了大量营销和宣传,框架本身的水平也绝不拉胯。首先,Flutter 拥有众多高质量的第一方和第二方集成,使用 Dart 语言并配合 Pub 生态作为依赖项。从技术上讲,我们几乎可以使用 Flutter 满足一切开发需求——面向移动端、面向桌面端,还能支持 macOS、Windows 和 Linux,甚至是 Web 和嵌入式物联网。简单来讲,任何能够运行 Android APK 的地方都能运行 Flutter 应用。据我所知,它目前尚不支持的就只有 WatchOS 和 tvOS 了。但如果真有需要,我也认识能帮大家解决问题的人。如果您的开发团队熟悉 Dart,也可以直接用它做 UI。这就是 Flutter,因为出自谷歌之手,所以毫不掩饰地向 Android 开发者群体疯狂示好。

 

下面咱们通过几组统计数字,看看跨平台开发目前的市场规模。纵观 Google Play Store 和苹果 App Store 上采用跨平台框架的应用,可以看到 Cordova 在 iOS 上占比 17%,在 Android 端则占比 20%。React Native 位列第二,双平台份额均稍逊 5%。Flutter 则紧随其后,而且继续表现出强烈的亲 Android 倾向。Ionic 和 Xamarin 完全无法跟前三甲相匹敌,接下来还有已经过时淘汰的 Titanium/Appcelerator 框架等。



 这些数字也有没讲出来的“小秘密”,比如实际使用跨平台框架的开发者占比只有三分之一。就是说如果选择跨平台开发,就相当于放弃掉了市场上三分之二的候选人才。另外,中长期历史趋势显示,Web 开发框架统计中 React Native 和 Xamarin 也赫然在列。过去三年来,使用跨平台开发技术的人数正在下降,其中 React Native 相对保持稳定,其他框架则情势危急。另一方面,Flutter 则保持上升势头,有 42%的移动应用都在使用。最后,Kotlin 多平台开发也走势良好。



虚构案例研究 II:金融科技业务


我们假定有一家金融科技公司,这样的企业需要业务应用吗?那是肯定的,毕竟竞争对手都有自己的应用,所以咱也不能缺项。那需要是原生应用吗?我们还是用之前提到过的标准来判断,比如是否需要大量使用操作系统 API?答案是并不需要。虽然这类应用会频繁用到通知功能,但这个问题已经有成熟解决方案,不需要额外费心。那用户要用这款应用来干什么?假定用途是查看股票价格,随时查询并收取通知,那这些确实都用不着劳原生开发的大驾。选择了跨平台之后,接下来是选择哪种框架的问题。首先,假定这家公司没有 ReactJS 团队,比如他们之前用的是 Angular,内部也没有经验丰富的.NET 人才,那么 React Native 和 Xamarin 就都被排除掉了。他们大量使用 Firebase 服务,而且需要多种自定义用户界面,包括美观的图形和精致的动画,那么综合来看最理想的选项就是 Flutter

 

移动端测试

 

最后,就是在移动设备上做测试。注意,移动设备上的单元测试同样有成熟方案,真正的问题出在 UI 测试方面。Flutter 提供的 UI 测试可谓冠绝群伦,相比之下原生开发和 React Native 使用的还是各平台自己的工具。Xamarin 也差不多,但我印象中它用的是针对各平台开发的自定义工具。

 

在持续集成(CI)中运行 UI 测试时,往往需要运行缓慢的上机测试——可能是物理实机,也可能是模拟机。有些云服务商虽然提供 UI 测试设备,但设置和维护起来非常复杂、使用成本也相当昂贵。经典的解决方案就是做更多的单元测试,这一点在 Android 端特别重要。以 Robolectric 为例,它就能帮我们将集成测试作为单元测试来运行。面向移动项目的专有持续集成解决方案也不少见,比如 Bitrise 等。

 

决策审查


做出了开发决策,那么在着手开发应用的同时,我们也该看看自己选得对不对、当前有哪些实际困难。毕竟很多错误不会立刻就显现出危害。比如说,某些厂商在几年之后放弃了 React Native,类似的情况最终也可能出现在 Flutter 当中。总之,请随时关注事态发展。问题发展得越早,我们的沉没成本也就越低。

 

总结


第一,考虑移动开发到底有没有必要。记得用数据来回答问题,别靠想象。

第二,确保企业有能力做移动开发,然后厘清组织结构和团队职责。

第三,在做出决策之前评估权衡要素,意识到不存在百试百灵的最优选项,充分理解自身实际。

第四,做出正确选择并努力推进。

 

互动问答


主持人:您讨论了好几种行之有效的实现方式。根据个人经验,您在绝大多数情况下会选择哪一种?

 

Poggi:我自己就是搞原生开发出身的,所以在这个问题上有明显的倾向性。但如果说必须要搞跨平台开发,那我可能更愿意选择 Flutter,因为我有一点这方面的经验。虽然我不太熟悉 Dart,但它跟 Java 其实挺像的、也不难理解。作为次优选项,我可能会选择 React Native。但先要承认,我对 JavaScript 一无所知,所以这么选对不对我也不敢说。总之,只要掌握了声明式、响应式 UI 框架的工作原理,那不同的框架往往只对应不同的语义和语言特性,在本质上还是相通的。

 

主持人:所言极是,大家在实际选择时恐怕还是会以自己熟悉的语言为导向。

 

参考链接:


https://www.infoq.com/presentations/tools-native-cross-platform/


相关阅读:


为什么说 Flutter 无法成为移动应用开发的“顶流明星”?

Google 路线图:Flutter 与 JavaScript、Wasm 集成

Flutter 和小程序容器技术的应用前景与发展潜力

移动应用架构与 React Native、Flutter 的关联

2023-06-13 13:0920625

评论 1 条评论

发布
用户头像
在苹果生态上搞跨平台,可以说完全发挥不了苹果的图形技术优势。
2023-06-18 15:22 · 北京
回复
没有更多了
发现更多内容

Java全栈开发---Java ERP系统开发:商业ERP(七

爱好编程进阶

Java 程序员 后端开发

科创人·SUSE大中华区董事长江永清:真开源要有打磨技术的匠心,要能持续创造社会价值

科创人

Java8设计模式最佳实战-设计模式概述(第七天学习记录)

爱好编程进阶

Java 程序员 后端开发

java中锁的四种状态

爱好编程进阶

Java 程序员 后端开发

与 Dfinity 明星项目面对面,各大赛道开发经验一览

TinTinLand

区块链

网络协议之:haproxy的Proxy Protocol代理协议

程序那些事

Java Netty 程序那些事 4月月更

AIRIOT物联网低代码平台如何配置OPC DA驱动?

AIRIOT

驱动配置

JavaCV人脸识别三部曲之三:识别和预览

爱好编程进阶

Java 程序员 后端开发

JavaWeb静态网页

爱好编程进阶

Java 程序员 后端开发

技术人的必备特质

Hockor

【等保小知识】等保测评是安全认证吗?

行云管家

等保 等级保护 等保测评 安全认证

开发一个不需要重写成Hive QL的大数据SQL引擎

华为云开发者联盟

sql 大数据 mapreduce SQL引擎 大数据仓库

最新区块链招聘:高薪招开发产品运营人才

TinTinLand

区块链

为团队投资CRM系统的投资回报率是多少?

低代码小观

CRM 客户关系管理 低代码开发 CRM系统 客户关系管理系统

科创人·数智未来私董会第4期:转型的实证-幸存者偏差与盲人摸象| 活动报名

科创人

如何在优麒麟上进行超大型文件的远程传输?这个命令帮你快速搞定!

优麒麟

Linux 开源 命令行 优麒麟 远程传输

墨天轮访谈 | 拓扑岭雷鹏:数据库新思维下的弹性压缩与内存计算

墨天轮

数据库 redis 国产数据库 键值数据库

华为数字化转型实践

乌龟哥哥

4月月更

零基础开启 Neo 开发之旅,NEP17 智能合约实战教学

TinTinLand

区块链

加入 Flow ,共同成为 Web3的建设者

TinTinLand

区块链

设备如何使用go sdk轻松连接华为云IoT平台

华为云开发者联盟

华为云 sdk go sdk IoT平台 华为云IoT平台

Java中关于内存泄漏分析和解决方案,都在这里了

爱好编程进阶

Java 程序员 后端开发

搞懂这份大厂Java面试知识点笔记汇总,涨薪15K你也没问题

Java架构追梦

Java 程序员 后端开发

浪潮信息加入,已完成与龙蜥操作系统产品兼容性验证

OpenAnolis小助手

云计算 服务器 龙蜥社区 CLA 浪潮

云管平台有哪几家?现在采购福利哪家好?

行云管家

云计算 混合云 云管平台

以图搜图应用篇-家具家居行业

视觉智能

人工智能 以图搜图 图像搜索 视觉智能

广袤之中:沿着克拉克三大定律,读懂华为的最深期待

脑极体

14岁懂社会-《被你讨厌的昆虫们》读书笔记

懒时小窝

读书笔记 14岁懂社会

Java之Spring Boot入门到精通【IDEA版】SpringBoot整合其他框架

爱好编程进阶

Java 程序员 后端开发

迎战大厂!“金三银四”和通过率达95%的Java面试八股文

Java架构追梦

Java 后端开发 程序员面试

阿里大牛评:入门到大成!GitHub新上线并发编程深度解析实战PDF

Java架构追梦

Java 后端开发 程序员面试

现代移动开发哪家强:原生还是跨平台?JetBrains专家:我选Flutter_大前端_InfoQ精选文章