速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

  • 2012-05-02
  • 本文字数:2421 字

    阅读完需:约 8 分钟

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

2012-05-02 20:1011307
用户头像

发布了 157 篇内容, 共 54.9 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

网络攻防学习笔记 Day66

穿过生命散发芬芳

网络攻防 7月日更

Linux之find常用命令汇总

入门小站

Linux

InnoDB存储引擎-锁

CodeWithBuff

MySQL innodb

数仓开发人员经常说的ETL,到底是什么

奔向架构师

数据仓库 数据架构 7月日更

模块一作业

Geek_35a345

三分钟搞懂依赖注入

喵叔

7月日更

Redis 高级特性

QiLab

redis

【架构实战营1期】模块一作业

Abner S.

架构实战营 #架构实战营

我猜你也在找内网渗透,这篇难道还不够你嚼烂?

网络安全学海

运维 网络安全 信息安全 渗透测试 内网渗透

搞测试是件费脑子的事

IT蜗壳-Tango

7月日更

使用 docker 构建时取出构建文件的三种方法

耳东@Erdong

Docker 7月日更 docker build

辞职1000小时后,我走进字节跳动拿了offer

Java 程序员 面试 java编程

第一周作业

Morphling

#架构实战营

一文掌握OLAP和DataCube数据魔方应用

白贺BaiHe

OLAP BI 数仓 7月日更 DataCube数据魔方

一行Python代码到底有多强大?

Jackpop

Python 大数据

中层管理者挖掘需求的七大法宝

石云升

读书笔记 需求 职场经验 管理经验 7月日更

入职腾讯一周年了

程序员鱼皮

Java 腾讯 大前端 实习 校招

关于数据安全

奔向架构师

大数据 数据安全

从零开始构建企业级推荐系统(二十九)

Databri_AI

产品 推荐系统

关于胖指针的应用

老实人Honey

架构实战营

VS Code有哪些奇技淫巧?

Jackpop

vscode

从现在开始用 NanoID 会取代UUID

devpoint

JavaScript uuid 7月日更

5分钟速读之Rust权威指南(三十六)模式匹配

wzx

rust

模块一作业

lhp

架构实战营

架构实战营 模块一作业

孫影

架构实战营 #架构实战营

学习笔记如何写?

Nydia

程序员外包避坑指南?

孙叫兽

程序员 外包

为了对抗内卷,我“偷”了阿里两份笔记:JDK源码+Java并发图册

Java架构师迁哥

架构实战营 模块一 作业

酷飞不会飞

架构实战营

[架构实战营][模块一作业]

KK_TTN

#架构实战营

6款工具,让协同开发变得轻而易举!

Jackpop

vscode 开发工具

Xamarin:使用C#移植Android操作系统_C#_赵劼_InfoQ精选文章