Android java.lang.VerifyError?


100

У своєму додатку для Android я завжди отримую VerifyErrors! І я не можу зрозуміти, чому. Щоразу, коли я включаю зовнішній JAR, я завжди отримую VerifyErrors, коли намагаюся запустити додаток (за винятком одного разу, коли я включив Apache Log4j.)

Зазвичай я це обходжу, беру джерело бібліотеки і додаю його до свого проекту, але я намагаюся розмістити клієнтську бібліотеку GData .

Я можу отримати це в джерелі, але це залежності (mail.jar, activation.jar, servlet-api.jar) я не можу, тому я отримую перевірку помилок. Я хотів би раз і назавжди докорінитись до цієї проблеми. Я подивився в Інтернеті, але всі вони, здається, говорять про неповні файли класів? яких я не знаю.


Як відомо, GData не працює в Android. Шукайте тему в програмі Google для розробників Android. Нам потрібно чекати офіційного GData для Android, у майбутньому випуску SDK.
mparaz

1
Ви використовуєте Gradle для створення свого проекту? У мене була ця проблема, коли я забув запустити чисту задачу перед тим, як збирати завдання
випустити

Відповіді:


35

Android використовує інший формат файлу класу. Чи запускаєте файли JAR сторонніх виробників через інструмент "dx", який постачається з Android SDK?


4
Буде дивовижним з додатковою інформацією про інструмент "dx".
Даніель Магнуссон

2
Подивіться у розділі «Бібліотека» налаштувань проекту Android, під списком версій SDK. Чи відображаються ваші зовнішні проекти, на які ви покладаєтесь у своїй збірці, із зеленою галочкою поруч із ними?
Адам

@Адам ДЯКУЙТЕ за цей коментар! Ви просто вирішили проблему, яку я витратив занадто багато часу, намагаючись розібратися.
Саймон Форсберг

118

Подивіться на LogCat і подивіться, що викликає верифікатор. Це, мабуть, якийсь метод класу java.lang, який не підтримується на рівні SDK для android, який ви використовуєте (наприклад, String.isEmpty ()).


4
Це слід позначити як реальну відповідь. Принаймні, що це було саме в моєму випадку, оскільки я отримував спорадичні помилки від своїх користувачів, і я відстежував це до виклику View.getTag (int), який не підтримується в т. 3 API
Bostone

1
Домовились. Я стикався з цим кілька разів, і кожного разу я націлююсь на 2.x і використовую щось, що не в 1.5. Що вас відкидає - це кинутий, коли клас створюється / використовується лише вперше, тому, якщо це відбувається щось епізодично, ви можете його не помітити деякий час.
mbafford


"Це слід позначити як реальну відповідь." Я зіткнувся з цією темою, тому що в мене однакова проблема. Я здогадуюсь, чому причина цього не була позначена справжньою відповіддю, тому що LogCat дає рядкове посилання на те, де я роблю екземпляр бібліотеки, але не на рядок, де проблема викликана. Іншими словами, в цьому випадку LogCat майже марний.
NotACleverМан

logcat на рівні WARN повинен показати вам подробиці про те, чому не вдалося перевірити
mmeyer

56

Від андроїд-розробників :

Вихід з "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

Подивившись вище помилка допомогла і мені. Шукайте повідомлення, яке починається з "VFY:" У моєму випадку воно сказало "довільно відкидаючи великий метод". Можливо, тому, що це створює величезну кількість масивів :) у будь-якому разі, дякую за пораду!
Amplify91

Дякую! Я виявив, що моя проблема стосується обробника винятків: NetworkOnMainThreadException не реалізований в Android 2.3. Подивіться на мою відповідь. Знову дякую! :)
Серафима

Дякую! У моєму випадку я націлювався на Android2.3 і використовував android-support-v4.jar, і класів у цій банці не було. Мені довелося натиснути на вкладку "експортувати" для цього класу у властивостях та вивести його над бібліотекою android2.3.3. Що ж, цей експорт - це те, що я чітко не розумію ...
xtof54

14

Щоб він працював, потрібно додати банку бібліотеки до однієї з вихідних папок (навіть якщо ви її вже додали як бібліотеку затемнення, її все одно потрібно додати як джерело).

  1. Створіть каталог у своєму проекті (наприклад, "libs") і поставте туди бібліотечну банку.
  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), але Lint не попередив мене про це ...
WonderCsabo

Для мене проблема полягає в тому, що мій код оголосити a CameraAccessException, який представлений на Android 5.0, але коли я запускаюсь на пристрої Android 4.3, VerifyError кидається.
Піасі

7

Якщо ви використовуєте Retrolambda, можливо, ви додали статичний метод в інтерфейс (який дозволений лише в Java 8).


7

Це також може статися через посилання граничної помилки на Lollypop нижче версій, де вона обмежена максимальним розміром 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: Переосмислити приєднанняBaseContext

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

Крок 4: Наступний крок - додати наступне до андроїд-частини вашої програми 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.
Хтось десь


2

