1、Xamarin的优势
对于一家希望拥有移动终端用户的公司来说,不得不同时考虑两个(或三个,虽然比较少就是了)平台的移动应用程序开发。然而令这些公司头疼的是,安卓开发多采用Java、iOS开发多采用Swift(或OC)、Win10 UWP开发多采用C#,这意味着这些公司不得不雇佣好几批工程师,或者让同一批工程师同时维护多个互不兼容的项目(当然,这些人的工资就得高一点)。
解决这一问题目前唯一成熟的方案是Xamarin,这是微软旗下的、致力于使.NET框架兼容其它移动端平台上的项目。我在以前的文章里提到过,这个所谓“框架”的东西,能抹平不同系统平台上API的差异,这意味着开发人员将能通过Xamarin在三个平台之间共享核心代码。
举个例子:假定某论坛需要多平台移动客户端,那么该平台需要维护三个独立的项目,每一个项目都有一套独立的业务代码;每次论坛API升级,三个项目必须分别被更新,否则App就会不可用。假如这个论坛采用Xamarin开发它的客户端,工程师们就能在三个平台之间共享超过95%的业务代码;无论是开发时,还是API更新时,只需要将这个共享的业务代码维护一次,就能同时应用在三个项目上。
2、Xamarin开发环境的搭建(Android)
搭建这样一个采用C#的开发环境并不复杂:它依然可以集成至Visual Studio。下面以Visual Studio 2017作为例子,来讲解该如何安装Xamarin。
找到一个名为VSInstaller的应用程序(不出意外的话,已经安装过VS2017的朋友可以在开始菜单里找到它),启动它。你已经安装的VS产品会被呈现在第一位。单击产品标识下面的“修改”按钮,修改程序功能。勾上这一项:
并在右边的详细目录里,去掉Android SDK和Android NDK(因为它们在中国大陆是无法访问的,这会导致VS功能修改失败):
单击修改按钮,让它完成修改过程。
由于刚刚去掉了Android SDK的安装,我们的Xamarin虽然可以编写代码,但是却不能编译和调试。现在我们来手动获取Android SDK。
登录Android开发工具中国镜像网站http://www.androiddevtools.cn/,页面下方会有镜像站的安卓开发工具下载地址:
下载那个zip版本的Windows平台下的Android SDK,校验完毕后解压至自己平时存放开发工具集的目录。下面会有这样一些文件(可能会少几个目录,但是在整体配置完毕之后就会有的):
启动SDK Manager,我们来配置镜像服务器。由于Android SDK的服务器在中国大陆无法访问,所以中国很多企业、研究机构和教育机构都建立了Android SDK的镜像站。下面是目前可用的镜像站列表(来自Android开发工具中国镜像网站):【更新国内可访问的谷歌安卓SDK下载:点此链接】
我们在SDK Manager的菜单栏,选择Tools->Options,将任一有效地址填入Proxy Settings里,并勾上Others下的第一项,如图:
填好之后,Close关掉这个窗口,在主界面菜单栏选择Packages->Reload,这样就能获得工具包列表,并且可以正确执行安装了。安卓各平台对应的SDK Platform根据需要安装,但是这几项是必须安装的:
等待安装完成,SDK的配置就完毕了。启动Visual Studio,在菜单栏选择工具->选项,在左侧找到Xamarin->Android设置,将Android SDK位置设置为你存放SDK的路径,直至路径左侧显示绿色对勾:
这一步完成后,Visual Studio应该就能正确编译Android应用了(如果您拥有合适版本的安卓手机,并已经打开了USB调试,那么请直接跳到4,不用看下一节)。但是在测试环境被搭建好之前,我们还无法对其的工作进行测试。
3、测试用虚拟机推荐
本节针对没有可用的安卓测试机的读者。
虚拟机是测试的关键。目前常用的开发用虚拟机有:谷歌安卓模拟器(官方),VS Emulator for Android(微软)。但是对于一般的计算机,我并不推荐上述两种:谷歌安卓模拟器运行效率向当低,而微软的安卓虚拟机复杂的网络共享方式不仅可能不会正常工作,甚至还会使主机产生麻烦的网络问题。这里我推荐一种基于Virtual Box的安卓虚拟机:Genymotion。Genymotion的个人版是免费的,而且运行起来相当高效,很适合作为测试用虚拟机。安装方式很傻瓜,我在此不作赘述,但是需要注意的是,Genymotion携带的Virtual Box版本过低不能正确运行在Windows10创意者更新上,所以推荐安装不携带Virtual Box的版本,然后手动安装Virtual Box的最新版本。
安装完毕之后,创建一个虚拟机,确保它能正常运行,这样你就拥有了一个不算专业,但可用的测试环境。
4、Hello, Android!
上述环境搭建完毕,是时候来尝试编写我们的第一个采用C#的Android程序了。启动Visual Studio,新建一个项目,看,Android的所有项目类型都可用了:
不同的是,它们的语言类型是C#。甚至,你还可以采用Xamarin.Forms技术同时编写三个平台的应用:
不过这里,我们还是新建一个普通的空白Android应用程序,耐心等待解决方案被创建完毕,观察解决方案管理器,你会发现某些地方,这个项目的结构和一个普通的Android应用很相似:
不同的是,代码采用了C#。我们修改那个Main.axml,让它看起来是这个样子:
这和普通的Android UI编写方式大同小异。我们双击打开MainActivity.cs,眼前是熟悉的C#代码:
需要指出的是,虽然这个例子我们体会不到跨平台的便利性,但是上面的using指令除了可以引用安卓特有的、位于Android空间下的名称空间以外,标准的.NET框架所包含的System名称空间也几乎全是可用的,这造就了Xamarin最大的优势,即可以跨平台共享代码:
我们编写OnCreate方法:
并且编写一个事件处理程序(技巧:λ表达式):
这样,我们的第一个用C#编写的Android应用就编写好了。启动虚拟机,或者把测试用手机连接至计算机(记得打开USB调试,虚拟机就不用了),等待正确连接之后,打开“运行”按钮右侧的下拉菜单选择你的设备,理论上,正常连接后它会显示你设备的名字:
执行我们的应用。编译过程和部署过程可能需要花费一定的时间,依各人计算机性能决定:
你可以像调试一个普通的C#程序一样给它加断点、监视和使用其它强大的调试工具:
如果你能做到上述几点,那么恭喜你,你的采用C#的安卓开发环境搭建完成了。你可以尝试在代码文件里编写你熟悉的C#语言,即使你完全没接触过Android开发,你也能轻易做出一个颇具规模的Android应用程序。iOS可以采用相同的方式开发,但是你必须拥有一台Mac作为渲染和调试服务器,这也许是苹果公司的策略导致的。
如果你需要在Android和iOS平台上(也许会包括UWP平台)同时维护移动应用,Xamarin绝对是个省时省力的选择;即使你只需要开发某一个特定平台的应用,Xamarin也不失为一个优秀的平台。