Android java.lang.VerifyError?


100

Android uygulamamda her zaman VerifyErrors alıyorum! Ve nedenini anlayamıyorum. Harici bir JAR eklediğimde, uygulamamı başlatmaya çalıştığımda her zaman VerifyErrors alıyorum (Apache Log4j'yi dahil ettiğim zamanlar hariç).

Genelde kitaplığın kaynağını alıp projeme ekleyerek bu sorunu çözüyorum , ancak GData istemci kitaplığını koymaya çalışıyorum .

Bunu kaynakta alabilirim, ancak bağımlılıkları (mail.jar, activation.jar, servlet-api.jar) Yapamıyorum, bu yüzden doğrulama hataları alıyorum. Bu sorunun kökenine bir kez ve sonsuza kadar inmek istiyorum. İnternete baktım ama hepsi tamamlanmamış sınıf dosyalarından mı bahsediyor? bilmediğim.


GData'nın Android'de çalışmadığı biliniyor. Android geliştiricileri Google Grubu'nda konuyu arayın. Gelecekteki bir SDK sürümünde Android için resmi bir GData beklememiz gerekiyor.
mparaz

1
Projenizi oluşturmak için Gradle kullanıyor musunuz? Montajı
serbest bırakmadan

Yanıtlar:


35

Android, farklı bir sınıf dosya biçimi kullanır. 3. taraf JAR dosyalarını Android SDK ile birlikte gelen "dx" aracıyla mı çalıştırıyorsunuz?


4
"Dx" aracı hakkında daha fazla bilgi ile harika olurdu.
Daniel Magnusson

2
Android proje tercihlerinin SDK sürümleri listesinin altındaki "Kitaplık" bölümüne bakın. Yapınızda güvendiğiniz harici projeler, yanlarında yeşil bir tik işaretiyle orada mı görünüyor?
Adam

@Adam bu yorum için TEŞEKKÜR EDERİZ! Çözmek için çok fazla zaman harcadığım bir sorunu çözdün.
Simon Forsberg

118

LogCat'e bakın ve doğrulama hatasına neyin sebep olduğunu görün. Muhtemelen bir java.lang sınıfında, kullandığınız android SDK düzeyinde desteklenmeyen bir yöntemdir (örneğin, String.isEmpty ()).


4
Bu gerçek cevap olarak işaretlenmelidir. En azından, kullanıcılarımdan ara sıra hatalar aldığım ve bunu API'nin 3. v.
Bostone

1
Kabul. Bununla birkaç kez karşılaştım ve her seferinde 2.x'i hedefliyorum ve 1.5'te olmayan bir şey kullanıyorum. Sizi şaşırtan şey, sınıf yalnızca ilk kez oluşturulduğunda / kullanıldığında atılmasıdır, bu nedenle ara sıra meydana gelen bir şeyse, bir süre fark etmeyebilirsiniz.
mbafford


"Bu gerçek cevap olarak işaretlenmelidir." Bu konuya geldim çünkü benim de aynı problemim var. Bunun gerçek cevap olarak işaretlenmemesinin nedenini tahmin ediyorum çünkü LogCat, bir kitaplık örneğini yaptığım yere bir satır referansı veriyor, ancak sorunun neden olduğu satıra değil. Diğer bir deyişle, bu durumda LogCat neredeyse işe yaramaz.
NotACleverMan

WARN düzeyindeki logcat size neden doğrulamanın başarısız olduğunun ayrıntılarını göstermelidir
mmeyer

56

Gönderen android-geliştiriciler :

"Adb logcat" çıktısı, bulunamayan sınıfı ve aynı zamanda kötü referansa sahip sınıfı gösterir. Konum, belirli Dalvik talimatına göre tanımlanır. İşin püf noktası, istisnanın üzerindeki günlüklere bakmaktır.


6
İstisnanın üzerine bakmak, hataya neden olan yöntemi belirlememe de yardımcı oldu. Benim için bu Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR ifadesiydi ki sonunda bunu Cupcake'de denerseniz ...
Manuel

2
Teşekkürler! WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;
Aldığım sorun buydu

Hatanın üstüne bakmak da bana yardımcı oldu. "VFY:" ile başlayan bir mesajı arayın, benim durumumda, "büyük yöntemi keyfi olarak reddediyor" yazıyordu. Muhtemelen çok sayıda dizi oluşturduğu için :) neyse, bahşiş için teşekkürler!
Amplify91

