Похоже, я флиртую с лимитом dex 65K, если я напишу несколько новых методов, у меня есть ошибка dex, если я удалю некоторые старые вещи, она исчезла.
Есть ли способ проверить, сколько методов вы используете в настоящее время в Android Studio?
Похоже, я флиртую с лимитом dex 65K, если я напишу несколько новых методов, у меня есть ошибка dex, если я удалю некоторые старые вещи, она исчезла.
Есть ли способ проверить, сколько методов вы используете в настоящее время в Android Studio?
Я могу найти хрупкий способ сделать это, что может быть лучше, чем вообще нет. Скопируйте и вставьте следующее в конец файла build.gradle модуля, заменив ANDROID_HOME
на путь установки Android SDK и BUILD_TOOLS_VERSION
с той же версией, указанной в спецификации buildToolsVersion
вашего блока android
:
buildscript {
dependencies {
classpath files("/Users/sbarta/sdk/build-tools/21.0.2/lib/dx.jar")
}
}
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
variant.assemble.doLast {
// Show the dex count after the assemble task is finished
showDexCount(
[filename: output.outputFile],
)
}
}
}
def showDexCount(Map... files) {
def maxReferences = (int) Math.pow(2, 16);
def buffer = 5000 // that for safety, because you can't burn maxReferences
println "\n\n***********************************************************************************"
println "* DEX COUNTS *"
println "***********************************************************************************"
files.each {
def dex = new com.android.dex.Dex(it.filename)
def count = dex.tableOfContents.methodIds.size
if ((maxReferences - count - buffer) >= 0)
println String.format('* %1$5d (there are still %2$5d references to burn...) *',
count, maxReferences - count - buffer)
else
println String.format('* %1$5d !!!WARNING!!! Too many references, please decrease by %2$4d! *',
count, -(maxReferences - count - buffer))
}
println "***********************************************************************************\n"
}
Это загружает сам код dex для оценки файлов dex и подсчета количества методов; он добавляет свою работу в конец задачи assemble
в сборке script, поэтому вы увидите ее в строках командной строки или если вы действительно запустите ее из Android Studio (где она будет отображаться в Gradle консоль).
Я попытался сделать его более устойчивым и использовать переменную окружения ANDROID_HOME вместо того, чтобы требовать от вас жесткого кода пути, но использование переменных среды при создании из Android Studio проблематично (оно работает из командной строки, хотя). Аналогично, я попытался заставить его использовать версию инструментов сборки из другого места в сборке script, на которую он ссылается, и я также попытался определить глобальную константу, но не смог сделать обзор и порядок выполнения работы. Если кто-то может улучшить это, прокомментируйте или отредактируйте ответ.
Это приспособлено из чего-то, написанного Карлосом Собриньо; Я не могу найти ссылку на оригинал, доступную в Интернете.
Я использовал два разных инструмента, чтобы найти количество методов:
1) Простой инструмент, который подсчитывает методы и показывает количество методов в разных пакетах: https://github.com/mihaip/dex-method-counts
Он покажет вам простые данные:
Read in 65490 method IDs.
<root>: 65490
: 3
android: 6837
accessibilityservice: 6
bluetooth: 2
content: 248
pm: 22
res: 45
...
com: 53881
adjust: 283
sdk: 283
codebutler: 65
android_websockets: 65
...
Overall method count: 65490
2) И вот еще один инструмент, который еще проще в использовании, вам нужно добавить зависимость к вашему проекту, и он покажет вам методы для каждой сборки. Вы можете просто прокомментировать эту линию зависимостей, когда вам это не нужно: https://github.com/KeepSafe/dexcount-gradle-plugin
methods fields package/class name
5037 1103 android.support.v4
29 1 android.support.v4.accessibilityservice
57 16 android.support.v4.animation
https://developer.android.com/studio/build/apk-analyzer.html#view_dex_files
Средство просмотра файлов APX Analyzer DEX обеспечивает немедленный доступ к базовой информации в файлах DEX в приложении. Оценки класса, пакета, общего количества ссылок и деклараций предоставляются в средстве просмотра, что может помочь решить, использовать ли multi-DEX или как удалить зависимости, чтобы опуститься ниже предела 64x DEX.
На рисунке 4 показано приложение среднего размера, приближающееся к пределу 64x DEX.