Java.lang.VerifyError: Verificateur classe rejetée sur Lollipop lors de l'utilisation de release APK
je reçois cette erreur lorsque j'installe ma version APK sur un périphérique 5.x
. L'erreur ne se produit pas lorsque je pousse le même code depuis Android Studio, ou si je l'exécute sur un périphérique 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)
j'injecte ma barre d'outils et un Drawer de navigation personnalisé dans la classe.
@InjectView(R.id.toolbar) Toolbar mToolbar;
@InjectView(R.id.nav_drawer) MyNavigationDrawer mNavigationDrawer;
ligne 31:
ButterKnife.inject(this);
Est-il quelque chose qui serait différent avec la Butterknife codegen lors de l'utilisation de gradle assembleRelease
? Je n'utilise pas du tout ProGuard.
Voici mes autres paramètres de construction 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)
7 réponses
le nettoyage du dossier build
a résolu le problème. Je ne sais pas pourquoi L'ART avait un problème, mais Dalvik ne l'a pas fait.
exécuter une tâche gradle clean
n'éliminait pas complètement mon dossier build
. J'ai eu à le faire manuellement, mais clean
peut fonctionner pour certaines personnes.
Dans mon cas, la cause était légèrement différente.
apparemment, mettre une déclaration synchronized
à l'intérieur d'un bloc try/catch
provoque le VerifyError
, comme rapporté ici sur SO et sur le bug tracker officiel .
dans mon cas, j'ai simplement désactivé l'option" exécution instantanée "de mes paramètres" construction, exécution, déploiement". Malheureusement, la fonctionnalité Android studio "Instant Run" est encore loin d'être stable...
À le faire:
- allez dans "Fichier" > "Paramètres" > "Construire, l'Exécution, le Déploiement" > "Instant Exécuter"
- décocher la case" Activer L'exécution instantanée..."et cliquez sur" OK "bouton
dans mon cas, la méthode indiquée par le message d'erreur était "mauvaise" et présentait des défauts inconnus. Passer d'un lambda Kotlin à une boucle régulière a résolu mon problème.
Avant (Avec Erreur):
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()) }
après:
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
}
dans mon cas, la cause est proguard. Mon arrêt d'application sur sumsung note3 whick est android 5.0.
J'ai importé l'android-async-http-1.4.9.jar, le proguard est:
-dontwarn com.loopj.android.http.**
-keep class com.loopj.android.http.**{*;}
ce n'est pas assez. J'ai ajouté:
-dontwarn cz.msebera.**
-keep class cz.msebera.**{*;}
le bug est parti.
donc si vous entrez dans ce bug, la raison profonde peut-être pas évidente, il faut noter le fichier proguard.
j'ai eu le même problème jetés par 151900920" .
de java.lang.VerifyError: Verificateur rejeté classe com.Google.Android.gms.tagmanager.TagManager: com.Google.Android.gms.commun.API.PendingResult com.Google.Android.gms.tagmanager.TagManager.loadContainerDefaultOnly (java.lang.String, int) pas de vérifier: com.Google.Android.gms.commun.API.PendingResult com.Google.Android.gms.tagmanager.TagManager.loadContainerDefaultOnly (java.lang.String, int): [0x11] de retour de Référence: com.Google.Android.gms.tagmanager.zzp", mais attendue de la déclaration " référence: com.Google.Android.gms.commun.API.PendingResult '
c'est arrivé après la fusion. Mon collègue a mis à jour la bibliothèque de 10.0.1
à 10.2.1
. Nouvelle version ne fonctionne pas.
en raison de contraintes de temps, je me rétracte vers l'ancienne version, et ça a marché.
Simple (3) étapes travaillé pour moi:
1 - depuis le menu du haut de android Studio build -- > clean project
2 - depuis le menu du haut de android Studio build -- > make project
3 - en haut du menu de construction de studio android -- > projet de reconstruction
tout est prêt..