Включение AOT в Xamarin для Android (Visual Studio)

Я знаю, что в Xamarin для Android есть поддержка AOT. После того, как программное обеспечение стало бесплатным, все его функции также стали бесплатными. Я прочитал документацию и включил AOT, изменив файл project.csproj следующим образом:

<AotAssemblies>True</AotAssemblies>

Убедившись, что мой путь к проекту не содержит пробелов (процесс прерывается), я запустил сборку и получил APK с обеими управляемыми библиотеками .NET и собственными скомпилированными библиотеками. . К сожалению, приложение, похоже, использует библиотеки DLL .NET и полностью игнорирует собственные библиотеки. Есть ли способ исправить это?

РЕДАКТИРОВАТЬ: читая некоторые другие вопросы, связанные с Mono AOT, кажется, что это может быть так, как оно должно работать. Я хотел AOT-скомпилировать свое приложение в надежде сократить время запуска ~ 2 секунды, которое вообще не изменилось после того, как я переключился с JIT на AOT. Может кто-нибудь объяснить мне это?

БОНУС: Можно ли как-нибудь включить расширенные флаги оптимизации? (например, -o)


person Riuo    schedule 22.05.2016    source источник
comment
ОБНОВЛЕНИЕ: версия Visual Studio для сообщества не поддерживает AOT; и, когда-то в последние шесть месяцев, обновление для Xamarin явно вынуждает его отключить (если вы вручную включили AOT, отредактировав файл csproj). Теперь для сборки с AOT необходима версия Enterprise.   -  person ToolmakerSteve    schedule 27.09.2018


Ответы (2)


AOT'ing ваших сборок / кода не изменит запуск инициализации приложения (начальная загрузка приложения + инициализация Xamarin / Mono, НО не включая время выполнения вашего кода).

Теперь, если вы выполняете X объем работы, который ограничен ЦП в вашем коде, скажем, в пределах OnCreate (что вам действительно не следует не делать), вы должны (следует ) увидеть уменьшение общего времени. Я говорю должен из-за того, что AOT'ing не гарантирует, что вы увидите более быстрое время выполнения определенной части кода, он устраняет дрожание, но есть много других факторов. . Я использую Mono (AOT без LLVM) в течение многих лет, и вам действительно нужно инструментировать и тестировать свой код.

Хотя режим JIT очень быстрый, а оптимизация по умолчанию в Mono настроена так, чтобы обеспечить хороший баланс между оптимизацией и скоростью JIT, компиляция AOT дает несколько дополнительных преимуществ:

  • Уменьшено время запуска.

Примечание. Это особенно полезно для больших программ, которым может потребоваться выполнить большой объем кода, прежде чем они будут работать ...

  • Возможная лучшая производительность.

Примечание: .... Это означает, что определенные программы могут работать медленнее, поскольку сгенерированный код является более общим, чем конкретный код, который может создать JIT.

Ссылка: http://www.mono-project.com/docs/advanced/aot/


Включите LLVM и AOT для тестирования ваших сборок выпуска:

Что касается оптимизации кода AOT, включите LLVM вместе с AOT в ваших сборках выпуска для тестирования производительности / инструментария. Примечание. Ключевым моментом является тестирование, наличие полного набора тестов приложения и внутренних инструментов для сбора данных о производительности во время выполнения - это ключ к получению тех 5-звездочных обзоров в магазинах приложений ;-)


EnableLLVM

Логическое свойство, определяющее, будет ли LLVM использоваться при предварительной компиляции сборок в машинный код. Поддержка этого свойства была добавлена ​​в Xamarin.Android 5.1.

По умолчанию это свойство имеет значение False.

Это свойство игнорируется, если свойство MSBuild $ (AotAssemblies) не имеет значения True.


AotAssemblies

Логическое свойство, определяющее, будут ли сборки заранее скомпилированы в собственный код и включены в .apk. Поддержка этого свойства была добавлена ​​в Xamarin.Android 5.1.

По умолчанию это свойство имеет значение False.

