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)
Ответы
Ответ 1
Очистка папки build
устраняет проблему. Не уверен, почему у АРТ была проблема, но у Дальвика этого не было.
Запуск задачи gradle clean
не очищал мою папку build
полностью. Я должен был сделать это вручную, но clean
может работать для некоторых людей.
Ответ 2
В моем случае причина была несколько иной.
По-видимому, помещение synchronized
оператора в блок try/catch
вызывает VerifyError
, как сообщается здесь в SO и на официальном трекере ошибок.
Ответ 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 вашего сертификата подписи. См. Аутентификация вашего клиента для информации.