Я могу найти хрупкий способ сделать это, что может быть лучше, чем вообще нет. Скопируйте и вставьте следующий код в нижней части файла 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's 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
в сценарии сборки, поэтому вы увидите его в строках командной строки или если вы действительно запустите его из Android Studio (где он появится в консоли Gradle).
Я попытался сделать его более устойчивым и использовать переменную окружения ANDROID_HOME вместо того, чтобы требовать жесткого кодирования пути, но использование переменных среды при создании из Android Studio проблематично (оно работает из командной строки, хотя). Аналогичным образом, я попытался заставить его использовать версию инструментов сборки с другого места в скрипте сборки, на который он ссылается, и я также попытался определить глобальную константу, но не смог сделать обзор и порядок выполнения работы. Если кто-то может улучшить это, прокомментируйте или отредактируйте ответ.
Это приспособлено из чего-то, написанного Карлосом Собриньо; Я не могу найти ссылку на оригинал, доступную в Интернете.
Вы можете проверить количество методов каждой зависимости, используемой в вашем проекте, плагина для Android-версии, пожалуйста, проверьте ответ http://stackoverflow.com/questions/30648172/gradle-library-duplicates-in-dependencies/36056607#36056607 – darwin
Хорошо, есть ли способ выяснить количество методов, которые содержит зависимость? – CoDe