C#移动跨平台开发(2)Xamarin移动跨平台解决方案是如何工作的?

概述

  上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows、Mac和Linux开发一个核心运行时(Core CLR),这也是开源的!IT媒体网站纷纷转载,博客园的C#开发者们热泪盈眶(泥煤都等这一天好久了!)

  与此同时VS2015预览版更是直接集成了Android模拟器,但是其实里面并没有说集成IOS模拟器,我不知道大家是怎么得出可以直接用VS来开发Android和IOS应用的。不管怎么说,这都是个好消息。那么问题来了,C#如何来开发Android和IOS应用?微软会怎么做我们不确定,但是我们倒是可以来看看Xamarin是如何做的。

Android系统架构

  我想下面这张图做Android开发的同学应该很熟悉,下面我们就通过来了解Android系统的架构入门来看看Xamarin会怎么样去做?

  • Linux Kernel 操作系统层
  • Libraries And Android Runtime 各种库和Android 运行环境
  • Application Framework 应用框架层 (由Java编写)
  • Applications 应用程序层(由Java编写并且在Dalvk虚拟机来运行)

  现在做Android开发的同学只要熟悉这些应用框架层的一些接口和类库就可以给方便的来实现自己的Android应用程序。

关于Dalvk虚拟机与Java运行环境的区别

  1. Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
  2. Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
  3. 不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式
  4. Dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
  5. 是为了在运行过程中进一步提高性能,对dex文件的进一步优化。
  6. 所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制
  7. 有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

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

Xamarin.Android 架构

  Java编写的Android应用程序通过调用 Android.* 和 Java.* 这些命名空间下的类来实现一些系统的功能包括:声音、显示、OpenGl等一些通过Java API不能实现的功能或者说是与硬件、系统平台相关的功能。那这里的问题是当我们用C#来编写的时候,这些功能怎么去调用?C#写的Android 应用程序又是如何初始化的?

Android Callable Wrappers (ACW)

  当一个C#开发的Android程序运行的时候,除了一个Dalvik的虚拟机实例,还有一个Mono的虚拟机实例在运行。那个Dalvik虚拟机实体就像一个宿主,我们的APP在宿主上运行,而我们所有用C#写的方法都会以ACW的形式被调用。在Java代码中以native的式式invoke,就像invoke其它C或者C++的代码一样。

  Momodroid.exe 在编译阶段会为我们的C#类生成对应的ACW。

 1 using System;
 2 using Android.App;
 3 using Android.OS;
 4
 5 namespace Mono.Samples.HelloWorld
 6 {
 7         public class HelloAndroid : Activity
 8         {
 9                 protected override void OnCreate (Bundle savedInstanceState)
10                 {
11                         base.OnCreate (savedInstanceState);
12                         SetContentView (R.layout.main);
13                 }
14         }
15 }

