Android java.lang.VerifyError?

100

В моем приложении для Android я всегда получаю VerifyErrors! И я не могу понять почему. Всякий раз, когда я включаю внешний JAR, я всегда получаю VerifyErrors, когда пытаюсь запустить свое приложение (за исключением одного раза, когда я включил Apache Log4j).

Обычно я обхожу это, беря исходный код библиотеки и добавляя его в свой проект, но я пытаюсь поставить клиентскую библиотеку GData .

Я могу получить это в исходном коде, но это зависимости (mail.jar, activate.jar, servlet-api.jar) я не могу, поэтому я получаю ошибки проверки. Я хотел бы раз и навсегда разобраться в корне этой проблемы. Я посмотрел в Интернете, но все они, кажется, говорят о неполных файлах классов? чего я не знаю.

Исаак Уоллер
источник
Известно, что GData не работает в Android. Ищите тему в группе android-разработчиков Google. Нам нужно дождаться официального выпуска GData для Android в следующем выпуске SDK.
mparaz
1
Вы используете Gradle для создания своего проекта? У меня возникла эта проблема, когда я забыл запустить задачу очистки перед задачей
AssemblyRelease

Ответы:

35

Android использует другой формат файла класса. Вы запускаете сторонние JAR-файлы с помощью инструмента «dx», который поставляется с Android SDK?

Тофу пиво
источник
4
Было бы неплохо получить дополнительную информацию об инструменте "dx".
Дэниел Магнуссон,
2
Загляните в раздел «Библиотека» в настройках проекта Android под списком версий SDK. Отображаются ли ваши внешние проекты, на которые вы полагаетесь в своей сборке, с зеленой галочкой рядом с ними?
Адам
@Adam СПАСИБО за этот комментарий! Вы только что решили проблему, на решение которой я потратил слишком много времени.
Саймон Форсберг
118

Посмотрите на LogCat и посмотрите, что вызывает verifyerror. Вероятно, это какой-то метод в классе java.lang, который не поддерживается на уровне Android SDK, который вы используете (например, String.isEmpty ()).

Alex
источник
4
Это должно быть отмечено как настоящий ответ. По крайней мере, именно так и было в моем случае, поскольку я получал спорадические ошибки от моих пользователей и отследил их до вызова View.getTag (int), который не поддерживается в
версии
1
Согласовано. Я сталкивался с этим несколько раз, и каждый раз я ориентируюсь на 2.x и использую то, чего нет в 1.5. Что вас сбивает с толку, так это то, что он выбрасывается, когда класс создается / используется только в первый раз, поэтому, если что-то происходит спорадически, вы можете не замечать этого какое-то время.
mbafford
1
Если это так, вам следует проверить эти ссылки: developer.android.com/resources/articles/… и doandroids.com/blogs/2010/5/8/backwards-compatibility
MyName
«Это должно быть отмечено как настоящий ответ». Я обратился к этой теме, потому что у меня такая же проблема. Я предполагаю, что причина, по которой это не было помечено как настоящий ответ, заключается в том, что LogCat дает ссылку на строку, где я создаю экземпляр библиотеки, но не на строку, в которой возникла проблема. Другими словами, в этом случае LogCat практически бесполезен.
NotACleverMan 07
logcat на уровне WARN должен показать вам подробную информацию о том, почему он не прошел проверку
mmeyer
56

От android-разработчиков :

В выводе "adb logcat" указывается класс, который не удалось найти, а также класс, имеющий неверную ссылку. Местоположение указывается до конкретной инструкции Dalvik. Уловка заключается в том, чтобы посмотреть журналы над исключением.

АБР
источник
6
Выше исключение тоже помогло мне определить метод, вызвавший ошибку. Для меня это было выражение Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR, что, в конце концов, довольно очевидно, если вы попробуете это на Cupcake ...
Мануэль
2
Спасибо! Это была проблема, с которой я столкнулся ... полезные журналы были чуть выше исключения: WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;(теперь, чтобы выяснить, как обойтись без DatatypeFactory)
pyko
Мне тоже помогла ошибка. Найдите сообщение, которое начинается с «VFY:» В моем случае было сказано «произвольно отклоняющий большой метод». Наверное потому, что он создает огромное количество массивов :) в любом случае спасибо за подсказку!
Amplify91 08
Спасибо! Я обнаружил, что моя проблема связана с обработчиком исключений: исключение NetworkOnMainThreadException не реализовано в Android 2.3. Посмотрите мой ответ. Еще раз спасибо! :)
Seraphim's
Спасибо! В моем случае я нацелился на Android2.3, использовал android-support-v4.jar, и он не находил классы в этой банке. Пришлось щелкнуть вкладку «экспорт» для этого класса в свойствах и вывести его над библиотекой android2.3.3. Что ж, этот экспорт - действительно то, чего я не совсем понимаю ...
xtof54
14