person SushiHangover    schedule 22.05.2016
comment
Спасибо за прекрасное объяснение! Должен ли я предполагать, что нет способа сократить время запуска, учитывая, что Mono не может быть дополнительно оптимизирован? Некоторым большим приложениям требуется около 5 секунд для загрузки (как видно в Google Play), и это действительно отвлекает меня от использования Xamarin. В моем методе OnCreate практически нет кода. - person Riuo; 22.05.2016
comment
@DoDo AOT / LLVM не поможет быстрее перейти к первому инициированному экрану в приложении HelloWorld (без пользовательского кода) ... Факты из жизни, поскольку есть накладные расходы на использование экосистемы Xamarin / C #, если вы дизайн приложения чистый, разница во времени запуска между собственным приложением и приложением на основе Xamarin должна быть довольно небольшой ... теперь я видел МНОГО родных приложений, у которых ужасный пользовательский опыт с точки зрения времени запуска, просмотр / время изменения активности, задержки обновления и т. д. набор инструментов делает только так много, после чего он находится в руках разработчиков приложений, к лучшему или к худшему ;-) - person SushiHangover; 22.05.2016
comment
Интересно ... Значит, накладные расходы останутся неизменными, даже если я масштабирую свое приложение? Я сохраню чистый метод OnCreate, в котором все будет происходить асинхронно после загрузки пользовательского интерфейса. Но если я добавлю больше кода и больше действий, будет ли время запуска оставаться текущим ~ 2 секунды или увеличится до примерно 5 секунд, которые я вижу на рынке? Кроме того, знаете ли вы, влияет ли использование большего количества библиотек C # на время запуска? Я где-то читал, что добавление дополнительных библиотек резко увеличивает время запуска, и я считаю, что именно здесь AOT играет большую роль. - person Riuo; 22.05.2016
comment
@DoDo Я работал над приложениями Xamarin.iOS и Xamarin.Android, которые загружают 200 МБ пользовательского кода и 2 ГБ установленного содержимого, и время их запуска действительно ничем не отличается от шаблонного приложения HelloWorld на Xamarin. Теперь, если бы мы запустили все, что нам нужно (обновления GPS, инициализацию физического движка, вывод таблицы лидеров Play Game и т. Д.), Просто при запуске приложения, да, мы были бы мертвыми в воде ... но между использованием Async и наших собственных пулов потоков умно и с ленивым запуском приложение оказывается перед пользователем за пару секунд. - person SushiHangover; 22.05.2016
comment
@DoDo Итак, в конце концов, это действительно мало связано с Xamarin, это просто разработка приложений в целом, и я бы делал тот же дизайн кода в приложениях Java / C Droid и / или приложениях ObjC / Swift для iOS. - person SushiHangover; 22.05.2016
comment
Спасибо, сэр! Я буду придерживаться ваших слов и продолжу работу с Xamarin :) - person Riuo; 22.05.2016
comment
@DoDo ;-) Я всегда смотрю на набор инструментов, инструменты разработчика, язык и т. Д. Как на второй, третий, последний (?) Элемент в списке. Вопрос, с которого вам следует начать, заключается в том, каковы цели вашего приложения, требования, платформы и т.д. доступ к разработчикам C #, я бы не стал бросать их перед Xcode / ObjC с 3-месячной датой отгрузки приложения ;-). Теперь, если у них / у вас НЕТ мобильного фона, выделите время, поскольку мобильный телефон - это другой мир, даже если вы используете известный как C # - person SushiHangover; 22.05.2016
comment
У меня ошибка при включении AOT. не удалось собрать сборку: / - person smedasn; 03.10.2016
comment
@smedasn Привет. Вы починили не смогли сборку? - person user1658602; 03.11.2016

Совпадение или нет, но когда я добавил <AotAssemblies>True</AotAssemblies> в <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> раздел android .csproj, время моего запуска сократилось с 10 до 4 секунд! Затем я удалил AotAssemblies и попытался снова, и у меня снова осталось 10 секунд, поэтому AotAssemblies что-то делает :)

person VeYroN    schedule 18.05.2017
comment
Я провел несколько тестов и AotAssemblies УКРАИЛ время запуска моего приложения с 5 до 3 с. - person Felix; 31.05.2018
comment
Я тоже могу это подтвердить. AOT улучшил время запуска моего приложения как минимум на 2 секунды. Все остальное, например, навигация по страницам, действия кнопок, обратная связь с пользовательским интерфейсом и т. Д., Тоже работает быстрее. - person Harindaka; 30.07.2018
comment
В моем случае приложение загружается быстро, но для загрузки первого представления (на странице) требуется 6 секунд. - person user1034912; 08.05.2021