HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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:1011264
用户头像

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

关注

评论

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

Java程序员福音!蚂蚁+字节

爱好编程进阶

Java 面试 后端开发

使用APICloud & 科大讯飞SDK快速实现语音识别功能

YonBuilder低代码开发平台

前端开发 语音识别 APP开发 APICloud 科大讯飞

java高级用法之:绑定CPU的线程Thread-Affinity

程序那些事

Java Netty 程序那些事 4月月更

深入浅出聊Taier—大数据分布式可视化DAG任务调度系统

袋鼠云数栈

大数据 开源 分布式 前端

限时好礼 | MongoDB又有新书籍出炉啦!

MongoDB中文社区

mongodb

哪家堡垒机好用?过来人指点一下!

行云管家

数据库 数据安全 堡垒机

Leetcode 14天算法挑战 D1-1 #704 二分搜索

米菲爸爸

面试 LeetCode

2022中国“SaaS”领域十大趋势

小炮

SaaS SaaS应用 SaaS平台

TiDB 6.0 的「元功能」:Placement Rules in SQL 是什么?

Geek_2d6073

无聊科技正经事周刊(第2期):线上马拉松你会参加吗?

潘大壮

程序员 周刊 科技周刊

百万奖金,首届船海数据智能应用创新大赛正式开赛

科技热闻

SFTP是什么协议?优势有哪些?与FTP有什么不同?

行云管家

运维 ftp sftp

珠宝行业电子秤串口程序开发

108518

珠宝行业erp 珠宝天平 电子秤

学习管理管理系统解决方案

低代码小观

学习方法 企业管理 企业管理系统 教育管理 CRM系统

应对“反洗钱”,银丰新融反洗钱自主监测系统为机构保驾护航

华为云开发者联盟

数据库 分布式架构 GaussDB 反洗钱 鲲鹏云

6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

MASA技术团队

C# .net 测试 压测 测试工具

怎么建立无法删除的文件夹?

InfoQ IT百科

java进阶篇02、注解、反射与动态代理

爱好编程进阶

Java 面试 后端开发

Java面试-volatile的内存语义

爱好编程进阶

Java 面试 后端开发

重磅!业界首个云原生批量计算项目Volcano正式晋级为CNCF孵化项目

华为云开发者联盟

云原生 Volcano 批量计算 cncf

深挖房地产行业数智化转型升级价值,推动地产管理革新

数商云

产业互联网 数字化转型 企业数字化

浅析mysql性能优化

乌龟哥哥

4月月更

活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?

tapdata

数据库

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

爱好编程进阶

Java 面试 后端开发

天翼云发布基于欧拉双版本的自研操作系统——CTyunOS

天翼云开发者社区

基于Feature Flag的下一代开发模式

字节跳动数据平台

字节跳动 AB testing实战 ab测试

TASKCTL 用户权限操作设置

敏捷调度TASKCTL

DevOps 分布式 敏捷开发 ETL系统 自动化运维

Java面试必备:阿里首发面试通关宝典震撼开源,文档

爱好编程进阶

Java 面试 后端开发

无聊科技正经事周刊(第3期):美团的推荐算法,是在玩火吗?

潘大壮

程序员 周刊 行业趋势 科技周刊

将node项目部署到云服务器详细教程

CRMEB

自助洗车加盟!自助洗车品牌大全

共享电单车厂家

自助洗车加盟 自助洗车品牌

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