Чтобы он работал, вам нужно добавить jar библиотеки в одну из исходных папок (даже если вы уже добавили ее как библиотеку eclipse, вам все равно нужно добавить ее как источник).

  1. Создайте каталог в своем проекте (ex "libs") и поместите туда jar библиотеки.
  2. Добавьте каталог в путь класса сборки (щелкните правой кнопкой мыши папку и выберите «Путь сборки» -> «Использовать как исходную папку»).
  3. Восстановите свой проект.
Максим Голивкин
источник
Можем ли мы добавить «Библиотеку проекта» вместо JAR в папку «libs»?
Ахмед
Странно ... Мне пришлось добавить ее как обычную библиотеку Java, а не как библиотеку в меню «Android» в Eclipse.
Фил
Спасибо Максим, хорошее решение.
Арун Бадоле
8

Это случилось со мной прямо сейчас. Ошибка была вызвана тем, что я использовал методы из более нового SDK, который был у моего устройства.

Устройство Android 1.5 установило apk с помощью этого:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
Макарс
источник
8

Нашел интересный случай. Я использую:

<uses-sdk
   android:minSdkVersion="9"
   android:targetSdkVersion="18" />

Таким образом, некоторые из новых возможностей Android 4 не реализованы в Android 2.3, например ImageView.setLayerType. Чтобы избежать ошибки времени выполнения, просто:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Этот подход следует использовать и при обработке исключений:

} catch (NetworkOnMainThreadException nomte) {
   // log this exception
} catch (SocketTimeoutException socketTimeoutException) {
   // log this exception
}

NetworkOnMainThreadExceptionне реализован в Android 2.3, поэтому при загрузке класса (и не раньше!) java.lang.VerifyErrorвозникает исключение .

Серафимов
источник
1
То же произошло и со мной. Я использовал то, java.lang.ReflectiveOperationExceptionчто не входит в состав более старых версий Android (например, 4.2), но Линт не предупреждал меня об этом ...
WonderCsabo
Для меня проблема заключается в том, что мой код объявляет a CameraAccessException, который представлен в Android 5.0, но когда я запускаю устройство Android 4.3, выдается VerifyError.
Piasy 03 авг.16,
7

Если вы используете Retrolambda, возможно, вы добавили статический метод к интерфейсу (что разрешено только в Java 8).

Тахион
источник
7

Это также может произойти из-за ошибки ограничения ссылки на Lollypop ниже версий, где он ограничен максимальным размером 65 КБ.

Возможное решение вышеуказанной проблемы

Шаг 1: Add android-support-multidex.jar to your project. The jar can be found in your Android SDK folder /sdk/extras/android/support/multidex/library/libs

Шаг 2. Расширьте свое приложение с помощью MultiDexApplication, например,

public class MyApplication extends MultiDexApplication

Шаг 3: переопределить attachBaseContext

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

Шаг 4: Следующим шагом является добавление следующего в часть вашего приложения для Android build.gradle.

 dexOptions {
      preDexLibraries = false
   }

Шаг 5: Наконец, следуя общей части ваших приложений build.gradle

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

Для подробностей, пожалуйста, оформляйте заказ

https://developer.android.com/tools/building/multidex.html

Паван Махешвари
источник
Сработало у меня !! не забудьте изменить класс приложения на «MultiDexApplication».
Ганеш
Ты спас меня, мужик. Это должен быть принятый ответ.
Рохит Рокде
3

В моем случае это произошло, когда я обновился с Eclipse Indigo до Eclipse Juno: я не уверен, в чем истинная причина, но мой проект Android, над которым я работаю долгое время, перестал работать из-за этого исключения.

После многих часов попыток исправить это я нашел решение для себя.

В моем проекте Android я использую другой проект (скажем, «MyUtils»), который находится в той же рабочей области. Итак, мне нужно было сделать следующее:

Щелкните правой кнопкой мыши проект Android -> Путь сборки -> Настроить путь сборки

Теперь перейдите на вкладку «Заказ и экспорт» и установите флажок «MyUtils». Вот и все: я избавился от этого досадного исключения.

Дмитрий Франк
источник
Вот что исправило это для меня ... у нас большой проект, поэтому я пошел и просто проверил флаг "экспорт" на всем. Выпуск PITA.
Someone Somewhere
3

Я понизил версию Gradle с 2.0.0-alpha2 до 1.5.0, которая решила эту проблему.

Сунь Чжэнчан
источник
2

