來源:騰飛(Jesse)
鏈接:http://www.cnblogs.com/jesse2013/p/how-xamarin-works.html
微軟宣布了開放.NET框架源代碼并且會(huì)為Windows、Mac和Linux開發(fā)一個(gè)核心運(yùn)行時(shí)(Core CLR),這也是開源的!IT媒體網(wǎng)站紛紛轉(zhuǎn)載,博客園的C#開發(fā)者們熱淚盈眶(泥煤都等這一天好久了?。?/p>
與此同時(shí)VS2015預(yù)覽版更是直接集成了Android模擬器,但是其實(shí)里面并沒有說集成IOS模擬器,我不知道大家是怎么得出可以直接用VS來開發(fā)Android和IOS應(yīng)用的。不管怎么說,這都是個(gè)好消息。那么問題來了,C#如何來開發(fā)Android和IOS應(yīng)用?微軟會(huì)怎么做我們不確定,但是我們倒是可以來看看Xamarin是如何做的。
我想下面這張圖做Android開發(fā)的同學(xué)應(yīng)該很熟悉,下面我們就通過來了解Android系統(tǒng)的架構(gòu)入門來看看Xamarin會(huì)怎么樣去做?
Linux Kernel 操作系統(tǒng)層
Libraries And Android Runtime 各種庫和Android 運(yùn)行環(huán)境
Application Framework 應(yīng)用框架層 (由Java編寫)
Applications 應(yīng)用程序?qū)樱ㄓ蒍ava編寫并且在Dalvk虛擬機(jī)來運(yùn)行)
現(xiàn)在做Android開發(fā)的同學(xué)只要熟悉這些應(yīng)用框架層的一些接口和類庫就可以給方便的來實(shí)現(xiàn)自己的Android應(yīng)用程序。
Dalvik主要是完成對(duì)象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
Dalvik負(fù)責(zé)進(jìn)程隔離和線程管理,每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。
不同于Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是其專有的文件格式
Dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。
是為了在運(yùn)行過程中進(jìn)一步提高性能,對(duì)dex文件的進(jìn)一步優(yōu)化。
所有的Android應(yīng)用的線程都對(duì)應(yīng)一個(gè)Linux線程,虛擬機(jī)因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制
有一個(gè)特殊的虛擬機(jī)進(jìn)程Zygote,他是虛擬機(jī)實(shí)例的孵化器。它在系統(tǒng)啟動(dòng)的時(shí)候就會(huì)產(chǎn)生,它會(huì)完成虛擬機(jī)的初始化,庫的加載,預(yù)制類庫和初始化的操作。如果系統(tǒng)需要一個(gè)新的虛擬機(jī)實(shí)例,它會(huì)迅速復(fù)制自身,以最快的數(shù)據(jù)提供給系統(tǒng)。對(duì)于一些只讀的系統(tǒng)庫,所有虛擬機(jī)實(shí)例都和Zygote共享一塊內(nèi)存區(qū)域。
大家注意第2點(diǎn)和第7點(diǎn)有助于我們理解Xamarin.Android的工作機(jī)制。
Java編寫的Android應(yīng)用程序通過調(diào)用 Android.* 和 Java.* 這些命名空間下的類來實(shí)現(xiàn)一些系統(tǒng)的功能包括:聲音、顯示、OpenGl等一些通過Java API不能實(shí)現(xiàn)的功能或者說是與硬件、系統(tǒng)平臺(tái)相關(guān)的功能。那這里的問題是當(dāng)我們用C#來編寫的時(shí)候,這些功能怎么去調(diào)用?C#寫的Android 應(yīng)用程序又是如何初始化的?
當(dāng)一個(gè)C#開發(fā)的Android程序運(yùn)行的時(shí)候,除了一個(gè)Dalvik的虛擬機(jī)實(shí)例,還有一個(gè)Mono的虛擬機(jī)實(shí)例在運(yùn)行。那個(gè)Dalvik虛擬機(jī)實(shí)體就像一個(gè)宿主,我們的APP在宿主上運(yùn)行,而我們所有用C#寫的方法都會(huì)以ACW的形式被調(diào)用。在Java代碼中以native的式式invoke,就像invoke其它C或者C++的代碼一樣。
Momodroid.exe 在編譯階段會(huì)為我們的C#類生成對(duì)應(yīng)的ACW。
using System;
using Android.App;
using Android.OS;
namespace Mono.Samples.HelloWorld
{
public class HelloAndroid : Activity
{
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (R.layout.main);
}
}
}
對(duì)應(yīng)生成的ACW代碼:
package mono.samples.helloWorld;
public class HelloAndroid
extends android.app.Activity
{
static final String __md_methods;
static {
__md_methods =
'n_onCreate:(Landroid/os/Bundle;)V:GetOnCreate_Landroid_os_Bundle_Handlern' +
'';
mono.android.Runtime.register ('Mono.Samples.HelloWorld.HelloAndroid, HelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', HelloAndroid.class, __md_methods);
}
public HelloAndroid ()
{
super ();
if (getClass () == HelloAndroid.class)
mono.android.TypeManager.Activate ('Mono.Samples.HelloWorld.HelloAndroid, HelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', '', this, new java.lang.Object[] { });
}
@Override
public void onCreate (android.os.Bundle p0)
{
n_onCreate (p0);
}
private native void n_onCreate (android.os.Bundle p0);
}
大家可以看到上面那個(gè) native的n_onCreate方法最后就會(huì)調(diào)用那個(gè)通過mono虛擬機(jī)注冊(cè)的Mono.Samples.HelloWorld.OnCreate 方法。
上面我們講Dalvik 虛擬機(jī)是我們C#開發(fā)的Android應(yīng)用程序的宿主,它通過ACW來調(diào)用我們用C#寫的方法。如果我們的這個(gè)C#里面的方法涉及到一些聲音或者系統(tǒng)本身,或者說現(xiàn)在已經(jīng)有很多成熟的用Java寫的類庫,我們想調(diào)用怎么辦? 答案是我們?cè)偻ㄟ^MCW 調(diào)回去。在C#運(yùn)行時(shí)中去調(diào)用Java 稱之為MCW。
Xamarin.Android Framework中有很多就是MCW,關(guān)于MCW的創(chuàng)建以及C#與Java集成開發(fā)的東西我們后面再細(xì)講,包括一個(gè)C#開發(fā)的Android應(yīng)用程序是如何被啟動(dòng)的,我們后面再細(xì)講。對(duì)于C#開發(fā)的Android應(yīng)用程序來說,性能上面肯定是會(huì)有影響,但是影響有多大,我并沒有做過具體測(cè)試,所以就不詳述了。后面我們?cè)偌?xì)細(xì)的去對(duì)比。
對(duì)于開發(fā)者來說,Xamarin.IOS相對(duì)于Xamarin.Android就要簡單很多了,我們用C#開發(fā)的ios應(yīng)用程序在被編譯成IL代碼之后,然后轉(zhuǎn)交給Apple complier直接編譯成IPhonee的本地機(jī)器碼。也就是說C#寫的IPhone應(yīng)用程序和objective-c 寫的是一樣的。并且Xamarin團(tuán)隊(duì)保證在每一個(gè)IOS系統(tǒng)更新的時(shí)間同步更新Xamarin.IOS這樣我們就不用擔(dān)心被滯后了。
這僅僅是一個(gè)粗略的介紹,Xamarin移動(dòng)跨平臺(tái)方案是如何來工作的,還有太多我們沒有涉及。 Xamarn.Forms為多種移動(dòng)平臺(tái)提供了統(tǒng)一的UI(雖然目前還有些比較特別的沒有實(shí)現(xiàn),官方也沒有力推它,用來做一些原型,或者概念驗(yàn)證可以試一樣,另外如果你的UI確實(shí)很簡單,那倒是沒有問題。),當(dāng)然在Xamarin.Forms不能夠滿足你的要求的時(shí)候,可以使用Xamarin.Android和Xamarin.IOS的UI控件,這些也是Native的,也就是說在UI方面不會(huì)有性能的影響。
就目前來看C#來開發(fā)IOS應(yīng)用更具有優(yōu)越性,我們要在VS中開發(fā)Iphone的應(yīng)用程序需要配一臺(tái)Mac來做編譯。相對(duì)而言,開發(fā)Android的應(yīng)用程序就會(huì)顯得繁瑣一些,底下還有一些隱藏的東西我們沒有具體的講,包括一個(gè)app的創(chuàng)建過程,C#與Java集成在一起開發(fā)時(shí)候的交互等等,這些問題我們就留在后面慢慢來解決。
http://developer.xamarin.com/guides/android/under_the_hood/architecture/
http://en.wikipedia.org/wiki/Java_Native_Interface
http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/
聯(lián)系客服