微信号:infoqchina

介绍:有内容的技术社区媒体

RubyMotion宣布将支持Android

2014-08-19 10:53 InfoQ

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时,应用程序有没有显著的性能降低?


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


InfoQ: 谢谢您接受我的采访。


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


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


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 架构高冷梗——云服务世界的神奇事件 W3C新版HTML5标准无视WHATWG GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD) 过爆了的「携程信用卡事件」 Electron - 创建跨平台的桌面客户的应用程序