如果能搜到这篇文章,我相信你已经了解了什么是Xamarin.Android和C#语言了。或者你可以去官网查看相关的概念。注意Xamarin旗下有Xamarin.Forms, Xamarin.Android, Xamarin.IOS,这篇文章只讲Xamarin.Android,因为笔者对Android比较熟悉,其他的都在学习中。
本篇文章主要回答以下两个问题:
-
Xamarin.Android应用为什么可以在Android系统上运行
-
Xamarin.Android应用是怎么在Android系统上运行
Xamarin.Android应用为什么可以在Android系统上运行
在Android原生开发中(Java或者Kotlin),我们开发的应用在启动时都会被系统分配一个虚拟机(Dalvik或者ART)去运行,而我们的虚拟机是运行在Linux内核之上的。同样,C#跟Java一样,也是高级语言,它运行在Android上也需要先转换为中间语言(IL),然后被CRL(类似Java的虚拟机)去执行。最后了解一下什么是Mono,从这篇文章中,我们可以看到如何使用Mono实现了一个轻量级的.NET程序运行环境,这个.NET程序运行环境就是CRL。再从维基百科我们可以看到,Mono项目不仅可以运行于Windows系统上,还可以运行于Linux上,这就意味着C#程序可以运行在Android系统上了(底层是Linux内核嘛)。在Xamarin.Android中使用的Mono.Android,你可以打开你的Xamarin.Android项目,在References文件夹下找到这个.dll文件。这样我们的Xamarin.Android程序就可以完美运行在Android系统上了,也就是说我们可以使用C#来完成Android的开发,那么大量的.NET平台的库就可以使用了。
Xamarin.Android应用是怎么在Android系统上运行
在讲怎么运行之前先上一张官网的图片:
在这张图中,左边是Xamarin.Android项目在Android系统上运行时的架构图,右边是原生Android项目在Android系统上运行的架构图,我们可以看到他们中间通过MCW和ACW来相互调用。
先解释一下MCW和ACW:
-
MCW:Managed Callable Wrappers are a JNI bridge which are used any time managed code needs to invoke Android code and provide support for overriding virtual methods and implementing Java interfaces
-
ACW:Android Callable Wrappers are a JNI bridge which are used any time the Android runtime needs to invoke managed code.
也就是说,ACW是Java代码在运行的时候ART去调用C#的IL(也就是上面所说的managed code,managed code是一个统称,比如Java编译以后的.class文件里面的语言也可以称为managed code)代码的一个JNI桥梁。而MCW则是C#的的IL去调用Java代码时候的一个JNI桥梁。
下面引用一下Ted's Blog中的片段来帮助我们更好得理解这两个概念:
Android Callable Wrappers(ACW)
使用C#开发的Android应用程序在运行的时候,C#代码是在Mono虚拟机中执行的,而Mono虚拟机是寄宿在Dalvik虚拟机中运行的,所有的C#代码都通过ACW的方式被调用。
Managed Callable Wrapper(MCW)
如果需要在C#中调用一些系统的功能或者Java实现的类库,该如何调用那? 答案就是MCW,MCW就是一个JNI桥梁,可以使用托管代码调用Android的代码。MCW将整个Android.* 以及相关的命名空间通过 jar绑定的方式暴露出来,是的C#可以调用。
当然只看概念可能不能够很好地理解什么是ACW和MCW。就像我们当初理解什么是JNI一样,大家都在说用JNI就是Java跟其他语言的交互,比如使用JNI去调用C++代码,但是到底什么是JNI呢?只有使用过JNI以后才能真正的理解JNI,也就是说只有看到实体才能真正的了解这个概念。
在这里我找了一篇文章里面的一张图片
这张图片里面的MainActivity就是我们用C#写的MainActivity在编译之后生成的对应的文件。这篇文章中也提到了:
将C#代码文件,转化成了基于对Java原生文件的映射。注意:不是直接转化成了Java代码!是调用注册。
这篇文章讲得很好,比较生动,我希望大家能够从中很好地理解ACW和MCW作为JNI桥梁概念的含义。
最后介绍一下Xamarin.Android应用在运行的时候的一个流程,在官网最后有一句话:
Xamarin.Android hooks into this by adding a mono.MonoRuntimeProvider ContentProvider to AndroidManifest.xml during the build process.
意思就是说,在Android系统启动一个app的时候,首先会读取Manifest文件中的Application节点,然后会去读ContentProvider节点,在读取ContentProvider节点的时候采用hook技术加入自己的Mono运行时,也就是说Mono运行时是寄宿在Dalvik虚拟机之中的。这也是为什么C#语言可以运行在Android系统上的原因之一。
总之,Xamarin.Android只是对原生Android的一个包裹,使用C#开发Xamarin.Android程序跟使用Java开发原生Android一样舒服。不同的是,C#还可以开发Xamarin.IOS等。
网友评论