Подтвердить что ты не робот

Java.lang.VerifyError: Verifier отклонил класс на Lollipop при использовании release 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);

Есть ли что-то, что будет отличаться от codegen 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

Logcat

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)
4b9b3361

Ответ 1

Очистка папки build устраняет проблему. Не уверен, почему у АРТ была проблема, но у Дальвика этого не было.

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

Ответ 3

В моем случае метод, который в сообщении об ошибке был "плохим", имел некоторые неизвестные ошибки. Переход от 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
}

Ответ 4

В моем случае я просто отключил параметр "Мгновенный запуск" из моих настроек "Build, Execution, Deployment". К сожалению, студия Android "Instant Run" еще далека от стабильности...

Для этого:

  • перейдите в "Файл" > "Настройки" > "Сборка, выполнение, развертывание" > "Мгновенный запуск"
  • снимите флажок "Включить мгновенный запуск..." и нажмите кнопку "ОК"

Ответ 5

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

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

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

Ответ 6

В моем случае причиной является proguard. Мое приложение отключилось от sumsung note3 whick и 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.

Ответ 7

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

java.lang.VerifyError: Verifier отклонен класс 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] return 'Ссылка: com.google.android.gms.tagmanager.zzp', но ожидается из декларации 'Reference: com.google.android.gms.common.api.PendingResult'

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

Из-за ограничений по времени, я откатился к старой версии и работал.

Ответ 8

Простые (3) шаги работали на меня:

1 - из верхнего меню сборки андроид студии → чистый проект

2 - из верхнего меню сборки андроид студии → сделать проект

3 - из верхнего меню сборки андроид студии → пересобрать проект

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

Ответ 9

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

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