使用Xamarin实现跨平台移动应用开发
2018-01-14

Xamarin曾是一种利基产品,售价昂贵。现在,它正逐渐成为一种广为使用的移动应用开发工具(参见链接给出幻灯片的第4张和第6张)。出于一些原因,Xamarin并不适用于某些类型的应用,其本身也存在着不少缺点。对此,本文将做详细的介绍。同时,Xamarin也是一种跨平台的开发工具。因此,我们还将在本文中权衡跨各种平台与原生开发上的一些优缺点。下面,我们首先简述Xamarin的推出及发展历史。

从Gnome、Mono到Ximian

Miguel de Icaza是Gnome项目的创始人,他同时也是一位开源项目冠军(Open Source Champion )。在他看来,要让开源项目得到大众的认可,必须使该项目与Microsoft、Novell等公司提供的商业软件毫无二致。出于此考虑,de Icaza于1999年开始和Nat Friedman合作。他们曾在1997年有过短暂的接触,那是在de Icaza的一次不成功的Microsoft面试期间。当时,de Icaza对Microsoft管理层指出,他们公司的软件应该走上开源之路。这次面试进展的并不顺利,但此后Friedman和de Icaza创立了Ximian项目,其中最主要的项目是Mono。Ximain于2003年被Novell收购,当时Novell正试图从Microsoft赢回它们日益萎缩的网络市场份额。此后,Novell于2011年被Attachmate收购,而Attachmate裁剪掉了Mono项目的大部分资源


这在de Icaza和Friedman看来,无疑是一个机会。因此,他们着手创立了另一个初创项目,即Xamarin,针对开发用于移动应用开发的产品。他们的首个产品Xamarin.Mac在2012年发布,支持开发人员使用C#语言为Apple Mac编写应用并通过Apple Store销售。在2013年,他们发布了Xamarin 2.0,这款IDE产品的推出,使开发人员可以使用Microsoft Visual Studio开发用于iOS、Android和Windows的应用。但是该版本的一个主要缺点在于,Xamarin的许可费用在当时是非常昂贵的。

多年来,Microsfot一直关注着de Icaza的动向。在Microsoft看来,Xamarin就是公司真正需要的产品,因为Xamarin具有使用Visual Studio开发Android和iOS应用的能力。这样,Microsoft出手收购了Xamarin,并将Xamarin作为一种开源的IDE绑定到.NET中。这正是De Icaza多年前就希望Microsfot能去做的事情。

