Недавно прочитал на Apptractor статью про влияние размера приложения на его скачивание, кому интересно прочитать можно по ссылке. Я знаю несколько способов уменьшения размера APK приложения, но вот на сколько сильно они помогут, это был любопытный вопрос. Для экспериментов нужно было найти рабочее большое приложение, в котором есть что оптимизировать.
Помог в этом мне Xamarin Studio, который выдает при запуске различные приложения-примеры. Для препарирования выбрал приложение Acquaint, исходники доступны на GitHub по ссылке.
По описанию в приложении доступен следующий функционал:
- Просмотр контактов
- Отображение карты
- Текстовые сообщения
- Построение маршрутов
- Звонки и почта
Реализовано на Xamarin.Forms, Xamarin.Android, Xamarin.iOS, меня конечно же интересует нативная Android реализация.
Приступаем
Я может покажусь капитаном, но дам очевиднейший совет, чтобы приложение занимало меньше места его нужно собирать в конфигурации Release. Да для профессиональных разработчиков это обычное дело, но новичков только пришедших в мир Xamarin думаю стоит об этом уведомить.
И так выясним же сколько наше приложение занимает изначально места
При сборке исходников из репозитория 29.8 Мб — приличный размер. Что ж приступим к оптимизации.
Включаем разделение архитектур
Так как Android система популярная, то поддерживает множество архитектур, в частности ARM которая в свою очередь включает в себя ARMv8, ARMv7, а так же x86 которая делится на 32 и 64 битную. Чем больше архитектур выбрано в проекте, тем на большем количестве устройств будет работать приложение. Это в свою очередь добавляет лишние мегабайты в APK, при том что ваше устройство с ARMv8 никогда не будет использовать код для x86, поэтому логично будет компилировать для каждой архитектуры свой APK, чтобы уменьшить размер.
Заходим в настройки проекта и смотрим какие архитектуры проставлены для приложения Acquaint
Как видим выставлены все галочки, поэтому опция «Генерировать для каждой архитектуры свой APK» в данной ситуации будет нам полезна.
Собираем приложение снова и смотрим на размер.
Теперь у нас создается 5 APK, размер которых от 23.9 Мб до 24.1 Мб не плохо, нам удалось выиграть 5Мб. Приступим к следующему способу.
Сжатие изображений без потерь
Картинки и различная графика всегда присутствует в приложении в виде иконок, сплешскринов, и прочих png и jpg файлов. Эта графика занимает существенную часть приложения и далеко не всегда оптимизирована, внутрь файла может быть зашита ненужна мета-информация или использоваться высокая глубина цвета, которая в текущем изображении попросту не нужна.
Существует множество различных оптимизаторов изображений, под macOS я использую ImageOptim, на мой взгляд это самое лучшее решение, которое сочетает в себе множество различных оптимизаторов, благодаря этому картинка сжимается до минимальных размеров.
Самое удобное то, что достаточно перетащить папку и она начнет обрабатывать все найденные графические файлы в папке и подпапках. После сжатия картинка перезаписывается оптимизированной версией что очень удобно. Представьте если бы все изображения складировались в отдельную папку и потом пришлось бы бегать по всем подпапкам и раскладывать вручную файлы, очень затратно по времени.
Под Windows увы мне не удалось найти хорошее решение по сжатию, возникает две проблемы либо плохой и неудобный интерфейс, либо сжатие очень слабое.
В качестве бесплатного сервиса по сжатию могу посоветовать TinyPNG
И так, закидываем папку проекта в программу, сжатие процесс длительный особенно для PNG, так же зависит от степени сжатия которую Вы выберите. Спустя какой то время видим результат:
ImageOptim сохранил нам дополнительные 860Кб, соберем проект снова и посмотрим помогло ли это.
Результат на лицо, теперь приложение занимает от 23 Мб до 23.3 Мб. Движемся дальше.
Включаем полную линковку библиотек
С этим способом нужно быть осторожно, потому что он может посчитать Ваш код неиспользуемым и вырезать его при сборке. Я использовал этот способ в одном из своих проектов и после этого приложение падало при запуске, пришлось повозиться чтобы выяснить что пошло не так, поэтому если Вам дорого время, либо не используйте этот способ, либо применять его в последнюю очередь, когда уже другие варианты уменьшения размера не помогают.
Заходим в настройки проекта и далее выбираем опцию на скриншоте ниже.
Если приложение после этой опции валится на устройстве то необходимо указать Ваши сборки как игнорируемые. Если и это не помогло, то дело в системных сборках, необходимо так же добавить их в игнорируемые.
Мне повезло, после полной линковки приложение запустилось и успешно подгрузило контакты.
Посмотрим сколько теперь оно занимает места.
Новый размер приложения от 17.4 Мб до 17.6 Мб, полная линковка творит чудеса.
Итог
После применения всех способов мне удалось сжать приложение с 29.8 Мб до 17.6 Мб, а это чуть более 40% ! Цифра огромная, благодаря такой оптимизации количество скачиваний Ваших приложений должны повысится.
Часть данных способов применима и к iOS приложениям.
И на последок еще несколько полезных советов:
- Выносите лишнюю графику на backend, после первого запуска ее можно докачать в приложение.
- Если в приложении используется аудио, то можно поиграть с битрейтом для уменьшения размера
- Аналогично с видео, настройка битрейта даст выигрыш в размере
Успехов в уменьшении приложений!
Сейчас не знаю, но раньше в сборщике apk из Android SDK была опция степени zip компрессии. К примеру приложение на Xamarin.Android (без форм) собранное для четырех целевых архитектур (универсальный apk) и в добавок с библиотекой SkiaSharp после zip перекомпрессии «весило» всего 12.5 mb. Жаль только после ручной перекомпрессии слетает подпись.