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

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

<AotAssemblies>True</AotAssemblies>

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

EDIT: читая вокруг некоторых других вопросов, связанных с Mono AOT, кажется, что это может быть так, как это должно работать. Я хотел AOT-скомпилировать свое приложение в надежде уменьшить время запуска ~2 секунд, которое не изменилось вообще после того, как я переключился с JIT на AOT. Кто-нибудь может мне это объяснить?

бонус: есть ли способ включить advanced флаги оптимизации? (например-o)

2 ответов


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

теперь, если вы делаете X объем работы, связанный с процессором в вашем коде, скажем, в OnCreate (который вы действительно должны не делать), вы бы (должны) увидеть уменьшение общего времени. Я говорю должны из-за того, что АОТ передоза не гарантирует, что вы увидите большее время выполнения определенного участка кода, это не исключает джиттер, но есть много других факторов. Я использую Mono (AOT w/ & w / o LLVM) в течение многих лет, и вам действительно нужно инструмент и тест на код код.

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

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

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

  • потенциал повышения производительности.

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

Ref:http://www.mono-project.com/docs/advanced/aot/


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

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


EnableLLVM

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

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

это свойство игнорируется, если свойство $ (AotAssemblies) MSBuild не Истинный.


AotAssemblies

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

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


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