Dx不好的类文件魔法(cafebabe)或版本(0033.0000)与ADK14

自从转向ADK14以来,我一直无法在Windows 7系统上构build新的发行版。

build立失败,“转换为达尔文格式失败,错误1”,而控制台充满了大量的“Dx坏类文件魔术(cafebabe)或版本(0033.0000)”。

完整的例外文本:

com.android.ide.eclipse.adt.internal.build.DexException: Conversion to Dalvik format failed with error 1 at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:740) at com.android.ide.eclipse.adt.internal.project.ExportHelper.exportReleaseApk(ExportHelper.java:204) at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.doExport(ExportWizard.java:290) at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.access$0(ExportWizard.java:229) at com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard$1.run(ExportWizard.java:214) at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121) 

我正在构build一个使用大量库的旧项目,所以这个问题可能与这个事实有关。 已经完成了所有的“固定属性”/清洁等移动到ADK14build议(因为我自然有这些问题),但他们没有帮助。

所有的库都在同一个Android SDK和JDK / JRE版本上,所以这似乎不是问题。事实上,该应用程序很容易内置在debugging和安装在我的老版本1.5macros达魔术 – 它只是当我需要导出一个签名的应用程序包,这个分解。

[编辑]这是在Windows 7×64电脑上。 我观察到,在我的Linux笔记本电脑(Lucid Lynx)上安装apk的完全相同的代码完全没有任何问题。

有任何想法吗? 对此感到非常沮丧。

注意

显然,这个错误信息可以由各种不同的问题触发。 我的特殊问题与Java 6/7无关,因为我从来没有安装过Java 7,编译器的合规性被设置为Java 6(当时我检查过,因为我已经看到了其他地方提出的解决scheme)。

用Java 6而不是7编译工作,但只有在我configuration了Eclipse“了解”我的JRE6安装path之后。 以前我只在Eclipse中安装了JRE7。 我可以将我的编译器合规性级别设置为1.6或1.5,但显然没有相应的JRE,它并没有任何效果。 我真的不明白为什么应该这样做 – JRE与编译有什么关系,它与Android代码有什么关系?

我终于find了解决这个问题的办法。

如果你看Proguard.bat(Android SDK \ tools \ proguard \ bin),你会发现下面一行:

 call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %* 

将其replace为以下内容:

 call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9 

这是一个愚蠢的老问题,我实际上已经意识到我曾经见过,现在我已经知道了。 显然,Android SDK团队仍然没有解决这个问题,当我干净安装Android SDK时,它被重新引入。

在阅读dex工具的源代码时,这里的问题是类文件不在它能够理解的版本内。 版本必须在45-50(主要版本)之间你在这里使用的版本是0033.0000(hex0x33),它是十进制的51(代表Java 7的版本号)。 这不是我的猜测,我直接在源代码中find了这个。

以下是猜测,什么解决了我的问题:我还没有想出你要做什么来坚定地确认什么类文件版本,你会得到与各种选项编译,但对我来说,问题是我的图书馆已编译与Java 7.因为Android只支持Java 5或6,我只是简单地重新编译在6,并繁荣,解决了。

将Eclipse的Java版本更改为6为我工作。 在Eclipse中,转到Windows-> Preferences-> Java-> Compiler,并将“Compiler compliance level”设置为1.6。

奇怪的是,我有Eclipse 3.7.0,它工作正常,而其他电脑3.7.1和在那里build立的jar文件不工作…

如果您使用的是Android Studio,可以通过使用上述build议来修复这个问题,通过添加以下几行来在build.gradle中定位Java 1.6:

 apply plugin: 'java' sourceCompatibility = 1.6 targetCompatibility = 1.6 

从此博客文章中发现此修复程序: http : //www.alonsoruibal.com/my-gradle-tips-and-tricks/

我通过右键单击Java项目 – >构buildpath – >configuration构buildpath转到库选项卡,selectJavaSE-1.7->按编辑,然后更改为JavaSE-1.6按下完成,然后确定。

转到Android项目,右键单击项目 – >构buildpath – >configuration构buildpath转到订单和导出选项卡,checkbox旁边的Java项目和其他库包括在内。 点击确定。 在你的Android项目中,删除“gen”和“bin”。 那么在这两个文件夹不久之后将重新生成(如果不是,那么确保你已经作为pipe理员运行了你的eclipse。)

现在尝试在手机上运行Android项目。 它的工作原理:)

我在Eclipse中通过转到Windows --> Preferences Java --> Compiler在右侧窗口中selectCompiler compliance level 1.6来解决这个问题,单击ApplyOk

Clean Build所有应该解决问题的项目

对于可能有同样问题的任何人的利益:

