- PVSM.RU - https://www.pvsm.ru -

Перевод — Максимальное использование 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 файла и узнать об его структуре [1], проверить содержимое перед выпуском или проверить некоторые распространенные проблемы, например размер 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 [2].

Пройдя этот же процесс для другой оставшейся анимации (instruction_touch _ * .png) и удалив эти PNG-файлы во всех плотностях, мы смогли сэкономить более 5 МБ. Чтобы поддерживать обратную совместимость, мы использовали VectorDrawableCompat [3] из библиотеки поддержки.

Просматривая другие папки ресурсов, было легко обнаружить некоторые несжатые WAV-файлы, которые можно было бы преобразовать в OGG, что означало еще большую экономию, не касаясь строки кода.

Далее в списке вещей, которые нужно проверить, была папка lib/, которая содержит собственные библиотеки для трех поддерживаемых нами ABI.
Было принято решение использовать поддержку разделов APK [4] в нашей сборке Gradle для создания отдельных версий приложения для каждого ABI.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: shevartsoft

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/perevod/270971

Ссылки в тексте:

[1] его структуре: https://developer.android.com/topic/performance/reduce-apk-size.html#apk-structure

[2] новую поддержку PSD в инструменте импорта векторных ресурсов Android Studio 2.2: https://developer.android.com/studio/write/vector-asset-studio.html

[3] VectorDrawableCompat: https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88

[4] поддержку разделов APK: https://developer.android.com/studio/build/configure-apk-splits.html

[5] android:extractNativeLibs: https://developer.android.com/reference/android/R.attr.html#extractNativeLibs

[6] новым упаковщиком: http://android-developers.blogspot.com/2016/11/understanding-apk-packaging-in-android-studio-2-2.html

[7] Proguard: https://developer.android.com/studio/build/shrink-code.html#shrink-code

[8] Multidex: https://developer.android.com/studio/build/multidex.html

[9] ограничении 64K: https://developer.android.com/studio/build/multidex.html#about

[10] принудительно добавить отсутствующие классы в первичный файл DEX: http://google.github.io/android-gradle-dsl/2.2/com.android.build.gradle.internal.dsl.ProductFlavor.html#com.android.build.gradle.internal.dsl.ProductFlavor:multiDexKeepFile

[11] Источник: https://habrahabr.ru/post/344968/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox