BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 赵劼 关注 4 他的粉丝 发布于 2012年5月3日. 估计阅读时间: 8 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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

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


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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

我简单用过Mono for Android by z x

但是感觉mono啥的要装还是挺大的。
如果是原生C#安卓底层代码。

那么是不是刷机以后就不用装环境了?,直接用c#开发。
貌似也没有这么简单。

我感觉虽然看起来很美,但是离商业化运营还有很大距离。
要是微软投点资就好了。

Re: 我简单用过Mono for Android by Jeffrey Zhao

试用版Mono for Android会需要在手机上装Mono,所以只用试用版的话结论是不正确的……Mono不会装到Android上面去,是把需要的部分内嵌到应用里去。

还有他们都写清楚了这只是个研究项目,旨在提高自身产品质量,他们都不想着商业化,就不用表示“离商业化运营还有很大距离”了……

研究过几个月meego的人 by Wei Fisher

老实说这个东西看不出有什么存在的意义。你说他能兼容android上的那好几x万应用不?如果不能对用户透明的运行apk的话,这就相当于是一个新的OS。
那就更看不出是图个什么,

为了打造一个开源os?还有一个meego(现在有个新名,叫啥没记住)存在呢。
为了性能?meego的Qt代码性能更高。
为了c#?meego上可以直接装mono……扩展一点说,packages.debian.org/packages.ubuntu.com/ 上的包,只要有 armel 的都能直接装到meego上(因为这货根本就是一个ubuntu)

除了android我只研究过meego。所以只能这么比较一下了……别见怪。我不是meego鼓吹者……

Re: 研究过几个月meego的人 by Wei Fisher

我能想到的唯一一个优势就是他也许能直接刷到现在这上万种android设备中,而meego只有一部n9……

Re: 研究过几个月meego的人 by Jeffrey Zhao

还是那句话,连Xamarim自己都说XobotOS只是个研究性项目,是为了更好的改进Mono for Android,您还花了那么多精力设想它的前景和方向,最后得到结论:它没什么存在的意义,多蛋疼啊……

Re: 研究过几个月meego的人 by Wei Fisher

我还的精力远没您花得多,5分钟而已。

实验性项目多了去了,社区的资源有限。借地方打个广告:

哪位大神的公司有用到ti的芯片,坑爹的ti有一小部分代码不是gpl。能否提供一个把 m3 watchdog 从 gp timer 11 改成 gp timer 10 的 ducati_m3.bin。不需要源代码,只要您帮我编译出来就行。

F#和C#那个快? by sl c

F#和C#都在clr上运行,按理说,速度应该是一样的。无疑F#代码长度比C#短,那么,为什么不直接移植到F#呢?

Re: 研究过几个月meego的人 by Jeffrey Zhao

如果您这5分钟用来看文章估计就不会有这问题了,不能光看标题和几个关键字啊。

实验性项目……显然不够多,要不您举一个对Mono for Android有帮助的实验性项目的例子吧。

Re: F#和C#那个快? by Jeffrey Zhao

代码长短又不是唯一选择条件,这个开发人员熟悉程度啊,社区力量多少啊都是考虑条件,否则Android从一开始就应该选择C#而不是Java了对吧,毕竟C#又好用效率又高。

关于ECMA by z c

developers.solidot.org/article.pl?sid=09/07/17/...
“ECMA标准没有定义系统命名空间(namespace)内的库,如binary object serialization,正则表达式,XPath和XSLT等等,因此它们不受微软社区承诺的保护”

不了解Mono,求证。

Re: F#和C#那个快? by sl c

代码长短又不是唯一选择条件,这个开发人员熟悉程度啊,社区力量多少啊都是考虑条件,否则Android从一开始就应该选择C#而不是Java了对吧,毕竟C#又好用效率又高。

确实,现在会F#的人不多,教材也就那两本。学习曲线有些陡峭。但是,F#是一个集各种语言特性一体的多范式编程语言。今天的努力换明天的生产力还是值得的。

Re: 关于ECMA by wang yi

这点和oracle java一样,api是IP

有多少源代码是java,多少源代码是c by sl c

安卓系统本质是linux,linux系统是用c编写的,而本文又说安卓系统是java编写的,所以我估计,安卓一部分是用c编写的,一部分用java编写的。那么,c,java都占了多少份额呢?

Re: 有多少源代码是java,多少源代码是c by shan sheng

我的理解是这样的。android类似于gnome或者kde(gnome又基于xorg我们就不谈了),所以说android是用java开发的,但是都是跑在linux的内核上,内核是用c写的

Re: 我简单用过Mono for Android by shan sheng

微软投资帮助android?那他的windowphone咋办

Re: F#和C#那个快? by Su Roderick

顶F#!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

16 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT