我为什么选择Xamarin

Xamarin是一项跨平台开发技术,之前是收费的,而且据说收费不菲,所以使用的人数比较少,在国内几乎无人问津。后来Xamarin被微软收购,现已免费开放,相信今后国内的使用人群会大幅地增长,一方面是因为免费的东西总是受人欢迎的,另一方面是Xamarin确实提供了一种比较强大的技术来支持跨平台开发(这里所指主要是Android和iOS上的开发,但其实不止于此)。

如今市面上号称可以提供跨平台开发的方案很多,比如React Native、PhoneGap、IONIC等,这些方面大多数都是基于HTML和JavaScript等技术实现的跨平台开发,在开发效率上自然是没话说,但是这些技术在性能上则逊色于原生的开发技术,而这恰恰是Xamarin得以生存的空间。

Xamarin声称可以获得不差于原生技术的性能,甚至在某些方面还有可能超越原生,我想这指的应该在是Android方面。我个人分析,原因可能是这样的。Xamarin使用C#进行开发(好像用F#也可以,不过我没有试过,据说F#也是一门非常不错,以后有时间会学习学习),C#默认方法是非虚的,即在子类中要重写方法,必须在父类中声明为virtual,而java默认所有方法都是虚方法,所以C#可以减少这方面的开销。其次的话,可能是微软毕竟也是老牌的IT公司,在系统软件方面的优化能力不容小觑,手里的黑科技也是不少,敢说这话应该是有底气的。当然这不是最重要的,只要能够在大多数情况获得近似于原生的性能,便已是非常不错了。

Xamarin主要有这么几项技术,Xamarin.Android、Xamarin.iOS和Xamarin.Forms,此外还有Xamarin.UWP、Xamarin.Windows、Xamarin.WinPhone等,但鉴于目前的市场占有率,后面几项可以暂时不去理会。

无论是Xamarin.Android还是Xamarin.iOS,本质都是对原生API做了一层C#的封装,因此在使用上与原生API会十分相似。这种封装会结合一些C#的语法特性,让开发者可以享受C#的语法糖。其中Xamarin.iOS是直接编译成ARM的二进制代码,因此执行效率肯定是非常高的。与此不同,Xamarin.Android被编译成中间语言,Xamarin在APK安装包中会包含一个mono的运行时,代码是在mono运行时和安卓本地的运行时上完成工作的,可想而知,这中间需要付出一些开销,而且会使安装包体积增大许多,但是考虑到设备的运行空间和存储空间都在高速增长,这也不能算是一个特别致命的缺点。

而Xamarin最为关键的技术还不是上面的两项,而是Xamarin.Forms。这项技术把IOS、android、UWP等平台的GUI进行了一统地抽象,开发者只需要写一套代码,编译器会在编译时将界面映射到原先控件上,从而获得原生平台的外观和性能。这种做法对于开发者应该是最喜闻乐见的,至少我是如此,相比于那种运行的虚拟层上的跨平台方式,这种做法性能损耗最少。当然,损耗小并不代表没有,官方也表示,Xamarin.Forms不适合用于开发图形界面操作特别复杂且频繁的应用。遇到这种情况,我们可以用Xamarin.IOS或Xamarin.Android来解决,也就是说Xamarin.Forms可以与Xamarin.IOS或Xamarin.Android在同一个项目结合使用。就以我准备使用Xamarin做输入法为例,根据Xamarin的特点,我用Xamarin.Forms来做输入法的设置界面,节省重复开发一套界面和业务逻辑的精力;而用Xamarin.IOS和Xamarin.Android来做输入法界面,以发挥最大的性能。目前从我实验的结果看,这个想法是可行的。虽然我最开始的想法是连输入法界面也用Forms来做,但发现在输入法界面无法使用Forms编写的界面(根据我的实验,Forms的界面应该只能用于制作Activity的界面,而不能做Service的界面,也可能是我不知道应该怎么实现),所以只好退而求其次,不过现在这个结果也是不错的,毕竟输入法界面本身对性能的要求就比较高,使用更接近原先代码的技术自然要好一些。

至此,我使用Xamarin的意图已经很明显了,就是想要用于它实现一个跨平台的移动输入法,具体的说是岁寒输入法。现在首先准备做的是IOS版的,然后再反过来重写Android版本,如果日后WindowPhone能有起色,并且开放第三放输入法的权限,那么基于这些代码实现一个WindowPhone就不会是一件再起炉灶又大费周章的事情。而如果使用原生语言开发的话,那每个平台都得重写一套代码,代价实在太大了,尤其对于个人开发者而言,不堪重负,这也是为什么Xamarin对我来说特别有吸引力的原因。

跨平台有跨平台的方便,自然也有跨平台的难处,Xamarin也仅仅提供了一种跨平台开发的手段而已,想要将这个手段发挥好,最大限度地实现对代码的重用,则需要更高的技巧和更多的思考。因此我不推荐初入开发门道的人选择Xamarin,在此之前,最好对其中一个平台及其开发过程有较深的理解。

Xamarin现在免费开放,显然这是微软的移动战略的一部分,由于自身操作系统在生态环境上的欠缺,迫使微软去推动跨平台技术的发展,以希望从其它平台上借势,从而反哺自身。在我看来,微软的移动操作系统不太可能会有转机,但这不意味着Xamarin作为一项技术没有希望。“有心栽花花不开,无心插柳柳成荫”的事情从不鲜见,只要抓住开发者这帮猢狲,微软这棵大树便不会倒,相信微软明白这个道理,作为开发者也不必过于担心微软过河拆桥。

这篇文章的目的不纯粹在于宣传Xamarin技术,毕竟微软没有给我发盒饭,但免费用着人家提供的技术,顺便给人家宣传宣传的好事也是值得做的。其实我主要是想在此立个字据,作为一个开始,日后尽可能地把开发过程中得到的经验和心得分享出来,既是一种记录,也是一种鞭策,以此自勉。

一些链接

Xamarin主页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,563评论 25 707
  • 介绍 最近出现的 React Native 再次让跨平台移动端开发这个话题火起来了,曾经大家以为在手机上可以像桌面...
    cosWriter阅读 2,282评论 0 12
  • 无谓,无所求!呵呵,今天随口问了同事,你可以做到没所谓么。他悠然答到,当然可以!我不信继续追加,不论什么事都可以。...
    再见一生阅读 291评论 0 0
  • 突然好怕哪一天自己长大到 一个人睡午觉到昏黄的光照进房间 却不再有爸妈工作回来开门的声音
    珍珠女士的元宝先生阅读 263评论 0 1
  • 每个人的心,都像上了锁的大门, 任你再粗的铁棒也撬不开。 唯有关怀, 才能把自己变成一只细腻的钥匙,进入你心中,了...
    画欣阅读 336评论 0 0