Проблема також може бути викликана невідповідністю двох проектів андроїдів. Наприклад, якщо ви розробили бібліотеку андроїдів, використовуючи пакет "com.yourcompany", тоді у вас є проект основного додатка, використовуючи той самий пакет, що і базовий пакет. Тоді скажімо, що ви хочете змінити версію свого основного додатка, тому ви зміните значення файлу маніфесту: Код версії та Ім'я версії. Якщо ви запускаєте додаток, не змінюючи цих значень для бібліотеки, ви отримаєте помилку підтвердження при будь-якому виклику методу на об'єкті з бібліотеки.


2

У мене було те саме питання. Я будував з 2.1 r1 та оновив до 2.1 r3 з новим adt 17. У мене були перевірки помилок на mail.jar на javamail, і це зводило мене з розуму. Ось як я вирішив питання:

  1. створив libs / папку та додав банки.
  2. клацніть правою кнопкою миші> додати як вихідну папку

Я спробував відновити, і це не вдалося. Я видалив libs / каталог як папку з джерелом і видалив refs до 3-х файлів jar на шляху збирання. Потім я знову додав libs / папку і додав кожну банку в libs / папку до шляху збирання. Зараз це працює як очікувалося. Це дивне рішення, але воно працювало для мене.


2

В Eclipse 4.x, якщо ви зіткнулися з цією проблемою, спробуйте нижче:

  1. перенести всі включені сторонні банки в User-Libaray
  2. просуньте вгору користувачу lib перед андроїд lib та перевірте її на вкладці «Порядок та експорт»
  3. очистити і відновити для запуску

2

У мене ця проблема після оновлення SDK. У компілятора виникли проблеми з моїми зовнішніми бібліотеками. Я зробив це: клацніть правою кнопкою миші на проект, потім "Інструменти для android> додайте бібліотеку супорту ..." це встановіть у мою бібліотеку проектів "android-support-v4.jar".


2

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

Тоді я змінив 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, 'Extract method ...'). Тож у моєму випадку причина - це непідтримуваний метод.


1

У мене була дуже схожа проблема. Я додав баночки з POI Apache, і проблема з’явилася, коли я оновлювався до Android SDK 22.3.

У мене були перевірені приватні бібліотеки Android, тому це не є частою проблемою для Android SDK. Я скасував усі банки AAche POI і додав по черзі. Я виявив, що poi-3.9-20121203.jar повинен бути перед poi-ooxml-3.9-20121203.jar . Інакше це не вийде.


1

Якщо у вас є тести, спробуйте прокоментувати цей рядок зі свого build.gradeфайлу:

testCoverageEnabled = true

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


1

У мене була така ж проблема, коли я зробив тягу.

Рішення: Збірка -> Очистити проект.

Сподіваюся, це допомагає.


1
Не тягнув і не робив нічого насправді, але чистий зробив це, дякую!
Олександр Г

1

Я знайшов інший випадок.

Умови:

  • Використовуйте Retrolambda (не впевнений, чи потрібно);
  • Зробіть статичний метод в інтерфейсі.

І результат бум! java.lang.VerifyError при спробі доступу до класу, який використовує цей інтерфейс. Схоже, Android (4.4. * В моєму випадку) не любить статичні методи в інтерфейсах. Видалення статичного методу з інтерфейсу змушує VerifyError піти.


0

У мене також була така проблема, як і у моїх банках у бібліотеці користувачів ...

Я вирішив це для того, щоб додати їх у папку lib, а потім додати їх у властивості збирання у затемненні ...

Перший раз, коли я це зробив, це не спрацювало, але потім я їх видалив і перечитав знову, і він почав працювати ...

трохи дивного! але зараз працюю весь час.

Щасти


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), вирішили проблему.


1
І, до речі, те, як я викликав корінь, коментував органи методів (замінюючи return null / 0 / false), поки VerifyError не пішов, а потім відновив матеріал, поки він не повернувся знову; тоді робимо те саме в методі проблеми. Не цікавий спосіб налагодження, звичайно, але це спрацювало.
benkc

0

У моєму випадку ця помилка виникає через те, що мій сервіс google-play не найновіший .

Якщо ваш проект не підтримує якийсь клас у .jar, ця помилка (наприклад, ImageView.setLayerType, AdvertisingIdClient тощо).


0

Я щойно визначив ще одну ситуацію, яка виникає, не лише через libs not dx 'ed. У мене є AsyncTask з дуже довгим методом doInBackground. Чомусь цей метод із понад 145 рядків почав ламатись. Це сталося в додатку 2.3. Коли я просто інкапсулював деякі деталі в методи, це спрацювало чудово.

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


0

Для мене проблема в кінцевому підсумку полягала в тому, що я використовував багатозагальний пункт десь у класі, який є функцією 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.verifyer. Тому я змінив компіляціюSdkVersion на 19

compileSdkVersion 19

Це добре спрацювало. Я думаю, що це може бути проблема SDK buildTools, і це здається нормальним, коли рівень API <21.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.