Перевод — Максимальное использование APK Analyzer

Одним из моих любимых последних дополнений к Android Studio является APK Analyzer, который вы можете найти в главном меню в разделе «Сборка → Анализ APK».

image
Полезный совет: можно просто перетаскивать 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.

image
Ресурсы отсортированы в порядке убывания по размеру

В этом примере, изучая 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.

image
Просмотр других папок в APK

Я быстро просмотрел AndroidManifest.xml и заметил, что в application отсутствует атрибут android:extractNativeLibs. Установка этого атрибута в false позволяет сохранить некоторое пространство на устройстве, поскольку оно предотвращает копирование собственных библиотек из APK в файловую систему. Единственное требование состоит в том, что эти файлы выравниваются по страницам и сохраняются несжатыми внутри APK, которые поддерживаются новым упаковщиком в плагине Android Gradle версии 2.2.0+.

image
Полный AndroidManifest.xml при просмотре в APK Analyzer

После внесения этих изменений мне было любопытно сравнить новую версию приложения с предыдущей. Для этого я проверил источник из git commit, с которого я начал, скомпилировал APK и сохранил его в другой папке. Затем я использовал функцию «Compare with…», чтобы увидеть разницу в размерах между старыми и новыми сборками.

image
Сравнение APK — доступ к нему через кнопку в правом верхнем углу

Мы хорошенько прошлись по ресурсам и нативным библиотекам, сэкономив 17 МБ с очень небольшими изменениями в приложении. Тем не менее, я вижу, что наш размер DEX регрессируется, а class2.dex растет на 400 КБ.

Отладка проблем DEX


В этом случае разница была связана с обновлением наших зависимостей до более новых версий и добавлением новых библиотек. Proguard и Multidex уже были включены для наших сборок, поэтому этого размера DEX не так много. Тем не менее, анализатор APK — отличный инструмент для отладки любых проблем с этой настройкой, особенно когда вы впервые включаете Multidex или Proguard для своего проекта.

image
Просмотр содержимого classes.dex

Когда вы нажимаете на любой файл DEX, вы увидите информацию о том, сколько классов и методов оно определяет, и сколько общих ссылок на методы оно содержит (это те методы, которые учитываются в ограничении 64K в одном файле DEX). В этом примере скриншот, приложение вот-вот достигнет предела, а это значит, что в ближайшем будущем ему понадобится MultiDex для разделения классов на отдельные файлы.

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

image
Количество ссылок на пакет

После того, как вы включили MultiDex и скомпилировали приложение, вы увидите второй файл classes2.dex (и, возможно, classes3.dex и т. Д.) Решение MultiDex в плагине Android-Gradle определяет, какие классы необходимы для запуска вашего приложения и помещает их в основной файл classes.dex, но в редком случае, когда это не работает, и вы получаете исключение ClassNotFoundException, вы можете использовать APK Analyzer для проверки файлов DEX, а затем принудительно добавить отсутствующие классы в первичный файл DEX.

Вы столкнетесь с подобными проблемами при включении Proguard и использовании классов или методов путем отражения или из макетов XML. APK Analyzer может помочь в проверке правильности конфигурации Proguard, позволяя вам легко проверить, имеются ли в APK методы и классы, и переименованы ли они (при обфускации). Также можно убедиться, что классы, которые вы хотите удалить, на самом деле удалены, и не учитываются в счетчике методов.

Нам было бы интересно узнать, какие другие применения вы найдете для APK Analyzer и какие другие функции вы бы хотели увидеть интегрированными в этот инструмент!
Поделиться публикацией
Ой, у вас баннер убежал!

Ну, и что?
Реклама
Комментарии 6
  • 0
    Поскольку эти изображения выглядят как идеальные кандидаты для хранения в виде векторов

    На самом деле не выглядят, если все же следовать рекомендациям на максимальный размер VectorDrawable в 200dp. Размер изображений выше около 600dp.


    We recommend that you limit a vector image to a maximum of 200 x 200 dp; otherwise, it can take too long to draw.

    В этой статье даже замерили отрисовку такого большого VectorDrawable и получили около 16 мс. Но это первоначальная отрисовка до кэширования в Bitmap.

    • 0
      У векторных изображений ещё есть лимит на сложность, студия ругается на сложные вектора
    • 0
      Крутая статья, но кто использует вектор в Android? Это же будут проблемы с совместимостью, и все такое?
      • 0
        Используют, но не все, а кому дизайнеры подготовят векторные ресурсы. А так проблем нет)
        • 0
          С support-library никаких проблем с совместимостью нет, более того в большинстве случаев пользоваться вектором гораздо удобнее чем png (простота масштабирования и смены цвета иконок, например), ну а про сокращение размера APK автор итак все рассказал
          • 0
            проблем нет если вы используете support library

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое