Привет! Меня зовут Андрей, я Android developer в компании Genesis Media и создаю приложения для наших медиа-бизнесов в Африке. На континенте безумно дорогой интернет, а основные мобильные устройства — маломощные бюджетные андроид-смартфоны, поэтому я делаю все возможное, чтобы облегчить наши продукты.
В этом тексте собраны наработки по оптимизации приложений для развивающихся рынков, которыми мы пользуемся. Считайте это мануалом для начинающих разработчиков.
Компаниям интересно донести свой продукт до новой аудитории. Например, в Индии только треть населения подключены к интернету, а в Нигерии — половина. Такой потенциал пропадает! Поэтому разработчики больших компаний сосредоточены на оптимизации приложений для развивающихся рынков.
Основные проблемы:
- устройства с маленьким объемом оперативной памяти
- устройства с маленькими экранами или низким разрешением
- дорогой интернет
- нестабильное интернет соединение
- старые версии операционных систем
Основные решения
Минимизация размера приложения
На рынках с дорогим интернетом и маломощными устройствами борьба идет буквально за мегабайты. Скачают ваше приложение или нет — зависит от размера. Разработчики Opera очень гордятся тем, что их приложение занимает всего 8 Мб. Для того, чтобы тоже гордиться своим продуктом, мы нашли семь решений.
- Минимизируйте количество библиотек. Поначалу мы убирали лишние библиотеки, а потом решили отказаться от сторонних библиотек в целом. Они упрощают работу разработчиков, но ради пары удобных функций подключать целую библиотеку неразумно. Поэтому мы самостоятельно описываем логику под нужды каждого проекта. Конечно, это занимает больше времени, больше кода, зато значительно сокращает размер приложения.
- Не держите в зависимостях библиотеки со схожим функционалом. Когда использование библиотек неизбежно — создание рекламы, например — посмотрите какие библиотеки они содержат внутри. Возможно, стоит отказаться от любимой в пользу той, что уже лежит в другой.
- Используйте легкие изображения. Ресурсы модуля приложения — картинки и прочее — зачастую занимают больше всего места. Уменьшайте их. Это проще, чем придумать, где ужиматься впредь.
Для этого мы начали использовать векторные изображения — они состоят из простых геометрических фигур, поэтому и внешне понятные, и занимают мало места. Вместо стандартной упаковки из пяти картинок под разные форматы дисплеев, вы добавляете одну векторную. Она меняет размер, не теряя качества. Из минусов — изображение должно быть простым. Сложную картинку нарисовать в векторе можно, но это не оптимальный вариант, ведь она все равно будет много весить и долго грузиться.
Если картинка сложная, мы используем WebP. Это гугловский формат сжатия, который позволяет уменьшить вес изображения чуть ли не в 10 раз.
Капитанский совет: работайте в паре с дизайнером. Изначально создавайте простой продукт, чтобы его не пришлось адаптировать, технично изощряясь.
- Обфусцируйте код. Я использую утилиту Proguard, но есть и другие варианты. Кроме преобразования кода до состояния нечитабельности, она выявляет и удаляет неиспользованные ресурсы, тем самым оптимизируя его.
- Пользуйтесь ресурсами платформы. Например, у Android есть внутренний класс drawable objects, который позволяет отрисовывать простые изображения внутри системы, не добавляя ничего в ресурсы. Задайте логику создания элемента и он отрисуется самостоятельно в момент загрузки графического интерфейса.
- Переиспользуйте ресурсы. Например, дублирующиеся картинки в разных цветах можно хранить не как две копии, а как одну плюс цветовой фильтр. В поисках таких оптимизационных вариантов вы потратите время, но оно того стоит ради сохранения минимального объема приложения.
- Используйте App Bundle — тип сборки приложения, когда элементы для каждого пользователя собираются индивидуально не разработчиком, а в PlayMarket. Это оптимизирует размер, потому что на платформе знают тип устройства пользователя и пакуют один подходящий вариант изображения. PlayMarket заявляет, что это помогает уменьшить размер приложения на 30%. Подойдет тем, кто не хочет заморачиваться с предыдущими вариантами.
- Оптимизируйте скорость отображения интерфейса — это актуально для пользователем со слабым железом. Зачастую пользовательский интерфейс верстается в xml файле — это удобно и быстро в сравнении с версткой в коде. Это не всегда хорошо сказывается на времени рендеринга UI, особенно на слабых устройствах. Можно немного ускорить этот процесс, если задать верстку в коде. Так мы сэкономим время на процессе преобразования xml верстки в код. Либо же можно использовать класс AsyncLayoutInflater, чтобы сделать этот процесс асинхронным. Возможно, общая скорость рендеринга не увеличится, но хотя бы сделает пользовательский интерфейс более отзывчивым (менее лагающим, тормозящим).
Оптимизация использования трафика
Отсутствие интернета — это не ошибка, а состояние приложения. И с ним надо уметь корректно работать. У пользователя должен быть доступ к информации — пусть он смотрит, читает, показывайте по максимуму все, что есть. Не отправляйте его назад.
- Кэширование данных. Экономить трафик в Африке очень важно — он на вес золота. Поэтому как только пользователь открывает ленту новостей, вся информация должна кэшироваться. Когда пропадет интернет или человек выйдет-зайдет в приложение, контент не будет грузиться еще раз.
- ЕTag. Повторная загрузка данных — неосознанная юзер-привычка, которую не замечаешь при недорогом интернете, но на развивающихся рынках это стоит дорого. Логика ЕTag анализирует данные по хешу и обновляет только изменившуюся информацию, или отправляет запрос «контент не изменился», весом не больше 1 Кб. Желательно добавлять ее в логику запросов, которые могут возвращать много данных.
- Отключение картинок. Так пользователь читает новости, но не тратит трафик на загрузку изображений. По желанию, он может их «включить» тапом, но автоматически они подтягиваться не будут.
Итого
Это основные способы помочь пользователям экономить трафик и место на устройстве. Старайтесь не добавлять в приложение сервисы, работающие в фоновом режиме, но это только после первой оптимизационной помощи по всем предыдущим пунктам. На этом все. Надеюсь, материал был вам полезен.
Автор: Khaynus