【问题标题】:How does Xamarin iOS and Android work?Xamarin iOS 和 Android 是如何工作的?
【发布时间】:2013-06-16 13:42:20
【问题描述】:

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

.app 文件 (iOS) 内部有许多 .dll 文件。但为什么? 在我读到的每一页和帖子上,他们都说:应用程序是本地执行的,没有任何解释。 有人可以向我解释一下 xamarin 开发人员对“本机”的含义吗?

.apk 文件内部不是单个 .dll 文件..

【问题讨论】:

标签: android ios mono xamarin


【解决方案1】:

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 的评论向我们展示了一些内部实现细节。

【讨论】:

    【解决方案2】:

    首先,Xamarin 同时在两个不同的运行时上工作:

    • 单声道
    • 本机运行时(Davlik、ART、iOS 运行时)

    一些例子。在 Visual Studio 中创建自己的 C# 类时,此类的实例将在 Mono 下运行。此外,当您从 nuget 下载 Newton.Json 包时,它也将在 Mono 中运行。这就是为什么我们可以使用所有很酷的 .NET 东西的原因。但是,当您从 Java.Lang.Object (Android) 或 NSObject (iOS) 继承或制作自定义控件时,这些类的实例将在本机运行时下运行。

    其次,你会注意到我们需要以某种方式绑定这两个世界。让我们看看我们有哪些类型的对象。

    • 托管对象(单声道)
    • 无人管理的物体(原生世界)
    • 对等对象(Mono,作为原生对象包装器的对象)

    对等对象是 Xamarin SDK 类的实例(例如活动、视图控件、UILabels、TextViews 等),您自己的从 Java.Lang.Object、NSObject、Fragment 甚至 UISegment 类继承的实例。

    该机制是 Xamarin 中最重要的功能之一。

    PS:实际上,对于 Xamarin 项目 JIT 或 AOT,我们使用哪种编译并不重要。它取决于平台并允许/不允许来自 .NET 世界的某些功能。这并没有描述 Xamarin 的工作原理。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 安卓使用jit
      猜你喜欢
      • 2019-12-14
      • 2023-04-08
      • 2016-01-06
      • 2022-01-15
      • 2023-01-02
      • 1970-01-01
      • 2020-12-20
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多