什么是混合开发
Posted on Wed, 25 Dec 2024 11:20:50 +0800 by LiangMingJian
原生开发
原生应用程序是指某一个移动平台(比如 iOS 或安卓)所特有的应用,使用相应平台支持的开发工具和语言,并直接调用系统提供的 SDK API。比如 Android 原生应用就是指使用 Java 或 Kotlin 语言直接调用 Android SDK 开发的应用程序,而 iOS 原生应用就是指通过 Objective-C 或 Swift 语言直接调用 iOS SDK 开发的应用程序。
原生开发有以下主要优势:
- 可访问平台全部功能(GPS、摄像头);
- 速度快、性能高、可以实现复杂动画及绘制,整体用户体验好;
主要缺点:
- 平台特定,开发成本高;不同平台必须维护不同代码,人力成本随之变大;
- 内容固定,动态化弱,大多数情况下,有新功能更新时只能发版;
在移动互联网发展初期,业务场景并不复杂,原生开发还可以应对产品需求迭代。 但近几年,随着物联网时代到来、移动互联网高歌猛进,日新月异,在很多业务场景中,传统的纯原生开发已经不能满足日益增长的业务需求。主要表现在:
- 动态化内容需求增大;当需求发生变化时,纯原生应用需要通过版本升级来更新内容,但应用上架、审核是需要周期的,这对高速变化的互联网时代来说是很难接受的,所以,对应用动态化(不发版也可以更新应用内容)的需求就变的迫在眉睫。
- 业务需求变化快,开发成本变大。由于原生开发一般都要维护 Android、iOS 两个开发团队,版本迭代时,无论人力成本,还是测试成本都会变大。
纯原生开发主要面临动态化和开发成本两个问题,而针对这两个问题,诞生了一些跨平台的动态化框架。
跨平台技术
针对原生开发面临问题,提出了跨平台框架解决方案,根据其原理,主要分为三类:
- H5 + 原生(Cordova、Ionic、微信小程序)
- JavaScript 开发 + 原生渲染 (React Native、Weex、快应用)
- 自绘 UI + 原生(QT for mobile、Flutter)
H5 + 原生混合开发
这类框架主要原理就是将 APP 的一部分需要动态变动的内容通过 H5 来实现,通过原生的网页加载控件 WebView(Android)或 WKWebView(iOS)来加载。这样一来,H5 部分是可以随时改变而不用发版,动态化需求能满足。同时,由于 H5 代码只需要一次开发,就能同时在Android 和 iOS 两个平台运行,这也可以减小开发成本,也就是说,H5 部分功能越多,开发成本就越小。
这种 H5 + 原生的开发模式为混合开发,采用混合模式开发的 APP 我们称之为混合应用或 Hybrid APP ,如果一个应用的大多数功能都是 H5 实现的话,我们称其为 Web APP 。
目前混合开发框架的典型代表有:Cordova、Ionic 和微信小程序,值得一提的是微信小程序目前是在 WebView 中渲染的,并非原生渲染。
如之前所述,原生开发可以访问平台所有功能,而混合开发中,H5 代码是运行在 WebView中,而 WebView 实质上就是一个浏览器内核,其 JavaScript 依然运行在一个权限受限的沙箱中,所以对于大多数系统能力都没有访问权限,比如无法访问文件系统、不能使用蓝牙等。所以,对于 H5 不能实现的功能,都需要原生去做。
混合框架一般都会在原生代码中预先实现一些访问系统能力的 API, 然后暴露给 WebView 以供 JavaScript 调用,这样一来,WebView 就成为了 JavaScript 与原生 API 之间通信的桥梁,主要负责 JavaScript 与原生之间传递调用消息。这种依赖于 WebView ,用于 JavaScript 与原生之间通信并实现了某种消息传输协议的工具称为 WebView JavaScript Bridge,简称 JsBridge,它是混合开发框架的核心。
JavaScript 开发+原生渲染
React Native(简称 RN)是 Facebook 于 2015 年 4 月开源的跨平台移动应用开发框架,是 Facebook 早先开源的 JS 框架 React 在原生移动应用平台的衍生产物,支持 iOS 和Android 两个平台。RN 使用 Javascript 语言,类似于 HTML 的 JSX,以及 CSS 来开发移动应用,因此熟悉 Web 前端开发的技术人员只需很少的学习就可以进入移动应用开发领域。
自绘 UI+原生
这种技术的思路是,通过在不同平台实现一个统一接口的渲染引擎来绘制 UI,而不依赖系统原生控件,所以可以做到不同平台 UI 的一致性。需要注意,自绘引擎解决的是 UI 的跨平台问题,如果涉及其它系统能力调用,依然要涉及原生开发。
这种平台技术的优点如下:
- 性能高;由于自绘引擎是直接调用系统 API 来绘制 UI,所以性能和原生控件接近。
- 灵活、组件库易维护、UI 外观保真度和一致性高;由于 UI 渲染不依赖原生控件,也就不需要根据不同平台的控件单独维护一套组件库,所以代码容易维护。由于组件库是同一套代码、同一个渲染引擎,所以在不同平台,组件显示外观可以做到高保真和高一致性;另外,由于不依赖原生控件,也就不会受原生布局系统的限制,这样布局系统会非常灵活。
不足之处在于:
- 动态性不足;为了保证 UI 绘制性能,自绘 UI 系统一般都会采用 AOT 模式编译其发布包,所以应用发布后,不能像 Hybrid 和 RN 那些使用 JavaScript(JIT)作为开发语言的框架那样动态下发代码。
- 开发效率低:QT 使用 C++ 作为其开发语言,而编程效率是直接会影响 APP 开发效率的,C++ 作为一门静态语言,在 UI 开发方面灵活性不及 JavaScript 这样的动态语言,另外, C++ 需要开发者手动去管理内存分配,没有 JavaScript 及 Java 中垃圾回收(GC)的机制。
Flutter 就属于这一类跨平台技术,Flutter 正是实现一套自绘引擎,并拥有一套自己的 UI 布局系统的混合框架。