java.lang.VerifyError: Верификатор отклонил класс на Lollipop при использовании выпуска APK

Я получаю эту ошибку, когда устанавливаю свой выпуск APK на 5.x устройство. Ошибка не возникает, когда я отправляю тот же код из Android Studio или запускаю его на 4.x устройстве.

java.lang.VerifyError: Verifier rejected class com.myapp.android.ui.activity.MainActivity$$ViewInjector due to bad method void com.myapp.android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.android.ui.activity.MainActivity) (declaration of 'com.myapp.android.ui.activity.MainActivity$$ViewInjector' appears in /data/app/com.myapp.android-2/base.apk)
       at java.lang.Class.classForName(Class.java)
       at java.lang.Class.forName(Class.java:308)
       at java.lang.Class.forName(Class.java:272)
       at butterknife.ButterKnife.findInjectorForClass(ButterKnife.java:298)
       at butterknife.ButterKnife.inject(ButterKnife.java:271)
       at butterknife.ButterKnife.inject(ButterKnife.java:184)
       at com.myapp.android.ui.activity.MyDrawerActivity.onCreate(MyDrawerActivity.java:31)

Я добавляю свою панель инструментов и пользовательский NavigationDrawer в класс.

@InjectView(R.id.toolbar) Toolbar mToolbar;
@InjectView(R.id.nav_drawer) MyNavigationDrawer mNavigationDrawer;

Строка 31:

ButterKnife.inject(this);

Есть ли что-то, что отличалось бы от кодегена Butterknife при использовании gradle assembleRelease? Я вообще не пользуюсь ProGuard.

Вот мои другие настройки сборки Android:

# Android SDK settings
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION=21.1.2

Логкат

I/art     (21354): Verification error in void com.myapp.android.ui.activity.MainActivity$$ViewInjector.inject(butterknife.ButterKnife$Finder, com.myapp.android.ui.activity.MainActivity, java.lang.Object)
I/art     (21354): void com.myapp.android.ui.activity.MainActivity$$ViewInjector.inject(butterknife.ButterKnife$Finder, com.myapp.android.ui.activity.MainActivity, java.lang.Object) failed to verify: register v4 has type Reference: com.myapp.android.ui.activity.MainActivity but expected Reference: com.myapp.android.ui.activity.LoggedInNavActivitya.lang.Object): [0x0]
I/art     (21354): Verification error in void com.myapp.android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.android.ui.activity.MainActivity)
I/art     (21354): void com.myapp.android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.android.ui.activity.MainActivity) failed to verify: register v1 has type Reference: com.myapp.android.ui.activity.MainActivity but expected Reference: com.myapp.android.ui.activity.LoggedInNavActivity
E/art     (21354): Verification failed on class com.myapp.android.ui.activity.MainActivity$$ViewInjector in /data/app/com.myapp.android-1/base.apk because: Verifier rejected class com.myapp.android.ui.activity.MainActivity$$ViewInjector due to bad method void com.myapp.android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.android.ui.activity.MainActivity)

person Austyn Mahoney    schedule 19.01.2015    source источник
comment
Можете ли вы показать вывод logcat? Перед исключением в журнале может быть дополнительная информация. (Было в Далвике, не знаю, что показывает Арт.)   -  person fadden    schedule 19.01.2015
comment
Я добавил журналы, которые появляются прямо перед ошибкой. Я сразу вижу одну проблему. Строка 2 показывает родительский класс с именем LoggedInNavActivitya, a в фактическом имени нет. Другая вопиющая проблема заключается в том, что этого LoggedInNavActivity больше нет даже в моей кодовой базе... Я удалил этот файл некоторое время назад.   -  person Austyn Mahoney    schedule 19.01.2015


Ответы (10)


Очистка папки build решила проблему. Не знаю, почему у ART возникла проблема, а у Dalvik — нет.

Выполнение задачи gradle clean не полностью очищало мою папку build. Мне пришлось сделать это вручную, но clean может сработать для некоторых людей.

person Austyn Mahoney    schedule 19.01.2015
comment
Если Очистить проект не работает, попробуйте Файл -> Недействительные кеши / Перезапуск... -> Недействительные и перезапуск - person Pelanes; 11.05.2017
comment
Выполнил как очистку проекта, так и аннулирование кешей/перезапуск. Не уверен, какой из них, но это сработало, когда я сделал оба. - person Can Poyrazoğlu; 22.07.2018

В моем случае причина была немного в другом.

По-видимому, размещение оператора synchronized внутри блока try/catch вызывает VerifyError, как сообщается здесь на SO и в официальной системе отслеживания ошибок.

person Sebastiano    schedule 06.02.2015
comment
+1. Это решило мою проблему, и я уверен, что без вашего ответа я бы не нашел первопричину. Большое спасибо! - person dbm; 08.04.2015

В моем случае метод, который в сообщении об ошибке был «плохим», имел некоторые неизвестные ошибки. Переход с лямбды Kotlin на обычный цикл решил мою проблему.

До (с ошибкой):

