W mojej aplikacji na Androida zawsze otrzymuję VerifyErrors! I nie wiem, dlaczego. Za każdym razem, gdy dołączam zewnętrzny plik JAR, zawsze otrzymuję VerifyErrors, gdy próbuję uruchomić moją aplikację (z wyjątkiem jednego razu, gdy dołączam Apache Log4j).
Zazwyczaj omijam ten problem, pobierając źródło biblioteki i dodając je do mojego projektu, ale próbuję umieścić bibliotekę klienta GData .
Mogę to uzyskać w źródle, ale jego zależności (mail.jar, aktywacja.jar, servlet-api.jar) nie mogę, więc otrzymuję błędy weryfikacji. Chciałbym raz na zawsze dotrzeć do źródła tego problemu. Szukałem w Internecie, ale wydaje się, że wszyscy mówią o niekompletnych plikach zajęć? których nie wiem.
java
android
gdata
verifyerror
Isaac Waller
źródło
źródło
Odpowiedzi:
Android używa innego formatu plików klas. Czy korzystasz z plików JAR innych firm za pomocą narzędzia „dx”, które jest dostarczane z pakietem Android SDK?
źródło
Spójrz na LogCat i zobacz, co powoduje błąd weryfikatora. Prawdopodobnie jest to metoda w klasie java.lang, która nie jest obsługiwana na używanym poziomie zestawu SDK systemu Android (na przykład String.isEmpty ()).
źródło
Od twórców Androida :
Dane wyjściowe z „adb logcat” wskazują klasę, której nie można znaleźć, oraz klasę, która ma błędne odniesienie. Lokalizacja jest określona zgodnie z konkretnymi instrukcjami Dalvik. Sztuczka polega na zajrzeniu do dzienników nad wyjątkiem.
źródło
WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;
(teraz, aby dowiedzieć się, jak to zrobić bez DatatypeFactory)Aby to działało, musisz dodać jar biblioteki do jednego z folderów źródłowych (nawet jeśli już dodałeś go jako bibliotekę eclipse, nadal musisz dodać go jako źródło).
źródło
Przydarzyło mi się to teraz. Błąd został spowodowany, ponieważ korzystałem z metod z nowszego zestawu SDK, który posiadało moje urządzenie.
Urządzenie z Androidem 1.5 zainstalowało apk, używając tego:
źródło
Znalazłem interesujący przypadek. Używam:
Tak więc niektóre z nowych możliwości Androida 4 nie zostały zaimplementowane w Androidzie 2.3, jak
ImageView.setLayerType
. Aby uniknąć błędów w czasie wykonywania, po prostu:To podejście powinno być stosowane również z obsługą wyjątków:
NetworkOnMainThreadException
nie jest zaimplementowana w systemie Android 2.3, więc po załadowaniu klasy (a nie wcześniej!)java.lang.VerifyError
występuje wyjątek .źródło
java.lang.ReflectiveOperationException
co nie jest zawarte w starszych wersjach Androida (na przykład 4.2), ale Lint nie ostrzegł mnie o tym ...CameraAccessException
, co jest wprowadzane w systemie Android 5.0, ale kiedy uruchamiam na urządzeniu z Androidem 4.3, wyrzucany jest VerifyError.Jeśli używasz Retrolambda, mogłeś dodać statyczną metodę do interfejsu (która jest dozwolona tylko w Javie 8).
źródło
Może to również wystąpić z powodu błędu limitu odniesienia w Lollypop poniżej wersji, w których jest ograniczony do maksymalnego rozmiaru 65K
Możliwe rozwiązanie powyższego problemu
Krok 1:
Add android-support-multidex.jar to your project. The jar can be found in your Android SDK folder /sdk/extras/android/support/multidex/library/libs
Krok 2: Rozszerz swoją aplikację o MultiDexApplication, np
Krok 3: Zastąp attachBaseContext
Krok 4: Następnym krokiem jest dodanie następujących elementów do części Android aplikacji build.gradle
Krok 5: Na koniec, postępując zgodnie z ogólną częścią twoich aplikacji build.gradle
Aby uzyskać szczegółowe informacje, przejdź do kasy
https://developer.android.com/tools/building/multidex.html
źródło
W moim przypadku stało się tak, gdy zaktualizowałem Eclipse Indigo do Eclipse Juno: nie jestem pewien, jaki jest prawdziwy powód, ale mój projekt na Androida, nad którym pracuję od dłuższego czasu, przestał działać z powodu tego wyjątku.
Po wielu godzinach próby rozwiązania tego problemu znalazłem rozwiązanie dla siebie.
W moim projekcie Android używam innego projektu (na przykład „MyUtils”), który znajduje się w tym samym obszarze roboczym. Musiałem więc wykonać następujące czynności:
Kliknij prawym przyciskiem myszy projekt systemu Android -> Ścieżka kompilacji -> Konfiguruj ścieżkę kompilacji
Teraz przejdź do zakładki „Zamów i eksportuj” i zaznacz pole „MyUtils”. To wszystko: pozbyłem się tego irytującego wyjątku.
źródło
Zmniejszam wersję Gradle z 2.0.0-alpha2 do 1.5.0, która rozwiązała ten problem.
źródło
Problem może być również spowodowany niezgodnością między dwoma projektami androidów. Na przykład, jeśli opracowałeś bibliotekę dla Androida przy użyciu pakietu „com.twojafirma”, masz projekt aplikacji głównej korzystający z tego samego pakietu co pakiet podstawowy. Następnie powiedzmy, że chcesz zmienić wersję swojej głównej aplikacji, więc zmień wartości pliku manifestu: kod wersji i nazwę wersji. Jeśli uruchomisz aplikację bez zmiany tych wartości dla biblioteki, otrzymasz błąd weryfikacji przy każdym wywołaniu metody na obiekcie z biblioteki.
źródło
Miałem ten sam problem. Budowałem z 2.1 r1 i zaktualizowałem do 2.1 r3 z nowym adt 17. Miałem błędy weryfikacji w mail.jar javamaila i doprowadzało mnie to do szału. Oto jak rozwiązałem problem:
próbowałem odbudować i się nie udało. Usunąłem katalog libs / jako folder źródłowy i usunąłem odniesienia do 3 plików jar w ścieżce kompilacji. Następnie ponownie dodałem folder libs / i dodałem każdy jar w folderze libs / do ścieżki kompilacji. Teraz działa zgodnie z oczekiwaniami. To dziwne obejście, ale zadziałało.
źródło
W
Eclipse 4.x
, jeśli napotkasz ten problem, spróbuj poniżej:źródło
Mam ten problem po aktualizacji SDK. Kompilator miał problemy z moimi zewnętrznymi bibliotekami. Zrobiłem to: kliknij prawym przyciskiem myszy projekt, a następnie „Android Tools> dodaj bibliotekę wsparcia…” ta instalacja w mojej bibliotece projektów „android-support-v4.jar”.
źródło
java.lang.VerifyError
oznacza, że skompilowany kod bajtowy odnosi się do czegoś, czego Android nie może znaleźć w czasie wykonywania. Ten verifyError Występuje tylko z KitKat4.4 i mniejszą wersją, której nie ma w powyższej wersji , nawet jeśli uruchomiłem tę samą kompilację na obu urządzeniach. kiedy użyłem parsera json json starszej wersji, to pokazujejava.lang.VerifyError
Następnie zmieniłem Dependancy na najnowszą wersję 2.2 na 2.7 bez biblioteki core (kiedy dołączam core2.7 daje to verifyError), to działa. co oznacza, że metody i inne treści rdzenia są migrowane do najnowszej wersji Databind2.7 . To naprawi moje problemy.
źródło
Dostaję również VerfiyError ... nie mogę znaleźć prawdziwego powodu. Pomaga zawinąć nowe wiersze kodu w metodę (Eclipse, „Wyodrębnij metodę…”). Więc w moim przypadku powodem nie jest nieobsługiwana metoda.
źródło
Miałem bardzo podobny problem. Dodałem jary Apache POI i pojawił się problem po aktualizacji do Android SDK 22.3.
Sprawdziłem prywatne biblioteki Androida, więc nie był to częsty problem z Android SDK. Odznaczyłem wszystkie słoiki Apache POI i dodałem jeden po drugim. Okazało się, że poi-3.9-20121203.jar powinien znajdować się przed poi-ooxml-3.9-20121203.jar . W przeciwnym razie to nie zadziała.
źródło
Jeśli masz testy, spróbuj wykomentować tę linię ze swojego
build.grade
pliku:Dla mnie spowodowało to wyjątki VerifyError w klasach, które używają funkcji Java 1.7, szczególnie w instrukcjach przełączania ciągów.
źródło
Miałem ten sam problem po wykonaniu git pull.
Rozwiązanie: Kompiluj -> Wyczyść projekt.
Mam nadzieję że to pomoże.
źródło
Znalazłem inny przypadek.
Warunki:
Rezultatem jest boom! java.lang.VerifyError podczas próby uzyskania dostępu do klasy używającej tego interfejsu. Wygląda na to, że Android (4.4. * W moim przypadku) nie lubi statycznych metod w interfejsach. Usunięcie metody statycznej z interfejsu powoduje zniknięcie VerifyError.
źródło
Ja też miałem ten problem, podobnie jak moje słoiki w bibliotece użytkownika ...
Sposób, w jaki to rozwiązałem, polegał na dodaniu ich do folderu lib, a następnie dodaniu ich we właściwościach kompilacji w eclipse ...
Za pierwszym razem nie zadziałało, ale potem je usunąłem i ponownie przeczytałem i zaczęło działać ...
trochę dziwny! ale teraz pracuje cały czas.
Powodzenia
źródło
Zakodowałem metody / klasy Android API, które są w SDK 2.1 i próbowałem uruchomić je na emulatorze Androida 1.6. Więc mam ten błąd.
ROZWIĄZANIE: Zmieniono to na poprawną wersję emulatora.
TO DZIAŁAŁO DLA MNIE .. Dzięki.
źródło
Dla potomności właśnie otrzymałem ten błąd, ponieważ używałem metody,
Arrays.copyOf()
która nie jest obsługiwana przez Javę 1.5, która odpowiada poziomowi Androida 4. Ponieważ pracowałem z bibliotekami opracowanymi pod 1.6, skompilowały się dobrze. Zobaczyłem problemy dopiero po przeniesieniu danej klasy do mojego projektu na Androida - wtedy błąd został podświetlony.W tej linii próbowałem zrobić
new DaoConfigArray
a ta klasa miała następującą linię:Jeszcze bardziej skomplikowane jest to, że wiersz 71 wskazywał na
ThreadLocal
inicjalizację, o której myślałem, że jest przyczyną problemu.źródło
Musiałem usunąć projekty zależne, a zamiast tego skompilować projekty zależne od jar i dołączyć je do folderu libs.
źródło
Jestem pewien, że moja sprawa była inna niż twoja, ale ponieważ jest to jeden z największych hitów podczas wyszukiwania hasła „java.lang.VerifyError na Androida”, pomyślałem, że nagram to tutaj dla potomności.
Miałem kilka zajęć w stylu:
I metoda, która zrobiła:
Tak długo, jak ten kod był obecny w pliku, otrzymywałbym VerifyError przy pierwszym załadowaniu klasy zawierającej tę metodę. Podzielenie go na dwie oddzielne metody (jedna, która dotyczyła tylko B, a druga dotyczyła tylko C) rozwiązało problem.
źródło
W moim przypadku ten błąd występuje, ponieważ moja usługa Google Play nie jest najnowsza .
Jeśli Twój projekt nie obsługuje jakiejś klasy w .jar, występuje ten błąd (np. ImageView.setLayerType, AdvertisingIdClient itp.).
źródło
Właśnie zidentyfikowałem inną sytuację, która występuje, nie tylko z powodu libs, a nie dx 'ed. Mam AsyncTask z bardzo długim mehtodem doInBackground. Z jakiegoś powodu ta metoda z ponad 145 liniami zaczęła pękać. Stało się to w aplikacji 2.3. Kiedy po prostu zamknąłem niektóre części w metodach, działało dobrze.
Więc dla tych, którzy nie mogli znaleźć klasy, która nie została poprawnie dx 'ed, spróbuj skrócić długość swojej metody.
źródło
Dla mnie problem polegał na tym, że użyłem klauzuli multi-catch gdzieś w klasie, która jest funkcją Java 7 (i API 19+). Więc zawiesiłoby się
VerifyError
na wszystkich urządzeniach starszych niż 19.źródło
Dla mnie było to w korelacji między compileSdkVersion i buildToolsVersion. Miałem:
Zmieniłem to na:
źródło
Dla mnie jest to problem compileSdkVersion. Kiedy użyłem poziomu API 21 w określonej aplikacji na Androida ( https://github.com/android10/Android-AOPExample ):
wystąpił błąd java.lang.verifyerror. Więc zmieniłem compileSdkVersion na 19
Działało dobrze. Myślę, że może to być problem SDK buildTools i wydaje się OK, gdy poziom API <21.
źródło