Переключить меню

Советы разработчикам Android по уменьшению размера файла APK

Опубликовано: 2015-10-28
Вот несколько рекомендаций для моих коллег-разработчиков Android по уменьшению статического следа. Вы можете выбрать те, которые лучше всего подходят для ваших конкретных потребностей.

1) Прогард

Нанять фрилансера на Truelancer

Инструмент для сжатия кода, такой как ProGuard, значительно уменьшит размер файла APK. Инструмент доступен на sourceforge. Обратите внимание, что очень важно повторно протестировать все приложение после применения ProGuard, поскольку иногда это может изменить поведение приложения. Поскольку ProGuard заменяет символы приложения, чтобы сделать код трудным для чтения, важно сохранить сопоставление символов, чтобы вы могли преобразовать трассировку стека обратно в исходные символы, если вам нужно расследовать сбой в вашем приложении.

2) Удаление отладочной информации

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

Для этого все функции, связанные с отладкой, должны быть заключены в условные блоки, как показано ниже:

 статическая окончательная отладка = ложь;
 если (отладить) {
 v(ТЕГ, "Отладка…")
 }

Важно, чтобы флаг отладки был установлен во время компиляции (т. е. объявлен как static final), чтобы компилятор мог полностью удалить все функции отладки. Создание собственного метода отладки, подобного показанному ниже, не является хорошей идеей, поскольку вызов myDebugPrint() не заключен в условный блок, а это означает, что компилятор должен сохранять информацию о myDebugPrint() в вызывающем классе.

 публичная пустота myDebugPrint()
если (отладка)
v(TAG, "Отладка...");
}
}
…
мояОтладкаПринт()

3) Удаление символов отладки из собственных библиотек . Использование символов отладки имеет смысл, если ваше приложение все еще находится в разработке и все еще требует отладки. Но если символы отладки все еще появляются при компиляции сборки выпуска и если вы хотите их удалить, мы рекомендуем удалить символы отладки из собственных библиотек (файлов .so). Это делается с помощью команды arm-eabi-strip из Android NDK.

4) Рекомендуемые медиаформаты . Если ваше приложение в значительной степени зависит от изображений, аудио или видео, вы можете уменьшить размер APK-файла другим способом, используя определенные медиаформаты. Мы рекомендуем использовать следующие медиаформаты для изображений, аудио и видео:

  • Видео: используйте H264 AVC. Кодируйте видео с разрешением, не превышающим разрешение экрана целевого устройства (если оно известно).
  • Аудио : AAC Audio рекомендуется для всех аудиоресурсов. AAC обеспечивает лучшее сжатие при заданном качестве по сравнению с mp3 или Ogg Vorbis. Необработанные форматы, такие как WAV, никогда не должны использоваться. Общим аргументом в пользу использования формата WAV является то, что декодирование сжатых аудиопотоков обычно означает большую задержку при воспроизведении. Однако Android предоставляет API Sound Pool, который позволяет приложениям использовать сжатые аудиопотоки без больших задержек.
  • Изображения : PNG или JPEG. Используйте PNG; поскольку это формат без потерь, он очень подходит для текстур и иллюстраций, поскольку при сжатии не будет визуальных артефактов. Если есть ограничения по размеру, используйте JPEG или комбинацию PNG и JPEG. Высококачественное изображение JPEG может хорошо работать с большими фотореалистичными изображениями, для которых оптимизирована схема сжатия JPEG.
  • Оптимизируйте размеры PNG без потери качества

Обязательно прочтите 5 финансовых решений, которые вы должны принять в 2015 году

Если вы используете формат PNG, изображения PNG можно уменьшить в размере без потери качества. Для этого используйте такой инструмент, как OptiPNG или PNGCrush. Оба отлично подходят для уменьшения размера файла PNG, сохраняя при этом качество изображения. PNGcrush — это программа с открытым исходным кодом, которая перебирает фильтры PNG и параметры zlib (Deflate), неоднократно сжимает изображение, используя конфигурацию каждого параметра, и выбирает конфигурацию, дающую наименьший сжатый результат (IDAT). С другой стороны, OptiPNG полностью выполняет испытания в памяти и записывает на диск только окончательный выходной файл. Кроме того, он предлагает пользователю несколько предустановок оптимизации.

