在最近的GR8Conf Europe 2014期间,SpringSource/Pivotal的Groovy高级软件工程师 Cédric Champeau已经在Andriod上完成一次Groovy代码的现场pull请求的合并。
Groovy开发人员为了在Android上运行Groovy已经等待好几年了。因为各种困难,它的实现被推迟了,这包括Andriod Dalvik虚拟机的不同字节码和Groovy代码的动态特性等。官方对Android的支持可能在Groovy2.4版本。InfoQ采访了 Champeau,了解了更多的这方面的内容以及未来Groovy在Andriod系统中的发展。
InfoQ:让Groovy在Android上工作,最困难的部分是什么?
实际上有多个问题,它们结合在一起使得这个工作变得有些困难。第一个问题是Groovy是一个在运行时生成类的动态语言。问题是那些类是使用标准的JVM格式生成的,而Android使用了自己的类格式(Dalvik VM)。Dalvik VM并不意味着运行时创建类,这样就变得很困难,因为每个使用标准JVM字节码的文件都需要通过'dex'工具加载处理。甚至你能够在设备上做到这些,运行时加载类仍然是痛苦的。例如,在jar文件中写一个类,然后加载这个jar。最后,我们决定这不是Groovy运行在Android上的主要关注点,我们应该更关注用Groovy写一个完整的应用,不涉及运行时创建类。这意味着有一些限制,但是这对许多用户来说是不可见的。最后,如果你在Android上静态编译Groovy时,使用了@compileStatic,性能以及内存消耗相当于或者同Android原生应用相同。
第二个问题实际上是和系统构建相关。新的Andriod构建系统使用了Gradle和一个自定义的插件,"android",它绕过了正常的"java"和"groovy"插件提供类似于应用程序变种的功能。这需要一些工作来弄清楚我们如果插入它来添加对Groovy的支持。令人欣慰的是自从公布以后,Groovy的Gradle插件和Android已经发布,使得事情变得更容易了。最后但并非最不重要的一点,我通过编写对Groovy的支持了解了Android。这是一件好事情,因为我可以看到在哪些地方使用Groovy会让你受益,但是实际上这花费我更多的时间比适配Groovy本身!
InfoQ:将来会考虑将这项工作扩展到iOS或者至少是Windows Phone来作为一中跨平台解决方案吗?
我肯定非常希望能在iOS上面看到Groovy的身影,但是我没有硬件设备去测试;)即使最近发布的Swift语言看起来与Groovy非常接近并且远远比Object-C吸引人,人们仍然可以把它作为Groovy的一种替代。但是,我们还要考虑这样一个问题:Swift是由供应商封锁的闭源软件。相比之下,Groovy则是完全开源的,如果你能在iOS和Android平台下用Groovy进行编码,举个例子来说,人们可能需要做的仅仅是重写他们应用的UI部分就可以使他们的应用更适应大部分的手机开发。至于Windows Phone,我完全不知道这是否可行。实际上对于这个平台,我了解甚少。
InfoQ: 当前有哪些不足之处? 还有哪些是不能运行的?
直到最近,仅仅@CompileStatic类能运行在Android上。但是现在也可以运行动态代码了,因此几乎所有的东西都能运行了,包括构建器。应当知道,使用动态代码应限于应用程序的非CPU密集型部分,因为它涉及到反射。这就是说,当前的限制是不能运行时实时构建类,因此一些特定的结构比如映射到类或者实时运行特征将不工作。欣慰的是有办法解决这些问题。最后,在方法描述符的数量上仍然有问题。Andriod缺省的方法总量的限制是65536,这相当的低,在无优化的情况下,Groovy将消耗8k(例如,ProGuard)。因此这意味着比通常的java应用程序更快的到达限制,即使有方法可以解决这件事情(例如用multidex选项)。
InfoQ:对将来Groovy/Android的发展有何规划?
CC: 官方对Android的支持会有第一个测试版的Groovy2.4。目前,你已经可以将其应用于自己的应用程序,并且实际上在第一个示例应用程序中,这已经包含在产品中。([2])但是它仅是基于Groovy的一个快照版本。但我真的很想看看新的库或框架编写的Groovy是如何便利Android应用程序的开发。Android非常啰嗦,Groovy则可以使编码更容易。为此,我们很多社区的开发人员已经写了大量的像这样的为Java开发的库,所以Groovy的普及和发展只是时间问题。我相信一旦用户在Android上面体验到了Groovy,他们不太可能切换回Java;)
[1] https://github.com/melix/groovy-android-gradle-plugin
[2] https://play.google.com/store/apps/details?id=me.champeau.gr8confagenda.app