Проблема также может быть вызвана несоответствием между двумя проектами Android. Например, если вы разработали библиотеку Android с использованием пакета com.yourcompany, тогда у вас есть проект основного приложения, использующий тот же пакет, что и базовый пакет. Затем предположим, что вы хотите изменить версию своего основного приложения, поэтому вы измените значения файла манифеста: код версии и имя версии. Если вы запустите приложение, не изменяя эти значения для библиотеки, вы получите ошибку проверки при любом вызове метода для объекта из библиотеки.

ZeroOne
источник
2

Я была такая же проблема. Я собирал 2.1 r1 и обновлялся до 2.1 r3 с новым adt 17. У меня были ошибки проверки в mail.jar javamail, и это сводило меня с ума. Вот как я решил проблему:

  1. создал папку libs / и добавил банки.
  2. щелкните правой кнопкой мыши> добавить в качестве исходной папки

Я попытался перестроить, и это не удалось. Я удалил каталог libs / как исходную папку и удалил ссылки на 3 файла jar в пути сборки. Затем я снова добавил папку libs / и добавил каждую банку в папке libs / в путь сборки. Теперь все работает как положено. Это странный обходной путь, но у меня он сработал.

Большие пальцы руки DP
источник
2

В Eclipse 4.x, если вы столкнулись с этой проблемой, попробуйте ниже:

  1. перенести все включенные сторонние jar-файлы в User-Libaray
  2. переместите пользовательскую библиотеку перед библиотекой Android и проверьте ее на вкладке «Порядок и экспорт».
  3. очистить и перестроить, чтобы запустить
user1691964
источник
2

У меня возникла эта проблема после обновления SDK. У компилятора были проблемы с моими внешними библиотеками. Я сделал это: щелкните правой кнопкой мыши проект, затем "Инструменты Android> добавить библиотеку поддержки ...", эту установку в моей библиотеке проектов "android-support-v4.jar".

Андреу
источник
2

java.lang.VerifyErrorозначает, что ваш скомпилированный байт-код относится к чему-то, что Android не может найти во время выполнения. Эта verifyError вызывает у меня только проблемы с kitkat4.4 и меньшей версией, которых нет в вышеуказанной версии , даже если я запускал одну и ту же сборку на обоих устройствах. когда я использовал парсер jackson json более старой версии, он показываетjava.lang.VerifyError

compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'

Затем я изменил Dependancy на последнюю версию 2.2 на 2.7 без основной библиотеки (когда я включаю core2.7, он дает verifyError), тогда он работает. это означает, что методы и другое содержимое ядра перенесено в последнюю версию Databind2.7 . Это исправит мои проблемы.

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
Ананд Криш
источник
1

Я тоже получаю VerfiyError ... не могу найти настоящую причину. Это помогает обернуть новые строки кода в метод (Eclipse, «Извлечь метод ...»). Так что в моем случае причина не в неподдерживаемом методе.

asdf wer
источник
1

У меня была очень похожая проблема. Я добавил jar-файлы Apache POI, и проблема возникла при обновлении до Android SDK 22.3.

Я проверил частные библиотеки Android, поэтому это не было распространенной проблемой с Android SDK. Я снял отметку со всех jar-файлов Apache POI и добавил один за другим. Я обнаружил, что poi-3.9-20121203.jar должен быть перед poi-ooxml-3.9-20121203.jar . Иначе не получится.

Гжегож Белански
источник
1

Если у вас есть тесты, попробуйте закомментировать эту строку из своего build.gradeфайла:

testCoverageEnabled = true

Для меня это вызвало исключения VerifyError для классов, которые используют функции Java 1.7, в частности, операторы переключения строк.

алуксийский
источник
1

У меня была такая же проблема после выполнения git pull.

Решение: Сборка -> Чистый проект.

Надеюсь это поможет.

Vingtoft
источник
1
Не потянул и не сделал ничего толком, но чистка сделала это, спасибо!
Alexandre G
1

Нашел другой случай.

Условия:

  • Используйте Retrolambda (не уверен, нужно ли);
  • Сделайте статический метод в интерфейсе.

И результат - бум! java.lang.VerifyError при попытке доступа к классу, который использует этот интерфейс. Похоже, Android (4.4. * В моем случае) не любит статические методы в интерфейсах. Удаление статического метода из интерфейса устраняет VerifyError.

Отображаемое имя
источник
0

У меня тоже была эта проблема, как и у моих банок в пользовательской библиотеке ...

Я решил эту проблему, добавив их в папку lib, а затем добавив в свойствах сборки в eclipse ...

В первый раз, когда я это сделал, это не сработало, но затем я удалил их и снова прочитал, и он начал работать ...

немного странный! но теперь все время работает.

Удачи

Бенджамин Ламбе
источник
0

Я закодировал методы / класс Android API, которые находятся в SDK 2.1, и пытался запустить его на эмуляторе Android 1.6. Итак, я получил эту ошибку.

РЕШЕНИЕ: Поменял на правильную версию эмулятора.

ЭТО РАБОТАЛО ДЛЯ МЕНЯ .. Спасибо.

Пиюш Патель
источник
0

Для потомков я получил эту ошибку, потому что я использовал Arrays.copyOf()метод, который не поддерживается Java 1.5, который соответствует уровню Android 4. Поскольку я работал, включая библиотеки, разработанные под 1.6, они компилировались нормально. Я увидел проблемы только тогда, когда переместил рассматриваемый класс в свой проект Android - тогда ошибка была выделена.

Uncaught handler: thread main exiting due to uncaught exception
java.lang.VerifyError: com.j256.ormlite.dao.BaseDaoImpl$DaoConfigArray
  at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:71)
  at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:1)
  at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:429)
  at java.lang.ThreadLocal.get(ThreadLocal.java:66)

В этой строке я пытался сделать, new DaoConfigArrayи у этого класса была следующая строка:

// copyOf is only supported in Java >= 1.6
doArray = Arrays.copyOf(daoArray, newLength);

Что еще более усложнило, так это то, что строка 71 указывала на ThreadLocalинициализацию, которая, как я думал, была причиной проблемы изначально.

private static final ThreadLocal<DaoConfigArray> daoConfigLevelLocal
    = new ThreadLocal<DaoConfigArray>() {
    @Override
    protected DaoConfigArray initialValue() {
        return new DaoConfigArray();
    }
};
Серый
источник
0

Мне пришлось удалить зависимые проекты и вместо этого скомпилировать зависимые проекты jar и включить их в папку libs.

Сиддхартх
источник
0

Я уверен, что моя причина отличалась от вашей, но, поскольку это один из самых популярных запросов при поиске «Android java.lang.VerifyError», я подумал, что запишу его здесь для потомков.

У меня было несколько занятий по следующим направлениям:

public class A { ... }
public class B extends A { ... }
public class C extends A { ... }

И способ, который сделал:

A[] result = null;
if (something)
    result = new B[cursor.getCount()];
else
    result = new C[cursor.getCount()];

// Fill result
...

Пока этот код присутствовал в файле, я получал VerifyError при первой загрузке класса, содержащего этот метод. Разделение его на два отдельных метода (один, который имел дело только с B, и другой, который имел дело только с C) устранил проблему.

Benkc
источник
1
И, кстати, способ, которым я вызвал это, закомментировал тела методов (заменяя их на return null / 0 / false) до тех пор, пока VerifyError не исчезнет, ​​а затем восстанавливал данные, пока они не вернулись; затем сделайте то же самое в рамках проблемного метода. Конечно, это не очень увлекательный способ отладки, но он работал.
benkc
0

В моем случае эта ошибка возникает из-за того, что моя служба Google Play не самая новая. .

Если ваш проект не поддерживает какой-либо класс в .jar, возникает эта ошибка (например, ImageView.setLayerType, AdvertisingIdClient и т. Д.).

Аллен
источник
0

Я только что определил другую ситуацию, которая возникает не только из-за того, что библиотеки не dx 'ed. У меня есть AsyncTask с очень длинным методом doInBackground. По какой-то причине этот метод с более чем 145 строками начал ломаться. Это произошло в приложении 2.3. Когда я просто инкапсулировал некоторые части в методы, все работало нормально.

Поэтому для тех, кто не смог найти класс, который был неправильно dx 'ed, попробуйте уменьшить длину вашего метода.

Рафаэль Коутиньо
источник
0

Для меня проблема на самом деле заключалась в том, что я использовал предложение multi-catch где-то в классе, которое является функцией Java 7 (и API 19+). Так что он вылетал VerifyErrorна всех устройствах до 19.

Джин
источник
0

Для меня это было корреляцией между compileSdkVersion и buildToolsVersion. Я имел:

compileSdkVersion 21
buildToolsVersion '19.1.0'

Я изменил его на:

compileSdkVersion 21
buildToolsVersion '21.1.2'
жинго
источник
0

Для меня это проблема compileSdkVersion. Когда я использовал уровень API 21 в конкретном приложении для Android ( https://github.com/android10/Android-AOPExample ):

compileSdkVersion 21

произошла ошибка java.lang.verifyerror. Поэтому я изменил compileSdkVersion на 19

compileSdkVersion 19

Это сработало. Я думаю, что это может быть проблема SDK buildTools, и это нормально, когда уровень API <21.

лилин
источник