5) Удалите неиспользуемые ресурсы Еще одна потенциальная группа пожирателей пространства, которую следует рассмотреть для удаления из вашего APK-файла, — это неиспользуемые ресурсы в вашем каталоге res, такие как неиспользуемые макеты, чертежи и цвета. Чтобы обнаружить неиспользуемые ресурсы в вашем APK, которые можно удалить, используйте инструмент android-unused-resources. Android Unused Resources — это Java-приложение, которое сканирует ваш проект на наличие неиспользуемых ресурсов.

6) Избегайте дублирования Убедитесь, что ваше приложение не имеет повторяющихся функций или дублирующихся активов, — это очевидный способ избежать ненужных файлов в вашем APK. Важно понимать, какие API Android вы используете, и полные функциональные возможности каждого из них. Возможно, один Android API уже выполняет работу другого API. Дублированные активы (строки, растровые изображения и т. д.) также являются пустой тратой места, и их можно легко избежать. В меньшей степени дублированный код также излишне увеличивает размер доставляемого двоичного файла.

7) Сократите количество методов Опытные разработчики Android давно столкнулись с вызывающей головную боль проблемой в своих приложениях. Количество методов, которые может иметь приложение, ограничено. Ну, раньше было ограничение. В конце концов, хорошие ребята из Google предоставили решение в октябре прошлого года, но оно было далеко от идеального. Несмотря на простоту реализации, решение multidex значительно усложняло и увеличивало время компиляции. Не останавливаясь на достигнутом, начиная с Lollipop (Android 5.0), вся виртуальная машина Android была революционизирована, чтобы предложить гораздо более надежное решение, такое, которое даже улучшает обычное время компиляции. Однако на данный момент решение Lollipop тоже не идеально. Это требует от разработчиков разработки только для Lollipop, что может быть проблематично, поскольку большинство приложений хотят быть совместимыми с более широким кругом пользователей и могут опасаться использования функций, недоступных в более ранних версиях Android. Так что прямо сейчас решение Lollipop — это хорошее решение для будущего Android, но оно может не иметь большого влияния в обозримом настоящем. Итак, что можно сделать за это время? Мы все согласны с тем, что вы не должны отказываться от функций и возможностей, просто чтобы не достичь предела в 65 КБ. Но нет никаких сомнений в том, что наилучшей практикой по-прежнему будет сокращение количества методов приложения. Итак, как вы все еще можете попытаться уменьшить количество методов, не теряя ту маленькую искру, которая делает ваше приложение особенным?

Обязательно прочтите Диверсификация вашей карьеры с помощью фриланса: гарантированные преимущества

Краткий обзор: «Откуда берутся все эти методы?»

Предел количества методов составляет примерно 65 тысяч методов (65 536, если быть точным). Это звучит как огромное число. Если вы начинающий разработчик Android, вы можете подумать: «Как же так много приложений могут так быстро достичь этого числа?» Вы, вероятно, будете в чем-то правы. Самостоятельно написать столько методов непросто. Но разработчики приложений не пишут все свое приложение самостоятельно. Разработчики приложений используют все больше и больше сторонних библиотек (SDK — комплекты для разработки программного обеспечения), которые помогают им достичь определенных целей и функций, которые в противном случае им пришлось бы разрабатывать полностью самостоятельно. От рекламы до улучшений графического интерфейса, социальных сетей, отчетов о сбоях и многого другого, SDK предлагают широкий спектр возможностей и API-интерфейсов, которые экономят драгоценное время разработки и помогают ускорить выпуск вашего приложения. Но каждый SDK увеличивает количество ваших методов, а некоторые SDK даже делают больше, чем вы рассчитывали. Конечно, это не обязательно плохо. Однако решающий удар пришелся на самих Google. Их набор сервисов Google Play представляет собой большой SDK, содержащий более 28 000 методов. С ограничением в 65 КБ это не совсем мало. И многие разработчики приложений хотели бы использовать этот SDK, поскольку он открывает дверь в волшебное королевство Google, а это очень желанная возможность, которая повышает ценность приложения. В этом посте я не только объясню, как выборочно использовать пакеты сервисов Google Play, но также расскажу вам, сколько методов каждый из этих пакетов добавляет в ваше приложение. Так что держитесь за свои места, это будет ухабистая поездка.

