Android应用程序中的MultiDex支持错误

10

我想使用Android L compat libs。在将相关代码添加到gradle后,我遇到了错误:

  Error Code:
2
  Output:
objc[36290]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
  at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:501)
  at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:276)
  at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:490)
  at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:167)
  at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
  at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
  at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
  at com.android.dx.command.dexer.Main.run(Main.java:230)
  at com.android.dx.command.dexer.Main.main(Main.java:199)
  at com.android.dx.command.Main.main(Main.java:103)

我在这里看到了相关问题,以及这里,并尝试了来自博客文章的解决方案,但仍然遇到了错误,在博客文章的情况下,我遇到的错误是:

  Error Code:
2  Output:
objc[36323]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Library dex files are not supported in multi-dex mode
    at com.android.dx.command.dexer.Main.runMultiDex(Main.java:322)
    at com.android.dx.command.dexer.Main.run(Main.java:228)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

这是我的安卓Gradle设置:

android {
compileSdkVersion 21
buildToolsVersion "20.0.0"

defaultConfig {
    applicationId "com.my.package"
    minSdkVersion 9
    targetSdkVersion 21
}

buildTypes {
    release {
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
    }
}

}

这些是我的依赖项:

dependencies {
compile project(':libraries:ecoGallery')
compile project(':libraries:facebookSDK')
compile 'com.android.support:support-v4:21.0.0'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.google.android.gms:play-services:6.1.71'
compile 'com.j256.ormlite:ormlite-android:4.48'
compile 'com.j256.ormlite:ormlite-core:4.48'
compile 'com.mixpanel.android:mixpanel-android:4.3.1@aar'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
compile 'com.nineoldandroids:library:2.4.0'
compile 'oauth.signpost:signpost-commonshttp4:1.2.1.2'
compile 'oauth.signpost:signpost-core:1.2.1.2'
compile 'com.uservoice:uservoice-android-sdk:+@aar'
compile 'com.newrelic.agent.android:android-agent:4.87.0'
compile 'com.google.guava:guava:18.0'
compile files('libs/android-support-multidex.jar')

}

有人对我做错的事情有什么想法吗?


这对你有帮助吗?也许可以禁用预编译(pre-dexing)?http://stackoverflow.com/questions/25696933/android-gradle-dexexception-library-dex-files-are-not-supported-in-multi-dex-m - Scott Barta
确实,您应该禁用预编译。 - Alex Lipov
此外,将 buildToolsVersion 的值从 "20.0.0" 设置为 "21.0.2"。 - Jared Burrows
谢谢大家,但我已经尝试过了(这是我在问题中链接的博客文章的最后一部分)。在完成该博客文章中的所有步骤后,我遇到了“com.android.dex.DexException:Library dex files are not supported in multi-dex mode”(意思是,我无法禁用预编译)。 - dors
5个回答

5

针对Android的Gradle插件版本0.14.0增加了完整的多dex支持
删除您为多dex所做的所有build.gradle更改,只需添加以下内容:

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

谢谢!链接非常有帮助。 - dors
我已经使用过它,但仍然出现相同的错误。还有其他建议吗? - jeeva

2

不要包含整个谷歌库,而是只使用你需要的部分。

例如,使用:

    compile 'com.google.android.gms:play-services-maps:7.8.0'
    compile 'com.google.android.gms:play-services-location:7.8.0'

替代

compile 'com.google.android.gms:play-services:7.8.0'

2

尝试将以下代码添加到您的build.gradle中,这对我有用。

android{

...
dexOptions {
        preDexLibraries = false
    }

afterEvaluate {
        tasks.matching {
            it.name.startsWith('dex')
        }.each { dx ->
            if (dx.additionalParameters == null) {
                dx.additionalParameters = ['--multi-dex']
            } else {
                dx.additionalParameters += '--multi-dex'
            }
        }
    }
...
}

0

他们给你的答案都不是很全面。问题在于Multidex。你必须在应用的gradle文件中添加该库:

implementation 'com.android.support:multidex:1.0.3'

接下来,在应用 gradle 的 defaultConfig 中添加:

multiDexEnabled true

你的应用程序必须是Multidex类型。你必须在清单文件中编写它:

android:name=".MyApplication"

MyApplication必须是Multidex类,或者它必须扩展它。


0

尝试禁用“即时运行”:

在Android Studio中: 菜单文件 -> 设置

在构建、执行、部署 -> 即时运行中: 取消选中启用即时运行以在部署时热交换代码/资源更改(默认启用)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接