web-dev-qa-db-fra.com

java.lang.VerifyError: le vérificateur a rejeté la classe sur Lollipop lors de l'utilisation de la version APK

Je reçois cette erreur lorsque j'installe ma version APK sur un appareil 5.x. L'erreur ne se produit pas lorsque j'expédie 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 NavigationDrawer personnalisé dans la classe.

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

Ligne 31:

ButterKnife.inject(this);

Existe-t-il quelque chose de différent avec Butterknife codegen avec 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)
36
Austyn Mahoney

Le nettoyage du dossier build a résolu le problème. Pas sûr de savoir pourquoi ART avait un problème mais pas Dalvik.

L'exécution d'une tâche de niveau clean n'a pas effacé complètement mon dossier build. Je devais le faire manuellement, mais clean peut fonctionner pour certaines personnes.

70
Austyn Mahoney

Dans mon cas, la cause était légèrement différente.

Apparemment, placer une instruction synchronized dans un bloc try/catch provoque la VerifyError, comme indiqué ici sur SO et sur le traqueur de bogues official .

11
Sebastiano

Dans mon cas, la méthode indiquée par le message d'erreur était "mauvaise" et comportait des erreurs inconnues. Changer de Kotlin lambda à une boucle normale 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
}
3
Marius Kohmann

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é de studio Android "Instant Run" est encore loin d'être stable ...

Faire cela: 

  1. allez dans "Fichier"> "Paramètres"> "Construction, exécution, déploiement"> "Exécution instantanée"
  2. décochez la case "Activer l'exécution instantanée ..." et cliquez sur le bouton "OK"
2
ahmed_khan_89

Mon application fonctionnait sur la plupart des plates-formes mais plantait immédiatement sous Android 5.1. J'ai commencé à soupçonner le nouveau compilateur D8 Dex après avoir lu l'information de Google sur sa qualité. Désactiver D8, qui utilise donc le compilateur DX d'origine, est la seule chose qui a fonctionné pour moi. Les caches de nettoyage et d'invalidation de projet ne résolvaient pas le problème . J'avais des blocs synchronisés, mais les supprimer ne le corrigeait pas . n'a pas le réparer.

Voici comment vous désactivez D8:
-Créez un fichier appelé gradle.properties à la racine de votre projet, s'il n'existe pas
-Dans cela, mettez cette ligne: Android.enableD8 = false

Vous obtiendrez des avertissements obsolètes. Espérons que Google corrige réellement D8 avant de supprimer complètement le DX obsolète. Je ne sais pas ce qui le déclenche dans mon code. J'utilise Android Studio 3.2.1 avec Gradle version 4.6 . Modifier: j'ai signalé ce bogue et les développeurs de Google étudient activement ce problème.

2
Georgie

Dans mon cas, la cause est proguard. L'arrêt de mon application sur Sumsung note3 whick est Android 5.0.
J'ai importé le fichier Android-async-http-1.4.9.jar, la progression est la suivante:

-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 bogue, la raison profonde peut ne pas être évidente, il faut noter le fichier proguard.

1
user1452641

J'ai eu le même problème lancé par GoogleTagManager.

Java.lang.VerifyError: le vérificateur a rejeté la classe com.google.Android.gms.tagmanager.TagManager: com.google.Android.gms.common.api.PendingResult com.google.Android.gms.tagmanager.Tagmanager.Tagmanager.TagManager.TagManager.TagManager.loadContainerDefaultOnly (Java échec de la vérification de lang.String, int): com.google.Android.gms.common.api.PendingResult com.google.Android.gms.tagmanager.TagManager.loadContainerDefaultOnly (Java.lang.String, int): [0x11] 'Référence: com.google.Android.gms.tagmanager.zzp', mais attendu de la déclaration 'Référence: com.google.Android.gms.common.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. La construction propre n'a pas fonctionné.

En raison de contraintes de temps, je suis revenu à l'ancienne version et cela a fonctionné.

0
Irshu

Simple (3) étapes a travaillé pour moi:

1 - dans le menu principal d'Android Studio Build -> projet propre

2 - dans le menu principal d'Android Studio Build -> make project

3 - dans le menu principal d'Android Studio Build -> projet de reconstruction

Tous mis en place ..

0
Ali Nawaz