Я работаю над Android-приложением, которое работает против ограничения количества меток dex. Есть ли простой способ показать количество методов , сгруппированных по пакету? Я могу получить общее количество методов, но мое приложение имеет несколько компонентов, и я пытаюсь выяснить, какой компонент является самым большим источником этого.
Отображение метода dex по пакету
Ответ 1
Это даст вам представление о том, насколько каждая иерархия пакетов способствует подсчету метода. Результаты включают все классы в этот каталог/пакет и все подкаталоги/пакеты.
baksmali blah.apk -o out
cd out
find * -type d -print -exec sh -c "smali {} -o {}/classes.dex && sh -c \"dexdump -f {}/classes.dex | grep method_ids_size\"" \;
Эта слегка измененная версия похожа, за исключением того, что она предназначена только для классов в этом конкретном каталоге/пакете, не включая поддиры/подпакеты
baksmali blah.apk -o out
cd out
find * -type d -print0 | xargs -0 -I{} sh -c "echo {} && find {} -maxdepth 1 -name \"*.smali\" -print0 | xargs -r -0 smali -o {}/classes.dex"
find -name "*.dex" -print -exec sh -c "dexdump -f {} | grep method_ids_size" \;
Ответ 2
Я написал инструмент dex-method-counts
, который выводит метод для каждого пакета быстрее и точнее, чем инструменты на основе smali, на которые ссылается ответ JesusFreke¹. Его можно установить из https://github.com/mihaip/dex-method-counts.
[1], что script дизассемблирует .dex и повторно собирает его с помощью пакета, но это означает, что методы, на которые ссылаются несколько пакетов, считаются дважды
Ответ 3
Я и коллега опубликовали в прошлом месяце службу, которая может помочь вам с вашей целью: http://www.methodscount.com/. Он показывает количество методов и другую аккуратную информацию.
Под капотом мы используем gradlew
для получения зависимостей и Android SDK tool dx
для вычисления информации dex. Мы применяем процедуру рекурсивно к библиотеке и ее зависимостям.
Мы также сохраняем результаты для уже вычисленных библиотек, чтобы ускорить процесс по последующим запросам.
Если вы используете Android Studio или IntelliJ, вы можете просто установить плагин, чтобы вся информация была удобной подсказкой (плагин также использует эту услугу).
Ответ 4
Находясь на старый вопрос, я написал плагин Gradle, который будет сообщать количество методов в вашем APK для каждой сборки. Он использует тот же код разбора DEX, который использует проект AOSP. Вы можете найти его на https://github.com/KeepSafe/dexcount-gradle-plugin.
Ответ 5
Я оценил работу всех разработчиков выше, и я всегда рад, что у меня такое замечательное сообщество, но так как Android studio 2.2 команда Google выпустила APK Analyzer → https://developer.android.com/studio/build/apk-analyzer.html
Теперь у всех нас есть встроенный инструмент для анализа количества методов, нашего размера ресурсов и даже мы можем сравнить два файла .apk снова друг с другом. Наконец, у всех нас есть этот инструмент. Разработка Android станет проще и проще.
BTW: Чтобы узнать, сколько у вас методов, откройте свой .apk файл в Android Studio (только с поддержкой 2.2+) и нажмите файл classes.dex. После этого вы сможете видеть, что методы учитываются во всех библиотеках и в вашем проекте.
Ответ 6
Вы также можете попробовать использовать https://github.com/KeepSafe/dexcount-gradle-plugin, который позволяет вам видеть количество меток в пакете графически через html.