我为什么选择Xamarin开发ios app安卓app

临岁之寒简书作者,转载

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

相关推荐
雨白6 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹8 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空10 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭10 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日11 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安11 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑11 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟15 小时前
CTF Web的数组巧用
android
点金石游戏出海16 小时前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
小蜜蜂嗡嗡17 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio