意外的顶级例外:com.android.dex.DexException:多个dex文件定义
当我将Google Analytics(分析)的configuration添加到我的Android项目并构build项目时,出现以下错误:
:app:transformClassesWithDexForDebug UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Ljavax/inject/Inject; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334) at com.android.dx.command.dexer.Main.run(Main.java:277) at com.android.dx.command.dexer.Main.main(Main.java:245) at com.android.dx.command.Main.main(Main.java:106) FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 * Try: Run with --info or --debug option to get more log output. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithDexForDebug'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:310) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90) at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) at org.gradle.util.Swapper.swap(Swapper.java:38) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) Caused by: org.gradle.internal.UncheckedException: com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:45) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:78) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:243) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:230) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) ... 57 more Caused by: com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at com.android.build.gradle.internal.transforms.DexTransform.transform(DexTransform.java:411) at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:112) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75) ... 63 more Caused by: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:42) at com.android.builder.core.AndroidBuilder.convertByteCode(AndroidBuilder.java:1325) at com.android.build.gradle.internal.transforms.DexTransform.transform(DexTransform.java:396) ... 65 more Caused by: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:365) at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:40) ... 67 more
这是什么意思,我怎样才能防止这个错误?
这里有点晚,但这很可能是你在你的build.gradle
文件中列出的依赖问题。
经过大量的testing,我成功地追逐了我的问题,并相信这可以帮助别人。
我不build议的事情:
除非你完全有必要在你的build.gradle中启用multiDex,否则不要这样做,这只是在你的应用程序的底层问题上跳过,而没有深入到它的根源。 你也不必要地增加你的apk的大小,并且当你的dex文件中有一个冲突的方法时,可能会有意外的崩溃。
需要注意的事项:
检查你的build.gradle文件中的所有依赖项。 你是否引用了一个依赖项,也包含了你已经包含的依赖项? 例如,如果包含appcompat-v7,则不需要包含appcompat-v4,因为v7包含v4的所有function。
我真正发现了什么(我的问题导致我的应用超出了我的dex文件中的方法限制)—-> GOOGLE PLAY SERVICES
如果你不需要在build.gradle中
compile 'com.google.android.gms:play-services:8.3.0'
,就不需要所有的google播放服务库依赖关系,只需使用你需要的东西即可。
Google有一个全面的库列表供您在这里select编译
所有这一切说,你可能只需要在你的Google Analytics中包含这一行gradle:
dependencies{ compile 'com.google.android.gms:play-services-analytics:8.3.0' }
编辑
此外,您可以通过转到项目的根目录(或使用Android Studio中的terminal)并运行以查看依赖关系树:
./gradlew app:dependencies
祝你好运,快乐的编码!
更新
现在,从Android Studio 2.2开始,您不再需要在您的应用程序中使用multi-dex进行反复试验。 使用Apk Analyzer来查看它是否真的需要!
解释: 用超过65K的方法构build应用程序
Android应用程序(APK)文件包含Dalvik Executable(DEX)文件forms的可执行字节码文件,其中包含用于运行应用程序的编译代码。 Dalvik Executable规范将单个DEX文件中可引用的方法总数限制为65,536个 ,包括您自己代码中的Android框架方法,库方法和方法。 超越此限制要求您configuration您的应用程序生成过程以生成多个DEX文件(称为multidexconfiguration)。
注意:这使您可以参考应用程序的所有方法。 就好像你有两个模块(限制:2×65K),但压缩成一个。 这需要构build过程中的成本(时间)。
解:
- 您应该尝试使用库格式化您的代码来删除多余的类,也不会超出限制方法。 例如,如果您使用maps play-services(com.google.android.gms:play-services:8.1.0),则可以更改为(编译com.google.android.gms:play-services-maps:8.1。 0“)来消除不必要的库依赖。 然后在AndroidStudio中同步Gradle并检查它是否运行。 如果没有跑到第二点。
- 将这添加到build.gradle (应用程序模块)。
android { ... defaultConfig { ... multiDexEnabled true } }
对我来说,它是与simplexml转换器相关的改造2.它修复:
compile ("com.squareup.retrofit2:converter-simplexml:2.0.0-beta4"){ exclude module: 'stax' exclude module: 'stax-api' exclude module: 'xpp3'}
适用于Android 5.0及更高版本的Multidex支持
Android 5.0及更高版本使用名为ART的运行时,它本身支持从应用程序APK文件加载多个dex文件。 ART在应用程序安装时执行预编译,扫描类(.. N).dex文件,并将它们编译成一个.oat文件供Android设备执行。 有关Android 5.0运行时的更多信息,请参阅介绍ART。
这意味着您的应用程序将在API级别21或更高版本上正常工作。
Android 5.0之前的Multidex支持
Android 5.0之前的平台版本使用Dalvik运行时来执行应用程序代码。 默认情况下,Dalvik将应用程序限制为每个APK一个classes.dex字节码文件。 为了解决这个限制,你可以使用multidex支持库,它成为应用程序的主要DEX文件的一部分,然后pipe理对其他DEX文件及其包含的代码的访问。
所以,首先确保你已经导入了正确的依赖关系,这似乎你做到了。
dependencies { compile 'com.android.support:multidex:1.0.1' }
在清单中,将MultiDexApplication
类从multidex支持库添加到应用程序元素。
<?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>
另外,如果你的应用扩展了Application
类,你可以重写attachBaseContext()
方法并调用MultiDex.install(this)
来启用multidex
。
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
最后,您将需要通过添加multiDexEnabled true
来更新您的build.gradle文件,如下所示:
defaultConfig { applicationId '{Project Name}' minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" multiDexEnabled true }
我希望它会帮助你。
在我的情况下,我有两次build.grade文件
compile 'com.google.android.gms:play-services-auth:8.4.0'
一旦我删除了第二个条目,它工作正常。
与我遇到的问题完全相同!
我发现这是由于重复的依赖关系。 在build.gradle中,其他依赖项可能已经包含在其中,从而产生冲突。 我删除了必要的依赖关系,解决了我的问题。
我做了什么来解决这个是从这里( https://developers.google.com/analytics/devguides/collection/android/v4/ )的gradle更改,然后在Android Studio进入“文件/项目结构”,然后点击进入分析,如果checkbox未选中,则让Gradle同步,然后再次选中checkbox,然后单击buttonlogin。完成此操作后,只需将您的实际跟踪器ID复制到mTracker = analytics.newTracker(<here>)
看这个页面寻求帮助。 https://developers.google.com/android/reference/com/google/android/gms/analytics/GoogleAnalytics
在构build文件中包含特定的依赖关系。
如果你想添加地图到你的应用程序,然后包括编译com.google.android.gms:play-services-location:9.2.1 '
而不是编译“ com.google.android.gms:play-services:9.2.1 ”
我认为你使用谷歌分析sdk V3使用V4,而我也面临同样的问题,同时使用谷歌parsinghttps://developers.google.com/analytics/devguides/collection/android/v4/ sdk V3更多信息。
如果您将Android Studio更新到最新版本1.4,则可能会发生这种情况。 您是否将支持库更新到最新版本? 你的compileSdkVersion
应该是23。
apply plugin: 'com.android.application' android { compileSdkVersion 23 //update this to 23 buildToolsVersion "21.1.2" defaultConfig { applicationId "your.package.name" minSdkVersion 16 targetSdkVersion 21 multiDexEnabled true //enable this } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { // update these to 23 if you have them and add the multidex compile 'com.android.support:support-v4:23.0.1' compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.android.support:design:23.0.1' compile 'com.google.android.gms:play-services:+' compile 'com.android.support:multidex:1.0.1' }
实际上,我发现有太多的Android Studio模块在没有启用multidex的情况下出现这个错误。 如果您试图避免启用multidex,则限制似乎在26个模块左右。 这是Android Studio 1.5.1
同样的问题,但使用react-native-svg时。 这帮助了我:
cd android ./gradlew clean
资源
- android:如何从非activity / service类使用getApplication和getApplicationContext
- 获取用于Google云消息传递的API密钥
- 如何在Android Studio的模拟器上启用物理键盘? (曾经工作)
- 从其他应用程序启动Facebook应用程序
- 无法在android中调用String.isEmpty()
- 如何在按下button后每隔10分钟重复一次方法,并在另一次button按下时结束
- 如何让Android Studio停止在search结果中返回生成的代码?
- 如何知道在使用SupportMapFragment时地图已准备好使用?
- 直播RTMP / RTSP播放器,无需在Android上使用webview(WOWZA服务器)