鄭重聲明:
本文非Xamarin使用詳解,也沒什么有用的干貨,只是給不知道Xamarin到底是什么的大家提供一點點微不足道的小介紹,看完以后啥收獲都沒有也不是沒可能的(*/ω\*)。so......ε=ε=ε=ε=ε=┌(つ•̀ω•́)つ(飛速逃離現場中......)
正文:
前段時間去參加了一個微軟的Xamarin培訓,剛好最近准備要在公司給大家做分享,這里先把我准備的內容寫出來分享一下好了。
開始之前,和大家分享一句來自Xamarin官網首頁的一句話:
圖片上的中文是我自己翻譯的,意思可能不是特別到位,但是從英文原文來看還是能夠感受到Xamarin自己對於它所提供的跨平台移動開發解決方案還是十分自信的。而且這句話也能給尚不了解Xamarin到底是什么的人一個很直觀的介紹——我們(Xamarin)是一個可以幫助你開發功能強大的移動應用的工具,並且你在移動開發過程中所需要用到的東西我們可都給你准備好了~
下面就從Xamarin的基本情況開始給大家做一個簡要介紹吧:
一、Xamarin簡介
- 2011年5月16日成立,2016年2月24日被微軟正式收購。
非常年輕的公司,成立不到五年的時間就被微軟這個巨頭給收購了。主要是Xamarin背后的商業價值確實很強大,並且它是用C#來進行跨平台移動開發的。微軟親兒子無誤了~
- 是Mono項目的一個分支。
基於.NET的跨平台實現的一個開源項目,Xamarin也正是由Mono項目中非常積極活躍的一批工程師所創立的。(不過我猜測多半是因為Mono作為開源項目實在是不賺錢,以及雖然做的已經很大很紅火了,但維護什么的還是只能靠開源社區的活躍分子們無償維護,久而久之自然是比不上可以全身心投入效果來的好了。所以里面最活躍的一批工程師干脆把Mono里移動開發這一塊專門拿出來做成了商業項目,果不其然,效果還是很顯著的嘛。——P.S以上均為個人臆測,不代表Mono項目參與者的真實想法!如果Xamarin創始人們順着網線摸過來了我是不會負責的!─=≡Σ(((つ•̀ω•́)つε=ε=ε=┌(;´゚ェ゚)┘)
- 使得C#程序員開發原生的Android、iOS應用成為可能。
Windows應用就更不用說了,畢竟微軟的親兒子。
- 一套代碼邏輯,三種平台實現:Android、iOS、Windows。
這點看上去和上面的感覺上有點重復,其實還是有差距的。上面那個只是說明了C#程序員不用去專門學Java或者Objective-C也能寫Android和iOS應用,但是這里其實是想說明如果你想同時開發一個三個平台都能用的App,使用Xamarin的話就不需要Android寫一遍代碼,iOS寫一遍代碼然后到了Windows那邊再寫一遍代碼那么麻煩了。不過這么一解釋感覺好像還是有點多余,跨平台開發本來就是為了解決重復寫代碼的問題嘛……
- 強大的Xamarin Platform:Xamarin Studio,Xamarin.Forms,Xamarin for Visual Studio,Xamarin Test Cloud......
這個就不用過多解釋了,Xamarin首頁那句霸氣的"Everything you need to deliver great mobile apps."依據就是從這來的,從開發、測試到發布,Xamarin樣樣都有~
二、Xamarin UI開發簡介
UI開發一直都是App開發中比較重要的一部分。既然Xamarin聲稱它能做到「原生開發」,那就簡單介紹一下它在UI開發方面的兩種途徑吧:
1.Xamarin Native Approach
說實話這種UI開發模式對於沒有接觸過Android或者iOS開發的C#程序員來說實在有點不友好,因為從名字上來說就能感受到了:Native,N-a-t-i-v-e!說的這么理直氣壯也是讓人氣不打一處來哦?(P.S. 雖然不是Naive,但還是有種被嘲諷了的感覺。)就是說你想實現“原生”UI開發是嗎?那就老老實實寫人家原生的UI代碼吧!雖然很可氣,不過相對PhoneGap,Sencha之類的基於HTML5,JavaScript以及CSS的跨平台開發方案來說,Xamarin好歹是提供了一種可以使用Android和iOS原生UI控件的可能。有Android或者iOS開發基礎的人選擇這種方式來開發UI自然更得心應手;沒有基礎但是有上進心並且很勤奮的孩紙們也可以趁這個機會去學點Android和iOS的UI開發知識,反正多學一點東西總歸是有好處的嘛。
至於那些既沒有移動開發基礎,又不勤奮的懶癌患者們,(沒錯,我就是這群人當中的佼佼者!(๑‾ ꇴ ‾๑))只能說Xamarin大概是算到了我們這群人的存在,所以提供了下面的這種開發方式:
2.Xamarin.Forms Approach
這種方式對C#程序員就很友好啦,在寫界面的時候大家只需要調用Xamarin.Forms里已經封裝好的UI組件就可以了,編譯階段Xamarin會根據代碼自動生成相應的原生UI組件的。當然啦,Xamarin.Forms還做不到100%提供Android和iOS中所有的UI控件的,不過對於絕大多數應用場景都是夠用的了。如果實在沒有大家也可以發揮自己的聰明才智稍加組合一下,畢竟很多hacks就是在這種貧窮的現實中創造出來的嘛。
下面是一張Xamarin Native Approach和Xamarin.Forms的代碼共享程度對比:
從上圖可以明顯感受到,如果使用Xamarin Native的方式來開發的話,共享代碼基本上就只剩后台邏輯代碼了,剩余大約1/4的代碼還是個平台相關的代碼。(看這么有規律和數字這么整的數據也能猜到對於這種數據的來源不能太苛刻~僅供直觀感受一下兩者之間的代碼量差距。)如果使用Xamarin.Forms開發的話,那幾乎沒有什么平台相關的代碼了。
總而言之,從個性化角度來說,Xamarin Native的方式要好一些;從維護角度來說,Xamarin.Forms維護起來更為輕松些。
三、Xamarin API簡介
其實這部分要認真介紹起來還是蠻費勁的,所以我就直接甩張圖給你們感受一下好了(懶癌發作中……(*/ω\*)):
這里要說明的其實就是Xamarin可以調用到Andriod和iOS中的所有API。實現所謂的100%原生API。這一點相較於PhoneGap之類的跨平台移動開發方案來說確實要優秀很多,因為每次Android或者iOS發布新功能的時候,就不用苦等經過封裝后才能調用的API了。並且開發出來的App使用體驗上接近原生開發的應用效率。
舉顆栗子(栗子來源於培訓老師。),iOS和Android剛推出健康功能里的記錄用戶每日行走步數功能時,使用PhoneGap等跨平台開發技術所開發的應用是沒法在第一時間就能調用到這個功能的API的,他們只能等PhoneGap根據Andriod和iOS所提供的原生API封裝好可被自己用戶調用的API后,用戶們才能調用到該功能的接口實現相應功能。所以對於調用非原生API開發的應用來說,其在功能更新方面會存在一定的滯后性。Xamarin傲嬌的表示他們可以做到Andriod或iOS發布新功能API的當天,Xamarin的開發者也能調用到這些API們!ヽ( ̄▽ ̄)و
能夠調用原生API的另一好處是,對於一些特殊的功能,譬如iOS的3D Touch功能之類的,Xamarin也能保障其開發者可以訪問到,而大多數基於H5+JS+CSS的跨平台開發技術對於這些特殊功能的支持可能就沒有那么到位了。(個人理解,這里如果有說的不對的地方敬請指正!)
四、Xamarin底層技術簡介
這一小節推薦大家去閱讀《Xamarin技術全解析》一文,介紹的非常詳細。作者一看就知道和我這種重度懶癌患者不一樣,因為我接下來又要甩圖了……
等等,甩圖之前再說一下Xamarin三大底層技術吧:Mono,Binding(綁定)以及P/Invoke(平台調用)。
好,下面請大家欣賞一下Xamarin.Andriod實現原理圖:
怎么樣?這圖是不是看着不是很好懂?(已經看懂的就略過我接下來的內容吧,怕看完后反而不懂了(*/ω\*)......)其實上面推薦的那篇文章里有很好的介紹,我就簡單復述(復制)一下吧。
我們用C#代碼寫的Andriod應用在運行的時候其實是在Mono虛擬機中運行的,而Mono虛擬機又是寄宿在ART(也就是Andriod虛擬機Dalvik)中運行的,所以ART通過ACWs(Andriod Callable Wrappers)的方式可以執行到Mono中的C#代碼。因為要打包Mono的環境,所以用C#開發出的Andriod應用apk文件會比原生開發出來的要大,效率嘛自然也是要低一些的。
C#代碼要是想調用系統功能或者Java的實現類庫,可以借助MCW(Managed Callable Wrapper)的方式來實現。MCW是JNI(Java Native Interface)的橋梁,可以使用托管代碼調用Andriod代碼。MCW通過將所有Andriod.*及相關的命名空間用jar綁定的方式暴露出來使得C#可以直接調用。
說(粘貼)完Xamarin.Android,下面再說(粘貼)下Xamarin.iOS吧:
相較於Xamarin.Andriod而言,Xamarin.iOS就很簡單啦~用C#開發的iOS應用被編譯成IL(Intermediate Language,中間語言)代碼,就轉交給Apple Compiler,由其直接編譯成iOS的本機代碼。本質上來說,用C#寫的iOS應用和Objective-C寫出來的沒有什么差別,是不是很棒!( • ̀ω•́ )✧
為表慶祝,再甩張圖慶祝一下:
最后的最后,放上一張來自微軟的吶喊圖來結束這篇沒有什么營養的介紹: