【问题标题】:Android 64k method limit error on 56k methods56k方法上的Android 64k方法限制错误
【发布时间】:2014-12-09 00:51:11
【问题描述】:

我在我的 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 个方法。 Here 是我正在运行的脚本。

对我的项目的唯一补充是我已将 Parse 从 1.4 更新到 1.7。

更新解析后构建和编译的项目,但是当我尝试添加任何新代码时出现此错误。

我第一次遇到此错误时使用的是 Android Studio 0.8.9。我已经恢复到 Android Studio 0.8.6 并且它仍在发生。

【问题讨论】:

  • 我认为您引用了一些外部库。 TOTAL 方法计数超过 65K
  • 为了澄清@Funkystein 的评论,您项目中的方法总数加上您包含的所有库中的方法总数。
  • 您可以查看项目中使用的每个依赖项的方法计数一个android studio插件,请查看答案stackoverflow.com/questions/30648172/…

标签: java android gradle android-studio dex


【解决方案1】:

你在使用混淆吗? Proguard 可以删除未使用的方法,因此您将适应限制。 此外,您可以将项目拆分为模块。 65k 限制是每个 dex 文件,模块是单独的 dex 文件。

您还可以将 Proguard 配置为内联短方法-应该删除很多短方法。

详情请参阅http://fuzzproductions.com/news/the-mythical-android-method-limit-solvedHow to solve the issue with Dalvik compiler limitation on 64K methods?

【讨论】:

    【解决方案2】:

    我用这段代码解决了这个问题,我的问题是谷歌播放服务将我的应用程序推到了极限。这会删除您的应用不需要的 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
    }
    }
    

    【讨论】:

    • 我看到的最好的答案之一!如果我可以投票 100 次,我会的!发送!
    • 这还能用吗?我在构建时得到一个空指针,指的是包含 ModuleVersionIdentifier 的第一行(在 .find{} 调用中)。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      当你更新你的谷歌播放服务时问题会出现,所以不是添加整个播放服务 android studio 提供了一种向项目添加特定 api 的方法Reference 它会减少你的方法

      【讨论】:

        【解决方案5】:

        您现在只能导入您使用的部分 Google Play 服务。这样就省了很多方法。

        如果你只使用 GCM,那么你只需要 com.google.android.gms:play-services-gcm:7.5.0

        在此处查看列表:https://developers.google.com/android/guides/setup

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-24
          • 1970-01-01
          • 1970-01-01
          • 2017-12-31
          • 2015-06-18
          • 2013-03-04
          相关资源
          最近更新 更多