BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

RubyMotion宣布将支持Android

| 作者 Mirko Stocker 关注 0 他的粉丝 ,译者 李士窑 关注 0 他的粉丝 发布于 2014年8月19日. 估计阅读时间: 6 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

RubyMotion为开发者带来了使用Ruby编写iOS和OS X 应用的一系列工具,它使用基于LLVM编译器进行代码编译,将Ruby编写的程序代码编译成本地原生代码。即将发布的3.0版本将支持Android应用的开发。Android的开发过程将类似于在iOS平台上的开发:Rake用来构建和运行应用,并生成清单文件和处理资源文件。

HipByte为Android版本构建了一个全新的Ruby运行库。为了提高性能和实现与Java的互操作性,Ruby的核心类(Fixnum、String、Array等)都是同Java对应的。

统一的运行方式使得它与Java API能够很好的整合在一起,由于对象不必使用桥接方式进行整合,因此整体上具有良好的性能表现。运行库将通过调用Java本地接口实现与Java的整合。不仅如此,Ruby版本的运行库本身就包含了Android的整套API。

内存管理委派给了Dalvik的逐代回收和并发垃圾收集器。当需要创建和销毁全局引用时,运行库负责做这些事情,如一个实例变量是一个集合时,而局部变量的内存回收是在编译时确定的。

垃圾收集器是非常高效的,它在每个线程上都分配了对象分配池,实现了快速的对象分配。它会在指定的线程上运行终结方法,并能够妥善处理循环引用的问题。

我们很好奇,他们是如何实现Ruby运行库的垃圾回收器,如何以静态方式把Ruby代码编译成机器码,以及如何与Android运行库进行整合。所以我们对HipByte的创始人Laurent Sansonetti做了一次访谈。

InfoQ:使用 RubyMotion的时候,在不需要桥接的情况下就能够实现将 Ruby的类直接映射到Java类,并且依然能够被编译成机器码,您能详细说明这一切是怎么发生的吗?

Android的Java虚拟机有一套对应C语言的API叫做JNI,它允许开发者使用C代码与Java虚拟机进行交互。在Android系统里,这就是NDK的一部分。

RubyMotion是Ruby的静态编译版本。静态编译器能够将Ruby代码转换成机器码。在Android中,生成的机器代码能够调用JNI API实现与的Java交互(例如发送Java方法)。

整个处理过程和新的Android运行原理(简称ART)是相似的。据我所知,唯一的不同之在于,RubyMotion开发的应用程序被预编译成机器码,而在ART中,应用程序是在运行设备上进行编译的。

Ruby的对象模型已经使用Java进行了重写,这就意味着Ruby的所有对象到Java对象的对应无需进行桥接、修改、转换,反之亦然。类似的,一些Ruby核心内建类是也是与Java一一对应的(如Ruby中的Array就是基于java.util.ArrayList的)。

InfoQ:当您编译代码时,您是怎么处理Ruby元编程组件的?

事实上,RubyMotion提供的Ruby的编译版本完全支持元编程。我们提供了一整套元编程API,#eval是唯一的一个例外,因为我们没有在应用中提供解释器(主要还是为了遵循苹果的政策)。

InfoQ:您是使用Dalvik的垃圾回收器,但是垃圾回收器是怎么回收本地代码分配的内存呢?

由Ruby代码生成的本地代码是间接使用Dalvik (或者 ART)垃圾回收器进行垃圾回收的,因而所有的内存都是托管对象。对于一些特殊对象,运行库需要进行手动分配内存,并且在调用finalize时,进行这些对象的内存回收。

InfoQ:我是否还能够继续使用我最喜欢的RubyGems?

支持Android版本的RubyMotion具有一定的局限性,这和支持iOS与OS X版本的RubyMotion是一样的。这是因为RubyMotion是Ruby的一个静态编译版本,#require 是被不支持的(在编译时必须提供所有文件),另外, #eval也没有被实现(参见上文)。因此,常规的RubyGems不能正常使用。

RubyMotion有专门为自己设计的gems,motion-toolbox.com有一个由社区维护的精选的RubyMotion库列表。

InfoQ:您现在能说下关于RubyMotion开发的应用程序性能的一些情况吗?当使用JNI时,应用程序有没有显著的性能降低?

我们还没有在性能方面投入过多精力,但是做了初步的测试,并且这些测试运行良好,也没有明显的性能下降 。调用JNI看上去也没有问题。事实上,它和很多Android运行库有一样的性能表现,并且都使用了相同的API。

InfoQ: 谢谢您接受我的采访

支持Android版本的RubyMotion目前还未发布,但他们正在寻找感兴趣的beta版本测试者。最终的版本将在今年晚些时候发布。

您是否有RubyMotion实现的iOS应用,且正打算迁移到Android环境?您是一个想要使用Ruby编写应用的Android开发者吗(或许你已经是了)?你对使用RubyMotion进行Android应用开发有什么想法吗?

查看英文原文RubyMotion Announces Android Support


感谢邵思华对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT