Одним из моих любимых последних дополнений к Android Studio является APK Analyzer, который вы можете найти в главном меню в разделе «Сборка → Анализ APK».
Полезный совет: можно просто перетаскивать APK-файлы в редактор, чтобы открыть их
APK Analyzer позволяет вам открывать и проверять содержимое любого APK файла, который у вас есть на компьютере, который либо создан из вашего проекта в Android Studio, либо получен с сервера сборки или другого хранилища. APK-файл не обязательно собирать (Build → Build APK) перед этим, и вам не нужен исходный код для этого APK.
Примечание. APK Analyzer лучше всего работает с release-версиями APK. Если вам нужно проанализировать debug-версию вашего приложения, убедитесь, что вы используете APK, который не предназначен для Instant run. Чтобы получить этот APK, соберите APK Build → Build APK. А еще можно узнать, открыли ли вы APK Instant Run, проверив наличие в архиве файла instant-run.zip.
Использование APK Analyzer — отличный способ обзора APK файла и узнать об его структуре, проверить содержимое перед выпуском или проверить некоторые распространенные проблемы, например размер APK и проблемы с DEX.
Уменьшение размера приложения с помощью APK Analyzer
APK Analyzer может предоставить вам много полезной и полезной информации о размере приложения. В верхней части экрана вы можете увидеть размер необработанного файла — это размер APK на диске. Размер загрузки показывает, сколько данных будет использовано для загрузки вашего приложения, принимая во внимание сжатие, которое делает Play Store.
Список файлов и папок сортируется по их размеру в порядке убывания. Это делает его отличным для определения «низких висящих плодов» оптимизации размера APK. Переходя в какую-либо папку в APK файле, вы увидите ресурсы и объекты, которые занимают больше всего места в APK.
Ресурсы отсортированы в порядке убывания по размеру
В этом примере, изучая APK для возможного уменьшения размера, я сразу смог заметить, что 3-кадровая анимация PNG — самая большая вещь в ресурсах, весом в 1,5 МБ, и это для плотности xxhdpi!
Поскольку эти изображения выглядят как идеальные кандидаты для хранения в виде векторов, мы нашли исходные файлы для иллюстраций и импортировали их как VectorDrawables, используя новую поддержку PSD в инструменте импорта векторных ресурсов Android Studio 2.2.
Пройдя этот же процесс для другой оставшейся анимации (instruction_touch _ * .png) и удалив эти PNG-файлы во всех плотностях, мы смогли сэкономить более 5 МБ. Чтобы поддерживать обратную совместимость, мы использовали VectorDrawableCompat из библиотеки поддержки.
Просматривая другие папки ресурсов, было легко обнаружить некоторые несжатые WAV-файлы, которые можно было бы преобразовать в OGG, что означало еще большую экономию, не касаясь строки кода.
Далее в списке вещей, которые нужно проверить, была папка lib/, которая содержит собственные библиотеки для трех поддерживаемых нами ABI.
Было принято решение использовать поддержку разделов APK в нашей сборке Gradle для создания отдельных версий приложения для каждого ABI.
Просмотр других папок в APK
Я быстро просмотрел AndroidManifest.xml и заметил, что в application отсутствует атрибут android:extractNativeLibs. Установка этого атрибута в false позволяет сохранить некоторое пространство на устройстве, поскольку оно предотвращает копирование собственных библиотек из APK в файловую систему. Единственное требование состоит в том, что эти файлы выравниваются по страницам и сохраняются несжатыми внутри APK, которые поддерживаются новым упаковщиком в плагине Android Gradle версии 2.2.0+.
Полный AndroidManifest.xml при просмотре в APK Analyzer
После внесения этих изменений мне было любопытно сравнить новую версию приложения с предыдущей. Для этого я проверил источник из git commit, с которого я начал, скомпилировал APK и сохранил его в другой папке. Затем я использовал функцию «Compare with…», чтобы увидеть разницу в размерах между старыми и новыми сборками.
Сравнение APK — доступ к нему через кнопку в правом верхнем углу
Мы хорошенько прошлись по ресурсам и нативным библиотекам, сэкономив 17 МБ с очень небольшими изменениями в приложении. Тем не менее, я вижу, что наш размер DEX регрессируется, а class2.dex растет на 400 КБ.
Отладка проблем DEX
В этом случае разница была связана с обновлением наших зависимостей до более новых версий и добавлением новых библиотек. Proguard и Multidex уже были включены для наших сборок, поэтому этого размера DEX не так много. Тем не менее, анализатор APK — отличный инструмент для отладки любых проблем с этой настройкой, особенно когда вы впервые включаете Multidex или Proguard для своего проекта.
Просмотр содержимого classes.dex
Когда вы нажимаете на любой файл DEX, вы увидите информацию о том, сколько классов и методов оно определяет, и сколько общих ссылок на методы оно содержит (это те методы, которые учитываются в ограничении 64K в одном файле DEX). В этом примере скриншот, приложение вот-вот достигнет предела, а это значит, что в ближайшем будущем ему понадобится MultiDex для разделения классов на отдельные файлы.
Вы можете просмотреть содержимое пакетов, чтобы узнать, какие из них используют все ссылки. В этом примере мы видим, что основными причинами раздутого DEX-файла являются библиотека поддержки и Службы Google Play.
Количество ссылок на пакет
После того, как вы включили MultiDex и скомпилировали приложение, вы увидите второй файл classes2.dex (и, возможно, classes3.dex и т. Д.) Решение MultiDex в плагине Android-Gradle определяет, какие классы необходимы для запуска вашего приложения и помещает их в основной файл classes.dex, но в редком случае, когда это не работает, и вы получаете исключение ClassNotFoundException, вы можете использовать APK Analyzer для проверки файлов DEX, а затем принудительно добавить отсутствующие классы в первичный файл DEX.
Вы столкнетесь с подобными проблемами при включении Proguard и использовании классов или методов путем отражения или из макетов XML. APK Analyzer может помочь в проверке правильности конфигурации Proguard, позволяя вам легко проверить, имеются ли в APK методы и классы, и переименованы ли они (при обфускации). Также можно убедиться, что классы, которые вы хотите удалить, на самом деле удалены, и не учитываются в счетчике методов.
Нам было бы интересно узнать, какие другие применения вы найдете для APK Analyzer и какие другие функции вы бы хотели увидеть интегрированными в этот инструмент!
Автор: shevartsoft