随着后PC时代的到来,以及互联网的高速发展,当前环境下拥有多平台设备的用户越来越多,开发者不得不考虑跨平台开发,以期多平台有一致的使用体验、获得更多的用户。现在主流的平台有:Android、IOS、Windows、MacOS、Linux。面对如此多的平台我们改如何面对,是一个值得思考的问题。下面我介绍今天需要讨论的一些主题:

  • 什么是跨平台?
  • 跨平台开发的意义?
  • 跨平台开发需要注意些什么?
  • 跨平台开发的现状?

什么是跨平台?

程序源码不依赖操作系统、不依赖硬件环境(如各种CPU指令集),可以在不同的操作系统上运行。

为了弄明白跨平台底层原理,我们需要从程序的生成看起,而程序又是由编程语言开发的,所以我们先从的开发语言看起:

1
2
3
4
5
6
7
graph LR
A[机器语言] --> B[汇编语言]
B --> C[C/C++]
B --> D[Java]
B --> E[Python]
B --> F[Go]
B --> G[其它...]

机器语言: 由0 1代码组成,可以直接被计算机硬件所识别,与底层硬件高度耦合,显然无法跨平台。
汇编语言: 采用字母、单词来表示一条指令,与硬件高度耦合,无法跨平台。
高级语言: C/C++、Java、Python、Go、… 面向过程或者面向对象,开发简单、高效,做到了与硬件无关,是我们跨平台开发的选择。


从实现方式上跨平台可以分为两大阵营:

#####编译型:
C、C++、Delphi、Pascal 使用不同平台对应的编译器,只需编译一次,生成可以执行文件。由不同平台不同的【编译器】做支撑
优点:程序执行效率高、使用内存低
不点:编译出来的可执行文件与平台相关,不能在其它平台直接运行。

#####解释型:
解释型的语言包括:Javascript、Python、Ruby、Perl、…等 。由不同平台不同的【解释器虚拟机】做支撑
优点:不需要编译,既可以跨平台。
不足:每次运行都需要将源代码解释称机器码并执行,效率较低,内存使用率高。

注意:编译型 + 解释型的混合体 : Java  Java代码要编译,解释运行在JVM上。

跨平台开发的意义?

1. 用户在不同平台有近似的用户体验、提高用户体验。
2. 公司可以获取更多用户。
3. 一份代码多平台部署,提高开发效率、可维护性。
4. 节省时间成本和人员成本。
5. …


跨平台开发需要注意什么?

编程语言、操作系统、代码编码格式、x64、x86、同一操作系统不同操作系统版本、操作系统版本都相同不同机型
1. 选择合适的编程语言。看编程语言本身对跨平台支持的程度,如windows的批出就不行。
2. 操作系统。目标操作系统都有哪些。
3. 代码文件的编码格式。不恰当的格式,可能再其它平台编译失败。
4. 程序是32位,还是64位,还是说在有的平台32位有的平台64位。
5. 需要考虑同一操作系统不同操作系统版本。
6. 需要考虑操作系统版本相同但是机型不同,适配。


跨平台开发的现状?

1
2
3
4
5
6
7
graph LR
A[跨平台开发]
A --> B[Web Java Script派]
A --> C[代码转换派]
A --> D[编译派]
A --> E[中间派]
A --> F[解释器虚拟机派]

1. Web Java Script派

  • React Native
    React Native基于JavaScript和React(用于构建用户界面的JavaScript库)。
    Facebook于2015年4月开源的跨平台移动应用开发框架。
    主要擅长于IOS、Android,也能应用于Windows、MacOS、linux
    官网:https://reactnative.dev/
    MacOS: https://github.com/ptmt/react-native-macos
    Windows: https://gitee.com/mirrors/react-native-windows/
    linux: https://gitlab.com/react-native-linux/react-native-linux
    使用React Native成功案例:https://reactnative.dev/showcase
    Facebook Android • iOS
    Instagram Android • iOS
    Skype Android • iOS
    Tencent QQ Android
    JD(手机京东)Android • iOS

  • Electron:
    2011 年左右,中国英特尔开源技术中心的王文睿(Roger Wang)希望能用 Node.js 来操作 WebKit,而创建了 node-webkit 项目,这就是 NW.js 的前身。
    2012 年,故事的另一个主角赵成(Cheng Zhao)加入到王文睿的小组,并对 node-webkit 项目做出了大量的改进,
    后来赵成离开了中国英特尔开源技术中心,帮助 github 团队尝试把 node-webkit 应用到 Atom 编辑器上,再后来 github 把这个项目开源出来,最终更名为Electron。
    官网:https://www.electronjs.org/
    Electron基于Nodejs和Chromium的跨平台桌面软件开发框架。使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序。
    Electron擅长于Mac、Windows、Linux也能支持Android、IOS
    Mac App Store 应用程序提交指南: https://www.electronjs.org/docs/tutorial/mac-app-store-submission-guide
    高版本使用CARemoteLayer 未公开api ios不能上架,AppStore有低版本Electron支持ios。
    使用Electron的成功案例: https://www.electronjs.org/apps
    Visual Studio Code
    GitBlade
    GitHub Desktop
    飞书
    迅雷X

  • PhoneGap:
    采用HTML,CSS和JavaScript的技术,创建移动跨平台移动应用程序的快速开发平台 Android • iOS
    2011年7月29日,PhoneGap发布了1.0版产品,现在由Adobe拥有.
    PhoneGap程序的加载和UI接口的反应都比本地的程序慢。Adobe警告开发者,由于使用PhoneGap框架开发的程序运行速度可能会太慢或使用体验不够“原生”.

2. 代码转换派

3. 编译派

C
C++
QT

4. 中间派(基于js 与 编译流之间):

  • Flutter
    Google开源,上线时间2015年5月。
    Flutter采用Dart语言
    Dart是面向对象的、类定义的、单继承的语言。需要编译、Dart2强类型语言。
    https://www.dartcn.com/
    优势:程序运行效率相对较高、Google开源的技术支持
    不足:开源库相对比较欠缺,更新频次不足

5. 解释器虚拟机:

Java
Python
Perl
Lua

其它资料:
2021最新15个跨平台App开发框架:https://www.jianshu.com/p/3bf119de6c5f