Ответ 1
Я могу найти хрупкий способ сделать это, что может быть лучше, чем вообще нет. Скопируйте и вставьте следующее в конец файла 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, на которую он ссылается, и я также попытался определить глобальную константу, но не смог сделать обзор и порядок выполнения работы. Если кто-то может улучшить это, прокомментируйте или отредактируйте ответ.
Это приспособлено из чего-то, написанного Карлосом Собриньо; Я не могу найти ссылку на оригинал, доступную в Интернете.