图1 Xamarin的发展历史(图片来源:Craig Dunn的幻灯片

跨平台开发的案例

移动应用开发主要有三种方式:原生的、跨平台的和混合的。本文将不会介绍混合解决方案,因为这种解决方案通常无法达到原生的或真正跨平台开发的质量和稳健性

图2 三种开发方式(图片来源:Matt Larson在Xamarin Experience伦敦2017大会上演讲幻灯片

原生开发使用特定于设备平台的编程语言和API。例如在iOS上,使用的是Objective C或Swift。尽管使用这种方式,开发人员能推出最适用于设备的产品,但其中也存在着一些严重的问题:

  • 需要开发人员熟悉平台语言和API。
  • 增加了上市时间;
  • 增大了维护代价。

在开发团队中问题

对于开发原生应用,可能至少需要维护两个团队。一个团队具备在iOS平台上的Swift/Objective C开发技能,另一个团队具备在Android上的Java开展技能。甚至很有可能还需要维护第三个团队,即具备Windows平台开发技能的团队。我们还需要确保团队能保持最新的技能,并且人员不会被其它公司挖走,因为当前对这些技能的需求量很大。如果使用跨平台的方法,并不能消除这个问题。但是该方法降低了开发人员入职所需的技能要求,问题得到了一定程度上的缓解。

在开发代码和测试代码时,如果需要维护多个基本上在做同一工作的团队,这最终将会对开发成本产生影响。

增加了上市时间

当公司中有多个不同的团队同时投身于应用开发时,可能上市的时间会更长,因为这时会有两个(或更多)的团队使用不同的语言在不同的平台上编写、测试和调试同一个应用,而不是基于一个通用的C#技术栈。如果使用了跨平台的方法,这将有助于缩短推出应用所需的时间。

增大了维护代价和复杂性

消费类电子产品企业出于维持自身客户群的考虑,喜欢不断地推出新款手机,并不断地对操作系统推陈出新。相应地,应用也需要做不断地升级和更新。这使应用开发团队忙于在新设备上测试应用、发布新版本和补丁程序。如果使用跨平台方式,那么我们可以在单个代码库上测试大部分或全部设备和更改。如果我们选择的是独立原生应用,那么维护工作和发布时间安排会更为复杂。在一开始开发时,如果我们创建了一个原生应用,那么时间和开销将保持增长。公司将需要维护一个更大规模的开发团队。

图3 特定于平台的开发方式(图片来源:Matt Larson在Xamarin Experience伦敦2017大会上演讲幻灯片

Xamarin跨平台开发的优点

跨平台的开发方式具有很多优点,其中主要是减少了复杂性,从而降低了成本和工作量。尽管任一跨平台解决方案都能有助于消除重复劳动,并具有更好的可维护性,但Xamarin还提供了其它一些优点。下面列出其中部分优点:

  • 提高了代码的可重用能力;
  • 在很大程度上减少了测试工作;
  • 精简了维护;
  • 提供全面的Xamarin环境;
  • 可在Xamarin Test Cloud提供的两千多台设备上做实地测试;
  • 近乎原生的性能;
  • 支持地理位置和使用iBeacon。

功能的一次性开发

在Xamarin中,有超过70%的代码可重用。这意味着,许多针对Android开发的功能,无需重写全部内容即可用于iOS。因此,开发人员一旦完成了针对某个环境的编码和测试阶段(无论是Android、iOS还是Windows),就可以将同一代码用于其它环境,并使影响最小化。相比于使用原生开发方法,应用可以更快地交付市场。

降低了测试时间和工作量

我们并非说要削减测试工作。无论应运行在何种设备上,无论选用何种开发方式,软件测试都是任一应用开发中的重要组成。但是,在一个操作系统(例如Android)上对大部分的功能测试和调试后,就会缩减在另一个操作系统(例如iOS)上的测试时间,因为部分功能已经在一个平台上得以验证并测试。这样,开发人员可以专注于一些特定于平台的事项。相比起让两个团队以串联方式工作于两个不同的系统上,这种方式无疑降低了测试时间和工作量。

Xamarin环境

Xamarin提供的IDE功能全面,开发人员可以在IDE中执行构建最终产品所需的每个任务。Xamarin最近推出了Xamarin.Forms,进一步简化了开发。但依然需要开发人员具有Xamarin经验,以决定是使用Forms,还是坚持使用传统的Xamarin开发。Xamarin官方推荐从Xamarin.Forms开始。

图4 Xamarin与Xamarin.Forms的对比(图片来源: Craig Dunn的幻灯片

图5 Xamarin.Forms与Xamarin原生开发的对比(图片来源:Xamarin官方网站

Xamarin还提供了线上的Xamarin University,有助于开发人员快速熟悉开发所需的各个领域。

访问Xamarin Test Cloud

Test Cloud提供了一种应用测试环境,支持开发人员在其中模拟真实世界情况对两千多种真实手机进行实地测试。Test Cloud并非免费的,但是对于受广大应用目标受众青睐的多种目标机型,使用Test Cloud无疑物有所值。此外,购买了Visual Studio Enterprise许可的组织,可以获得Test Cloud的25%折扣。

性能近乎原生

在跨平台方式和混合开发方式领域中,没有竞争者的表现可与Xamarin相匹敌。其中的原因在于,Xamarin将源代码编译成二进制对象,而许多竞争对手(例如Sencha和PhoneGap)仅在运行时编译。 在2015年,一位开发人员Harry Cheung在Android和Apple上做过一些对比测试。必须要承认的是,测试当时所用设备,现在看来完全过时了。这对于Xamarin而言尤其如此,特别是在iOS上。

图6 iOS平台上开发的应用性能对比(图片来源:Harry Cheung的Medium博客文章

图7 Android平台上开发的应用性能对比(图片来源:Harry Cheung的Medium博客文章

使用iBeacons和地理位置

如果用户需要在应用中使用Beacons和地理位置,那么Xamarin可以使用邻近设备(其中包括Beacons和地理位置),支持定位和物联网(IoT)。Xamarin与Estimote间有着良好的合作关系。Estimote制造设备,并提供可用于开发的Xamarin SDK。尽管用户并非一定要局限Estimote的设备,但是Estimote设备的确可以使生活更轻松,因为基于设备开发的应用可以通过iBeacons(或其它协议)接收现场信息,其中包括了IoT设备的报告和监控情况。

Xamarin是跨平台的,但是近乎原生

尽管上面我们已经介绍了跨平台开发的多个优点,但是在此我们还是要着重介绍Xamarin的一个亮点。Xamarin对于iOS和Android来说都是“近乎原生”的。为实现这一点,Xamarin采用的一个方法是支持直接从C#调用开发人员使用Objective C/Swift for iOS及Java for Android的所有API。原生开发人员可用的标准用户界面控件,也可以通过Xamarin访问。这样,一旦应用运行在设备上,就会给出正确的观感。

尽管使用C#可以实现几乎所有的 特性,但是其中可能依然需要少量的原生代码。对于一名经验丰富的Xamarin开发人员,这无疑是应用开发中的一种福利,因为他们可以根据自身过往的经验决定调用情况。

Xamarin的适用之处

Xamarin具有强健的后端架构,非常适合于开发企业应用,以及任何需要做大量后端开发的应用。虽然Xamarin在需要功能丰富的用户界面方面有一定局限性,但Xamarin仍然可以生成一些非常有吸引力的应用。在本文稍后,我们将会给出一些案例研究。

Xamarin的最大优势在于开发时间以及跨平台工作的效率上。由于竞争激烈,大多数移动应用项目都给出了一个最后期限,Xamarin开发人员的开发速度无疑占优。Xamarin的另一个优势在于它能使用Estimote SDK,集成Beacons和智能眼镜等物联网设备。

Xamarin是运作在Microsoft生态系统中的,这一事实对于企业来说也是一大优势。其中的大多数企业已对Visual Studio等产品做了投资,并且很可能拥有一个稳定的.NET开发团队。

Xamarin有不足之处

下面给出一些坏消息。在下列情况中,Xamarin并非最好的选择:

  • UI界面复杂(B2C情况下);
  • 大量的动画和图形(例如,游戏);
  • 仍然需要一些原生编程的情况下;
  • 当应用会发展成很大的规模时;
  • 需要使用特定的开源软件库的情况下;
  • 如果开发人员不愿意支付Xamarin的许可费用。

UI界面复杂

如果应用面向的是最终用户,并且需要提供丰富的前端功能,这时建议使用原生应用。Xamarin.Forms足以应对简单的用户界面,并可以受益于Xamarin优异的后端功能。但是面对需要复杂用户界面的应用时,Xamarin是无法与原生SDK相媲美的。这是因为iOS和Android的UI必须根据各自平台的观感分别进行设计和实现,最终可共享的应用代码将不足一半,达不到一般情况下的75%,或是近乎使用Forms100%。这完全违背了我们使用Xamarin的初衷。因此,这时应使用Objective C或Java。

图形和动画

Xamarin也并非开发游戏应用的好选择。Xamarin不适用于需要强大图形或动画的应用。尽管如此,我们也不能完全排除使用Xamarin开发游戏。一个例子就是Bastion展示在iPad上的游戏。此外,Xamarin的最新发展将会使这一状况有所改观。

图8 Bastion展示在iPad上的游戏(图片来源:Jo Ann Buckner在Xamarin官方博客上的文章

并非100%的解决方案

正如我们前面提到的,在一些情况下,要构建一个完整的解决方案,我们可能仍然需要编写少量的原生代码。这意味着,开发人员仍然需要一些原生技能,这会降低Xamarin提供的优势。

访问开源软件库上的限制

原生开发人员可以使用目标平台上所有可用的开源软件库。但是,Xamarin开发人员只能使用在Xamarin环境中的开源软件库,这通常数量更少。随着Xamarin的日益普及,预计在未来这个问题将会逐渐消失。正如NuGet的最新发展所示。

Xamarin应用的规模很大

Xamarin应用的规模会更大一些。开发人员可能需要做一些额外工作,去优化应用的大小。如果一个应用过大,安装将花费更多的时间,并可能在客户手机上引发存储和访问问题,这会导致用户考虑删除该应用。

Xamarin可能是免费的,但是Visual Studio并非免费的

由于Xamarin是捆绑在Visual Studio中的,开发人员会发现需要Visual Studio Professional或Enterprise版才能使用所需的功能。尽管入门级产品是免费的,当然其中也不会具备所有的特性。

Xamarin提供了标准许可和云许可,它们的价格可不便宜。下图显示了标准许可的报价,供读者参考。

图9 Xamarin许可报价(图片来源:Xamarin官方网站

一些使用Xamarin的成功案例

下面我们选取了几个不同行业的公司作为案例。这些公司使用Xamarin取得了满意的效果。

Siemens PLM

图10 Siemens PLM应用示例(图片来源:Kyle Maxey发表在engineering.com上的文章

Siemens PLM是由一些昂贵的工程软件组合成的庞大产品,在全球拥有超过9百万席位和7.7万名用户。Siemens希望能借助一款名为“Catchbook”的轻便移动绘图和CAD应用,进一步扩展公司的市场。在应用中,用户可以使用手指或触笔绘制形状。考虑到公司具备Microsoft的开发技能,却不具备iOS或Android的开发技能,因此Siemens选择了Xamarin。Xamarin提供的第一个优势,就是企业可以移植很多现有的代码。其次,企业避免了学习原生iOS和Android开发语言的麻烦,就能让75%的应用运行起来。

世界银行

图11 世界银行应用示例(图片来源:Ann Buckne发表在Xamarin官方博客上的文章

世界银行有一个小开发团队,由8位开发人员组成。团队成员熟悉Visual Studio和C#开发,因此团队能够使用Xamarin快速提高生产力。他们开发的一个复杂的调查系统只针对Android设备应用。这是因为世界银行所面对的是发展中国家用户,Android系统他们主要选择的手机类型。

可口可乐装瓶公司

图12 可口可乐装瓶公司应用实例(图片来源: Lacey Butler发表在Xamarin官方博客上的文章

在短短的四个月时间内,全球最大的可口可乐装瓶公司就将“MarketPlace”应用投入运行。与前面介绍的案例一样,公司拥有具备.Net和C#技能的工作人员,他们十分熟悉Visual Studio,这就是公司对使用Xamarin有兴趣的原因。公司引入了两名经验丰富的Xamarin开发人员来指导团队(顺便说一句,他们在团队合作中使用了Slack。Slack也是使用Xamarin的)。

社区评论情况

Xamarin由于其敏捷性,使得产品能够在最短的时间内运行起来,因此在一些移动应用开发公司中广受好评。下面给出在Clutch Review论坛中的一些评论。

“对于具有.NET和C#经验的开发人员而言,他们希望开发工具能集成Microsoft技术栈后端。Xamarin无疑是一种极好的工具。”

“通过与Xamarin的合作,我们已成功地交付了大量的移动应用。这些应用得到了我们客户的高度赞赏。例如,有一位客户希望仅用正常时间的一半就交付一个应用,因为该应用将在一个大型活动中展示。正是由于Xamarin允许我们无缝地共享代码,这使得我们能够在最后期限内完成任务。客户非常高兴。面对如此时间上的压力,使用Xamarin总是更具优势。”

“如前所述,Xamarin最大的问题是在涉及到需要高度自动化的图形或应用时,就会面临一些问题。”

结论

虽然Xamarin并非适用于任一移动应用,但它的确是公司在选择移动应用开发中的考虑对象。应用可能会相当复杂,正如上面给出的企业案例所示。在企业环境中,Xamarin中使用C#作为首选语言,这使得其在众多竞争对手中脱颖而出。自Microsoft收购Xamarin以来,市场也一直保持快速的增长。对于现有客户来说,这无疑是一个好消息。

图13 Xamarin的市场增长情况(图片来源:Matt Larson在Xamarin Experience伦敦2017大会上演讲幻灯片

本文作者简介

Adriana Blum任移动应用开发公司Iflexion的高级技术架构师。她在管理和交付定制移动解决方案上,拥有13年以上的经验。她目前在帮助企业实现流程自动化、寻找新的发展机会,并创建可为企业带来高价值的应用。

原文: http://www.infoq.com/cn/articles/mobile-cross-platform-xamarin