Игровая площадка сервисов Google Play

Итак, сколько методов на самом деле добавляют сервисы Google Play? Что ж, как и все в жизни, это гораздо сложнее, чем просто конечный результат. Но давайте сделаем это по одному шагу за раз. SDK Google Play Services на самом деле содержит 19 различных SDK. С Gradle вы можете выборочно выбирать, какие из них использовать. Все, что вам нужно сделать, это добавить следующую зависимость в файл build.gradle вашего модуля приложения:

 зависимости {
скомпилировать 'com.google.android.gms:play-services:7.5.0'
}

Последняя версия GPS, выпущенная на данный момент, — 7.5.0. Он помечен как версия 25 в Android SDK Manager. Чтобы выбрать конкретные пакеты, замените следующую строку любым количеством строк зависимостей, указав конкретные пакеты. Скажем, например, вам просто нужны Google Plus, Google Games, Google Ads и Google Maps:

 зависимости {
скомпилировать 'com.google.android.gms:play-services-plus:7.5.0'
скомпилировать 'com.google.android.gms:play-services-games:7.5.0'
скомпилировать «com.google.android.gms:play-services-ads:7.5.0»
скомпилировать 'com.google.android.gms:play-services-maps:7.5.0'
}

Не слишком сложно, но вот первая загвоздка. Один из 19 великолепных SDK называется play-services-base. Если вы включите какой-либо пакет службы Google Play, он также будет автоматически добавлен. Сколько методов содержит базовый пакет? Почти 8000 (точное число ниже).

Обязательна к прочтению Эпоха фрилансеров: люди, у которых фриланс выходит на новый уровень

И вот вторая зацепка. Я не включил только 3 пакета в приведенный выше пример. Я даже не включил 4, если считать и базовый пакет. На самом деле я включил 5 пакетов. Почему? Потому что пакет Google Games использует пакет Google Диска, поэтому он также был импортирован (на самом деле Google Ads также включает в себя пакет, называемый диспетчером тегов, но я считаю здесь только «выбираемые» пакеты).

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

Итак, вот вкратце — какие пакеты вы можете добавить, сколько методов они добавляют и какие другие пакеты они привносят, чтобы сорвать вечеринку. Данные относятся к последней версии сервисов Google Play (7.5.0/редакция 25):

Советы разработчикам Android по уменьшению размера APK-файла 2
Общее количество методов: 28175

Общее количество методов: 28 175. Некоторые из этих цифр, согласитесь, поистине чудовищны. Если все, что вам нужно, это пакет панорамы, вы не можете просто получить девять методов, вам нужно получить почти 8000. Неудивительно, что так много приложений приближаются или превышают этот предел в 65 КБ.

Некоторые из этих чисел могут показаться немного противоречивыми, если вы попытаетесь их сложить. Это потому, что, опять же, логика сервисов Google Play немного сложнее, чем кажется на первый взгляд. Например, Google Analytics включает единственный метод из Google Ads для получения рекламного идентификатора учетной записи.

Обратите внимание, что при подсчете того, сколько каждый пакет добавляет к вашему приложению, обязательно исключайте двойные (например, не учитывайте базовый пакет более одного раза).

Вы не можете выборочно добавить все

А вот и финальный укол. В сервисах Google Play есть два крошечных пакета, которые нельзя добавить выборочно. Пакет поиска (предоставляющий вам доступ к Google Now API) включает только 22 метода. Если вы хотите использовать его, у вас нет выбора, кроме как добавить все 28 000+ методов, все сервисы Google Play. Надеюсь, это будет исправлено в более поздних версиях.

(Еще один «недоступный» пакет — это пакет appstate , который включает 111 методов, однако теперь он устарел в пользу SavedGames , включенного в пакет google-play-games).

Нанять фрилансера на Truelancer