Включить 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 что-то делает :)