带有ADK14的Dx坏类文件魔术(cafebabe)或版本(0033.0000)

时间:2011-10-23 14:31:17

标签: java android

自从迁移到ADK14后,我无法在Windows 7系统上构建新的apks版本。

构建失败,“转换为dalvik格式失败,错误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)

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

所有库都在相同的Android SDK和JDK / JRE版本上,所以这似乎不是问题。事实上,该应用程序很容易在调试中构建并安装在我的旧版本1.5 HTC Magic上 - 只有在我需要导出已签名的应用程序包时才会崩溃。

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

有什么想法吗?对此感到非常沮丧。

注意

显然,此错误消息可能由各种不同的问题触发。我的特殊问题与Java 6/7无关,因为我从未安装过Java 7,并且编译器合规性设置为Java 6(我当时检查过,因为我已经看到其他地方建议的解决方案)。

17 个答案:

答案 0 :(得分:37)

使用Java 6而不是7进行编译对我有用,但只有在我将Eclipse配置为“了解”我的JRE6安装路径之后。以前我只在Eclipse中设置了JRE7。我可以将我的编译器合规性级别设置为1.6或1.5,但显然没有相应的JRE,它实际上没有任何影响。我真的不明白为什么会这样--JRE与编译有什么关系,它与Android代码有什么关系?

答案 1 :(得分:27)

我终于找到了解决这个问题的方法。

如果您查看Proguard.bat(Android SDK \ tools \ proguard \ bin),您会找到以下行:

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

将其替换为以下内容:

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

这是一个愚蠢的老问题,我实际上意识到我以前见过,现在我已经弄明白了。显然Android SDK团队仍然没有解决这个问题,并且在我干净安装Android SDK时重新引入了它。

答案 2 :(得分:25)

在阅读dex工具的源代码时,问题在于类文件不在其可以理解的版本中。版本必须介于45-50(主要版本)之间。您在此处使用的版本是0033.0000(十六进制为0x33),十进制为51(版本号代表Java 7)。这不是我的推测,我直接在源代码中找到了它。

以下是推测,以及解决了我的问题:我还没弄清楚你要做什么来坚定地确认你用各种选项编译时会得到什么类文件版本,但对我来说问题是我的库用Java 7编译过。由于Android只支持Java 5或6,我只是在6中重新编译,并且繁荣,解决了。

答案 3 :(得分:13)

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

奇怪的是我有Eclipse 3.7.0并且它工作正常,而其他计算机有3.7.1并且那里构建的jar文件不起作用...

答案 4 :(得分:12)

如果您使用的是Android Studio,可以使用上述建议通过添加以下行在 build.gradle 中定位Java 1.6来解决此问题:

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

在此博文中发现了此修补程序:http://www.alonsoruibal.com/my-gradle-tips-and-tricks/

答案 5 :(得分:5)

我通过右键单击Java Project-> Build Path-> Configure Build Path解决了这个问题 转到Libraries选项卡,选择JavaSE-1.7->按Edit然后切换到JavaSE-1.6 按完成然后确定。

转到Android项目,右键单击Project-> Build Path-> Configure Build Path 转到“订购和导出”选项卡,选中java项目旁边的复选框以及您包含的其他库。 点击确定。 在您的Android项目中,删除" gen"和" bin"。 然后不久之后这两个文件夹将重新生成。(如果它没有那么确保你以管理员的身份运行你的eclipse。)

现在尝试在手机上运行android项目。 Wala有效:)

答案 6 :(得分:3)

为了任何可能遇到同样问题的人的利益:

删除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

如果您遇到同样的问题,请为其加注星标。

答案 7 :(得分:3)

我有同样的错误消息dexing没有用 " Dx坏类文件魔术(cafebabe)或版本(0033.0000)"。

我安装了JDK1.7,Eclipse Kepler,AndroidSDK-19(Android 4.4)。如果有任何更新,最后运行 android-sdk-windows / SDK Manager.exe 工具。事实证明我有19级sdk,但工具/ Android SDK构建工具部分是18.1.1。已安装 Build-tools 19.0.3 并且编译开始正常工作。

答案 8 :(得分:2)

对于搜索此错误消息的其他人,另一个可能的原因是您包含为java 7构建的库。对于我们,将这些构建调整为专门针对java 6(然后构建新的jar)修复了问题。 / p>

如果使用ant构建,可以通过将以下属性添加到javac标记来执行此操作:

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

如果直接调用javac,请使用:

javac -source 1.6 -target 1.6 ...

答案 9 :(得分:2)

  

Dx坏类文件魔术(cafebabe)或版本(0033.0000)

这是关于

的构建工具的检查
  1. 这是一个java类文件吗? (Java类文件开头有咖啡馆&#39;
  2. 是不受支持的版本。此消息表示不支持0033.0000(Java SE 1.7)
  3. 所以这条特别的信息说

      

    阅读这个类文件(它有咖啡馆和魔法师),我对JVM 1.7的版本感到困惑

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

    wikipedia : Java class file有一个表格,显示了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 |
    +------------+-----------+
    

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

    如何解决

    有两种机制可用于解决此问题。

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

      在java上编译时,您可以告诉编译器 target 一个早期的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。这是限时修复。 Oracle不断改进java,删除错误,旧的SDK没有更新。

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

答案 10 :(得分:2)

我尝试了其他几种解决方案。帮助我的是下载最新版本的ProGuard并将其复制到android-sdk / tools / proguard / bin和lib。

答案 11 :(得分:0)

我在jar期间遇到了这条错误消息 - &gt; dex转换。问题出在损坏的 jar文件中。

答案 12 :(得分:0)

使用Maven的编译器插件可以轻松解决此错误,同时只安装了JDK 1.7。查看my blog post了解如何操作。

答案 13 :(得分:0)

对我来说,这个问题存在于安装的旧版本工具版本中(构建工具是我正在使用的平台工具和sdk版本的背后)。所以我采取了哪些措施来解决错误:

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

PS:唯一的缺点是我对版本进行了硬编码,在将来的更新中我不会自动使用它。

答案 14 :(得分:0)

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

所以对我有用的解决方案非常简单。 使用Java 5或更低版本构建.jar文件。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

就我而言,问题不在于JDK,也不在于编译器合规级别 1.6 这是关于我的SDK构建工具“18.1.1”。我将构建工具更新为“21.1.2”,错误消失了。