Xamarin是一項(xiàng)跨平臺(tái)開發(fā)技術(shù)服赎,之前是收費(fèi)的葵蒂,而且據(jù)說(shuō)收費(fèi)不菲,所以使用的人數(shù)比較少重虑,在國(guó)內(nèi)幾乎無(wú)人問(wèn)津践付。后來(lái)Xamarin被微軟收購(gòu),現(xiàn)已免費(fèi)開放缺厉,相信今后國(guó)內(nèi)的使用人群會(huì)大幅地增長(zhǎng)永高,一方面是因?yàn)槊赓M(fèi)的東西總是受人歡迎的,另一方面是Xamarin確實(shí)提供了一種比較強(qiáng)大的技術(shù)來(lái)支持跨平臺(tái)開發(fā)(這里所指主要是Android和iOS上的開發(fā)提针,但其實(shí)不止于此)命爬。
如今市面上號(hào)稱可以提供跨平臺(tái)開發(fā)的方案很多,比如React Native辐脖、PhoneGap饲宛、IONIC等,這些方面大多數(shù)都是基于HTML和JavaScript等技術(shù)實(shí)現(xiàn)的跨平臺(tái)開發(fā)嗜价,在開發(fā)效率上自然是沒(méi)話說(shuō)艇抠,但是這些技術(shù)在性能上則遜色于原生的開發(fā)技術(shù)幕庐,而這恰恰是Xamarin得以生存的空間。
Xamarin聲稱可以獲得不差于原生技術(shù)的性能家淤,甚至在某些方面還有可能超越原生异剥,我想這指的應(yīng)該在是Android方面。我個(gè)人分析絮重,原因可能是這樣的冤寿。Xamarin使用C#進(jìn)行開發(fā)(好像用F#也可以,不過(guò)我沒(méi)有試過(guò)青伤,據(jù)說(shuō)F#也是一門非常不錯(cuò)督怜,以后有時(shí)間會(huì)學(xué)習(xí)學(xué)習(xí)),C#默認(rèn)方法是非虛的潮模,即在子類中要重寫方法亮蛔,必須在父類中聲明為virtual,而java默認(rèn)所有方法都是虛方法擎厢,所以C#可以減少這方面的開銷究流。其次的話,可能是微軟畢竟也是老牌的IT公司动遭,在系統(tǒng)軟件方面的優(yōu)化能力不容小覷芬探,手里的黑科技也是不少,敢說(shuō)這話應(yīng)該是有底氣的厘惦。當(dāng)然這不是最重要的偷仿,只要能夠在大多數(shù)情況獲得近似于原生的性能,便已是非常不錯(cuò)了宵蕉。
Xamarin主要有這么幾項(xiàng)技術(shù)酝静,Xamarin.Android、Xamarin.iOS和Xamarin.Forms羡玛,此外還有Xamarin.UWP别智、Xamarin.Windows、Xamarin.WinPhone等稼稿,但鑒于目前的市場(chǎng)占有率薄榛,后面幾項(xiàng)可以暫時(shí)不去理會(huì)。
無(wú)論是Xamarin.Android還是Xamarin.iOS让歼,本質(zhì)都是對(duì)原生API做了一層C#的封裝敞恋,因此在使用上與原生API會(huì)十分相似。這種封裝會(huì)結(jié)合一些C#的語(yǔ)法特性谋右,讓開發(fā)者可以享受C#的語(yǔ)法糖硬猫。其中Xamarin.iOS是直接編譯成ARM的二進(jìn)制代碼,因此執(zhí)行效率肯定是非常高的。與此不同啸蜜,Xamarin.Android被編譯成中間語(yǔ)言馏予,Xamarin在APK安裝包中會(huì)包含一個(gè)mono的運(yùn)行時(shí),代碼是在mono運(yùn)行時(shí)和安卓本地的運(yùn)行時(shí)上完成工作的盔性,可想而知,這中間需要付出一些開銷呢岗,而且會(huì)使安裝包體積增大許多冕香,但是考慮到設(shè)備的運(yùn)行空間和存儲(chǔ)空間都在高速增長(zhǎng),這也不能算是一個(gè)特別致命的缺點(diǎn)后豫。
而Xamarin最為關(guān)鍵的技術(shù)還不是上面的兩項(xiàng)悉尾,而是Xamarin.Forms。這項(xiàng)技術(shù)把IOS挫酿、android构眯、UWP等平臺(tái)的GUI進(jìn)行了一統(tǒng)地抽象,開發(fā)者只需要寫一套代碼早龟,編譯器會(huì)在編譯時(shí)將界面映射到原先控件上惫霸,從而獲得原生平臺(tái)的外觀和性能。這種做法對(duì)于開發(fā)者應(yīng)該是最喜聞樂(lè)見(jiàn)的葱弟,至少我是如此壹店,相比于那種運(yùn)行的虛擬層上的跨平臺(tái)方式,這種做法性能損耗最少芝加。當(dāng)然硅卢,損耗小并不代表沒(méi)有,官方也表示藏杖,Xamarin.Forms不適合用于開發(fā)圖形界面操作特別復(fù)雜且頻繁的應(yīng)用将塑。遇到這種情況,我們可以用Xamarin.IOS或Xamarin.Android來(lái)解決蝌麸,也就是說(shuō)Xamarin.Forms可以與Xamarin.IOS或Xamarin.Android在同一個(gè)項(xiàng)目結(jié)合使用点寥。就以我準(zhǔn)備使用Xamarin做輸入法為例,根據(jù)Xamarin的特點(diǎn)祥楣,我用Xamarin.Forms來(lái)做輸入法的設(shè)置界面开财,節(jié)省重復(fù)開發(fā)一套界面和業(yè)務(wù)邏輯的精力;而用Xamarin.IOS和Xamarin.Android來(lái)做輸入法界面误褪,以發(fā)揮最大的性能责鳍。目前從我實(shí)驗(yàn)的結(jié)果看,這個(gè)想法是可行的兽间。雖然我最開始的想法是連輸入法界面也用Forms來(lái)做历葛,但發(fā)現(xiàn)在輸入法界面無(wú)法使用Forms編寫的界面(根據(jù)我的實(shí)驗(yàn),F(xiàn)orms的界面應(yīng)該只能用于制作Activity的界面,而不能做Service的界面恤溶,也可能是我不知道應(yīng)該怎么實(shí)現(xiàn))乓诽,所以只好退而求其次,不過(guò)現(xiàn)在這個(gè)結(jié)果也是不錯(cuò)的咒程,畢竟輸入法界面本身對(duì)性能的要求就比較高鸠天,使用更接近原先代碼的技術(shù)自然要好一些。
至此帐姻,我使用Xamarin的意圖已經(jīng)很明顯了稠集,就是想要用于它實(shí)現(xiàn)一個(gè)跨平臺(tái)的移動(dòng)輸入法,具體的說(shuō)是歲寒輸入法〖⒋桑現(xiàn)在首先準(zhǔn)備做的是IOS版的剥纷,然后再反過(guò)來(lái)重寫Android版本,如果日后WindowPhone能有起色呢铆,并且開放第三放輸入法的權(quán)限晦鞋,那么基于這些代碼實(shí)現(xiàn)一個(gè)WindowPhone就不會(huì)是一件再起爐灶又大費(fèi)周章的事情。而如果使用原生語(yǔ)言開發(fā)的話棺克,那每個(gè)平臺(tái)都得重寫一套代碼悠垛,代價(jià)實(shí)在太大了,尤其對(duì)于個(gè)人開發(fā)者而言娜谊,不堪重負(fù)鼎文,這也是為什么Xamarin對(duì)我來(lái)說(shuō)特別有吸引力的原因。
跨平臺(tái)有跨平臺(tái)的方便因俐,自然也有跨平臺(tái)的難處拇惋,Xamarin也僅僅提供了一種跨平臺(tái)開發(fā)的手段而已,想要將這個(gè)手段發(fā)揮好抹剩,最大限度地實(shí)現(xiàn)對(duì)代碼的重用撑帖,則需要更高的技巧和更多的思考。因此我不推薦初入開發(fā)門道的人選擇Xamarin澳眷,在此之前胡嘿,最好對(duì)其中一個(gè)平臺(tái)及其開發(fā)過(guò)程有較深的理解。
Xamarin現(xiàn)在免費(fèi)開放钳踊,顯然這是微軟的移動(dòng)戰(zhàn)略的一部分衷敌,由于自身操作系統(tǒng)在生態(tài)環(huán)境上的欠缺,迫使微軟去推動(dòng)跨平臺(tái)技術(shù)的發(fā)展拓瞪,以希望從其它平臺(tái)上借勢(shì)缴罗,從而反哺自身。在我看來(lái)祭埂,微軟的移動(dòng)操作系統(tǒng)不太可能會(huì)有轉(zhuǎn)機(jī)面氓,但這不意味著Xamarin作為一項(xiàng)技術(shù)沒(méi)有希望。“有心栽花花不開舌界,無(wú)心插柳柳成蔭”的事情從不鮮見(jiàn)掘譬,只要抓住開發(fā)者這幫猢猻,微軟這棵大樹便不會(huì)倒呻拌,相信微軟明白這個(gè)道理葱轩,作為開發(fā)者也不必過(guò)于擔(dān)心微軟過(guò)河拆橋。
這篇文章的目的不純粹在于宣傳Xamarin技術(shù)藐握,畢竟微軟沒(méi)有給我發(fā)盒飯酿箭,但免費(fèi)用著人家提供的技術(shù),順便給人家宣傳宣傳的好事也是值得做的趾娃。其實(shí)我主要是想在此立個(gè)字據(jù),作為一個(gè)開始缔御,日后盡可能地把開發(fā)過(guò)程中得到的經(jīng)驗(yàn)和心得分享出來(lái)抬闷,既是一種記錄,也是一種鞭策耕突,以此自勉笤成。