对应生成的ACW代码:

 1 package mono.samples.helloWorld;
 2
 3 public class HelloAndroid
 4         extends android.app.Activity
 5 {
 6         static final String __md_methods;
 7         static {
 8                 __md_methods =
 9                         "n_onCreate:(Landroid/os/Bundle;)V:GetOnCreate_Landroid_os_Bundle_Handler\n" +
10                         "";
11                 mono.android.Runtime.register ("Mono.Samples.HelloWorld.HelloAndroid, HelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", HelloAndroid.class, __md_methods);
12         }
13
14         public HelloAndroid ()
15         {
16                 super ();
17                 if (getClass () == HelloAndroid.class)
18                         mono.android.TypeManager.Activate ("Mono.Samples.HelloWorld.HelloAndroid, HelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "", this, new java.lang.Object[] {  });
19         }
20
21         @Override
22         public void onCreate (android.os.Bundle p0)
23         {
24                 n_onCreate (p0);
25         }
26
27         private native void n_onCreate (android.os.Bundle p0);
28 }

  大家可以看到上面那个 native的n_onCreate方法最后就会调用那个通过mono虚拟机注册的Mono.Samples.HelloWorld.OnCreate 方法。

Managed Callable Wrappers (MCW)

  上面我们讲Dalvik 虚拟机是我们C#开发的Android应用程序的宿主,它通过ACW来调用我们用C#写的方法。如果我们的这个C#里面的方法涉及到一些声音或者系统本身,或者说现在已经有很多成熟的用Java写的类库,我们想调用怎么办? 答案是我们再通过MCW 调回去。在C#运行时中去调用Java 称之为MCW。

  Xamarin.Android Framework中有很多就是MCW,关于MCW的创建以及C#与Java集成开发的东西我们后面再细讲,包括一个C#开发的Android应用程序是如何被启动的,我们后面再细讲。对于C#开发的Android应用程序来说,性能上面肯定是会有影响,但是影响有多大,我并没有做过具体测试,所以就不详述了。后面我们再细细的去对比。

Xamarin.IOS 架构

  对于开发者来说,Xamarin.IOS相对于Xamarin.Android就要简单很多了,我们用C#开发的ios应用程序在被编译成IL代码之后,然后转交给Apple complier直接编译成IPhonee的本地机器码。也就是说C#写的IPhone应用程序和objective-c 写的是一样的。并且Xamarin团队保证在每一个IOS系统更新的时间同步更新Xamarin.IOS这样我们就不用担心被滞后了。

小结

  这仅仅是一个粗略的介绍,Xamarin移动跨平台方案是如何来工作的,还有太多我们没有涉及。 Xamarn.Forms为多种移动平台提供了统一的UI(虽然目前还有些比较特别的没有实现,官方也没有力推它,用来做一些原型,或者概念验证可以试一样,另外如果你的UI确实很简单,那倒是没有问题。),当然在Xamarin.Forms不能够满足你的要求的时候,可以使用Xamarin.Android和Xamarin.IOS的UI控件,这些也是Native的,也就是说在UI方面不会有性能的影响。

  就目前来看C#来开发IOS应用更具有优越性,我们要在VS中开发Iphone的应用程序需要配一台Mac来做编译。相对而言,开发Android的应用程序就会显得繁琐一些,底下还有一些隐藏的东西我们没有具体的讲,包括一个app的创建过程,C#与Java集成在一起开发时候的交互等等,这些问题我们就留在后面慢慢来解决。

参考阅读

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/

时间: 2024-11-06 10:02:00

C#移动跨平台开发(2)Xamarin移动跨平台解决方案是如何工作的?的相关文章

Visual Studio跨平台开发(1):Hello Xamarin!

前言 应用程序发展的脚步, 从来没有停过. 从早期的Windows 应用程序, 到网络时代的web 应用程序, 再到近几年相当盛行的行动装置应用程序(Mobile Application), 身为C#的开发人员与Visual Studio的使用者. Windows Phone与Windows Store App的开发是否已满足不了你了呢? 如果能夠让你使用C#及Visual Studio 来开发iOS及Android的app. 是否能再度唤醒你的开发魂? Xamain 正是为了这样的需求而诞生的

Visual Studio跨平台开发实战(1) - Hello Xamarin!

原文 Visual Studio跨平台开发实战(1) - Hello Xamarin! 前言 应用程式发展的脚步, 从来没有停过. 从早期的Windows 应用程式, 到网路时代的web 应用程式, 再到近几年相当盛行的行动装置应用程式(Mobile Application), 身为C#的开发人员与Visual Studio的使用者. Windows Phone与Windows Store App的开发是否已满足不了你了呢? 如果能够让你使用C#及Visual Studio 来开发iOS及And

C#跨平台手机应用开发工具Xamarin尝试 与Eclipse简单对比

Xamarin 支持使用C#开发基于Android.IOS.WindowsPhone应用开发,最大特点C#+跨平台,详细说明问度娘. 安装 研究 想体验研究的点击查看页面 Xamarin For Visual Studio 3.0.54.0 完整离线破解版 我也下载了研究下,破解有时候有问题,一登陆就变成试用版,需要重新生成License,挺烦人,于是写了段批处理,放入记事本中另存为crack.bat执行,则可再次生成License. @Entitlements.bak为破解后生成的Entitl

浅谈移动应用的跨平台开发工具(Xamarin和React Native)

谈移动应用的跨平台开发不能不提HTML5,PhoneGap和Sencha等平台一直致力于使用HTML5技术来开发跨平台的移动应用,现在看来这个方向基本算是失败的,基于HTML5的移动应用在用户体验上与原生应用仍然存在着明显的差距. 与上述HTML5平台不同,Xamarin和React Native通过各自的方式来实现跨平台.Xamarin基于Mono框架将C#代码编译为原生平台代码,React Native则是在UI主线程之外运行一个JavaScript线程,两者呈现给用户的都是原生体验. 笔者

isual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍

原文 isual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS, Xamarin 在Visual Studio中针对Android, 可以直接设计使用者介面. 在本篇教学文章中, 笔者会针对Android的专案目录结构以及基本控制项进行介绍, 包含TextView, EditView, Toggle/ Switch以及Seekbar控制项. Android专案目录结构 在Visual Studio建立Android 应用程式专案后, ??

Visual Studio跨平台开发实战(3) - Xamarin iOS多页面应用程式开发

原文 Visual Studio跨平台开发实战(3) - Xamarin iOS多页面应用程式开发 前言 在前一篇教学中, 我们学会如何使用Visual Studio 搭配Xcode 进行iOS基本控制项的操作. 但都是属于单一画面的应用程式. 这次我们要来练习如何透过Navigation Controller来建立多页面的iOS应用程式. 设定专案及画面 1. 开启Xamarin Studio 并建立新专案, 专案类型为iOS=>iPhone=>空白专案, 专案名称为02-Navigatio

Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍

原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iOS的专案目录架构以及基本控制项进行说明. 包含UIButton,, UISlider, UISwitch, UIImage以及UIWebView控制项. iOS的使用者介面描述档, 其副档名为.xib, 目前在Visual Studio尚未支援直接编辑. 因此在文章中, 我们会先用Xamarin S

Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发

原文 Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发 前言 大部份的Andr??oid 都具有实体或虚拟的Back键. 因此在处理多页面应用程式时, 与先前所介绍的iOS Navigation controller 比较起来会简单许多. 1. 开启Visual Studio 并新增Android Application 专案并命名为Lab4-MultiScreen   2. 在Layout资料夹中新增Second.axml   在Second

使用Xamarin实现跨平台移动应用开发(转载)

刚在朋友圈看到张善友,转发的一条分享“使用Xamarin实现跨平台移动应用开发”,写的确实很详细得体,从收费到开源,这段时间xamarin受到不少质疑,如此文http://blog.csdn.net/aofengdaxia/article/details/41891945/.当然这篇随笔也是转载的(如果不写成随笔,大伙可能看不到这篇文章).希望那些已经入坑xamarin的开发者能有一个新的认识 原文链接:http://www.infoq.com/cn/articles/mobile-cross-