Размер Xamarin - apk

Итак, после того, как я начал разрабатывать приложение с помощью Xamarin.Forms, когда я попытался создать сборку релизов сегодня, я был потрясен, увидев, что размер приложения составляет ~ 25 МБ - ~ 31 МБ (после SDK Only Linking, ProGuard, Создание apk для каждого abi). Моя папка ресурсов находится только в КБ. Apk фактически был всего 5 МБ в режиме отладки и был так счастлив увидеть его. Позже я понял, что это из-за опции "Использовать совместную работу", которую мы не должны использовать в режиме Release.

Затем я попытался создать пустое приложение Xamarin.Android, но сборка релизов с помощью Linking SDK и User Assemblies, ProGuard, APK для каждого abi все еще ~ 8MB до ~ 13MB.

В приведенной ниже ссылке минимальный размер составляет 2,9 МБ с помощью приложения Hello World, однако я не могу создать такой размер. https://developer.xamarin.com/guides/android/advanced_topics/application_package_sizes/

Для моего приложения и пустого приложения, которое я создал, необходимые dll кажутся высокими (например, mscorlib.dll имеет размер 2.2 МБ и т.д., где, как говорится в ссылке после ссылки, будет 1 мб) Вот что я вижу как мой сборка после извлечения apk введите описание изображения здесь

В одной из недавних технологических конференций Microsoft мне стало известно, что приложение "9 News" (ссылка ниже) было построено с использованием xamarin, и создатели присутствовали на сцене. Однако я был удивлен этим размером приложения. Это всего лишь 5,85 МБ. Я не уверен, как это достигается?

Может ли кто-нибудь помочь мне с этим?

https://play.google.com/store/apps/details?id=nineNewsAlerts.nine.com

Мне также интересно узнать, что Microsoft делает что-то для улучшения размеров пакетов приложений? Или это будет разрешено, если они принесут ядро ​​.NET к xamarin?

Ответ 1

Файлы APK для Xamarin Android имеют больший размер, чем обычно, потому что они включают библиотеки Xamarin, которые переводят код С# на Java-код, для запуска в ОС Android.

Используя следующие параметры, вы можете уменьшить размер APK:

  • Конфигурация: Активный (Release).
  • Платформа: Активна (любой процессор). Это необходимо для создания APK для магазина Google Play.
  • Использовать совместное выполнение: false. Если вы установите значение true, APK будет использовать Mono Runtime для выполнения. Mono Runtime устанавливается автоматически при отладке через USB, но не в Release APK. Если Mono Runtime не установлено на устройстве, и этот параметр установлен в true в Release APK, приложение выйдет из строя.
  • Сгенерировать один пакет (.apk) для выбранного ABI: false. Создайте APK для максимально возможного количества платформ по соображениям совместимости.
  • Включить Multi-Dex: true, но вы можете установить его в false, если ваше приложение не очень сложное (то есть имеет менее 65536 переменных или методов, см. здесь).
  • Включить инструментарий разработчика (отладка и профилирование): false для выпуска APK.
  • Связывание: SDK и пользовательских сборок. Это заставит компилятор Xamarin удалить все неиспользуемые классы из SDK и вашего кода, уменьшив размер APK.
  • Поддерживаемые архитектуры: Выберите все по соображениям совместимости.

Вот пример экрана печати:

введите описание изображения здесь

Ответ 2

Вот статистика моего размера приложения Xamarin.Forms из консоли Google Play. Вы можете увидеть, насколько он снизился, как только я серьезно отнесся к теме и отошел от настроек Xamarin по умолчанию:

enter image description here