Teşekkürler! Sorunumun istisna işleyicide olduğunu buldum: NetworkOnMainThreadException Android 2.3'te uygulanmadı. Cevabım için aşağı bak. Tekrar teşekkürler! :)
Seraphim

Teşekkürler! Benim durumumda, Android2.3'ü hedefliyordum ve android-support-v4.jar'ı kullanıyordum ve bu kavanozdaki sınıfları bulamıyordu. Özelliklerde bu sınıf için "dışa aktar" sekmesine tıklamak ve onu android2.3.3 kitaplığının üstüne getirmek zorunda kaldım. Pekala, bu ihracat gerçekten net olarak anlamadığım bir şey ...
xtof54

14

Çalışmasını sağlamak için, kaynak klasörlerden birine kitaplık kavanozunu eklemeniz gerekir (onu daha önce tutulma kitaplığı olarak eklemiş olsanız bile, yine de kaynak olarak eklemeniz gerekir).

  1. Projenizde bir dizin oluşturun (ör. "Libs") ve kitaplık kavanozunu buraya yerleştirin.
  2. Dizini derleme sınıfı yoluna ekleyin (klasör üzerinde sağ tuşa tıklayın ve "Oluşturma yolu" -> "Kaynak klasör olarak kullan" ı seçin).
  3. Projenizi yeniden oluşturun.

"Libs" klasörüne JAR yerine "Proje Kitaplığı" ekleyebilir miyiz?
Ahmed

Garip ... Onu normal bir Java kitaplığı olarak eklemem gerekiyordu - Eclipse'deki "Android" menüsünün altındaki bir kitaplık olarak değil.
Phil

Teşekkürler Maksim, güzel çözüm.
Arun Badole

8

Şu anda bana oldu. Hata, cihazımın sahip olduğu daha yeni bir SDK'dan yöntemler kullanmamdan kaynaklanıyordu.

Android 1.5 cihazı bunu kullanarak bir apk yükledi:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>

8

İlginç bir vaka buldum. Kullanırım:

<uses-sdk
   android:minSdkVersion="9"
   android:targetSdkVersion="18" />

Yani bazı yeni Android 4 yeteneklerinin Android 2.3 gibi bazı özellikleri yoktur ImageView.setLayerType. Çalışma zamanı hatasını önlemek için basitçe:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Bu yaklaşım, aşağıdaki istisnaların ele alınmasında da kullanılmalıdır:

} catch (NetworkOnMainThreadException nomte) {
   // log this exception
} catch (SocketTimeoutException socketTimeoutException) {
   // log this exception
}

NetworkOnMainThreadExceptionAndroid 2.3'te uygulanmadığından, sınıf yüklendiğinde (ve daha önce değil!) istisna java.lang.VerifyErroroluşur.


1
Aynısı benim için de oldu. Daha java.lang.ReflectiveOperationExceptioneski Android sürümlerinde (örneğin 4.2) bulunmayan kullandım, ancak Lint beni bu konuda uyarmadı ...
WonderCsabo

Benim için sorun, CameraAccessExceptionkodumun Android 5.0'da tanıtılan a'yı deklare etmesi , ancak bir Android 4.3 cihazında çalıştırdığımda VerifyError atılıyor.
Piasy

7

