Xamarin 是一套基于C#語言的跨平台移動應用開發工具,今年2月份微軟宣布收購Xamarin,而後在4月份進行的Build大會上微軟宣布将會在各個版本的Visual Studio中免費提供Xamarin,并且宣布Xamarin SDK開源。
本文主要闡述Xamarin是什麼,它能做什麼以及它是如何跨平台的。
Xamarin 的跨平台開發思路是:使用 C# 來完成所有平台共用的,和平台無關的 app 邏輯部分;由于各個平台的 UI 和互動不同,再使用由 Xamarin 封裝好的 C# API 來通路和操控 native 的控件,分别進行不同平台的 UI 開發。
如下圖:

另外Xamarin還提供了Xamarin.Forms UI工具包,Xamarin.Forms可以幫助開發人員快速的建構跨平台的UI,通過一次編碼,生成多個平台的原生UI界面,稍後本文會講述Xamarin.Forms的使用方法以及實作原理。
Xamarin主要由Xamarin.iOS,Xamarin.Android以及Xamarin.Forms組成,主要功能也有着三部分組成:
下面會使用Mac OS X上的Xamarin Studio來示範如何建構iOS應用:
- 打開Xamarin Studio
- 建立一個項目,選擇iOS - App - Single View App
- 點選下一步,輸入App 名稱, 例如:FirstXamariniOS,一路點選下一步,工程建立完成。
下面是生成的iOS工程結構截圖:
如果有Xcode使用經驗的話會發現,這個Xamarin iOS工程的項目結構與Xcode的結構很類似,都包含了AppDelegate類,預設的ViewController以及Main StoryBoard檔案,基本的類名稱都是一緻的。
打開Main.storyboard 檔案,可以從Toolbox上拖拽一些原生控件到View Controller上,與Xcode中使用方式一緻,但是有一些功能沒有Xcode 強大,比如設定View的Auto layout等等,如下圖:
運作上面的工程,就可以在模拟器中檢視效果了。
從上面來看來說使用Xamarin進行iOS程式設計需要有一定的iOS App開發知識,需要熟悉iOS UI架構(Cocoa Touch)等等,即便使用Xamarin開發應用,也繞不過原生底層的這些東西。
- 建立一個項目,選擇Android - App - Android App
- 點選下一步,輸入App 名稱, 例如:FirstXamarinAndroid,一路點選下一步,工程建立完成。
下面是生成的Android工程結構截圖:
如果有Eclipse進行Android程式設計經驗的話會發現,這個Xamarin Android工程的項目結構與Eclipse的結構很類似,都包含了預設的MainActivity以及布局檔案,基本的類名稱都是一緻的。
打開Main.axml檔案,可以從Toolbox上拖拽一些原生控件到View Controller上,與Eclipse的體驗類似,也可以通過編輯XML的方式更改界面。
同樣從上面來看來說使用Xamarin進行Android程式設計需要有一定的Android App開發知識,需要熟悉Android UI架構等等,原生底層的東西還是需要熟悉的。
Xamarin.Forms 是一個建立跨平台使用者界面的庫,通過Xamarin.Forms 可以一次編碼生成基于各個移動平台(iOS, Android, Windows Phone)的應用界面。
Xamarin.Forms提供了更高層次的一層UI元件抽象,這些元件在進行最終呈現的時候,會以原生控件的方式表現出來,也就是說每一個Xmarin.Forms的控件最終會有多個平台的原生呈現邏輯,如下圖中,Xamarin.Forms的Entry控件,對應的原生呈現為:
使用Xamarin.Forms建構跨平台應用的一個缺陷就是隻能使用Xamarin.Forms包中的控件,會有一些限制。
- Android應用程式試運作在Dalvik虛拟機中的,每一個應用程式對應一個單獨的虛拟機執行個體,其代碼在虛拟機的解釋下得以執行。
- Dalvik主要是完成對象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
Xamarin.Android架構圖(ART 是Android 虛拟機Dalvik):
Android Callable Wrappers(ACW)
使用C#開發的Android應用程式在運作的時候,C#代碼是在Mono虛拟機中執行的,而Mono虛拟機是寄宿在Dalvik虛拟機中運作的,所有的C#代碼都通過ACW的方式被調用。
由于需要打包Mono環境,使用C#開發的Android應用的APK檔案會比原生開發的大,執行效率也會差一些。
Managed Callable Wrapper(MCW)
如果需要在C#中調用一些系統的功能或者Java實作的類庫,該如何調用那? 答案就是MCW,MCW就是一個JNI橋梁,可以使用托管代碼調用Android的代碼。MCW将整個Android.* 以及相關的命名空間通過 jar綁定的方式暴露出來,是的C#可以調用。
對于開發者來說,Xamarin.IOS相對于Xamarin.Android就要簡單很多了,我們用C#開發的iOS應用程式在被編譯成IL代碼之後,然後轉交給Apple complier直接編譯成iOS的本地機器碼,也就是說C#寫的iOS應用程式和Objective-C 寫的是一樣的。
透過 Ahead-of-Time (AOT) 編譯程式,直接将Xamarin.iOS程式編譯為ARM的執行檔。編譯封裝完成的應用程式被直接編譯為原生的二進制執行檔案。
在Xamarin Studio中建構Xamarin.Forms跨平台的應用的時候,會生成Android以及iOS單獨的項目工程,兩者共享業務邏輯以及一些UI界面,在打包生成App的時候,是分開進行的,兩者互不影響。每個平台的實作原理與上面講的是一樣的。
本文轉自 powertoolsteam 51CTO部落格,原文連結:http://blog.51cto.com/powertoolsteam/1782877,如需轉載請自行聯系原作者