2KB项目,专业的源码交易网站 帮助 收藏 每日签到

开发一个移动跨平台库 —— 第一部分:探索

  • 时间:2019-01-23 18:37 编辑:2KB 来源:2KB.COM 阅读:327
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:Dev
英文原文:Developing a mobile cross-platform library - Part 1. Exploring

本文中,我介绍了我在探索开发移动跨平台库(例如一个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

其它翻译版本 (1) 加载中

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

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

选项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吗?

选项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++类库之间的桥梁,这两种语言的对象可以相互转化.

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

 

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

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

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

选项 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。这个选项被否决了,因为这个项目已经失效。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部