Dx bad class file magic (cafebabe) или версия (0033.0000) с ADK14
С переходом на ADK14 я не смог создать новые apks для выпуска в моей системе Windows 7.
Ошибка построения с ошибкой "преобразование в формат dalvik с ошибкой 1", в то время как консоль заполнена множеством "Dx bad file file magic (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. Я заметил, что упаковка apk на моем Linux-ноутбуке (Lucid Lynx) для одного и того же кода абсолютно не имеет проблем.
Любые идеи? Это очень расстраивается.
Примечание
По-видимому, это сообщение об ошибке может быть вызвано множеством различных проблем. Моя проблема не была связана с Java 6/7, поскольку я никогда не устанавливал Java 7 в первую очередь, а соответствие компилятора было установлено на Java 6 (в то время я проверял, как это было показано в другом месте).
Ответы
Ответ 1
Я нашел решение этой проблемы, наконец.
Если вы посмотрите в 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
Компиляция с Java 6 вместо 7 работала для меня, но только после того, как я сконфигурировал Eclipse, чтобы "узнать о моем пути установки JRE6". Раньше у меня только был JRE7, созданный в Eclipse. Я мог бы установить уровень соответствия компилятора 1,6 или 1,5, но, по-видимому, без соответствующей JRE это не имело никакого эффекта. Я не понимаю, почему это должно быть - что JRE связано с компиляцией и что это связано с Android-кодом?
Ответ 3
При чтении источника инструмента dex проблема в том, что файл класса не входит в версию, которую он может понять. Версия должна быть между 45-50 (основная версия). Версия, которую вы используете здесь, - 0033.0000 (0x33 в шестнадцатеричном формате), которая равна 51 в десятичной системе (номер версии, представляющий Java 7). Это не спекуляция с моей стороны, я нашел это прямо в исходном коде.
Следующее - это спекуляция, и то, что решило мою проблему: я не понял, что вам нужно сделать, чтобы твердо подтвердить, какую версию файла класса вы получите при компиляции с различными параметрами, но для меня проблема в том, что моя библиотека был скомпилирован с Java 7. Так как Android поддерживает только Java 5 или 6, я просто перекомпилировался в 6, и стрела была решена.
Ответ 4
Изменение java-версии Eclipse для 6 работало для меня. В Eclipse перейдите в Windows- > Preferences- > Java- > Compiler и установите "Уровень соответствия компилятора" на 1.6.
Странно то, что у меня был Eclipse 3.7.0, и он работал нормально, в то время как другие компьютеры имели 3.7.1, а создаваемые там файлы jar не работали...
Ответ 5
Если вы используете Android Studio, это можно устранить, используя приведенную выше рекомендацию для таргетинга Java 1.6 в build.gradle, добавив следующие строки:
apply plugin: 'java'
sourceCompatibility = 1.6
targetCompatibility = 1.6
Обнаружено это исправление из этого сообщения в блоге: http://www.alonsoruibal.com/my-gradle-tips-and-tricks/
Ответ 6
Я исправил эту проблему, щелкнув правой кнопкой мыши Java Project- > Build Path- > Configure Build Path
Перейдите на вкладку "Библиотеки", выберите "JavaSE-1.7- > нажмите" Изменить ", затем выберите" JavaSE-1.6 ".
Нажмите "Готово", затем "ОК".
Перейдите в Android-проект, щелкните правой кнопкой мыши Project- > Build Path- > Configure Build Path
Перейдите на вкладку "Заказ и экспорт", установите флажок рядом с проектом java и другими включенными вами библиотеками.
Нажмите ОК.
В вашем проекте Android удалите "gen" и "bin".
затем вскоре после того, как эти две папки будут восстановлены. (Если это не так, убедитесь, что вы запустили ваше затмение как администратор.)
попробуйте запустить Android-проект на своем телефоне. Wala работает:)
Ответ 7
Я решил эту проблему в Eclipse, перейдя в Windows --> Preferences Java --> Compiler
в правом окне, выберите Compiler compliance level
- 1.6
, нажмите Apply
и Ok
.
И Clean Build
все проекты, которые должны решить проблему
Ответ 8
В интересах любого, у кого может быть такая же проблема:
Удаление 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
Если вы столкнулись с одной и той же проблемой, пожалуйста, запустите ее.
Ответ 9
У меня было такое же сообщение об ошибке, что dexing не работал
"Dx bad file file magic (cafebabe) или версия (0033.0000)".
У меня был JDK1.7, Eclipse Kepler, AndroidSDK-19 (Android 4.4). Наконец, запустите файл android-sdk-windows/SDK Manager.exe, если есть какие-либо обновления. Оказывается, у меня был уровень 19 sdk, но Tools/Android SDK Build-tools составлял 18.1.1. Установленные сборщики 19.0.3 и компиляция начали нормально работать.
Ответ 10
Я попробовал все, начиная с нескольких других решений. то, что помогло мне, было загрузить самую последнюю версию ProGuard и скопировать ее с помощью android-sdk/tools/proguard/bin и lib.
Ответ 11
Для других, которые ищут это сообщение об ошибке, другая возможная причина заключается в том, что вы включаете библиотеки, которые были созданы для java 7. Для нас исправление этих сборок специально предназначалось для java 6 (а затем для создания новых баннеров), устранило проблему.
Если вы создаете с помощью ant, вы можете сделать это, добавив в свой javac-тег следующие атрибуты:
<javac
...
source="1.6" target="1.6"
...
>
Если вы вызываете javac напрямую, используйте:
javac -source 1.6 -target 1.6 ...
Ответ 12
Dx плохой класс файла магия (cafebabe) или версия (0033.0000)
Это проверка из инструментов сборки
- Является ли это файлом класса java. (Файлы классов Java имеют "cafebabe" в начале)
- Это неподдерживаемая версия. В этом сообщении говорится, что 0033.0000 (Java SE 1.7) не поддерживается
В этом конкретном сообщении говорится:
Чтение этого файла класса (у него есть "cafebabe" магия), я запутался в версии JVM 1.7
Инструменты Java и инструменты построения поддерживаются Oracle, а инструменты dex/dalvik/Android Runtime (ART) поддерживаются google/android. Поэтому, когда оракул генерирует новую java, существует период времени, когда java, сгенерированный последним sdk, несовместим с java, поддерживаемым инструментами построения.
wikipedia: файл класса 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) инструментальная цепочка поддерживает 1,6 и 1,7, но не 1,8.
Как разрешить
Существует два механизма, которые могут быть использованы для решения этой проблемы.
- Измените совместимость
- Измените SDK
Измените совместимость
При компиляции на java вы можете сообщить компилятору о таргетинге на более ранний SDK. С Android-студией на данный момент (2.0), это делается путем изменения.
File/Project Structure
Нажмите на каждый модуль и установите Source Compatibility
в требуемую версию java.
В raw 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
sdk для более ранних java-сборок может быть загружен, и вы можете загрузить и установить предыдущий SDK. Это ограниченное время. Oracle постоянно совершенствует Java, удаляет ошибки, а старые SDK не обновляются.
SDK обновляется путем изменения SDK
с левой стороны project structure
Ответ 13
Вы можете легко обойти эту ошибку с помощью плагина Maven компилятора, имея только JDK 1.7. Отметьте мой пост в блоге о том, как это сделать.
Ответ 14
Я столкнулся с этим сообщением об ошибке во время преобразования jar → dex. Проблема была в поврежденном файле jar.
Ответ 15
Для меня эта проблема возникла при установке слишком старой версии инструментов сборки (инструменты сборки были за инструментами платформы и версиями sdk, которые я использовал). Так что я сделал, чтобы исправить ошибку:
- Я загрузил последнюю версию инструментов сборки из Android SDK manager
- Я использую ADT. Тем не менее, последняя версия инструментов сборки не использовалась и эта ошибка сохранялась. Поэтому я добавил строку
sdk.buildtools=22.0.1
в файлы project.properties
во всех моих проектах и библиотеках. Теперь ошибка исчезла.
PS: Единственным недостатком является то, что я жестко запрограммировал версию и будущие обновления, я не буду автоматически ее использовать.
Ответ 16
Эта ошибка возникает, если вы используете файл .jar
, который не использует какие-либо функции Java 6 или выше, но был построен с использованием Java 6 или выше, в соответствии с informIT.com. По-видимому, Google не включает JDK 7 в системные требования Android.
Итак, решение, которое сработало для меня, очень просто.
Создайте файл .jar
, используя Java 5 или меньше.
Ответ 17
У меня была такая же проблема при использовании build-tools 18.0.1, но все отлично работает, когда я перехожу к использованию 19.0.1. Возможно, лучше оставить комментарий после ответа "Кто", но репутация низкая.
Ответ 18
В моем случае проблема не в JDK, а в уровне соответствия компилятора 1.6
Речь шла о моих инструментах SDK, которые были "18.1.1" . Я обновляю встроенные инструменты до "21.1.2" , и ошибки исчезли.