Retrolambda kullanıyorsanız, bir arayüze statik bir yöntem eklemiş olabilirsiniz (buna yalnızca Java 8'de izin verilir).


7

Bu aynı zamanda, maksimum 65K boyuta kadar sınırlı olan Lollypop aşağıdaki sürümlerde referans sınır hatası nedeniyle de ortaya çıkabilir.

Yukarıdaki sorun için olası çözüm

Aşama 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

Adım 2: Uygulamanızı MultiDexApplication ile genişletin, örneğin

public class MyApplication extends MultiDexApplication

3. Adım: attachBaseContext'i geçersiz kılın

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

Adım 4: Sonraki adım, aşağıdakileri uygulamalarınızın build.gradle android kısmına eklemektir.

 dexOptions {
      preDexLibraries = false
   }

Adım 5: Son olarak, uygulamalarınızın genel kısmının ardından build.gradle

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

Ayrıntılar için lütfen kontrol edin

https://developer.android.com/tools/building/multidex.html


Benim için çalıştı !! Uygulama sınıfını "MultiDexApplication" olarak değiştirmeyi unutmayın.
Ganesh

Beni büyük bir zaman kurtardın adamım. Kabul edilen cevap bu olmalıdır.
Rohit Rokde

3

Benim durumumda, Eclipse Indigo'dan Eclipse Juno'ya güncellediğimde oldu: Gerçek nedenin ne olduğundan emin değilim, ancak uzun süredir üzerinde çalıştığım Android projem bu istisna nedeniyle çalışmayı durdurdu.

Sonra birçok bunu düzeltmeye çalışıyorum saatleri, kendim için bir çözüm buldular.

Android projemde, aynı çalışma alanında bulunan başka bir proje (örneğin "MyUtils") kullanıyorum. Bu yüzden aşağıdakileri yapmam gerekiyordu:

Android projesine sağ tıklayın -> Oluşturma yolu -> Yapı yolunu yapılandırın

Şimdi, "Sipariş Et ve Dışa Aktar" sekmesine gidin ve "MyUtils" i işaretleyin. İşte bu: Bu sinir bozucu istisnadan kurtuldum.


Benim için sorunu düzelten şey buydu ... Büyük bir projemiz var, bu yüzden etrafta dolaştım ve her şeyin "ihracat" bayrağına baktım. PITA sorunu.
Someone Somewhere


2

Soruna iki android projesi arasındaki uyumsuzluk da neden olabilir. Örneğin, "com.yourcompany" paketini kullanarak bir android kitaplığı geliştirdiyseniz, o zaman ana uygulamanın projesini temel paket ile aynı paketi kullanırsınız. Ardından, ana uygulamanızın sürümünü değiştirmek istediğinizi varsayalım, böylece manifest dosyasının değerlerini değiştirirsiniz: Sürüm Kodu ve Sürüm adı. Uygulamanızı kitaplık için bu değerleri değiştirmeden çalıştırırsanız, kitaplıktaki bir nesnede herhangi bir yöntem çağrısında doğrulama hatası alırsınız.


2

Ben de aynı sorunu yaşadım. 2.1 r1 ile inşa ediyordum ve yeni adt 17 ile 2.1 r3'e güncelledim. Javamail'in mail.jar'ında doğrulama hataları vardı ve bu beni deli ediyordu. Sorunu şu şekilde çözdüm:

  1. bir libs / klasör oluşturdu ve kavanozları ekledi.
  2. sağ tıklayın> kaynak klasör olarak ekle

yeniden inşa etmeyi denedim ve başarısız oldu. Bir kaynak klasör olarak libs / dizini kaldırdım ve derleme yolundaki 3 jar dosyasına referansları kaldırdım. Daha sonra libs / klasörünü tekrar ekledim ve libs / klasöründeki her bir jar dosyasını oluşturma yoluna ekledim. Şimdi beklendiği gibi çalışıyor. Bu garip bir çözüm ama benim için çalıştı.


2

İçinde Eclipse 4.x, bu sorunla karşılaşırsanız, aşağıdakileri deneyin:

  1. dahil edilen tüm 3. taraf kavanozlarını Kullanıcı-Libaray'a taşıma
  2. kullanıcı kütüphanesini android kütüphanesinden önce yukarı taşıyın ve Sipariş ve Dışa Aktar sekmesinde kontrol edin
  3. temizlemek ve çalıştırmak için yeniden inşa etmek

2

Bu sorunu bir SDK güncellemesinden sonra yaşıyorum. Derleyicinin harici kütüphanelerimle sorunları vardı. Bunu yaptım: projeye sağ tıklayın, ardından "android Araçları> destek kitaplığı ekle ..." bu proje kitaplığıma "android-support-v4.jar" yükleyin.


2

java.lang.VerifyErrorderlenmiş bayt kodunuzun, Android'in çalışma zamanında bulamayacağı bir şeye atıfta bulunduğu anlamına gelir. Bu doğrulamaError , her iki Cihazda da aynı yapıyı çalıştırmış olsam bile yukarıdaki sürümde olmayan kitkat4.4 ve daha düşük sürümle beni sorun . eski sürümün jackson json ayrıştırıcısını kullandığımda gösteriyorjava.lang.VerifyError

compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'

Daha sonra Dependancy'yi çekirdek kitaplık olmadan en son sürüm 2.2'den 2.7'ye değiştirdim (core2.7'yi eklediğimde doğrulamaError veriyor), sonra çalışıyor. Bu, Yöntemlerin ve diğer core içeriğinin Databind2.7'nin en son sürümüne geçirildiği anlamına gelir . Bu benim sorunlarımı çözer.

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'

