Android java.ленг.Исключение verifyerror?


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

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

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

30 96

30 ответов:

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

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

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

вывод из "adb logcat" указывает на класс, который не может быть найдено так же как и класс, который имеет плохую ссылку. Расположение идентифицируется вплоть до конкретной инструкции Dalvik. Фокус в том, что чтобы посмотреть в журналах выше исключения.

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

  1. создать каталог в вашем проекте (e. x. "libs") и поставить библиотеку банку там.
  2. добавить каталог в класс сборки путь (правой кнопкой на папка и выберите "путь сборки" - > " использовать как исходная папка").
  3. перестроить проект.

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

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

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>

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

<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 происходит.

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

Это также может произойти из-за ссылки на ошибку предела на леденец ниже версии, где он ограничен до максимального размера 65K

возможное решение по указанному вопросу

Шаг 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-часть ваших приложений строить.gradle

 dexOptions {
      preDexLibraries = false
   }

Шаг 5: Наконец, перейдем к общей части сборки ваших приложений.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

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

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

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

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

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

Правой Кнопкой Мыши на Android project - > путь сборки - > настроить путь сборки

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

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

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

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

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

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

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

Я тоже получаю VerfiyError... не могу найти настоящую причину. Это помогает обернуть новые строки кода в метод (Eclipse, ' Extract Method...'). Поэтому в моем случае причина не является неподдерживаемым методом.

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

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

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

testCoverageEnabled = true

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

У меня была такая же проблема после того, как я сделал git pull.

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

надеюсь, что это помогает.

Я нашел еще один случай.

условия:

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

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

java.lang.VerifyError означает, что ваш скомпилированный байт-код ссылается на то, что Android не может найти во время выполнения. Это verifyError выдает меня только с kitkat4. 4 и меньшая версия не в выше версии из этого даже я запустил одну и ту же сборку в обоих устройствах. когда я использовал jackson JSON parser старой версии он показывает 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.+'

тогда я изменил зависимость на последняя версия 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'

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

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

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

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

Удачи

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

устранение: Изменил его, чтобы исправить версию эмулятора.

этой работала ДЛЯ МЕНЯ.. спасибо.

для потомков, я просто получил эту ошибку, потому что я использовал 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.initialValue(BaseDaoImpl.java:71)
  at com.j256.ormlite.dao.BaseDaoImpl.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();
    }
};

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

Я уверен, что моя причина отличалась от вашей, но так как это один из лучших хитов при поиске "Android java.ленг.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) исправили проблему.

в моем случае, эта ошибка возникает, потому что мой google-play-сервис не самый новый.

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

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

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

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

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

compileSdkVersion 21
buildToolsVersion '19.1.0'

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

compileSdkVersion 21
buildToolsVersion '21.1.2'

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

compileSdkVersion 21

java.ленг.исключение verifyerror произошло. Поэтому я изменил compileSdkVersion на 19

compileSdkVersion 19

Он работал хорошо. Я думаю, что это может быть проблема SDK buildTools, и это кажется ОК, когда уровень API