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

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

关注

评论

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

恒源云(GPUSHARE)_LLD: 内部数据指导的标签去噪方法【ACL 2022】

恒源云

人工智能 深度学习

【教程直播第4期】揭秘数据迁移之 OceanBase CDC & OMS 社区版能力

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版

react源码解析14.手写hooks

buchila11

React

MySQL数据库升级后如何防止性能下降

@零度

MySQL

在线JSON转sarcastic工具

入门小站

工具

10个常见的前端手写功能,你全都会吗?

CRMEB

养孩子到底有多难?

Tiger

28天写作

volatile和synchronzied的区别

悟空聊架构

synchronized 28天写作 悟空聊架构 12月日更 volatitle

react源码解析13.hooks源码

buchila11

React

Kafka-Broker的基本模块

编程江湖

大数据

为什么我不怎么用调试器

Justin

软件开发 28天写作 调试工具

DataPipeline实时数据融合产品入驻青云云市场,催化企业数据价值释放

DataPipeline数见科技

大数据 中间件 Big Data 数据融合 数据管理

重点人员动态管控系统开发,智慧公安预警管控平台

电微13828808271

【北京讲座报名!】12月26日与深度学习大牛共赋技术之约!

亚马逊云科技 (Amazon Web Services)

人工智能 深度学习 活动 ML

Java开发之命名规范

@零度

Java 命名规范

从直播硬件出发,浅析直播技术到物联网设备的智能化趋势

阿里云视频云

阿里云 物联网 直播 直播技术 视频云

压测大师链路监控服务开放免费体验预约

WeTest

Vue 路由组件传参的 8 种方式

编程江湖

Vue 前端开发

记字节前端面试一道简单的算法题

全栈潇晨

LeetCode 算法面试

30个类手写Spring核心原理之自定义ORM(上)(6)

Tom弹架构

Java spring 源码

Android C++系列:Linux Socket编程(四)多路IO转接服务器

轻口味

28天写作 12月日更

公安情报研判系统开发,情报可视化分析研判平台解决方案

电微13828808271

飞桨企业版重磅发布智能边缘控制台,5分钟零代码自动化模型部署

百度大脑

人工智能

拍乐云测试自动化实践

拍乐云Pano

DevOps 敏捷开发 自动化测试

一文搞懂TopK问题

bigsai

数据结构 算法

Linux一学就会之Linux系统启动原理及故障排除

学神来啦

Linux 运维 黑客 linux运维 linux云计算

dart系列之:dart优秀的秘诀-隔离机制

程序那些事

flutter dart 程序那些事 12月日更 flutter for web

微服务架构 | 如何优化日志链路追踪输出SQL的执行效率?

码农架构

微服务架构 链路追踪 SpringCloud

智慧社区综合服务管理平台,社区管理系统搭建

电微13828808271

VUEX的store用法

CRMEB

Linux之mv命令

入门小站

Linux

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