开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
开发一个移动跨平台库 —— 第一部分:探索 - 技术翻译 - 开源中国社区

开发一个移动跨平台库 —— 第一部分:探索 【已翻译100%】

oschina 推荐于 4年前 (共 17 段, 翻译完成于 03-06) 评论 12
收藏  
111
推荐标签: 待读

本文中,我介绍了我在探索开发移动跨平台库(例如一个codebase,可成为不同移动平台上的app的一部分)时积累的经验:从移动跨平台开发工具(PhoneGap,Titanium之类的),到代码移植工具;从无法满足需求的 WebView,到可以满足需求的 C++ 和 JavaScript 引擎。在这个问题上,现有的教程资源比较匮乏,因此我们想分享一些经验可能会有帮助。这是三部曲的第一部,列出了所有我们探索过的解决方案。接下来会发布关于 C++ 和 JavaScript 引擎的部分。

戴仓薯
 翻译得不错哦!

“一次编写,到处运行” 是为阐明 Java 的跨平台功能而编写的著名标语。程序员都希望他们的代码能到处运行。尽管如此,要跟上 CPU 体系结构的变化是如此困难,新的程序语言日日涌现,框架来了又去,并且如果你想跟操作系统打交道,代码的重用性就不必再提。

但是也许,如果我们只把范围限制在移动设备,可能还有机会!近年来移动化的趋势日趋明显,所以开发一个移动跨平台的一定会对一些开发者有所帮助。

戴仓薯
 翻译得不错哦!

如果我们要进一步缩小,到iOS和Android上,它们目前的市场占有率为93.9%。这给我们锁定了7个目标CPU架构/ABI(ARMv7、armv7s、IOS的arm64、armeabi、armeabi-V7A、x86和针对Android的MIPS),以及两种编程语言(iOS的Objective-C和Android的Java)。至于框架和操作系统,支持最新的两个iOS版本应该就足够了,因为新的iOS版本有着较高的使用率,但当涉及到Android时,要有一个不错覆盖率的话我们需要支持Froyo(或者Gingerbread)以后的所有版本。正如你所看到的,这不是件容易的事,但我们需要这样做。 

我们想要做的总结在下图中;在有一些适配特定平台胶水代码的情况下在两个平台间共享一个库。由于Skyscanner严重依赖在于互联网,一些网络函数是不可少的。

The high-level architecture of the mobile apps

Garfielt
 翻译得不错哦!

通常情况下,在iOS中,一个库可以通过Objective-C源代码或预编译的静态二进制库中导入,并要有相应的头文件。在Android中,除了Java源代码,一个库也可以通过.class(字节码)文件和静态/共享二进制库导入。然而,由于这些选择是限制性的,这里的研究将更进一步,去探索在Android和iOS中导入代码的替代方法。 

那么,我们该如何开始呢?有什么选项呢?是否有简化的工具呢?

Garfielt
 翻译得不错哦!

选项1-移动跨平台开发工具

如果你是一名移动开发者,你一定听说过大量的移动跨平台开发工具,比如PhoneGap,Appcelerator Titanium 和Xamarin。它们中的一些工具允许我们开发类库,对吗?

具备这一功能的工具通常存在的主要问题如下:

 1输出到终端产品(.app/ .ipa或者 .apk)而不是类库中

 2嵌入到运行时的环境中运行跨平台的代码,这些代码与在环境中的本地代码交互非常的困难.

  • 网页视图工具-这些工具使用视图做为运行时环境,用JavaScript/HTML5来编写代码.如果它们与运行在网页视图的代码交互困难时,它们将会立即失效.(然而,它总是试图这样,你随后将会发现.)这样的工具包括PhoneGap, RhoMobile,Secha Touch,appMobi, Telerik.

  • Adobe AIR--这的运行时环境中Adobe集成运行时环境.它的失效取决与与AIR中代码交互的困难程度.

  • Xamarin--它只能输出到中间的Xamarin 库中,而不是本地库中.

  • Appcelerator Titanium--创建的本地类库并不是官方支持的,但是它可能是可以工作的,如果我们写Titanium的扩展,这些扩展允许与本地代码交互.太多的麻烦,存在问题的那些结果,同时不确保在下一个版本Titanium的升级中这些功能是否保留.

  • Corona--Corona的员工声称它已支持Android,同时它未来将支持iOS.

  • MoSync--与Corona类似

  • Kony--不支持.

  • Trigger.io--不支持

  • OpenFL--不支持

  • DragonRad--已过时,似乎不支持

