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

  • 赵劼

2012 年 5 月 2 日

话题: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 作为一个虚拟机也更为成熟,在过去的十年里进行着不断地改进,现在可谓经历了第八代的优化了。

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

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 也会感谢我们呢!

更多有关 Mono 的信息,请访问InfoQ 上的详细内容


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

C#Android语言 & 开发