我可以找到一个脆弱的方式来做到这一点,这可能比没有办法更好。复制并粘贴以下到您的模块的的build.gradle文件的底部,用你的Android SDK安装的路径和BUILD_TOOLS_VERSION与在buildToolsVersion规范的android块指定的同一版本替换ANDROID_HOME:
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构建时使用环境变量有问题(它可以从命令行运行)。同样,我试图从构建脚本的其他地方获取构建工具版本,并在其中引用它,并且尝试定义全局常量,但无法确定范围和执行顺序。如果有人可以改进,请评论或编辑答案。
这是改编自Carlos Sobrinho写的东西;我无法找到原始的Web访问参考。