Всем известно, что Android Market накладывает ограничение на размер публикуемых программ. Сегодня в магазине можно разместить приложение, размер которого не превосходит 50 Мб, но что же делать, если Вы вылезли за это ограничение?Дэвид Карлссон, архитектор приложений из Sony Ericsson, дает несколько советов, которые помогут уменьшить размер вашего apk файла.
APK- аббревиатура от Android application package (файл архива Android программы). Каждое Android приложение упаковывается в apk архив, содержащий исполняемый код (.dex файлы), ресурсы, активы и файл манифеста. Фактически apk представляет собой обычный zip архив, поэтому не имеет смысла предварительно сжимать файлы ресурсов каким-нибудь архиватором.
Почему нужно стремиться к экономии памяти? Размер памяти на смартфоне ограничен несколькими мегабайтами, а пользователю нужно хранить кучу разной информации: фотографии, музыку, архив сообщений. Поэтому размер приложения отнюдь не последний фактор, учитываемый пользователем при поиске программ.
Ниже приводится несколько полезных советов, которые помогут вам уменьшить размер ваших Android программ.
ProGuard- это обфускатор, попутно сжимающий размер кода. Как известно, Java приложения компилируются в байт-код, из которого довольно просто восстановить java исходник. Для усложнения жизни любителям реверс-инженерии придумали обфускаторы. Обфускатор служит для запутывания исходного кода программы, при сохранении исходной функциональности. Получается рабочий исходник, мало пригодный для чтения человеком. Программа ProGuard помимо собственно обфускации сжимает исходный код, делает его более быстрым и менее требовательным к памяти. Очень важно после использования ProGuard провести тщательное тестирование полученного приложения. Возможны ситуации, когда в ходе оптимизации и обфускации кода изменяется его функциональность. В таких случаях важно позаботиться о сохранении symbol mapping, чтобы можно было восстановить из обфусцированного кода исходный и попытаться выявить источник проблем.
Дэвид рекомендует перед компиляцией финальной версии программы убрать из нее все связанные с отладкой конструкции, поскольку они не несут для пользователя ничего полезного.
Входящий в состав Android SDK компилятор умеет автоматически удалять отладочный код из релиза, но программист должен позаботиться о правильном оформлении своей программы, поместив отладочные команды в специальный блок:
if (debug) { Log.v(TAG, “Debug …”); }
Часто начинающие разработчики оформляют отладочный код в виде отдельных методов
public void myDebugPrint() { if (Debug) { Log.v(TAG, “Debug …”); } } … myDebugPrint() …
Это не лучшее решение, поскольку на этапе сборки релиза будет удален блок if (Debug){...}, но сам методmyDebugPrint() и его вызов останутся нетронутыми и будут занимать место.
Использование символов отладки имеет смысл, когда ваше приложение находится в стадии разработки. Если Вы решили собрать релиз, Дэвид рекомендует удалить символы отладки из нативных библиотек (.so файлы). Это можно сделать, вызвав команду arm-eabi-strip из Android NDK.
Если ваше приложение содержит графику, видео и аудио данные, использование "правильных" форматов может положительно сказаться на размере приложения. Дэвид рекомендует использовать следующие форматы:
Довольно часто получаемые в результате работы графических редакторов PNG файлы плохо скомпрессированы и их размер может быть дополнительно уменьшен с помощью специальных утилит:OptiPNGилиPNGCrush. Обе эти программы пересжимают PNG файл, сохраняя качество картинки. Программы перебирают параметры PNG фильтров и настроек алгоритма сжатия и создают на выходе файл с оптимальными параметрами.
9patch PNG- специальный формат, который может быть использован для создания растягиваемых подложек. Наиболее часто этот формат используется для создания кнопок и других элементов пользовательского интерфейса. В рамках 9patch картинка разбивается на 9 сегментов - четыре угла, четыре грани и центральная часть. На основе такой картинки можно создавать подложки произвольного размера, при этом угловые сегменты никак не масштабируются; ребра и центральный сегмент растягиваются (многократно повторяются), заполняя промежутки между углами. Ниже показана 9patch картинка и две сгенерированные на ее основе кнопки. Применение этого формата позволяет существенно уменьшить размер графики, необходимой для создания интерфейса.
Как правило, папка res содержит несколько неиспользуемых ресурсов. Для их удаления можно использовать специальную утилитуandroid-unused-resources, которая сканирует Ваш исходный код и удаляет из проекта неиспользуемые ресурсы.
Убедитесь, что в вашем приложении не дублируется функциональность и активы (строки, рисунки и т.п.). Важно понимать, какие Android API вы используете, и знать их функциональность. Может получиться, что в вашей программе для решения задачи, которую можно решить средствами уже подключенных API, подключается новый API. Дублирование кода, например, включение в программу функций делающих одно и то же, также ведет к разбуханию APK файлов.
P.S. От редактора. Практика показывает, что многие разработчики в силу незнания или лени пренебрегают этими простыми приемами. Мы настоятельно рекомендуем заботиться о своих пользователях и распространять только оптимизированные приложения.
Источник:Tips for reducing APK file size
Перевод:Александр Ледков