2015-01-19 8 views
23

Ten błąd pojawia się podczas instalowania mojego wydania APK na urządzeniu 5.x. Błąd nie występuje, gdy wypycham ten sam kod z Android Studio, lub gdy uruchamiam go na urządzeniu 4.x.java.lang.VerifyError: Weryfikacja klasy odrzuconej na Lollipop podczas korzystania z wydania APK

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) 

Wstrzyknę mój pasek narzędzi i niestandardowy element nawigacyjny NavigationDrawer w klasie.

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

Linia 31:

ButterKnife.inject(this); 

Czy istnieje coś, co byłoby inaczej z Codegen butterknife podczas korzystania gradle assembleRelease? W ogóle nie używam ProGuarda.

Oto moje inne ustawienia Android produkcji:

# 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) 
+0

można pokazać wyjście logcat? W dzienniku mogą pojawiać się dodatkowe informacje przed wyjątkiem. (W Dalvik nie było pewności, co pokazuje Art.) – fadden

+0

Dodałem logi, które pojawiają się tuż przed błędem. Widzę jeden problem od razu. Linia 2 pokazuje klasę nadrzędną o nazwie "LoggedInNavActivitya", a "a" nie jest w rzeczywistej nazwie. Drugi rażący problem, że "LoggedInNavActivity" nie jest już w mojej bazie kodu ... Usunąłem ten plik jakiś czas temu. –

Odpowiedz

55

czyszczenie folder build rozwiązany. Nie wiem, dlaczego ART miał problem, ale Dalvik nie.

Uruchamianie gradle clean zadanie nie wyczyściło mojego folderu build do końca. Musiałem to zrobić ręcznie, ale dla niektórych osób może działać clean.

+6

Próbowałem tego wiele razy, ale nie pomagam. – Alexander

+2

Jeśli Wyczyść projekt nie działa, spróbuj użyć Plik -> Unieważnij pamięć podręczną/Uruchom ponownie ... -> Unieważnij i ponownie uruchom – Pelanes

9

W moim przypadku przyczyna była nieco inna.

Najwyraźniej oddanie synchronized oświadczenie wewnątrz try/catch bloku powoduje VerifyError, jak donosi here on SO i na official bug tracker.

+0

+1. Ten rozwiązał mój problem i na pewno nie znalazłbym tej głównej przyczyny bez Twojej odpowiedzi. Wielkie dzięki! – dbm

1

W moim przypadku przyczyną jest proguard. Zamykanie mojej aplikacji na sumsung note3 whick to Android 5.0.
I przywoził android-asynchronicznej-http-1.4.9.jar The PROGUARD jest:

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

To nie wystarczy. Dodałem:

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

brak błędu.

Jeśli więc dołączysz do tego błędu, głęboko zakorzeniony powód może nie być oczywisty, należy zauważyć plik proguard.

0

Miałem ten sam problem zgłoszony przez GoogleTagManager.

java.lang.VerifyError: Verifier rejected class com.google.android.gms.tagmanager.TagManager: com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java.lang.String, int) failed to verify: com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java.lang.String, int): [0x11] returning 'Reference: com.google.android.gms.tagmanager.zzp', but expected from declaration 'Reference: com.google.android.gms.common.api.PendingResult'

Stało się po scaleniu. Mój kolega zaktualizował bibliotekę z 10.0.1 do 10.2.1. Czysta kompilacja nie działa.

Z powodu ograniczeń czasowych wycofałem do starszej wersji i zadziałało.

1

Po prostu wyłączyłem opcję "Natychmiastowy bieg" z ustawień "Buduj, wykonuj, wdróż". Niestety funkcja studia "Instant Run" w Androidzie wciąż nie jest stabilna ...

Aby to zrobić:

  1. przejdź do "Plik"> "Ustawienia"> "Build, wykonanie, wdrożenie"> "Natychmiastowe Run"
  2. odznacz pole "Włącz Natychmiastowy Uruchom ..." i kliknij przycisk "OK"
1

W moim przypadku metoda, o której mowa w komunikacie o błędzie, była "zła", miała kilka nieznanych błędów. Zmiana z lambda Kotlin na regularną pętlę rozwiązała mój problem.

Przed (z błędem):

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()) } 

Po:

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 
} 
+0

Miałem te same problemy z funkcjami stdlib. – urgentx

Powiązane problemy