Android:我的应用程序太大,并且"无法执行dex:方法ID不在[0,0xffff]:65536"?

ab1*_*b11 24 android dx dalvik

我正在尝试将我的应用程序与Box,Dropbox和Google Drive集成.所有这三项服务都需要一些第三方罐子.此外,我的应用程序已经需要一些第三方罐子.现在当我尝试从eclipse运行我的应用程序时,我收到以下错误:

无法执行dex:方法ID不在[0,0xffff]中:65536转换为Dalvik格式失败:无法执行dex:方法ID不在[0,0xffff]中:65536

似乎发生此错误是因为我的应用程序有太多方法.我相当肯定这些方法的大部分来自第三方罐子,所以试图通过简化我的代码来解决这个问题是不现实的.我在网上找到了这两个建议.

  1. 添加dex.force.jumbo=true到project.properties(并使用adt版本21).我这样做但仍然得到错误.

  2. 使用多个dex文件,如下所述:http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html.这似乎是唯一的选择,但我不明白它在我的情况下是如何适用的.问题是像Drive这样的服务有太多的依赖关系.这个解决方案是否要求我在引用其依赖项时修改Drive源以使用inflection?(这显然不是一种选择).

  3. 使用proguard缩小删除未使用的代码/方法.使用proguard导出我的应用程序确实有效,文档服务集成在> 4.0设备上按预期工作.但是,在2.3设备上进行测试时会抛出classnotfound错误.

所以,我希望就这个问题提出一些建议.选项2是我案例的解决方案吗?我应该考虑另一个解决方案吗?

Com*_*are 14

您还可以将其中一个或多个作为主插件的插件,以单独的APK形式下载.该APK会暴露主应用程序将使用的一些组件 - 因为我不知道您与这些服务集成的性质,我无法就此提出更具体的建议.您可以使用自己的signature级别自定义<permission>来保护两个应用程序之间的通信.而且,作为奖励,如果使用第三方库添加了额外权限的要求,您只需要插件APK中的那些权限,保持您的主APK更小.


Jas*_*son 7

***新****所有其他答案现已过时.这是新修复

Android 5.0及更高版本

自动包含多语言支持.来自文档:

Android 5.0及更高版本使用名为ART的运行时,它本身支持从应用程序APK文件加载多个dex文件.ART在应用程序安装时执行预编译,扫描类(.. N).dex文件并将它们编译成单个.oat文件以供Android设备执行.有关Android 5.0运行时的更多信息,请参阅ART简介.

Android 5.0以下

只需将Android mult-dex支持工具添加到您的gradle构建中:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
Run Code Online (Sandbox Code Playgroud)


Rag*_*ood 6

Dalvik VM每个dex文件最多可以有65536个方法,因为字节码指令集无法引用需要16位以上的方法号(正如@danfuzz在评论中指出的那样).

虽然可以使用多个dex文件来解决这个问题,但Facebook 找到了另一个可以在他们的应用程序中部署以解决问题的修复程序.

  • 注意:限制不是"内存分配问题".字节码指令集无法引用需要16位以上的方法编号.当我离开Android团队时,我已经解决了正在进行中的问题,似乎没有人在同一时间拿起它(唉). (5认同)

小智 5

请参阅vm/LinearAlloc.c,您可以找到以下代码:(Android 2.3.3下的5MiB,Android 4.0后的8MiB作为我的调查)

#define DEFAULT_MAX_LENGTH(5*1024*1024)

...

LinearAllocHdr*pHdr;

...

pHdr-> mapLength = DEFAULT_MAX_LENGTH;

我想'Facebook修复'是通过使用本机C指针编辑这个内存.IMHO LinearAlloc问题和这个方法ID问题是不同的事情.