老司机学新平台 - Xamarin开发环境及开发框架初探

随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增。免费、更好的VS2015集成、更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即使工作中没有直接应用,也忍不住想要一探究竟。

搭建开发环境

工欲善其事,必先利其器。首先,我们需要一个完美的开发环境。要怎么才“完美”呢?我想至少要达到以下三点:

  • 完美的Visual Studio集成
  • 高效易用的Android和iOS模拟器
  • 可视化UI设计

安装Xamarin

Xamarin的Visual Studio插件,现在已经是VS2015各版本的一个可选组件,这方面的安装和集成不是问题。不过,一般VS的安装程序默认安装的都不是最新版本。要升级到最新版本,官方方案是下载那个Xamarin官网的在线安装程序;或者,也可以在已安装Xamarin插件的VS2015的Options/Xamarin/Others中进行升级。

然而,国内的网络环境几乎没法下载更新。变通的办法是,可以用Fiddler这样的工具,抓到Xamarin的安装升级程序企图下载的安装包的URL,然后,通过例如百度云等提供的离线下载功能来下载,然后手动在本地安装。

另一个问题是,上述插件装完,如果企图编译Android项目的,在国内环境,多半会遇到“m2repository目录中相关文件找不到”这样的错误,这是因为,在编译Android项目时,它会企图从google的网站下载这些m2repository的package,然后,国内网络认为并没有google这个网站,大家都懂的,FQ下载速度也不稳定,有时一个package就要几百M。baidu了好一阵,后来找到有某位同学share的一个手动安装包,可惜我不记得出处了,当时只是转存到自己的百度云了,如果,谁知道,请告知,我一定会追加注明。

这里是我的百度云上的一个share,包含了当前最新的Xamarin的Windows和MacOS相关的安装包,和包括上面提到的这个m2repository手动安装包:
http://pan.baidu.com/s/1o8GqgNS 密码:oeoa

Android模拟器

选择一:

Xamarin的VS插件本身包含了官方的Android SDK及其模拟器,不过,在windows平台上,想要较好的性能,模拟器必须配置使用x86核心的CPU,并且安装Intel® HAXM启用硬件虚拟化加速。

选择二:

Visual Studio 2015的安装程序,同时提供了一个基于Hyper-V的Visual Studio Emulator for Android,性能非常不错。不过,Hyper-V和Intel® HAXM不能同时启用。一旦启用Hyper-V,widnows会禁止其他app使用CPU的虚拟化加速功能。所以,只能二选一。

iOS模拟器