删除proguard允许导出的apk工作。 为什么Proguard在Linux中工作,但在Windows上却不是一个谜。

现在这个Android项目已经报告了这个问题: http : //code.google.com/p/android/issues/detail?id=21170&can=4&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

如果遇到同样的问题,请将其挂上。

我有同样的错误信息德兴没有工作“Dx坏类文件魔术(cafebabe)或版本(0033.0000)”。

我安装了JDK1.7,Eclipse Kepler,AndroidSDK-19(Android 4.4)。 如果有更新,最后运行android-sdk-windows / SDK Manager.exe工具。 原来,我有19级的SDK,但工具/ Android SDK构build工具部分是18.1.1。 安装的构build工具19.0.3和编译开始工作正常。

我尝试了几个其他的解决scheme。 那个帮助我的东西是下载最新版本的ProGuard并复制它做android-sdk / tools / proguard / bin和lib。

对于其他search此错误消息的人来说,另一个可能的原因是您正在为Java 7包含构build的库。对于我们来说,调整这些构build以专门针对Java 6(然后构build新的JAR)解决了这个问题。

如果使用ant构build,可以通过将以下属性添加到您的javac标记中来实现:

 <javac ... source="1.6" target="1.6" ... > 

如果直接调用javac,使用:

 javac -source 1.6 -target 1.6 ... 

Dx不好的档案魔法(cafebabe)或版本(0033.0000)

这是从构build工具的检查

  1. 这是一个Java类文件。 (Java类文件在开始时有'cafebabe')
  2. 这是一个不支持的版本。 此消息说0033.0000(Java SE 1.7)不受支持

所以这个特别的消息说

读这个类文件(它有'cafebabe'魔术),我被JVM 1.7的版本弄糊涂了

java语言和构build工具由Oracle维护,dex / dalvik / Android运行时(ART)工具由google / android维护。 所以当oracle生成一个新的java时,有一段时间,由最新的sdk生成的java与构build工具所支持的java不兼容。

维基百科:Java类文件有一个表格,显示了Java的版本及其版本号

 +------------+-----------+ |Java SE 1.9 | 0035.0000 | |Java SE 1.8 | 0034.0000 | |Java SE 1.7 | 0033.0000 | |Java SE 1.6 | 0032.0000 | +------------+-----------+ 

所以在这种情况下,“坏版本”是1.7。 最新的(2016年5月)工具链支持1.6和1.7,但不是1.8。

如何解决

有两种机制可以用来解决这个问题。

  1. 更改兼容性
  2. 更改SDK

更改兼容性

在java上编译时,你可以告诉编译器定位一个早期的SDK。 目前与Android工作室(2.0),这是通过改变。

 File/Project Structure 

点击每个模块,并将Source Compatibility设置为所需的Java版本。

在原始gradle中,这意味着插入到build.gradle ,如下所示:

 android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6 } 

对于一个java项目, build.gradle需要

 sourceCompatibility= 1.6 targetCompatibility= 1.6 

更改SDK

可以下载较早的java版本的sdk,并且可以下载并安装较早的SDK。 这是一个有限的时间修复。 甲骨文正在不断改进Java,删除错误,而旧的SDK不会被更新。

通过从project structure的左侧更改SDK来更新SDK

使用Maven的编译器插件可以轻松解决这个错误,同时只安装JDK 1.7。 看看我的博客文章如何做到这一点。

在jar – > dex转换过程中,我遇到了这个错误信息。 问题出在一个损坏的 jar文件中。

对我来说,这个问题驻留在过时的构build工具版本安装(构build工具是在我使用的平台工具和sdk版本的背后)。 所以我做了什么来解决这个错误:

  • 我从Android SDKpipe理器下载了最新版本的构build工具
  • 我正在使用ADT。 尽pipe如此,还是没有使用最新版本的构build工具,错误依然存在。 所以我在我的所有项目和库中的project.properties文件中添加了sdk.buildtools=22.0.1行。 现在错误消失了。

PS:唯一的缺点是我硬编码的版本,在未来的更新,我不会自动使用它。

根据informIT.com ,当您使用不使用Java 6或更高版本的任何function,但是使用Java 6或更高版本构build的.jar文件时会发生此错误。 显然, Google不会在Android的系统要求中包含JDK 7

所以这个解决scheme对我来说非常简单。 使用Java 5或更低版本构build.jar文件。

我在使用build-tools 18.0.1时遇到了同样的问题,但是当我改用19.0.1时,一切正常。 在Whome的回答后发表评论可能会更好,但声誉不高。

在我的情况下,问题不是关于JDK或编译器合规性级别1.6关于我的SDK构build工具是“18.1.1” 。 我更新构build工具到“21.1.2”和错误消失了。