多个R.java中的冗余资源referance导致DexIndexOverflowException

我有多个库项目,他们都依赖于支持库。 我的应用程序依赖于这些多个库项目。 每个库项目都包含对其R.java文件中的库资源的引用。 由于冗余,这会使字段ID计数膨胀。

我的应用得到了

DexIndexOverflowException:字段ID不在[0,0xffff]中:65536

因为这个冗余的R.java引用。

因此,我的应用程序有47k方法,而65k字段ID。

编辑:

我不会使用multi-dex,它不是我的问题的解决方案。 我想削减冗余字段ID。

问题不在于如何解决问题,问题是如何摆脱冗余字段ID。 使用multi-dex不会删除冗余字段ID。

就像@ intellij-amiya的答案一样,使用multidexproguard将解决您的问题,我个人推荐。

如果您不想遵循该方法,则可以手动排除重复的依赖项。

在终端中执行以下命令以查找重复的依赖项。

 ./gradlew :app:dependencies --configuration compile 

或者如果你在窗户上,

 gradlew.bat :app:dependencies --configuration compile 

更改:app作为您的项目名称。

我们假设你的gradle依赖是这样的:

 compile 'com.android.support:support-compat:26.+' compile 'com.android.support:support-fragment:26.+' 

您将获得如下输出:

 +--- com.android.support:support-compat:26.+ -> 26.0.0-alpha1 | \--- com.android.support:support-annotations:26.0.0-alpha1 \--- com.android.support:support-fragment:26.+ -> 26.0.0-alpha1 +--- com.android.support:support-compat:26.0.0-alpha1 (*) +--- com.android.support:support-core-ui:26.0.0-alpha1 | +--- com.android.support:support-annotations:26.0.0-alpha1 | \--- com.android.support:support-compat:26.0.0-alpha1 (*) \--- com.android.support:support-core-utils:26.0.0-alpha1 +--- com.android.support:support-annotations:26.0.0-alpha1 \--- com.android.support:support-compat:26.0.0-alpha1 (*) 

您可以看到标有(*)依赖项,并且可以排除这些依赖项。 您可以看到support-compat是重复的,排除它是通过编辑完成的,如下所示:

 compile ('com.android.support:support-fragment:26.+') { exclude module: 'support-compat' } 

重复此操作,直到您可以将计数低于64k

而现在最困难的部分仍然存在。

根据我的经验,排除某些依赖项可能会导致构建失败,运行时exception等。因此,您需要检查应用程序是否正常运行而没有问题。

希望这有帮助。

DexIndexOverflowException:字段ID不在[0,0xffff]中:65536

  • Android预先定义limit of Methods of 65536

什么时候?

DEX文件的方法索引的大小为16位,因此它表示65536表示单个DEX文件中的代码可以调用的引用总数。 如果克服则会出现此错误。

一旦开始包含足以导致达到64K方法限制的库,就需要删除无关的依赖项。

怎么样? 不使用 multiDex

  • 你应该添加proguard

ProGuard优化字节码,删除未使用的代码指令,并使用短名称对剩余的类,字段和方法进行模糊处理。Gradle的Android插件提供资源缩减function,可以从打包的应用程序中删除未使用的资源,包括代码库中未使用的资源。 它与代码收缩一起工作,这样一旦删除了未使用的代码,也可以安全地删除不再引用的任何资源。

如何启用Proguard

minifyEnabled true添加到build.gradle文件中的相应构建types。

 android { buildTypes { release { //You can add this in debug mode minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } 

注意

  1. getDefaultProguardFile('proguard-android.txt')方法从Android SDK tools->proguard->folder获取默认的ProGuard设置。

  2. 您可以在proguard-rules.pro文件中添加自定义ProGuard规则。

资源萎缩

资源缩减仅适用于代码收缩。 在代码缩减器删除所有未使用的代码之后,资源缩减器可以识别应用程序仍在使用哪些资源。

 buildTypes { release { minifyEnabled true shrinkResources true //You can add this in debug mode } } 

通过在Module build.gradle中添加“multiDexEnabled true”来解决我的问题。

 android { ... defaultConfig { ... multiDexEnabled true } }