Xamarin iOS和Android是如何工作的?

29

我试图理解Xamarin.iOS(MonoTouch)和Xamarin.Android(Mono for Android)的工作原理。 我写了一个小应用程序并查看了.app和.apk文件。

.app文件(iOS)中有许多.dll文件。但为什么? 在我阅读的每篇文章和帖子上,他们都说:该应用程序是本地执行的,没有任何解释的内容。 有人可以解释一下Xamarin开发人员所说的“本地”是什么意思吗?

.apk文件中没有单独的.dll文件。


iOS捆绑包中的dll只是用于反射的元数据,而不是可执行代码。请参见http://stackoverflow.com/questions/10741319/how-secure-is-monotouch。 - Jason
3个回答

10

Xamarin对“本地”的定义包括但不限于以下内容:

  • 每一行C#代码都被编译成机器码,然后打包在.app文件中。在运行时,没有JIT,因为它被AOT所抑制。更多信息可以在此处找到。

http://www.mono-project.com/AOT

请注意,Xamarin.Android 仍然使用JIT,详情请参见 http://xamarin.com/how-it-works 访问平台本地类型/API是完全开放的,因此您不会受到一小组API调用的限制(如果您使用HTML5 / JavaScript,则知道有哪些限制)。
您设计的用户界面绑定到iOS(CocoaTouch)或Android(Skia)公开的本机API。没有中间层会影响性能或外观。
至于 .ipa 或 .apk 内部包含了什么,谁关心呢?当然,@Jason的评论向我们展示了一些内部实现细节。

4
首先,Xamarin同时在两个不同的运行时上工作:
- Mono - Native runtime(Davlik、ART、iOS runtime)
例如,在Visual Studio中创建自己的C#类时,该类的实例将在Mono下运行。此外,当您从NuGet下载Newton.Json包时,这也会在Mono下运行。这就是为什么我们可以使用所有很酷的.NET内容的原因。但是,当您从Java.Lang.Object(Android)或NSObject(iOS)继承,或者制作自定义控件时,这些类的实例将在本地运行时下运行。
其次,您可以注意到,我们需要以某种方式绑定这两个世界。让我们看看我们有哪些类型的对象。
- 托管对象(Mono) - 非托管对象(本地世界) - Peer对象(Mono,对象是封装本地对象的包装器)
Peer对象是Xamarin SDK类(例如activities、视图控件、UILabels、TextViews等)、您自己从Java.Lang.Object、NSObject、Fragment甚至是UISegment类继承的实例。
这种机制是Xamarin最重要的东西之一。
PS:事实上,对于Xamarin项目使用JIT或AOT编译并不重要。它取决于平台,并允许/不允许来自.NET世界的某些功能。这并不描述Xamarin的工作原理。

1

Xamarin编译器捆绑了.NET运行时,并输出本地(二进制)ARM可执行文件,打包为iOS或Android应用程序。


用于安卓,请使用JIT。 - ArthNRick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接