1

Ben de VerfiyError'ı alıyorum ... gerçek bir neden bulamıyorum. Yeni kod satırlarının bir yönteme (Eclipse, 'Extract Method ...') sarılmasına yardımcı olur. Yani benim durumumda sebep desteklenmeyen bir yöntem değil.


1

Çok benzer bir problemim vardı. Apache POI kavanozlarını ekledim ve android SDK 22.3'e güncellediğimde sorun çıktı.

Android Özel Kitaplıklarını kontrol ettirdim, bu yüzden bu, android SDK ile ortak bir sorun değildi. Tüm Apache POI kavanozlarının işaretini kaldırdım ve tek tek ekledim. Ben bulundu poi-3.9-20121203.jar önce olmalıdır poi-OOXML 3.9-20121203.jar . Aksi takdirde işe yaramayacaktır.


1

Testleriniz varsa, build.gradedosyanızdan bu satırı yorumlamayı deneyin :

testCoverageEnabled = true

Benim için bu, Java 1.7 özelliklerini kullanan sınıflarda, özellikle de dizgi anahtarı deyimlerinde VerifyError istisnalarına neden oldu.


1

Git çekme yaptıktan sonra aynı sorunu yaşadım.

Çözüm: Build -> Clean Project.

Bu yardımcı olur umarım.


1
Gerçekten bir şey çekmedim veya yapmadım, ama temiz yaptı, teşekkürler!
Alexandre G

1

Başka bir vaka buldum.

Koşullar:

  • Retrolambda kullanın (gerekli olup olmadığından emin değil);
  • Bir arayüzde statik bir yöntem yapın.

Ve sonuç patlama! Bu arayüzü kullanan sınıfa erişmeye çalışırken java.lang.VerifyError. Görünüşe göre Android (benim durumumda 4.4. *) Arayüzlerde statik yöntemleri sevmiyor. Statik yöntemin arayüzden kaldırılması VerifyError'ın ortadan kalkmasını sağlar.


0

Ayrıca kavanozlarımın bir kullanıcı kitaplığında olduğu gibi bu sorunu yaşadım ...

Bunu çözme şeklim onları lib klasörüne eklemek ve ardından onları eclipse'deki yapı özelliklerine eklemekti ...

Bunu ilk yaptığımda işe yaramadı ama sonra onları kaldırıp tekrar okudum ve çalışmaya başladı ...

biraz tuhaf! ama şimdi her zaman çalışıyor.

İyi şanslar


0

SDK 2.1'de bulunan Android API yöntemlerini / sınıfını kodladım ve Android 1.6 öykünücüsünde çalıştırmaya çalışıyordum. Yani bu hatayı aldım.

ÇÖZÜM: Emülatör sürümünü düzeltmek için değiştirildi.

BU BENİM İÇİN ÇALIŞTI .. Teşekkürler.


0

Gelecek nesiller için, bu hatayı aldım çünkü kullanıyordum Arrays.copyOf() Java 1.5 tarafından desteklenen bir yöntem olmayan Android Seviye 4'e karşılık gelen bir yöntem . 1.6 altında geliştirilen kütüphaneleri dahil ederek çalıştığım için iyi derlediler. Sorunları yalnızca söz konusu sınıfı Android projeme taşıdığımda gördüm - sonra hata vurgulandı.

