Xamarin:使用C#移植Android操作系统

Oracle和Google针对Android中Java的专利问题鏖战正酣,与此同时Xamarin正在尝试使用C#移植Android操作系统,完全替换其中的Java代码。虽然这Xamarin表明这不会是公司的主要业务,但这依然会是一个十分有趣的尝试,并且对于其拳头产品之一,Mono for Android的进一步发展也会有很好的帮助。

Xamarin的前身是Novell公司的Mono团队,去年从Novell中剥离出来,并拥有关于Mono所有的专利及知识产权,其主营业务也是 围绕Mono进行的跨平台应用开发,覆盖iOS(iPhone/iPad),Android等主流移动设备。使用Mono以及Xamarin的产品,开发 人员能够使用C#和.NET开发各平台上的原生应用程序,并能够跨平台共享除界面之外的代码,减少开发成本。

Xamarin表示,Java并非是Android上开发原生应用的唯一方法,甚至也不是最好的方法,Xamarin的主力产品Mono for Android可以让开发人员创建更高效,更省电的应用程序。与Sun的做法不同,微软从一开始就将C#.NET虚拟机提交为ECMA标准,这些标准遵循ISO的专利承诺,也受到微软自身发布的,具有法律效力的社区承诺覆盖,微软承诺不会追究这些标准中涉及的专利问题。

Xamarin团队在博客里写到:

去年7月,当Xamarin刚成立的时候,我们在Boston召集了整个团队一起商讨iOS和Android上Mono的演进计划。某日,在结束了 一天的查理士河上的皮艇活动之后,我们在饭桌上讨论如何改进Android应用程序的性能和耗电,以及如何让Mono for Android变得更好。

最后我们回到了底层问题上:Dalvik还是个年轻的虚拟机,它没有经过Mono那样的性能调优,在受限于Java的许多性能限制的同时,也缺少如 Oracle HotSpot那样强大的后端优化能力。在那次晚餐中,我们的团队迸发出了一个疯狂的念头:不如将Android源代码翻译成C#吧。这样Android 就可以得益于C#的高效功能,例如结构体,P/Invoke,真正的泛型,还有我们更为成熟的运行时作为后盾。

虽然那年7月最终什么都没有发生,但这个念头深深地印在了我们的脑海里。

把时钟快速向后拨几个月:Mono for Android已经获得了令人瞩目的成果,于是我们再一次开始思考如何改进产品在Android上的性能。如果我们把Java替换成更快的C#,以此避免 Dalvik带来的各种限制又会怎么样呢?我们可以让一个Android手机完全摆脱Java,摆脱Dalvik虚拟机的限制吗?

我们觉得这个点子已经疯狂到值得一试了。于是,从一个小项目开始,我们以完整翻译Android中的Java部分至C#为目标开始前进。我们把这个项目称为XobotOS。

目前XobotOS的绝大部分Android层已经完全改写为C#,Xamarin还公开了一幅XobotOS在Linux工作站上运行的截图,其中完全没有Java的存在。

Android的核心代码包含数百万行Java代码,同时Xamarin团队希望可以保持同步更新——事实上XobotOS项目是从Android 2.x开始的,直到今年在Google开源了Ice Cream Sandwish之后才升级至Android 4.0。因此,唯一可靠的做法似乎只有Java到C#的自动翻译了,在这个过程中还需要创建维护各种所需的工具。一开始Xamarin团队使用了 Sharpen,它的著名案例之一,便是由Frank Krueger将一个Java Applet程序自动翻译为C#代码,基于MonoTouch打造出一款著名的iOS应用iCircuit,并得到了苹果官方的推荐。Xamarin团队对Sharpen进行了许多改进,让这个Java至C#的代码转化工具变得更为成熟。目前新版的Sharpen已经随XobotOS一起发布,Xamarin团队希望更多的人能从中获利,并贡献出自己的力量。

对于Android是如何从Mono上面获得比Dalvik更好的性能,Xamarin团队谈到:

微软对C#进行了一些改进,大大简化了代码优化的难度。例如它引入了值类型,降低了小型对象带来的开销;同时虚方法不再默认启用,这降低了虚拟机的性能优化难度。更进一步的是,Java和C#在泛型实现方式上分道扬镳,Java采用了完全向前兼容的做法,而C#在运行时上构建了支持。C#的做法更为易懂易用,也更为高效和完备。

从那时起,两种语言和执行环境都在不断改进。C#原本只是一门“稍稍优于”Java的语言,如今两者的差距何止以千里计。从动态编程,到引入异步支 持,还有迭代器,函数式编程组件,拥抱并行化,乃至泛型的优秀实现。其中大量的功能来自于Don Syme的的研究,他的F#小组还在继续引领语言发展的新思路。

更重要的是,Mono作为一个虚拟机也更为成熟,在过去的十年里进行着不断地改进,现在可谓经历了第八代的优化了。

Mono优化

Xamarin认为这些都是影响性能的因素。例如,由于结构体和泛型的影响,一个简单的二叉树性能测试便可以看出Java和C#两者间存在显著的性能差别:

Java vs. C#, Binary tree benchmark

Xamarin宣布,他们已经在GitHub上公开了XobotOS的源代码,任何人可以自由尝试。不过他们也谈到,公司的目标是提供最好的移动应用开发平台,因此XobotOS不会是公司的重心,不过这依然是一次十分有趣的体验,一些技术产出也可以融入未来的产品之内,例如:

  • 直接访问Skia图形引擎:目前Mono for Android通过Java来访问下层图形类库,而通过XobotOS中的代码,便可以跳过这个中间人,使用Mono的P/Invoke技术直接访问Skia的原生渲染代码。
  • Java到C#的转换工具:新版Sharpen已经随XobotOS一起发布
  • 将Java代码替换为C#代码:对于一些性能敏感的部分,可以使用C#来代替Java以换取更好的效率,这个研究项目的一些特性将会融入未来的产品当中。

Xamarin创建XobotOS研究项目的目的,一是好玩,二是对产品有实实在在的收益。他们表示:

对于一个创业公司来说,专注固然重要,但有时候也需要尝试一些疯狂的想法来推动自身前进——说不定有一天,Google也会感谢我们呢!

你可能感兴趣的:(android)