iOS模拟器可以在Windows上跑,但是,还是同时需要一台Mac机器,或者一个Mac虚拟机来进行真正的编译和背后的模拟器服务的运行。关于虚拟机安装,建议使用VMWARE,网上相关的文章不少,这里就不过多介绍了。不过,安装最新的Xcode8需要MacOS v10.11.6以上版本。目前最新版本的Xamarin iOS组件可以阉割运行于Xcode7(iOS项目的link选项不能选Don't link,否则无法运行),不过需要Xcode8才能完美运行所有功能。另外,因为开启了Hyper-V以后VMWARE里面不能跑x64的系统,而新版的OSX都只有x64版了,所以,实际上,还是必须关闭Hyper-V才能运行。所以,虽然我很喜欢Visual Studio Emulator for Android,也只能忍痛不用了。

一旦在MacOS中安装好Mono MDK和Xamarin ios组件,并打开MacOS的远程控制允许远程server进行ssh连接,就可以在VS2015中配置iOS模拟器了。配置成功以后,就可以在Xamarin的iOS项目中,指定部署到iOS模拟器了。不过默认情况下,iOS模拟器运行时是运行在MacOS端的,别急,可以安装下面这个iOS Simulator for Windows,让iOS模拟器的UI运行在Windows端。

可视化UI设计

Xamarin的UI设计,现在有两大类别,一类是如Xamarin Android/iOS这样,只能用于特定平台的UI。这类UI几乎是原生Android和iOS的简单封装,所以不具通用性,不过Xamarin本身就已经提供对其很好的可视化设计功能,但是这种UI无法跨平台共享相关的代码;另一类,也是真正能体现Xamarin跨平台价值的,就是基于Xamarin Forms和xaml的UI,这类UI设计可以真正的跨平台共享UI代码,但是,目前,Xamarin提供的Vasual Studio插件还不能进行很好的预览支持。幸好,有一些做得不错的第三方插件,评估了好几个后,觉得最好用的是Gorilla Player,这也是一个免费工具,不过并不开源。

Gorilla Player的运行效果如下,可以在编辑Xamarin Forms的xaml时,在多个device或者模拟器里实时预览UI效果:

至此,开发环境,基本搞定。

Xamarin开发框架的选择

语言和开发工具,是进行任何软件开发的基础。但是,没有好的框架,开发效率往往事倍功半。在决定一个框架之前,我过了一遍这本官方的教程Creating Mobile Apps with Xamarin.Forms Book First Edition,大概列一下面一些要点——如果我自己要设计一个Xamarin的架构,大概会怎么做呢?

  • 首先,我一定会选用Portable Class Library(PCL)类型的项目,来共享跨平台代码,包括UI代码;
  • 接着,我需要尽可能使用Mvvm模式,来管理UI组件的数据和事件绑定,并且简化UI层的单元测试;
  • 然后,UI设计必须基于xaml和Xamarin Forms,方便预览和隔离UI和后端代码;
  • 最后,为各种通用功能,比如,SplashPage,Audio Play,DB Access,我会做一些类库,这些类库应该包含PCL格式的共享代码,还应该包含各平台的特殊实现;

评估了一些现有的框架,发现数量不少,不过大多数都还在比较早期阶段,很少有基于Xamarin Forms的,尤其是基于xaml版的Forms。直到找到MvvmCross。他的较早版本也是不支持Xamarin Forms的,不过,现在已经有了MvvmCross-Forms,这个repo的Samples目录包含了很好的示例。

那么,MvvmCross和MvvmCross-Forms提供了哪些框架别的功呢?

  • 首先,它的名字都叫Mvvm了,当然,它的所有UI模块都是基于ViewModel的,它强制要求每个逻辑页面都必须有一个ViewModel,甚至连页面跳转时指定的也不是页面名字,而是ViewModel;
  • 当结合使用MvvmCross-Forms时,对应于每一个ViewModel,有一个xaml格式的标准Xamarin Forms页面,每个xaml默认绑定到对应的ViewModel;
  • 它提供了一个IoC容器实现,替代功能薄弱的Xamarin官方提供的DependencyService,支持Fluent形式的DI配置,更好的管理各种业务Model和Service;
  • 它的模版封装了Xamarin官方模版中一般存在于Shared项目的App.cs,提供了一个它自己的封装版本,实现更完善的DI功能;
  • 在每个Android、iOS项目中,它的模版提供了一个通用SplashScreen实现和一个Setup.cs文件,用于项目的初始化;
  • 它提供了一个很好的跨平台插件架构,已经有很多官方和社区提供的插件,也很容易添加各种跨平台的插件功能;

总体上说,它几乎完美符合我心目中的期望的所有功能,甚至超出预期。使用它的模版进行跨平台开发,在绝大多数情况下,只需要写ViewModel+xaml和对应的业务Model和Service,开发效率极大的得到提升。再结合前面提到的Gorilla Player的xaml多平台UI设计和实时预览功能。整个开发过程,想必是会非常舒畅的!

因为才刚玩了几天,还没深入了解MvvmCross的一些实现细节,上面的介绍,还是更多的停留在表面的功能上,也十分可能有所疏漏,欢迎批评指正。后续有时间会对MvvmCross的架构做一些更深入分析。

Update 1 (2016-10-14): 如何修复VS2015启动时的“XamarainShellPackage did not load correctly”错误?

在一台Win10机器上新装VS2015,并升级Xamarin for VisualStudio后,每次打开VS2015报“XamarainShellPackage did not load correctly”等package不能load错误。修复办法,在控制面板的添加删除程序中手动反安装Xamarin。然后,在VS2015安装程序中修复安装VS2015。最后,手动安装最新的Xamarin for VisualStudio msi安装包。打开VS2015就不再抱错了,新版的Xamarin开发工具也能正常运行了。

Update 2 (2016-10-16): 如何加速Android SDK Manager的下载和更新?

默认情况下,Android SDK Manager从https://dl-ssl.google.com下载所有的更新。但是dl-ssl.google.com在国内常年被墙无法访问,但非https的dl.google.com域名却没有被封,而且速度飞快。我们可以设置Android SDK Manager的选项,强制指定让它从dl.google.com下载所有的更新:

Update 3 (2016-10-24): 离线查看SDK文档的利器,Zeal和Dash,你必不可少的伙伴!

posted @ 2016-10-04 21:03  Teddy's Knowledge Base  Views(5947)  Comments(17Edit  收藏  举报