Uncaught handler: thread main exiting due to uncaught exception
java.lang.VerifyError: com.j256.ormlite.dao.BaseDaoImpl$DaoConfigArray
  at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:71)
  at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:1)
  at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:429)
  at java.lang.ThreadLocal.get(ThreadLocal.java:66)

O hatta bir şey yapmaya çalışıyordum new DaoConfigArray ve o sınıfta şu satır vardı:

// copyOf is only supported in Java >= 1.6
doArray = Arrays.copyOf(daoArray, newLength);

Bunu daha da karmaşık hale getiren şey, satır 71'in ThreadLocalbaşlangıçta sorunun nedeni olduğunu düşündüğüm bir ilklendirmeye işaret ediyor olmasıydı.

private static final ThreadLocal<DaoConfigArray> daoConfigLevelLocal
    = new ThreadLocal<DaoConfigArray>() {
    @Override
    protected DaoConfigArray initialValue() {
        return new DaoConfigArray();
    }
};

0

Bağımlı projeleri kaldırmak ve bunun yerine bağımlı projeleri derlemek zorunda kaldım ve bunları kütüphaneler klasörüne dahil ettim.


0

Eminim amacım sizinkinden farklıydı, ancak bu "Android java.lang.VerifyError" arandığında en çok izlenenlerden biri olduğundan, gelecek nesil için buraya kaydetmeyi düşündüm.

Şu satırlarda bazı derslerim vardı:

public class A { ... }
public class B extends A { ... }
public class C extends A { ... }

Ve bunu yapan bir yöntem:

A[] result = null;
if (something)
    result = new B[cursor.getCount()];
else
    result = new C[cursor.getCount()];

// Fill result
...

Bu kod dosyada olduğu sürece, bu yöntemi içeren sınıf ilk yüklendiğinde bir VerifyError hatası alacağım. Bunu iki ayrı yönteme bölmek (biri yalnızca B'lerle, diğeri yalnızca C'lerle ilgilenen) sorunu çözdü.


1
Ve bu arada, benim kökten neden olduğum yöntem, VerifyError kaybolana kadar yöntem gövdelerini yorumlamak (return null / 0 / false ile değiştirerek), ardından tekrar geri gelene kadar öğeleri geri yüklemekti; daha sonra problem yöntemi içinde aynısını yapmak. Hata ayıklamanın eğlenceli bir yolu değil, ama işe yaradı.
benkc

0

Benim durumumda, bu hata, google oyun hizmetim en yeni olmadığı için ortaya çıkıyor .

Projeniz .jar'daki bazı sınıfları desteklemiyorsa, bu hata oluşur (ör. ImageView.setLayerType, AdvertisingIdClient, vb.).


0

Sadece dx ' edilmeyen kitaplardan dolayı değil, meydana gelen başka bir durumu belirledim . Çok uzun doInBackground metodu olan bir AsyncTask'ım var. 145'den fazla çizgiye sahip bu yöntem nedense kopmaya başladı. Bir 2.3 uygulamasında gerçekleşti. Bazı parçaları yöntemlere dahil ettiğimde iyi çalıştı.

Yani doğru değildi sınıf bulamadık olanlar için dx 'ed senin yöntemin uzunluğunu azaltmayı deneyin.


0

Benim için sorun aslında sınıfta bir yerde Java 7 özelliği (ve API 19+) olan çoklu yakalama cümlesini kullanmamdı. Bu nedenle, VerifyError19'dan önceki tüm cihazlarda çökebilir .


0

Benim için compileSdkVersion ve buildToolsVersion arasında bir korelasyon içindeydi. Sahiptim:

compileSdkVersion 21
buildToolsVersion '19.1.0'

Ben şu şekilde değiştirdim:

compileSdkVersion 21
buildToolsVersion '21.1.2'

0

Benim için bu compileSdkVersion sorunudur. API düzey 21'i belirli bir android uygulamasında kullandığımda ( https://github.com/android10/Android-AOPExample ):

compileSdkVersion 21

java.lang.verifyerror oluştu. Bu yüzden compileSdkVersion'ı 19 olarak değiştirdim

compileSdkVersion 19

İyi çalıştı. Bunun SDK buildTools sorunu olabileceğini düşünüyorum ve API seviyesi <21 olduğunda sorun yok gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.