加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

聊聊移动端跨平台开发的各种技术

发布时间:2016-07-29 11:18:06 所属栏目:语言 来源:百度Fex
导读:最近出现的 React Native 再次让跨平台移动端开发这个话题火起来了,曾经大家以为在手机上可以像桌面那样通过 Web 技术来实现跨平台开发,却大多因为性能或功能问题而放弃

所以后来它又推出了 Tengu 这个专门针对 APP 开发的工具,它的比起之前的方案更灵活些,本质上有点类似 C++ 公共库的方案,只不过语言变成了 Swift/Objective-C,使用 Swift/Objective-C 来编译生成跨平台的 SO 文件,提供给 Android 调用。

另一个类似的是 Silver,不过目前没正式发布,它不仅支持 Swift,还支持 C# 和自创的 Oxygene 语言(看起来像 Pascal),在界面方面它还有个跨平台非 UI 库 Sugar,然而目前 Star 数只有 17,太非主流了,所以实在懒得研究它。

使用 Swift 编译为 SO 给 Android 用虽然可行,但目前相关工具都不太成熟,所以不推荐使用。

Go

Go 是最近几年很火的后端服务开发语言,它语法简单且高性能,目前在国内有不少用户。

Go 从 1.4 版本开始支持开发 Android 应用(并将在 1.5 版本支持 iOS),不过前只能调用很少 的 API,比如 OpenGL 等,所以只能用来开发游戏,但我感觉并不靠谱,现在还有谁直接基于 OpenGL 开发游戏?大部分游戏都是基于某个框架的,而 Go 在这方面太缺乏了,我只看到一个桌面端 Azul3D,而且非常不成熟。

因为 Android 的 View 层完全是基于 Java 写的,要想用 Go 来写 UI 不可避免要调用 Java 代码,而这方面 Go 还没有简便的方式,目前 Go 调用外部代码只能使用 cgo,通过 cgo 再调用 jni,这需要写很多中间代码,所以目前 Go 1.4 采用的是类似 RPC 通讯的方式来做,从它源码中例子可以看出这种方式有多麻烦,性能肯定有不小的损失。

而且 cgo 的实现本身就对性能有损失,除了各种无关函数的调用,它还会锁定一个 Go 的系统线程,这会影响其它 gorountine 的运行,如果同时运行太多外部调用,甚至会导致所有 gorountine 等待。

这个问题的根源在于 Go 的栈是可以自动扩充的,这种方式有利于创建无数 gorountine,但却也导致了无法直接调用 C 编译后的函数,需要进行栈切换。

所以使用 Go 开发跨平台移动端应用目前不靠谱。

话说 Rust 没有 Go 的性能,它调用 C 函数是没有性能损耗的,但目前 Rust 还没提供对 iOS/Android 的官方支持,尽管有人还是尝试过是可行的,但现在还不稳定,从 Rust 语言本身的设计来看,它挺适合取代 C++ 来做这种跨平台公共代码,但它的缺点是语法复杂,会吓跑很多开发者。

Xojo

我之前一直以为 BASIC 挂了,没想到还有这么一个特例,Xojo 使用的就是 BASIC,它有看起来很强大的 IDE,让人感觉像是在用 VisualBasic。

它的定位应该是给小朋友或业余开发者用的,因为似乎看起来学习成本低,但我不这么认为,因为用得人少,反而网上资料会很少,所以恐怕成本会更高。

因为时间关系,以及对 BASIC 无爱,我并没有怎么研究它。

小结

从目前分析的情况看,C++ 是比较稳妥的选择,但它对团队成员有要求,如果大家都没写过 C++,可以试试 Xamrin 或 RoboVM。

虚拟机流

除了编译为不同平台下的二进制文件,还有另一种常见做法是通过虚拟机来支持跨平台运行,比如 JavaScript 和 Lua 都是天生的内嵌语言,所以在这个流派中很多方案都使用了这两个语言。

不过虚拟机流会遇到两个问题:一个是性能损耗,另一个是虚拟机本身也会占不小的体积。

Java 系

说到跨平台虚拟机大家都会想到 Java,因为这个语言一开始就是为了跨平台设计的,Sun 的 J2ME 早在 1998 年就有了,在 iPhone 出来前的手机上,很多小游戏都是基于 J2ME 开发的,这个项目至今还活着,能运行在 Raspberry Pi 上。

前面提到微软提供了将 Objective-C 编译在 Windows Phone 上运行的工具,在对 Android 的支持上我没找到的详细资料,所以就暂时认为它是虚拟机的方式,从 Astoria 项目的介绍上看它做得非常完善,不仅能支持 NDK 中的 C++,还实现了 Java 的 debug 接口,使得可以直接用 Android Studio 等 IDE 来调试,整个开发体验和在 Android 手机上几乎没区别。

另外 BlackBerry 10 也是通过内嵌虚拟机来支持直接运行 Android 应用,不过据说比较卡。

不过前面提到 C# 和 Java 在 iOS 端的方案都是通过 AOT 的方式实现的,目前还没见到有 Java 虚拟机的方案,我想主要原因是 iOS 的限制,普通 app 不能调用 mmap、mprotect,所以无法使用 JIT 来优化性能,如果 iOS 开放,或许哪天有人开发一个像微软那样能直接在 iOS 上运行 Android 应用的虚拟机,就不需要跨平台开发了,大家只需要学 Android 开发就够了。。。

Titanium/Hyperloop

Titanium 应该不少人听过,它和 PhoneGap 几乎是同时期的著名跨平台方案,和 PhoneGap 最大的区别是:它的界面没有使用 HTML/CSS,而是自己设计了一套基于 XML 的 UI 框架 Alloy,代码类似下面这个样子:

app/styles/index.tss".container": {  backgroundColor:"white"},// This is applied to all Labels in the view"Label": {  width: Ti.UI.SIZE,  height: Ti.UI.SIZE,  color: "#000", // black  transform: Alloy.Globals.rotateLeft // value is defined in the alloy.js file},// This is only applied to an element with the id attribute assigned to "label""#label": {  color: "#999" /* gray *                        

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读