加入收藏 | 设为首页 | 会员中心 | 我要投稿 网站开发网_安阳站长网 (https://www.0372zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

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

编译流比前面的代码转换更进一步,它直接将某个语言编译为普通平台下的二进制文件,这种做法有明显的优缺点:

  • 优点
    • 可以重用一些实现很复杂的代码,比如之前用 C++ 实现的游戏引擎,重写一遍成本太高
    • 编译后的代码反编译困难
    • 或许性能会好些(具体要看实现)
  • 缺点
    • 如果这个工具本身有 Bug 或性能问题,定位和修改成本会很高
    • 编译后体积不小,尤其是如果要支持 ARMv8 和 x86 的话

接下来我们通过区分不同语言来介绍这个流派下的各种方案。

C++ 类

C++ 是最常见的选择,因为目前 Android、iOS 和 Windows Phone 都提供了 C++ 开发的支持,它通常有三种做法:

  • 只用 C++ 实现非界面部分,这是官方比较推崇的方案,目前有很多应用是这么做的,比如 Mailbox 和 Microsoft Office。
  • 使用 2D 图形库来自己绘制界面,这种做法在桌面比较常见,因为很多界面都有个性化需求,但在移动端用得还不多。
  • 使用 OpenGL 来绘制界面,常见于游戏中。

使用 C++ 实现非界面部分比较常见,所以这里就不重复介绍了,除了能提升性能和共用代码,还有人使用这种方式来隐藏一些关键代码(比如密钥),如果你不知道如何构建这样的跨平台项目,可以参考 Dropbox 开源的 libmx3 项目,它还内嵌了 json 和 sqlite 库,并通过调用系统库来实现对简单 HTTP、EventLoop 及创建线程的支持。

而如果要用 C++ 实现界面部分,在 iOS 和 Windows Phone 下可以分别使用 C++ 的超集 Objective-C++ 和 C++/CX,所以还比较容易,但在 Android 下问题就比较麻烦了,主要原因是 Android 的界面绝大部分是 Java 实现的,所以用 C++ 开发界面最大的挑战是如何支持 Android,这有两种做法:通过 JNI 调用系统提供的 Java 方法或者自己画 UI。

第一种做法虽然可行,但代码太冗余了比如一个简单的函数调用需要写那么多代码:

JNIEnv* env;jclass testClass = (*env)->FindClass(env, "com/your/package/name/Test"); 
// get ClassjmethodID constructor = (*env)->GetMethodID(env, cls, "", "()V");jobject testObject = (*env)->NewObject(env, testClass, constructor);methodID callFromCpp = (*env)->GetMethodID(env, testClass, "callFromCpp", "()V");
//get methodid(*env)->CallVoidMethod(env, testObject, callFromCpp);

那自己画 UI 是否会更方便点?比如 JUCE 和 QT 就是自己画的,我们来看看 QT 的效果:

移动开发技术 跨平台开发技术 开发技术

看起来很不错是吧?不过在 Android 5 下就悲剧了,很多效果都没出来,比如按钮没有涟漪效果,甚至边框都没了,根本原因在于它是通过 Qt Quick Controls 的自定义样式来模拟的,而不是使用系统 UI 组件,因此它享受不到系统升级自动带来的界面优化,只能自己再实现一遍,工作量不小。

反而如果最开始用的是 Android 原生组件就什么都不需要做,而且还能用新的 AppCompat 库来在 Android 5 以下实现 Material Design 效果。

最后一种做法是使用 OpenGL 来绘制界面,因为 EGL+OpenGL 本身就是跨平台,所以基于它来实现会很方便,目前大多数跨平台游戏底层都是这么做的。

既然可以基于 OpenGL 来开发跨平台游戏,是否能用它来实现界面?当然是可行的,而且 Android 4 的界面就是基于 OpenGL 的,不过它并不是只用 OpenGL 的 API,那样是不现实的,因为 OpenGL API 最初设计并不是为了画 2D 图形的,所以连画个圆形都没有直接的方法,因此 Android 4 中是通过 Skia 将路径转换为位置数组或纹理,然后再交给 OpenGL 渲染的。

然而要完全实现一遍 Android 的 UI 架构工作量不小,以下是其中部分相关代码的代码量:

移动开发技术 跨平台开发技术 开发技术

其中光是文字渲染就非常复杂,如果你觉得简单,那只能说明你没看过这个世界有多大,或许你知道中文有编码问题、英语有连字符(hyphen)折行,但你是否知道繁体中文有竖排版、阿拉伯文是从右到左的、日语有平假名注音(ルビ)、印度语有元音附标文字(abugida )……?

而相比之下如果每个平台单独开发界面,看似工作量不小,但目前在各个平台下都会有良好的官方支持,相关工具和文档都很完善,所以其实成本没那么高,而且可以给用户和系统风格保持一致的良好体验,所以我认为对于大多数应用来说自己画 UI 是很不划算的。

不过也有特例,对于 UI 比较独特的应用来说,自己画也是有好处的,除了更灵活的控制,它还能使得不同平台下风格统一,这在桌面应用中很常见,比如 Windows 下你会发现几乎每个必备软件的 UI 都不太一样,而且好多都有换肤功能,在这种情况下很适合自己画 UI。

(编辑:网站开发网_安阳站长网)

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