随着前端技术的发展,传统的Android,IOS原生开发似乎已经不那么受欢迎了,而每一项新技术的诞生肯定是为了解决老技术不能解决的问题,因此将新老技术对比学习是非常重要的。
原生开发
原生应用程序是指某一个移动平台(比如安卓或IOS)所特有的应用,使用相应平台支持的开发工具和语言,并直接调用系统提供的SDK。比如Android原生就是指使用Java或Kotlin直接调用Android SDK。而IOS原生就是指通过Objective-C或Swift直接调用IOS SDK。
优点:
- 可访问平台全部功能(如GPS,摄像头等);
- 速度快、性能高、可以实现复杂动画及绘制,整体用户体验好。 缺点:
- 平台特定,开发成本高,不同平台需要维护不同的代码,人力成本高;
- 内容固定,动态化弱,多数情况下,有新功能更新时只能发版,而通过版本升级来更新内容,应用上架、审核是需要时间的,这对高速变化的互联网时代来说是很难接受的。因此,不发版就可以更新内容的需求就变得迫在眉睫了。
针对原生开发所带来的问题,跨平台的动态化框架应运而生。如今市面上出现的很多跨平台框架基本分为三类:
- H5 + 原生(微信小程序、Cordova、Ionic)
- Js + 原生(React Native、Weex)
- 自绘UI + 原生(Flutter、QT)
H5 + 原生
优点:H5部分可以随时改变而不用发版,动态化需求能满足,同时,H5代码只需要一次开发就能同时在Android和IOS两个平台运行,减少开发成本。
缺点:性能体验不佳,对于复杂界面或动画,webview会不堪重任。
js + 原生
优点:
- 采用web开发技术栈,上手快,开发成本相对较低。
- 原生渲染,性能相比H5要好很多。
- 动态化较好,支持热更新。 缺点:
- 渲染时需要js和原生之间通信,某些场景下可能会因为通信频繁而产生卡顿。
- JavaScript 为脚本语言,执行时需要解释执行 (这种执行方式通常称为 JIT,即 Just In Time,指在执行时实时生成机器码),执行效率和编译类语言(编译类语言的执行方式为 AOT ,即 Ahead Of Time,指在代码执行前已经将源码进行了预处理,这种预处理通常情况下是将源码编译为机器码或某种中间码)仍有差距。
- 由于渲染依赖原生控件,不同平台的控件需要单独维护,并且当系统更新时,社区控件可能会滞后;除此之外,其控件系统也会受到原生UI系统限制,例如,在 Android 中,手势冲突消歧规则是固定的,这在使用不同人写的控件嵌套时,手势冲突问题将会变得非常棘手。这就会导致,如果需要自定义原生渲染组件时,开发和维护成本过高。
自绘UI + 原生
优点:
- 性能高;由于自绘引擎是直接调用系统API来绘制UI,所以性能和原生控件接近。
- 灵活、组件库易维护、UI外观保真度和一致性高;由于UI渲染不依赖原生控件,也就不需要根据不同平台的控件单独维护一套组件库,所以代码容易维护。由于组件库是同一套代码、同一个渲染引擎,所以在不同平台,组件显示外观可以做到高保真和高一致性;另外,由于不依赖原生控件,也就不会受原生布局系统的限制,这样布局系统会非常灵活。 缺点:
- 动态性不足;为了保证UI绘制性能,自绘UI系统一般都会采用 AOT 模式编译其发布包,所以应用发布后,不能像 Hybrid 和 RN 那些使用 JavaScript(JIT)作为开发语言的框架那样动态下发代码。
- 应用开发效率低:Qt 使用 C++ 作为其开发语言,而编程效率是直接会影响 App 开发效率的,C++ 作为一门静态语言,在 UI 开发方面灵活性不及 JavaScript 这样的动态语言,另外,C++需要开发者手动去管理内存分配,没有 JavaScript 及Java中垃圾回收(GC)的机制。
| 技术类型 | UI渲染方式 | 性能 | 开发效率 | 动态化 | 框架代表 |
|---|---|---|---|---|---|
| H5+原生 | WebView渲染 | 一般 | 高 | 支持 | Ionic、Cordova |
| JS+原生 | 原生控件渲染 | 好 | 中 | 支持 | React Native、Weex |
| 自绘UI+原生 | 系统API渲染 | 好 | Flutter高,Qt低 | 默认不支持 | Flutter、Qt |