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

\ 531bc7db2a8a1735b9b50aa663a35e51.png
\

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

\

4c20af654c343796242d753b99723be5.png

\
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)关注我们,并与我们的编辑和其他读者朋友交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值