Java Android 64k方法限制56k方法的错误
我在android项目中收到此错误:Java Android 64k方法限制56k方法的错误,java,android,gradle,android-studio,dex,Java,Android,Gradle,Android Studio,Dex,我在android项目中收到此错误: Unable to execute dex: method ID not in [0, 0xffff]: 65536 Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 根据我所有的研究,这是因为我的android项目中有太多的方法-限制是64k。然而,我已经运行了脚本来计算项目中当前有多少个方法,并且它提出了56k个方
Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
根据我所有的研究,这是因为我的android项目中有太多的方法-限制是64k。然而,我已经运行了脚本来计算项目中当前有多少个方法,并且它提出了56k个方法。是我正在运行的脚本
对我的项目唯一的补充是我已经将Parse从1.4更新到了1.7
项目是在更新parse之后构建和编译的,但是当我尝试添加任何新代码时,会出现此错误
当我第一次遇到这个错误时,我正在使用Android Studio 0.8.9。我已经恢复到Android Studio 0.8.6,它仍然在发生 您正在使用模糊处理吗?Proguard可以删除未使用的方法,因此您将符合限制。 此外,您还可以将项目拆分为模块。65k限制是每个dex文件,模块是单独的dex文件 您还可以将Proguard配置为内联短方法-它们应该删除很多短方法
有关详细信息,请参阅和。我用这段代码解决了这个问题,我的问题是google play服务将我的应用推到了极限。这将删除应用程序不需要的google play服务。将其放在gradle构建文件的底部
def toCamelCase(String string) {
String result = ""
string.findAll("[^\\W]+") { String word ->
result += word.capitalize()
}
return result
}
afterEvaluate { project ->
Configuration runtimeConfiguration = project.configurations.getByName('compile')
ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
// Forces resolve of configuration
ModuleVersionIdentifier module = resolution.getAllComponents().find { it.moduleVersion.name.equals("play-services") }.moduleVersion
String prepareTaskName = "prepare${toCamelCase("${module.group} ${module.name} ${module.version}")}Library"
File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir
Task stripPlayServices = project.tasks.create(name: 'stripPlayServices', group: "Strip") {
inputs.files new File(playServiceRootFolder, "classes.jar")
outputs.dir playServiceRootFolder
description 'Strip useless packages from Google Play Services library to avoid reaching dex limit'
doLast {
copy {
from(file(new File(playServiceRootFolder, "classes.jar")))
into(file(playServiceRootFolder))
rename { fileName ->
fileName = "classes_orig.jar"
}
}
tasks.create(name: "stripPlayServices" + module.version, type: Jar) {
destinationDir = playServiceRootFolder
archiveName = "classes.jar"
from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) {
exclude "com/google/ads/**"
exclude "com/google/android/gms/analytics/**"
exclude "com/google/android/gms/games/**"
exclude "com/google/android/gms/plus/**"
exclude "com/google/android/gms/drive/**"
exclude "com/google/android/gms/ads/**"
}
}.execute()
delete file(new File(playServiceRootFolder, "classes_orig.jar"))
}
}
project.tasks.findAll { it.name.startsWith('prepare') && it.name.endsWith('Dependencies') }.each { Task task ->
task.dependsOn stripPlayServices
}
}
您可能想看看新的MultiDex支持库
当您更新google play服务时,问题会出现,因此android studio提供了一种向项目添加特定api的方法,而不是添加整个播放服务,这将减少您的方法您现在只能导入您使用的google play服务。这节省了很多方法 如果您只使用GCM,那么您只需要 com.google.android.gms:play services gcm:7.5.0
请看下面的列表:我想您正在引用一些外部库。方法总数超过65kt为了澄清@Funkystein的评论,你的项目中的方法总数加上你包含的所有库中的方法总数。你可以检查你的项目中使用的每个依赖项的方法计数一个android studio插件,请检查我看到的最佳答案之一!如果我能投票100次,我会的!德克萨斯州!这个还能用吗?我在构建时得到一个空指针,它引用了包含ModuleVersionIdentifier的第一行(在.find{}调用中)。