【看了请推荐,推荐满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#编译的业务代码哦~~~业务代码一会儿会说的哦(这个文件是二进制的可被安卓虚拟机执行的文件,跟语言无关)。