Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Оптимизация размера APK и AAB пакетов: удаление ненужных стилей для других ОС

Delphi , Программа и Интерфейс , Размеры и Положение

 

При разработке кроссплатформенных мобильных приложений на Delphi для Android и iOS многие разработчики сталкиваются с неожиданным увеличением размера итоговых пакетов. Как показывает практика, одной из причин такого "раздувания" могут быть стили, предназначенные для других операционных систем, которые не используются в текущей сборке, но всё равно включаются в пакет.

Проблема: лишние стили увеличивают размер пакетов

Как обнаружил пользователь Stewag на форуме, при использовании StyleBook с несколькими стилями (Android, iOS и Windows) все они включаются в итоговые APK и AAB пакеты, даже если предназначены для других платформ. Это приводит к значительному увеличению размера:

  • APK (Android development):
  • Все три стиля: 15.2 MB
  • Только Android и iOS: 14.2 MB
  • Только Android: 13.2 MB

  • AAB (Android store):

  • Все три стиля: 25.0 MB
  • Только Android и iOS: 23.1 MB
  • Только Android: 21.3 MB

Как видно, удаление ненужных стилей может уменьшить размер пакета на 15% и более.

Решение 1: Использование TDataModule с условной компиляцией

Patrick PREMARTIN предложил элегантное решение с использованием TDataModule и условной компиляции:

  1. Удалите все StyleBook с форм
  2. Создайте отдельные модули данных для каждой ОС:
  3. DataModuleAndroid
  4. DataModuleiOS
  5. DataModuleWindows
  6. Разместите StyleBook с соответствующим стилем на каждом модуле данных
  7. Установите свойство UseStyleManager в True для всех StyleBook
  8. Добавьте код в событие FormCreate каждой формы:
{$IFDEF MSWINDOWS}
  if not assigned(DataModuleWindows) then
    DataModuleWindows := TDataModuleWindows.Create(self);
  Stylebook := DataModuleWindows.StyleBook1;
{$ENDIF}
{$IFDEF ANDROID}
  if not assigned(DataModuleAndroid) then
    DataModuleAndroid := TDataModuleAndroid.Create(self);
  Stylebook := DataModuleAndroid.StyleBook1;
{$ENDIF}
{$IFDEF IOS}
  if not assigned(DataModuleiOS) then
    DataModuleiOS := TDataModuleiOS.Create(self);
  Stylebook := DataModuleiOS.StyleBook1;
{$ENDIF}
  1. В разделе uses добавьте:
{$IFDEF IOS}
  DMIOS,
{$ENDIF}
{$IFDEF ANDROID}
  DMAndroid,
{$ENDIF}
{$IFDEF MSWINDOWS}
  DMWindows,
{$ENDIF}

Это решение полностью предотвращает включение ненужных стилей в пакеты для других платформ.

Решение 2: Сжатие стилей и условное включение ресурсов

Пользователь Wak предложил альтернативный подход со сжатием стилей и их условной загрузкой:

  1. Сожмите стили в ZIP-архивы (уменьшение размера до ~15% от оригинала)
  2. Включите сжатые стили как ресурсы
  3. Используйте код для загрузки стилей из ресурсов:
function LoadZippedStyleFromResource(const ResName, Filename: string): TFmxObject;
var
  rs, ms: TStream;
  ZipFile: TZipFile;
  ZipHeader: TZipHeader;
begin
  try
    rs := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
    ZipFile := TZipFile.Create;
    try
      ZipFile.Open(rs, zmRead);
      ZipFile.Read(Filename, ms, ZipHeader);
      try
        ms.Position := 0;
        Result := TStyleStreaming.LoadFromStream(ms);
      finally
        ms.Free;
      end;
    finally
      ZipFile.Free;
      FreeAndNil(rs);
    end
  except
    FreeAndNil(rs);
    Exit(nil);
  end;
end;

// Использование:
Style := LoadZippedStyleFromResource('Polar', 'PolarDark.style');
if Assigned(Style) then 
  TStyleManager.SetStyle(Style);
  1. Условно включайте ресурсы:
{$IFDEF MSWINDOWS}
{$R 'Styles\Polar.Win.res'}
{$ENDIF}

{$IFDEF MACOS}
{$R 'Styles\Polar.Mac.res'}
{$ENDIF}

Этот метод особенно полезен для десктопных приложений (Windows и Mac), где сжатие даёт значительное уменьшение размера.

Рекомендации по выбору решения

  1. Для мобильных приложений (APK, AAB, IPA) предпочтительнее первый метод с TDataModule, так как:
    APK и AAB уже сжаты, дополнительное сжатие стилей не даёт преимущества
    Решение проще в реализации и поддержке
    Полностью исключает ненужные стили из пакета
  2. Для десктопных приложений (Windows, Mac) можно рассмотреть второй метод:
    Сжатие стилей значительно уменьшает размер исполняемого файла
    Позволяет включать несколько стилей с минимальными накладными расходами

Дополнительные советы по оптимизации

  1. Всегда размещайте стили на модулях данных, а не на формах
  2. Используйте условную компиляцию для всех платформо-специфичных ресурсов
  3. Регулярно проверяйте размер итоговых пакетов при добавлении новых стилей
  4. Создавайте отдельные модули данных для разных стилей, если приложение поддерживает их переключение

Заключение

Оптимизация размера пакетов - важная часть разработки мобильных приложений. Как показала практика, простое удаление ненужных стилей для других платформ может уменьшить размер пакета на 15% и более. Предложенные решения с использованием TDataModule и условной компиляции или сжатия стилей позволяют эффективно решить эту проблему и создавать более компактные приложения.

Примеры кода и дополнительные материалы можно найти в репозитории Patrick PREMARTIN.

Создано по материалам из источника по ссылке.

Оптимизация размера APK и AAB пакетов в Delphi-приложениях за счёт удаления неиспользуемых стилей для других операционных систем.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Размеры и Положение ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:53:56/0.0058560371398926/0