Подтвердить что ты не робот

Как работает Xamarin iOS и Android?

Я пытаюсь понять, как работают Xamarin.iOS(MonoTouch) и Xamarin.Android(Mono для Android). Я написал небольшое приложение и заглянул в файл .app и .apk.

Внутри файла .app(iOS) много файлов .dll. Но почему? На каждой странице и посту, которые я читаю, они говорят: приложение выполнено native и ничего не интерпретируется. Может ли кто-нибудь объяснить мне, что означает разработчик xamarin с "родным"?

Внутри файла .apk нет ни одного файла DLL.

4b9b3361

Ответ 1

Определение "родной" Xamarin включает, но не ограничивается:

  • Каждая строка кода С# компилируется в машинный код и затем упаковывается в .app. В runtime нет JIT, поскольку он подавляется AOT. Более подробную информацию можно найти на

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

(Обратите внимание, что Xamarin.Android по-прежнему использует JIT, http://xamarin.com/how-it-works)

  • Доступ к родным типам /API платформы полностью открыт, поэтому вы не ограничены небольшим набором вызовов API (если вы используете HTML5/JavaScript, вы знаете, какие существуют ограничения).

  • Пользовательский интерфейс, который вы создаете, привязан к собственному API, открытому iOS (CocoaTouch) или Android (Skia). Нет промежуточного слоя, который может повредить производительность или внешний вид.

Что касается внутри .ipa или .apk, кого это волнует? Конечно, комментарий @Jason показывает нам некоторые детали внутренней реализации.

Ответ 2

Компилятор Xamarin объединяет среду выполнения .NET и выводит собственный (двоичный) исполняемый файл ARM, упакованный как приложение для iOS или Android.

Ответ 3

Прежде всего, Xamarin работает в двух разных режимах одновременно:

  • Mono
  • Собственное время выполнения (Davlik, ART, iOS runtime)

Пример. Когда вы создаете свой собственный класс С# в Visual Studio, экземпляр этого класса будет работать под Mono. Также, когда вы загружаете пакет Newton.Json из nuget, это также будет работать в Mono. Это причина, почему мы можем использовать все классные вещи .NET. Однако, когда вы наследуете Java.Lang.Object(Android) или NSObject (iOS) или создаете собственный элемент управления, экземпляры этих классов будут запускаться под собственной версией.

Во-вторых, вы можете заметить, что нам нужно каким-то образом связать эти два мира. Давайте посмотрим, какие типы объектов у нас есть.

  • Управляемые объекты (Mono)
  • Неумелые объекты (родной мир)
  • Одноранговые объекты (Моно, объекты, которые являются оболочками для собственных объектов)

Одноранговые объекты представляют собой экземпляры классов SDKs Xamarin (например, действия, элементы управления просмотром, UILabels, TextViews и т.д.), экземпляры вашего собственного наследования из классов Java.Lang.Object, NSObject, Fragment или даже UISegment.

Этот механизм является одной из самых важных вещей от Xamarin.

PS: На самом деле, неважно, какую из компиляции мы используем для проектов Xamarin JIT или AOT. Это зависит от платформы и позволяет/не позволяет некоторые функции из мира .NET. Это не описывает, как работает Xamarin.