HTML5技术

【Xamain 跨平台机制原理剖析】 - SmartFramework

字号+ 作者:H5之家 来源:H5之家 2016-02-01 10:13 我要评论( )

【看了请推荐,推荐满100后,将发补丁地址】 Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生态Java开发Android的越来越多,人工费用成本降低。 上面说的3条,都跟钱相关,不占技术边,看起来跟本文的标

【看了请推荐,推荐满100后,将发补丁地址】

 

Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生态Java开发Android的越来越多,人工费用成本降低。

上面说的3条,都跟钱相关,不占技术边,看起来跟本文的标题严重不符。但是,细细看来,如果这个产品的圈子打不开,再牛的技术,也是枉然。因为技术是在不断推进的,

性能问题,技术问题,实现问题,等等都可以随着时间的推动去解决,但是,Xamarin公司貌似没打算把价格降低。越发的稳定。死鬼死鬼.......。所以,我们需要破解,我们需要破解,我们需要破解(重要的事情说3遍),但是破解并非容易,这个平台软件,几乎是我见过的CLI语言最难破解的东东,因为里面钉子太多,剃不干净。(我曾经尝试去破解,发现需要耗费太多的时间,而且不稳定)。。但是,嗯,道高一尺魔高一丈。找补丁,到谷歌..........现在可以明确的告诉大家,最新版的Xamarin有了破解补丁。谷歌去吧。

 

上面说的是题外话,希望这个生态可以在这片土壤继续壮大。我们开始进入我们的标题,不要说我是标题党。呵呵。

我们就讨论Xamarin的Android开发机制吧,IOS的,本身就是在MAC下面编译的,是AOT,不是JIT.........AOT机制,本身把代码转换成了Native代码应用。JIT是基于虚拟机语言运行的中间代码。Java和.Net 都是JIT 。。。。都有类似运行的虚拟机。Java->JVM  .....C#->CLR->JIT->Native Code......

 

首先,这个跨平台的思路是基于很久以前的的Mono项目,关于Mono项目,自己百度脑补。Mono是对微乳.Net的跨平台的实现。基于C语言的实现,可以实现CLR在不同的平台系统下的运行。当然,针对的就是Linux系统。Mono的诞生,让.net可以在Linux下跑了。

好,上面仅仅是开端,我们再来看下Android。这个项目是Google收购的一家Droid公司的产品。就是用开源的Linux系统,做的二次开发。本质依然是Linux内核。

谷歌收购这个项目后,加大了对这个项目的投入。最终得以让这个项目在移动设备上运行起来。。(资本+科技=进步)

看Android项目的结构图:

 

从最上层的应用层,如 短信 电话 视频 微信 QQ等应用 到先的支持库,都是用Java实现的。

再往下就是一些对硬件功能包装的库lib层,大多是一些开源的Linux应用库,跟这个层平级的Android的虚拟机Dalvik。

最终是Linux的内核,系统的内核的作用,就是操作系统跟硬件进行交互。(当然,硬件需要对应的驱动被系统所能识别)

以上是安卓的结构和运行概述。当你打开微信的时候,就是从应用层-》框架层-》虚拟机到内核的一个来回调用交互。

----------------------------------Xamarin是怎么运行的?----------------------------------

我们上面说过,Mono项目,实现.net语言在Linux下运行,Android是Linux项目,那只要Android中有Mono,那么.net 就能在安卓里跑!!!!

于是,从Mono开发过的一些人,过度到了Xamarin公司。Xamarin公司就是基于此。

那么Xamarin打包的安卓应用是怎么跑的? 看下面的图:

这是啥?

哦,老伯伯的皮影。

额,被老外学会了。。。。。

然后, 无语了...................

 

没错,这个Xamarin其实就是皮影戏(高科技的皮影)!!!!!!!!!!!!!!!!!!!!!

(写到这里,不仅为国人悲哀,自己家的东西都被当垃圾丢弃,外国佬却总能从里面找出点什么。。。比如:炸药 司南 罗盘 等等,我们自己抛弃了自己,我们的眼里脑子里只有钱钱房房.................拿出点理想吧  my guys!!!)

说它是高科技的皮影,并非空穴来风。我们看看官方给出的结构解释:

原文:

大概意思是:Xamarin安卓项目是基于Mono运行时的,Android原生应用基于安卓运行时,也就是那个Dalvik虚拟机。。。当运行Xamarin创建的安卓应用的时候,

对应的安卓虚拟机上也会有对应包装过的对象的实例被分配。那个MCW 代表的是对原生Android的Lib的绑定,ACW是基于调用映射的API后返回响应到Mono。

怎么绑定,又怎么反馈呢?看官方怎么说的。。。

下文:

地址:

英文不好的同学,自己打开网址找翻译工具吧。

大概意思是:MCW 的绑定机制还有ACW的核心就是 JNI    

JNI是什么鬼?科普一下:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

好,既然提供交互入口JNI,那么我们的代码在经过monodroid处理后,就可以与Android这个java项目交互了。

那么C#语言是不是被处理转换成了JNI的应用了?是的。看图:

 

看完上图,你应该知道了,它在编译的时候,将C#代码文件,转化成了基于对Java原生文件的映射。注意:不是直接转化成了Java代码!是调用注册。

生产的java文件中并不提供运行实现,而是提供了在Android运行时的匹配映射!!!!!!!!!!!!!!!

真正的执行代码依然在classes.dex文件中。但并不是我们的C#编译的业务代码哦~~~业务代码一会儿会说的哦(这个文件是二进制的可被安卓虚拟机执行的文件,跟语言无关)。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 用惯了Task,你应该也需要了解它的内部调度机制TaskScheduler - 一线码农

    用惯了Task,你应该也需要了解它的内部调度机制TaskScheduler - 一线

    2017-04-29 10:01

  • 跨平台的.NET邮件协议MailKit组件解析 - 彭泽0902

    跨平台的.NET邮件协议MailKit组件解析 - 彭泽0902

    2017-03-17 13:01

  • 推荐15个很优秀的跨平台的移动开发工具 - 梦想天空(山边小溪)

    推荐15个很优秀的跨平台的移动开发工具 - 梦想天空(山边小溪)

    2017-03-12 13:02

  • 【实践】基于接口的插件机制 - 悠扬的牧笛

    【实践】基于接口的插件机制 - 悠扬的牧笛

    2017-01-18 14:03

网友点评