为了账号安全,请及时绑定邮箱和手机立即绑定

仅在运行测试时抛出DexIndexOverflow异常

仅在运行测试时抛出DexIndexOverflow异常

PIPIONE 2019-06-21 16:22:55
仅在运行测试时抛出DexIndexOverflow异常我可以在我的调试和发布变体中成功地构建和运行我的Android应用程序,没有问题。然而,当我尝试运行我的新单元测试时(我以前从来没有过它们),我就会感到恐惧。DexIndexOverflow异常..我怀疑ProGuard不是与我的单元测试一起运行,而是与我的正常调试和发布BuildTypes一起运行。我该怎么办才能跑ProGuard在我的单元测试运行配置中?我搜遍了梯度文件ProGuard文档,以及AndroidStudio文档来解决这个问题,但是我什么也没找到。
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

Android应用程序(APK)文件以Dalvik Executable(DEX)文件的形式包含可执行字节码文件,其中包含用于运行应用程序的编译代码。Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536个,包括您自己代码中的Android框架方法、库方法和方法。要克服这个限制,需要将应用程序构建过程配置为生成多个DEX文件,称为Multidex配置。

AndroidSDK构建工具21.1及更高版本中提供的用于Gradle的Android插件支持Multidex作为构建配置的一部分。在尝试为Multidex配置应用程序之前,请确保使用SDKManager将AndroidSDK、BuildTools和AndroidSupportRepository更新为最新版本。

将应用程序开发项目设置为使用Multidex配置需要对应用程序开发项目进行一些修改。特别是,您需要执行以下步骤:

  1. 更改分级生成配置以启用Multidex

  2. 修改清单以引用MultiDexApplication类

修改您的应用程序Gradle构建文件配置,以包括支持库,并启用Multidex输出。

    android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 25
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...}dependencies {
  compile 'com.android.support:multidex:1.0.3' }

在您的清单中添加MultiDexApplication类的多氨纶支持应用程序元素的库。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
     android:name="android.support.multidex.MultiDexApplication">

    </application></manifest>

阅读关于多重Dex

如果您的Application类正在扩展其他类,而您不想或不能更改它,override attachBaseContext()如下所示:

public class MyApplication extends MultiDexApplication { 
   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } }

然后

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
     android:name=".MyApplication">
    </application></manifest>

结语

虽然图书馆在大多数情况下解决了DEX 64K问题,但它应该被视为最后的手段。在尝试使用它之前,您应该检查项目中不需要的依赖项,并使用ProGuard尽可能多地删除未使用的代码。


查看完整回答
反对 回复 2019-06-21
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

升级到Gradle插件3.1.1为我解决了这个问题,如建议在这个答案中


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 368 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信