fun validZipCode(zipcode: String): Boolean {
    val validRegexes = arrayOf(
            "0[0-9]{1}[0-9]{2}", 
            "1[0-2]{1}[0-9]{2}", 
            "1[3-4]{1}[0-9]{2}", 
            "19[0-9]{2}", 
            "2[0-1]{1}[0-9]{2}" 
    )
return validRegexes.any { zipcode.matches(it.toRegex()) }

После:

fun validZipCode(zipcode: String): Boolean {

    val validRegexes = arrayOf(
            "0[0-9]{1}[0-9]{2}", 
            "1[0-2]{1}[0-9]{2}", 
            "1[3-4]{1}[0-9]{2}",
            "19[0-9]{2}", 
            "2[0-1]{1}[0-9]{2}"
    )

    for (regex in validRegexes) {
        if (zipcode.matches(regex.toRegex())) {
            return true
        }
    }

    return false
}
person Marius Kohmann    schedule 16.02.2018
comment
У меня были те же проблемы с функциями stdlib. - person urgentx; 22.02.2018

Мое приложение работало на большинстве платформ, но сразу же вылетало на Android 5.1. Я начал подозревать новый компилятор D8 dex после того, как прочитал информацию Google о том, насколько он великолепен. Отключение D8, чтобы он использовал оригинальный компилятор DX, — единственное, что сработало для меня. Очистка/аннулирование кешей проекта не исправили это. У меня были синхронизированные блоки, но их удаление не помогло. Отключение мгновенного запуска не помогло. Отключение proguard не помогло.

Вот как вы можете отключить D8:
-Создайте файл с именем gradle.properties в корне вашего проекта, если он не существует
-В него поместите эту строку: android.enableD8 = false

Вы получите устаревшие предупреждения. Надеюсь, Google действительно исправит D8, прежде чем полностью удалит устаревший DX. Я не знаю, что в моем коде вызывает это. Я использую Android Studio 3.2.1 с версией Gradle 4.6. Изменить: я сообщил об этой ошибке, и разработчики Google активно ее исследуют.

person Georgie    schedule 03.11.2018
comment
Это отчет об ошибке: issuetracker.google.com/issues/118911692. - person Georgie; 09.12.2018

Verify Error в основном выдается в определенных сценариях, которые возникают, если мы изменили определение класса A, но класс B был скомпилирован с использованием более старой версии класса A. Вот почему она разрешается, если мы очищаем наш проект и перестройте все классы вместе с той же версией Java.

По следующей ссылке перечислены некоторые сценарии, в которых может возникнуть ошибка проверки. java.lang.VerifyError – Как для решения VerifyError

person Anuj Garg    schedule 24.01.2020

Редактировать: поскольку люди все еще голосуют за этот ответ, я хочу отметить, что он датирован 2017 годом. Я не уверен, что он все еще верен... Надеюсь, он все еще полезен для некоторых из вас...

В моем случае я просто отключил параметр «Мгновенный запуск» в настройках «Сборка», «Выполнение», «Развертывание».

To do so:

  1. перейдите в Файл › Настройки › Сборка, выполнение, развертывание › Мгновенный запуск
  2. снимите флажок Включить мгновенный запуск... и нажмите кнопку ОК
person ahmed_khan_89    schedule 07.03.2017

У меня была такая же проблема, брошенная GoogleTagManager.

java.lang.VerifyError: Верификатор отклонил класс com.google.android.gms.tagmanager.TagManager: com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java. lang.String, int) не удалось проверить: com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java.lang.String, int): [0x11] возвращает «Ссылка: com.google.android.gms.tagmanager.zzp», но ожидается из объявления «Ссылка: com.google.android.gms.common.api.PendingResult»

Это произошло после слияния. Мой коллега обновил библиотеку с 10.0.1 до 10.2.1. Чистая сборка не помогла.

Из-за нехватки времени я откатился на более старую версию, и это сработало.

person Irshu    schedule 27.02.2017

В моем случае причина в proguard. Мое завершение работы приложения на sumsung note3 Wick - это Android 5.0.
Я импортировал android-async-http-1.4.9.jar, proguard:

-dontwarn com.loopj.android.http.**
-keep class com.loopj.android.http.**{*;}

Этого не достаточно. Я добавил:

-dontwarn cz.msebera.**
-keep class cz.msebera.**{*;}

ошибка исчезла.

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

person user1452641    schedule 23.05.2016
comment
Как именно эти пакеты в конфигурации proguard относятся к импортированному вами .jar? - person howettl; 13.01.2021

Мне помогли простые (3) шага:

1- из верхнего меню сборки Android Studio --> очистить проект

2- из верхнего меню сборки Android Studio --> создать проект

3 - из верхнего меню сборки Android Studio --> перестроить проект

Все настроено..

person Ali Nawaz    schedule 17.04.2018

Может быть, это может помочь кому-то, кто сталкивается с этой проблемой и в Debug Build.

Я также столкнулся с той же ошибкой. Я пропустил настройку проекта Google API Console. Итак, настройте проект Google API Console, следуя этому и при появлении запроса укажите имя пакета вашего приложения. Вам также потребуется предоставить хэш SHA-1 вашего сертификата подписи. Информацию см. в разделе Аутентификация вашего клиента.

person mannu    schedule 09.05.2019