Android java.lang.VerifyError? - PullRequest
       25

Android java.lang.VerifyError?

97 голосов
/ 21 марта 2009

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

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

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

Ответы [ 30 ]

117 голосов
/ 04 февраля 2010

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

56 голосов
/ 23 августа 2010

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

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

35 голосов
/ 21 марта 2009

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

14 голосов
/ 29 ноября 2010

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

  1. Создайте каталог в вашем проекте (например, "libs") и положить библиотеку банку там.
  2. Добавить каталог в класс сборки путь (нажмите правую кнопку на папку и выберите «Путь сборки» -> «Использовать в качестве исходной папки ").
  3. Перестройте свой проект.
8 голосов
/ 19 сентября 2013

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

<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.

8 голосов
/ 11 мая 2010

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

Устройство Android 1.5 установило apk, используя это:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
7 голосов
/ 23 марта 2015

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

7 голосов
/ 30 июля 2015

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

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

Step1: 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

3 голосов
/ 14 марта 2013

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

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

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

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

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

3 голосов
/ 15 декабря 2015

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

...