Как исправить ошибку Dalvik format failed в Eclipse
Узнайте, как решить ошибку 'Conversion to Dalvik format failed with error 1' при добавлении внешних JAR в Eclipse. Конфликты XmlPullParser и дублирующих классов.
Как исправить ошибку «Conversion to Dalvik format failed with error 1» при добавлении внешнего JAR в Eclipse?
Я столкнулся с следующей ошибкой в своём Android‑приложении в Eclipse:
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lorg/xmlpull/v1/XmlPullParser;
....
Conversion to Dalvik format failed with error 1
Эта ошибка появляется только тогда, когда я добавляю конкретный внешний JAR‑файл в проект. Я тщательно искал решения, но ни одно из них не помогло. Я также пробовал менять версию Android с 1.5 на 1.6, но ошибка остаётся.
Что вызывает эту ошибку и как её можно устранить при работе с внешними JAR‑файлами в Android‑проекте?
Понимание ошибки
Ошибка «Conversion to Dalvik format failed with error 1» является одной из самых раздражающих ошибок компиляции в Android‑разработке, особенно при работе с Eclipse. Конкретное сообщение об ошибке, которое вы видите:
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lorg/xmlpull/v1/XmlPullParser;
....
Conversion to Dalvik format failed with error 1
указывает, что инструмент сборки Android (в частности, dx) сталкивается с дублирующимися определениями классов во время преобразования Java‑байткода в Dalvik‑байткод. Как объясняет Repeato, «это означает, что конвертер Dalvik обнаружил дублирующиеся определения классов, обычно из-за конфликтующих JAR‑файлов или конфликтов имён пакетов».
Класс XmlPullParser особенно проблематичен, потому что:
- Он входит в стандартные библиотеки Android‑framework
- Многие сторонние библиотеки (например, KSOAP2, XML‑парсеры и т.д.) включают собственные версии этого класса
- Android‑framework уже предоставляет эту функциональность, поэтому внешние копии избыточны
Общие причины конфликтов XmlPullParser
Множественные зависимости библиотек
Самая частая причина — наличие нескольких JAR‑файлов, содержащих один и тот же класс XmlPullParser. Как отмечает Stack Overflow, «ваш toolchain вызывает dx с несколькими копиями Jackson JSON‑парсера. Убедитесь, что в ваших библиотечных зависимостях нет двух копий Jackson».
Конфликты с фреймворком
Некоторые разработчики случайно включают классы Android‑framework в свои внешние JAR‑файлы. Как отмечает один ответ на Stack Overflow, «я ошибочно добавил ссылку на копию android.jar, которая не нужна, так как это зависимость Android, после удаления ошибка исчезла».
Конфликты версий библиотек
Разные версии одной и той же библиотеки могут содержать класс XmlPullParser, что приводит к конфликтам. Например, у вас могут быть одновременно kxml2-2.3.0.jar и xmlpull-1.1.3.4d_b4_min.jar, оба содержащих одинаковые классы.
Проблемы с путём сборки
Неправильные настройки пути сборки, особенно с экспортом и порядком библиотек, могут привести к тому, что система сборки обрабатывает одни и те же классы несколько раз.
Пошаговые решения
Решение 1: Очистка и удаление файлов из каталога bin
Самое простое решение — очистить проект и удалить кэшированные JAR‑файлы:
- Щёлкните правой кнопкой мыши по проекту в Eclipse
- Выберите Clean… и очистите все проекты
- Перейдите в каталог
binвашего проекта - Удалите любые JAR‑файлы, которые там не должны быть
- Обновите проект в Eclipse
Как сообщается на Stack Overflow, «я нашёл, что дублирование происходило в каталоге bin. После удаления JAR‑файла из bin и обновления проекта ошибка исчезла!»
Решение 2: Проверка дублирующихся ссылок на библиотеки
Проверьте путь сборки проекта, чтобы выявить дублирующиеся библиотеки:
- Щёлкните правой кнопкой мыши по проекту → Properties → Java Build Path
- Перейдите на вкладку Libraries
- Разверните каждый JAR‑элемент, чтобы увидеть полные пути
- Ищите несколько записей, содержащих одну и ту же библиотеку
- Удалите любые дублирующие записи
Решение 3: Исключение конкретных классов из пути сборки
Если вам нужно оставить JAR, но исключить конфликтующие классы:
- Щёлкните правой кнопкой мыши по проблемному JAR в пути сборки
- Выберите Properties
- Перейдите на вкладку Order and Export
- Снимите галочку с JAR, чтобы он не экспортировался
- В качестве альтернативы можно использовать правила ProGuard (см. расширенные решения ниже)
Решение 4: Обновление зависимостей библиотек
Убедитесь, что вы используете совместимые версии библиотек:
- Проверьте документацию внешнего JAR
- Ищите известные проблемы совместимости с вашим уровнем API Android
- Обновите библиотеки до версий, которые не включают классы фреймворка
- При возможности используйте библиотеки AndroidX
Расширенные методы устранения неполадок
Использование ProGuard для исключения дублирующихся классов
Для более сложных сценариев можно настроить ProGuard, чтобы исключить проблемные классы. Как отмечает Stack Overflow, вы можете добавить следующие правила в конфигурацию ProGuard:
-libraryjars ${android.libraryjars}(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class,!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt)
Это указывает системе сборки исключить эти конкретные классы из библиотек Android‑framework при обработке ваших внешних JAR‑ов.
Ручная проверка JAR‑ов
Вы можете вручную проверить JAR‑файлы, чтобы выявить конфликты:
# Проверяем, содержит ли JAR XmlPullParser
jar tf your-library.jar | grep XmlPullParser
Если вы обнаружите дублирующиеся классы в нескольких JAR‑ах, вам нужно решить, какую библиотеку оставить, исходя из требований вашего проекта.
Использование инструмента jar для анализа
Командная строка jar поможет выявить конфликтующие классы:
# Список содержимого нескольких JAR‑ов и поиск дубликатов
jar tf library1.jar | grep XmlPullParser
jar tf library2.jar | grep XmlPullParser
Стратегии предотвращения
Внимательный выбор библиотек
При добавлении внешних библиотек в ваш Android‑проект:
- Исследуйте библиотеки перед добавлением
- Проверьте, включают ли они классы фреймворка
- Предпочитайте библиотеки, специально разработанные для Android
- Ищите библиотеки, которые используют встроенный XML‑парсер Android, а не собственный
Регулярное обслуживание проекта
- Периодически проверяйте зависимости проекта
- Удаляйте неиспользуемые JAR‑файлы
- Обновляйте библиотеки до последних версий
- Следите за новыми проблемами совместимости
Корректная настройка пути сборки
- Настройте путь сборки правильно с самого начала
- Используйте последовательный порядок библиотек
- Правильно конфигурируйте экспорт
- Документируйте решения по зависимостям
Миграция на современные инструменты
Хотя Eclipse был основным IDE для Android‑разработки в ранние годы, Google с тех пор перешёл на Android Studio и сборки на базе Gradle. Если вы всё ещё сталкиваетесь с этими проблемами в Eclipse, рассмотрите возможность миграции на современные инструменты:
Преимущества современных систем сборки
- Лучшее управление зависимостями
- Автоматическое разрешение дублирующихся классов
- Улучшенная производительность сборки
- Доступ к последним возможностям Android
Конфигурация сборки Gradle
В современных Android‑проектах, использующих Gradle, проблемы с дублирующимися классами часто решаются автоматически, но когда они всё же возникают, их легче отладить:
// В файле app/build.gradle
android {
// ...
configurations {
all*.exclude group: 'xmlpull', module: 'xmlpull'
}
}
Заключение
Ошибка «Conversion to Dalvik format failed with error 1» с конфликтами XmlPullParser является распространённой, но решаемой проблемой в Android‑разработке. Понимая, что это фундаментальная проблема дублирования классов, вы можете систематически выявлять и устранять конфликты через надёжное управление зависимостями.
Ключевые выводы:
- Всегда очищайте проект и удаляйте кэшированные JAR‑файлы из каталога
bin. - Тщательно проверяйте путь сборки на наличие дублирующих ссылок на библиотеки.
- Используйте правила ProGuard или исключайте конкретные классы при необходимости.
- Рассмотрите миграцию из Eclipse в современные инструменты Android Studio и Gradle.
- Практикуйте внимательный выбор библиотек и регулярное обслуживание проекта.
Если проблемы продолжают возникать, обратитесь к сообществу разработчиков Android на платформах вроде Stack Overflow – эти ошибки часто требуют детального анализа конкретной конфигурации и зависимостей вашего проекта.
Источники
- Stack Overflow - “Conversion to Dalvik format failed with error 1” on external JAR
- Repeato - “Conversion to Dalvik Format Failed with Error 1” on External JAR in Eclipse
- Answers Point - “Conversion to Dalvik format failed with error 1” on external JAR
- Stack Overflow - Eclipse: Conversion to Dalvik format failed with error 1
- Stack Overflow - Android Conversion to Dalvik format failed with error 1
- Stack Overflow - Conversion to Dalvik format failed with error 1
- Stack Overflow - Problem with Proguard and XmlPullParser
- Android Developers - XmlPullParser API Reference
- Stack Overflow - Duplicate class org.xmlpull.v1.XmlPullParser Android
- CopyProgramming - Android error caused by redundant class org.xmlpull.v1.XmlPullParser