HTML5技术

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

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

Java原生的开发会把业务代码压缩进此文件。这个文件也是安卓虚拟机执行对应的应用时候,能找到入口,起始点。但是,Mono项目的业务代码没在这个里面,记住,它是皮影戏。这个是皮影。真正的操作者,幕后凶手,在后

Java原生的开发会把业务代码压缩进此文件。这个文件也是安卓虚拟机执行对应的应用时候,能找到入口,起始点。但是,Mono项目的业务代码没在这个里面,记住,它是皮影戏。这个是皮影。真正的操作者,幕后凶手,在后台!!!

上法宝:

 

Xamarin生成的apk包中,也是这样。

lib目录提供了运行时需要的lib 库,如Mono运行时。

注意下面的那俩文件,就是皮影戏的杆儿,映射工具。

真正的执行代码在????

在 lib 中或者在assemblies中!!

为啥是或者?因为企业版的Xamarin,支持使用NDK将应用打包成Native应用!!!

有的人纠结那个calsses.dex文件,作为入口,说Android的应用不是非线性耦合的模块应用吗?是的,但是,这非线性针对的是系统,或者是程序块内部,而不是系统跟程序应用之间的描述。应用插入到系统上,那个自描述文件 AndroidManifest.xml 提供了程序的入口描述。

而calsses.dex被安卓虚拟机 Dalvik 执行后,会给这个程序分配对应的程序运行域,

 (摘自:腾飞(Jesse))关于Dalvk虚拟机与Java运行环境的区别

  大家注意第2点和第7点有助于我们理解Xamarin.Android的工作机制

 

好,到此,你就知道了吧,那个classes.dex 就是给Zygote提供孵化器应用的............Zygote(受精卵。很形象。应用像是受精卵,通过他暖化出来了个小鸡应用)

 

KO!!!!!!!到此,你也就基本知道,这玩意儿是怎么运行的了吧。。。。没错,记住,皮影戏!!!!!!!!!!!!!!!

-----------------------------垃圾回收----------------------------------------

关于这个话题,其实没必要过分讨论,因为既然是皮影戏,那么肯定两边交互的时候 肯定不如原生,如果你纠结这个,那么请学好Java去吧。

然后就是硬件的问题,从09年到现在,内存啊 CPU什么的再移动终端上换了好几代了。从单核到双核到四核到八核。。。。。硬件的提升简直是要亲命的。

花好几个月优化的项目,可能新一代的的硬件直接藐视了以前的项目性能问题。。。(当然,不能不关注性能。在一些游戏 视频等对硬件渲染要求较高的时候,就能体现出性能的致命性!!)

好了看到这里,你也没必要继续往下看了。下面的是基于Xamarin的内存管理。

因为是皮影戏,两边其实是互相持有对方的信息的。耍皮影的根据皮影反馈的信息,进行下一步如何操作,皮影接到命令,就会在屏幕上显示对应的动作。。。

摘抄:

1. 性能问题。例如垃圾回收,Mono for Android 声称支持垃圾回收,但也有需要注意的一些严重限制。"GC不完整视图的进程,可能无法运行在内存不足时,由于GC不知道内存不足。"因为这通常需要手动,每当创建一个activity运行垃圾回收或销毁,以释放未使用的内存。否则,可能导致内存不足的异常。 我自己也不止一次碰到了这个问题,不得不使用替代方法来解决问题。 

关于内存管理: 
许多Mono for Android被分配对象为包装Java对象做为它们的代表。 这时会发生什么:每次你分配一个包装过类型相对应Java类型,就创建两个对象: 
1). Java对象在Java堆中 
2). Mono代理对象在Mono堆中 
Mono for Android不能确保这两个对象相互引用后长时间存活。那就是,Mono的垃圾回收引用一个对象,Java端的对象将一直活着,反之亦然。这个代理对象的创建mandroid.exe是工具编译时完成。 然而,GC是懒惰的,按需运行的集合,而不是简单地对象超出范围时候。 那么这意味着跨虚拟机的垃圾至少比一般更多,这是不可避免的。所以,为了临时使用时分配一个大数字对象,显示释放那些对象所需的资源是宝贵的。约定的方法使用using关键字来new一个object,使用using子句来隐式释放目标的new object是有必要的。释放Mono端的包装的Java-VM收集的对象,从而来防止太多的临时对象关联在一起很长时间。

去官方网站了解更多关于Mono for Android的垃圾回收。

其实,Mono已经对垃圾回收机制,一直在优化。

针对iOS的MonoTouch目前支持了分代式垃圾回收器(generational garbage collector)SGen。直到不久之前,Sgen还只是完整版本Mono中的一个实验性部分。伴随着垃圾回收器一同到来的,还有一个为iOS准备的 内存分析器(Memory Profiler),它可以从MonoDevelop集成开发环境中访问到。

分代式垃圾回收器Sgen取代了Mono中传统的Boehm垃圾回收器。虽然Sgen预计会有更好的性能,但其保守式扫描仍然会给它带来一些阻碍。预计将来Sgen会切换到精确的堆栈标记系统,这样应当可以大幅度减少产生的内存碎片。

 

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

网友点评