Android java.ленг.Исключение verifyerror?
в моем приложении для Android я всегда получаю VerifyErrors! И я не могу понять почему. Всякий раз, когда я включаю внешнюю банку, я всегда получаю VerifyErrors, когда я пытаюсь запустить свое приложение (за исключением одного раза, когда я включил Apache Log4j.)
обычно я обхожу это, беря источник библиотеки и добавляя его в свой проект, но я пытаюсь поставить клиентская библиотека GData.
Я могу получить это в источнике, но это зависимости (почта.баночка, активация.сосуд, сервлет-АПИ.jar) я не могу, поэтому я получаю проверить ошибки. Я хотел бы добраться до корня этой проблемы раз и навсегда. Я посмотрел в интернете, но все они, кажется, говорят о неполных файлах класса? чего я не знаю.
30 ответов:
Android использует другой формат файла класса. Вы запускаете сторонние файлы JAR через инструмент "dx", который поставляется с Android SDK?
посмотрите на LogCat и посмотрите, что вызывает verifyerror. Это, вероятно, какой-то метод в java.класс lang, который не поддерживается на уровне Android SDK, который вы используете (например, String.isEmpty ()).
вывод из "adb logcat" указывает на класс, который не может быть найдено так же как и класс, который имеет плохую ссылку. Расположение идентифицируется вплоть до конкретной инструкции Dalvik. Фокус в том, что чтобы посмотреть в журналах выше исключения.
чтобы заставить его работать, вам нужно добавить jar библиотеки в одну из исходных папок (даже если вы уже добавили его в качестве библиотеки eclipse, вам все равно нужно добавить его в качестве источника).
- создать каталог в вашем проекте (e. x. "libs") и поставить библиотеку банку там.
- добавить каталог в класс сборки путь (правой кнопкой на папка и выберите "путь сборки" - > " использовать как исходная папка").
- перестроить проект.
Это случилось со мной прямо сейчас. Ошибка была вызвана тем, что я использовал методы из более нового 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' } } }
для деталей, пожалуйста проверите
In
Eclipse 4.x
, Если вы столкнулись с этой проблемой, попробуйте ниже:
- перенести все включенные 3-й партии банки в Пользователь-Libaray
- переместите пользовательский lib перед Android lib и проверьте его на вкладке порядок и экспорт
- очистить и перестроить, чтобы запустить
в моем случае это произошло, когда я обновился от Eclipse Indigo до Eclipse Juno: я не уверен, что это истинная причина, но мой проект Android, над которым я работаю, долгое время перестал работать из-за этого исключения.
после много часов, пытаясь исправить это, я нашел решение для меня.
в моем проекте Android я использую другой проект (скажем, "MyUtils"), который находится в том же рабочем пространстве. Итак, мне нужно было сделать следующее:
Правой Кнопкой Мыши на Android project - > путь сборки - > настроить путь сборки
Теперь перейдите на вкладку "заказ и экспорт" и установите флажок "MyUtils". Вот и все: я избавился от этого досадного исключения.
проблема также может быть вызвана несоответствием между двумя проектами андроидов. Например, если вы разработали библиотеку android с помощью пакета " com.yourcompany", то у вас есть проект основного приложения, используя тот же пакет, что и базовый пакет. Затем предположим, что вы хотите изменить версию своего основного приложения, поэтому вы измените значения файла манифеста: код версии и имя версии. Если вы запустите приложение без изменения этих значений для библиотеки, вы получите сообщение об ошибке проверки любой вызов метода для объекта из библиотеки.
У меня была та же проблема. Я строил с 2.1 r1 и обновлен до 2.1 r3 с новым adt 17. У меня были ошибки проверки на почте javamail.jar и это сводило меня с ума. Вот как я решил эту проблему:
- создал libs / папку и добавил банки.
- щелкните правой кнопкой мыши > добавить как исходную папку
Я попробовал перестроить, и это не удалось. Я удалил каталог 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