В помощь мобильному разработчику

Выжимаем минимум из приложения

Александр Алексеев

Недавно прочитал на Apptractor статью про влияние размера приложения на его скачивание, кому интересно прочитать можно по ссылке. Я знаю несколько способов уменьшения размера APK приложения, но вот на сколько сильно они помогут, это был любопытный вопрос. Для экспериментов нужно было найти рабочее большое приложение, в котором есть что оптимизировать.
Помог в этом мне Xamarin Studio, который выдает при запуске различные приложения-примеры. Для препарирования выбрал приложение Acquaint, исходники доступны на GitHub по ссылке.
По описанию в приложении доступен следующий функционал:

  • Просмотр контактов
  • Отображение карты
  • Текстовые сообщения
  • Построение маршрутов
  • Звонки и почта

Реализовано на Xamarin.Forms, Xamarin.Android, Xamarin.iOS, меня конечно же интересует нативная Android реализация.

Приступаем

Я может покажусь капитаном, но дам очевиднейший совет, чтобы приложение занимало меньше места его нужно собирать в конфигурации Release. Да для профессиональных разработчиков это обычное дело, но новичков только пришедших в мир Xamarin думаю стоит об этом уведомить.

И так выясним же сколько наше приложение занимает изначально местаsearchingrelease2016-10-1422-19-54

При сборке исходников из репозитория 29.8 Мб — приличный размер. Что ж приступим к оптимизации.

 

Включаем разделение архитектур

Так как Android система популярная, то поддерживает множество архитектур, в частности ARM которая в свою очередь включает в себя ARMv8, ARMv7, а так же x86 которая делится на 32 и 64 битную. Чем больше архитектур выбрано в проекте, тем на большем количестве устройств  будет работать приложение. Это в свою очередь добавляет лишние мегабайты в APK, при том что ваше устройство с ARMv8 никогда не будет использовать код для x86, поэтому логично будет компилировать для каждой архитектуры свой APK, чтобы уменьшить размер.

Заходим в настройки проекта и смотрим какие архитектуры проставлены для приложения Acquaint
project-options-acquaint-native-droid-2016-10-18-00-40-04
Как видим выставлены все галочки, поэтому опция «Генерировать для каждой архитектуры свой APK» в данной ситуации будет нам полезна.

project-options-acquaint-native-droid-2016-10-18-00-44-23

Собираем приложение снова и смотрим на размер.

searchingrelease2016-10-1422-25-14

Теперь у нас создается 5 APK, размер которых от 23.9 Мб до 24.1 Мб не плохо, нам удалось выиграть 5Мб. Приступим к следующему способу.

 

Сжатие изображений без потерь

Картинки и различная графика всегда присутствует в приложении в виде иконок, сплешскринов, и прочих png и jpg файлов. Эта графика занимает существенную часть приложения и далеко не всегда оптимизирована, внутрь файла может быть зашита ненужна мета-информация или использоваться высокая глубина цвета, которая в текущем изображении попросту не нужна.

Существует множество различных оптимизаторов изображений, под macOS я использую ImageOptim, на мой взгляд это самое лучшее решение, которое сочетает в себе множество различных оптимизаторов, благодаря этому картинка сжимается до минимальных размеров.
imageoptim-preferences-2016-10-18-10-18-17

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

Под Windows увы мне не удалось найти хорошее решение по сжатию, возникает две проблемы либо плохой и неудобный интерфейс, либо сжатие очень слабое.

В качестве бесплатного сервиса по сжатию могу посоветовать TinyPNG

И так, закидываем папку проекта в программу, сжатие процесс длительный особенно для PNG, так же зависит от степени сжатия которую Вы выберите. Спустя какой то время видим результат:
imageoptim2016-10-1423-13-46
ImageOptim сохранил нам дополнительные 860Кб, соберем проект снова и посмотрим помогло ли это.

searchingrelease2016-10-1423-35-05

Результат на лицо, теперь приложение занимает от 23 Мб до 23.3 Мб. Движемся дальше.

 

 

Включаем полную линковку библиотек

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

Заходим в настройки проекта и далее выбираем опцию на скриншоте ниже.
projectoptions-acquaint-native-droid2016-10-1810-42-09

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

Мне повезло, после полной линковки приложение запустилось и успешно подгрузило контакты.
Посмотрим сколько теперь оно занимает места.

searchingrelease2016-10-1423-40-56

Новый размер приложения от 17.4 Мб до 17.6 Мб, полная линковка творит чудеса.

Итог

После применения всех способов мне удалось сжать приложение с 29.8 Мб до 17.6 Мб, а это чуть более 40% ! Цифра огромная, благодаря такой оптимизации количество скачиваний Ваших приложений должны повысится.

Часть данных способов применима и к iOS приложениям.

И на последок еще несколько полезных советов:

  • Выносите лишнюю графику на backend, после первого запуска ее можно докачать в приложение.
  • Если в приложении используется аудио, то можно поиграть с битрейтом для уменьшения размера
  • Аналогично с видео, настройка битрейта даст выигрыш в размере

Успехов в уменьшении приложений!

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

xamarin-platform
Android

1 Comment

  1. Сейчас не знаю, но раньше в сборщике apk из Android SDK была опция степени zip компрессии. К примеру приложение на Xamarin.Android (без форм) собранное для четырех целевых архитектур (универсальный apk) и в добавок с библиотекой SkiaSharp после zip перекомпрессии «весило» всего 12.5 mb. Жаль только после ручной перекомпрессии слетает подпись.

Написать ответ