В дополнение к мерам, которые обычно встречаются при поиске по теме (связывание, отслеживание собственных ресурсов, APK для ABI и т.д.), Вот несколько моих собственных выводов и замечаний:

  • Включение управляемых подсистем TLS размером ~ 1 МБ - по умолчанию выбран вариант "Собственный TLS 1.2" в разделе "Параметры проекта" → "Параметры Android" → "Дополнительно" → реализация SSL/TLS. Управляемый TLS - только версия 1.1, возможно, это проблема кого-то
  • Обновление до Xamarin.Forms 4.1 дает сокращение ~ 1 МБ (по сравнению с 3.x и 4.0) - они удалили некоторые неиспользуемые, но все еще упоминаемые библиотеки совместимости Android
  • Включение упаковщика aapt2 дает сокращение ~ 1 МБ только для ресурсов App Compat (тех, на которые ссылается и включает Xamarin.Forms). Мог бы дать больше, если у вас есть много собственных ресурсов. У aapt2 вы можете еще больше сократить ресурсы, используя следующие дополнительные аргументы в файле Android.csproj:

    <PropertyGroup>
       <AndroidUseAapt2>true</AndroidUseAapt2>
       <AndroidAapt2LinkExtraArgs>--no-version-vectors -c en-rUS</AndroidAapt2LinkExtraArgs>
    </PropertyGroup>
    
  • Включение D8 и R8 дает еще ~ 1 МБ для небольшого приложения Xamarin.Forms (Параметры проекта → Параметры Android или .csproj)

    <PropertyGroup>
        <AndroidDexTool>d8</AndroidDexTool>
        <AndroidLinkTool>r8</AndroidLinkTool>
    </PropertyGroup>
    
  • SkiaSharp 1.60.3 дает экономию ~ 2 МБ на архитектуру по сравнению с более поздними версиями (например, 1.68.0). Стоит посмотреть на зависимости и их версии, вздувающие ваш APK.

  • Отключение AoT (если оно было включено ранее по умолчанию) может легко сократить размер вашего приложения вдвое. Включение опережающего времени усложнение могло бы стать преднамеренным шагом для повышения производительности при запуске вашего приложения. Здесь есть очевидный компромисс: либо вы пользуетесь AoT, и у вас огромный размер приложения, либо у вас его нет, и вы сохраняете минимальный размер при медленном запуске приложения. Один из моментов, которые следует учитывать при выборе компромисса... В большинстве статей ASO (а также в консоли Google Play) упоминается, как важно иметь небольшой размер приложения для увеличения конверсии установок. Очевидно, что при просмотре в Google Play отображается размер загрузки приложения, а не время запуска приложения.

  • Настройте AoT, чтобы минимизировать его занимаемую площадь, добавьте в .csproj следующую информацию для конфигурации выпуска:

    <PropertyGroup>
        <AotAssemblies>true</AotAssemblies>
        <AndroidAotAdditionalArguments>no-write-symbols,nodebug</AndroidAotAdditionalArguments>
    </PropertyGroup>
    
  • Выполнение частичного AoT. По умолчанию AoT просматривает все сборки, разрешенные проектом, и добавляет файлы 30+.so в каталог /lib вашего APK. Существует множество совместимых приложений, BCL и системных библиотек. Можно хотеть иметь контроль над тем, какие сборки пропустить через AoT, а какие проигнорировать, чтобы найти хорошее место между производительностью и размером приложения. Ну, нет такой вещи, как стандартная функция (по крайней мере, я не нашел). Вы можете поиграть с процессом сборки Xamarin, внеся изменения в Xamarin.Android.Common.targets - вы можете найти некоторые подробности об этом процессе здесь. Я нашел свое золотое сечение, используя AoT всего три библиотеки (1 мою собственную библиотеку пользовательского интерфейса XF и 2 библиотеки XF):

    <_resolveduserassemblies2 include="Tmp/android/assets/Xamarin.Forms.Core.dll;Tmp/android/assets/Saplin.CPDT.UICore.dll;Tmp/android/assets/Xamarin.Forms.Platform.Android.dll;" />

P.S.: Включение связывания (SDK и пользовательские сборки) - 90% вероятности, что вы обнаружите, что ваше приложение сломано, если вы широко используете XAML и привязки. Добавьте свои собственные библиотеки в исключения компоновщика - библиотека классов XF, в которой размещен ваш пользовательский интерфейс, любые библиотеки классов, которые вы создали, и которые могут использовать отражение.

PPS: благодаря моим усилиям по минимизации, частичному AoT и оплате с помощью асинхронной/отложенной загрузки пользовательского интерфейса Xamarin.Forms(здесь и здесь) я достиг значительного уменьшения размера приложения (см. рис. Выше) со значительными улучшениями времени запуска приложения (по данным Nokia N1 через ADB):

  • Нет AOT, интерфейс синхронизации (мс): 3613, 3586, 3576
  • Частичное AOT, асинхронный интерфейс (мс): 2202, 2255, 2258

Ответ 3

Я понимаю вашу проблему при создании мобильного приложения, вы всегда хотели создать файл apk небольшого размера, который можно легко загрузить и использовать пользователями. Для этого попробуйте уменьшить дублирование кода в вашем проекте и уменьшить весь размер изображения. Используйте следующие шаги, это поможет вам уменьшить размер apk. Щелкните правой кнопкой мыши на свойства дроида. Откройте Настройки Android → Нажмите на упаковку, затем проверьте создание одного пакета (.apk) для выбранного ABI. Проверьте опции Multi-Dex и proguard. Теперь перейдите к опции Linker, выберите сборки SDK Только в раскрывающемся списке "Связывание". Теперь перейдите на вкладку Advance, Проверьте все параметры в разделе Поддерживаемая архитектура. Сохраните все настройки и сохраните проект в режиме освобождения и создайте свой проект, после чего вы можете создать уменьшенный размер файла apk. Используйте следующую ссылку для получения дополнительной информации.

http://motzcod.es/post/112072508362/how-to-keep-your-android-app-size-down