因此,失败了,没什么真正可行的:(

但是等一下,难道C/C++的代码不能访问iOS和Android吗?

LitStone
 翻译得不错哦!

选项2--C++

使用C++来开发类库是可行的两个解决方案之一.

在Android平台,本地开发套件(NDK)和Java本地套件框架(JNI)允许Java与C/C++的代码运行和交互.NDK的负责为Android的每个目标对象(armeabi,armeabi-v7a,x86和mips)编译C++代码; 而JNI允许这两种语言沟通交流.使用JNI相当的啰唆;程序员必须遵守命名规则,而且需要用Java和c++两层包装.一方面,通过用Java语言暴露所有的c++类和方法(包括了本地关键字),Java封装提供了一个用于c++类库的Java的接口.另一方面,c++封装提供了Java封状与c++类库之间的桥梁,这两种语言的对象可以相互转化.

LitStone
 翻译得不错哦!

在iOS中,事情就变得简单多了。在此系统中,没有命名规则,只需要采用“Objective-C++”进行额外一层的封装就可以。“Objective-C++”是一种允许变量在单一的源文件中既使用“Objective-C”代码,也可以使用“C++”代码的语言。所以,所有的对象翻译都只发生在这个单一封装层中。你可以查看略微修改后的Android/iOS应用的流程图如下:

 

Haimei
 翻译得不错哦!

引入第三方库也是不常规的,因为程序员不能直接访问JRE/Android以及Cocoa Touch框架。在这种情况下,第三方库可以通过两种方式引入,源代码或预编译的二进制文件(或者找到它们,或者编译它们)。其中的一个特例是执行网络操作(HTTP请求),在标准模板库(STL)中它是不被支持的,所以我们整合了libcurl到跨平台库中。libcurl不能以源代码引入,只能作为一个可执行的配置脚本。幸运的是能够找到为iOS预编译的二进制文件。在Android中,我们使用NDK工具链/编译器为每个Android目标系统编译libcurl。为7个目标架构(3适用于iOS,4为Android)编译库是很费时的,但这个过程的一部分可以用脚本实现自动化。

Garfielt
 翻译得不错哦!

这个措施相当奏效,C++是种流行的语言,它有一个庞大数量的可用的第三方库,并且所有使用的工具(Android的NDK、JNI、Objective-C++)都有官方的解决方案,由谷歌和苹果的支持。这个措施的唯一的缺点是在Android上,如果我们想保持Java包装对象对C++对象的引用,我们必须在Java对象释放前手动回收C++对象(通常叫删除C++对象)。然而,如果没有理由保留C++对象的话,它们可以在被复制成Java中对应部分后立即销毁。 

更多关于这个措施的详细资料(连同一些代码段)将在接下来几周中陆续以特定的文章发表出来。

Garfielt
 翻译得不错哦!

选项 3 - 代码移植

另一个考虑过的选择是,只维护一个代码库,然后用适当的工具把代码翻译为平台对应的语言。这种选择也有它的缺陷:

  • 生成代码效率不会像原生开发者写的那样高。

  • 翻译过程很容易引入Bug,而且必须手动修复。

  • 导入的二进制文件很难被翻译,因为大多数的工具只能翻译源代码。

以下是几种移动平台代码移植工具。遗憾的是,没有一种能满足需求:

  • J2ObjC - Google 开发的工具,用于翻译 Java 代码为 Objective-C 。看起来质量比较高(与以下其他相比)。目前为止,它能把部分 Java 类翻译为 Objective-C ,但开发还没有完成。不幸的是,它目前翻译不了 Java 的 HTTP 请求,但是如果我们为每个平台单独实现这部分功能,也有实现的可能。这个项目从2012年9月建立至今。

  • Hyperloop - 将 JavaScript 翻译为平台原生代码的工具。目前为止,它只支持 iOS ,而且并不稳定,但他们的计划是扩展到所有流行的平台。这个项目从2013年8月建立至今。

  • ObjC2J - 将 Objective-C 翻译为 Java 的工具。这本来也是个很好的思路,但不幸的是,它还不够成熟,含有很多bug,经常输出不能编译的代码。

  • XMLVM - 将 JVM 字节码交叉编译为 Objective-C 的工具。这个工具不仅不够完善,用起来很复杂,并且需要下载/导入很多legacy jar。

  • Apportable - 将 iOS 应用转化为 Android 应用的工具。不幸的是,它达不到我们的要求,因为它只能翻译整个应用,无法翻译库,而且直接输出 .apk(Android 应用安装包)文件。

  • Avian - 轻量级的 Java 虚拟机,可以嵌入 iOS app bundle 并运行 Java 代码。这个方案满足不了需求,因为想要让 iOS 上跑的 UI 代码与虚拟机中跑的 Java 库代码交互非常困难。

  • in the box - 在 iOS 上运行的移植 Dalvik 虚拟机和 Android Gingerbread (2.3) API。这个选项被否决了,因为这个项目已经失效。

戴仓薯
 翻译得不错哦!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
评论(12)
Ctrl/CMD+Enter

来坐沙发!是要多考虑跨平台的问题
见Qt、、、、、、
哈哈哈、、、、、、、
j2objc吧
板凳
cpp软文
用户需要跨平台,程序员实现跨平台是噩梦
目前在用Xamarin,直接webview交互html,挺好的。mono for Android以及mono touch,已经实现了楼主的那个图型结构,只是xamarin的开发成本有点,299美刀/year
哈哈,我做了一个这样的库:
http://blog.csdn.net/tianpad/article/details/18770721
实际应用在开发中,linux,android,ios,html5,windows,linux统统搞定。
第二部分出来了,译文有吗?
@戴仓薯 , @Garfielt , @徐继开 , @out_lier , @LitStone , @Haimei , @yxrykds

引用来自“addcn”的评论

第二部分出来了,译文有吗?
@戴仓薯 , @Garfielt , @徐继开 , @out_lier , @LitStone , @Haimei , @yxrykds

已投递原文,审核通过后就开始译了:)

引用来自“addcn”的评论

第二部分出来了,译文有吗?
@戴仓薯 , @Garfielt , @徐继开 , @out_lier , @LitStone , @Haimei , @yxrykds

没看到原文啊,原文发布出来了吗?

引用来自“Haimei”的评论

引用来自“addcn”的评论

第二部分出来了,译文有吗?
@戴仓薯 , @Garfielt , @徐继开 , @out_lier , @LitStone , @Haimei , @yxrykds

没看到原文啊,原文发布出来了吗?

http://www.skyscanner.net/blogs/developing-mobile-cross-platform-library-part-2-c
顶部