Android java.lang.VerifyError?

100

Di aplikasi Android saya, saya selalu mendapatkan VerifyErrors! Dan saya tidak tahu mengapa. Setiap kali saya menyertakan JAR eksternal, saya selalu mendapatkan VerifyErrors saat mencoba meluncurkan aplikasi saya (kecuali sekali, saat saya menyertakan Apache Log4j.)

Saya biasanya menyiasati ini dengan mengambil sumber pustaka dan menambahkannya ke proyek saya, tetapi saya mencoba untuk meletakkan pustaka klien GData .

Saya bisa mendapatkan ini di sumber, tetapi dependensinya (mail.jar, activation.jar, servlet-api.jar) Saya tidak bisa, jadi saya mendapatkan kesalahan verifikasi. Saya ingin mengetahui akar masalah ini untuk selamanya. Saya mencari di internet, tetapi mereka semua sepertinya berbicara tentang file kelas yang tidak lengkap? yang saya tidak tahu.

Isaac Waller
sumber
GData diketahui tidak berfungsi di Android. Telusuri topik di Grup Google pengembang android. Kami harus menunggu GData resmi untuk Android, di rilis SDK mendatang.
mparaz
1
Apakah Anda menggunakan Gradle untuk membangun proyek Anda? Saya mengalami masalah ini ketika saya lupa menjalankan tugas bersih sebelum tugas assembleRelease ...
IgorGanapolsky

Jawaban:

35

Android menggunakan format file kelas yang berbeda. Apakah Anda menjalankan file JAR pihak ketiga melalui alat "dx" yang disertakan dengan Android SDK?

TofuBeer
sumber
4
Akan luar biasa dengan beberapa info lebih lanjut tentang alat "dx".
Daniel Magnusson
2
Lihat di bagian "Pustaka" pada preferensi proyek Android, di bawah daftar versi SDK. Apakah proyek eksternal yang Anda andalkan dalam bangunan Anda muncul di sana, dengan tanda centang hijau di sebelahnya?
Adam
@Adam TERIMA KASIH untuk komentar itu! Anda baru saja memecahkan masalah yang saya habiskan terlalu banyak waktu untuk mencoba mencari tahu.
Simon Forsberg
118

Lihat LogCat dan lihat apa yang menyebabkan verifikasi kesalahan. Ini mungkin beberapa metode dalam kelas java.lang yang tidak didukung pada tingkat SDK Android yang Anda gunakan (misalnya, String.isEmpty ()).

Alex
sumber
4
Ini harus ditandai sebagai jawaban nyata. Setidaknya apa yang sebenarnya terjadi dalam kasus saya sejak saya mendapatkan kesalahan sporadis dari pengguna saya dan saya melacaknya ke panggilan View.getTag (int) yang tidak didukung di v. 3 API
Bostone
1
Sepakat. Saya telah menjumpai ini beberapa kali dan setiap kali saya menargetkan 2.x dan menggunakan sesuatu yang bukan di 1.5. Apa yang membuat Anda kesal adalah itu dilempar ketika kelas dibuat / digunakan untuk pertama kalinya saja, jadi jika itu adalah sesuatu yang terjadi secara sporadis, Anda mungkin tidak menyadarinya untuk sementara waktu.
mbafford
"Ini harus ditandai sebagai jawaban nyata." Saya menemukan utas ini karena saya memiliki masalah yang sama. Saya menebak alasan mengapa ini tidak ditandai sebagai jawaban sebenarnya adalah karena LogCat memberikan referensi baris ke tempat saya membuat instance pustaka tetapi bukan baris tempat masalahnya disebabkan. Dengan kata lain, dalam hal ini LogCat hampir tidak berguna.
NotACleverMan
logcat di tingkat WARN akan menunjukkan kepada Anda detail mengapa itu gagal verifikasi
mmeyer
56

Dari pengembang android :

Keluaran dari "adb logcat" menunjukkan kelas yang tidak dapat ditemukan serta kelas yang memiliki referensi buruk. Lokasi diidentifikasi hingga ke instruksi Dalvik spesifik. Triknya adalah dengan melihat log di atas pengecualian.

ADB
sumber
6
Melihat di atas pengecualian membantu saya juga untuk mengidentifikasi metode yang menyebabkan kesalahan. Bagi saya, itu adalah ekspresi Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR yang agak jelas, pada akhirnya, jika Anda mencobanya di Cupcake ...
Manuel
2
Terima kasih! Ini adalah masalah yang saya dapatkan ... log yang berguna berada tepat di atas pengecualian: WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;(sekarang untuk mencari tahu bagaimana melakukannya tanpa DatatypeFactory)
pyko
Melihat di atas kesalahan itu membantu saya juga. Cari pesan yang dimulai dengan "VFY:" Dalam kasus saya, dikatakan "secara sewenang-wenang menolak metode besar". Mungkin karena itu menciptakan sejumlah besar array :) bagaimanapun, terima kasih atas tipnya!
Amplify91
Terima kasih! Saya menemukan masalah saya ada pada penangan pengecualian: NetworkOnMainThreadException tidak diimplementasikan di Android 2.3. Lihat balasan saya. Terima kasih lagi! :)
Seraphim
Terima kasih! Dalam kasus saya, saya menargetkan Android2.3 dan saya menggunakan android-support-v4.jar, dan tidak menemukan kelas di jar ini. Saya harus mengklik tab "ekspor" untuk kelas ini di properti dan membawanya ke atas pustaka android2.3.3. Ekspor ini benar-benar sesuatu yang tidak saya mengerti dengan jelas ...
xtof54
14

Untuk membuatnya bekerja Anda perlu menambahkan jar dari perpustakaan ke salah satu folder sumber (meskipun Anda telah menambahkannya sebagai perpustakaan gerhana, Anda masih perlu menambahkannya sebagai sumber).

  1. Buat direktori dalam proyek Anda (misalnya "libs") dan letakkan jar perpustakaan di sana.
  2. Tambahkan direktori ke jalur kelas build dengan (klik tombol kanan pada folder dan pilih "Jalur build" -> "Gunakan sebagai folder sumber").
  3. Bangun kembali proyek Anda.
Maksim Golivkin
sumber
Bisakah kita menambahkan "Project Library" sebagai ganti JAR ke folder 'libs'?
Ahmed
Aneh ... Saya harus menambahkannya sebagai perpustakaan Java normal - bukan sebagai perpustakaan di bawah menu "Android" di Eclipse.
Phil
Terima kasih Maksim, solusi bagus.
Arun Badole
8

Itu terjadi pada saya sekarang. Kesalahan ini terjadi karena saya menggunakan metode dari SDK yang lebih baru yang dimiliki perangkat saya.

Perangkat Android 1.5 memasang apk menggunakan ini:

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

Saya menemukan kasus yang menarik. Saya menggunakan:

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

Jadi beberapa kemampuan Android 4 baru tidak ditanamkan di Android 2.3 seperti ImageView.setLayerType. Untuk menghindari kesalahan runtime:

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

Pendekatan ini harus digunakan juga dengan penanganan pengecualian:

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

NetworkOnMainThreadExceptiontidak diimplementasikan di Android 2.3 jadi ketika kelas dimuat (dan bukan sebelumnya!) pengecualian java.lang.VerifyErrorterjadi.

Seraphim
sumber
1
Hal yang sama terjadi pada saya. Saya menggunakan java.lang.ReflectiveOperationExceptionyang tidak termasuk dalam versi Android yang lebih lama (misalnya 4.2), tetapi Lint tidak memperingatkan saya tentang ini ...
WonderCsabo
Bagi saya masalahnya adalah kode saya menyatakan a CameraAccessException, yang diperkenalkan di Android 5.0, tetapi ketika saya menjalankan di perangkat Android 4.3, VerifyError dilempar.
Piasy
7

Jika Anda menggunakan Retrolambda, Anda mungkin telah menambahkan metode statis ke antarmuka (yang hanya diperbolehkan di Java 8).

Takhion
sumber
7

Ini juga dapat terjadi karena kesalahan batas referensi pada Lollypop versi di bawah, yang dibatasi hingga ukuran maksimal 65K

Solusi yang mungkin untuk masalah di atas

Langkah 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

Langkah2: Perluas aplikasi Anda dengan MultiDexApplication, misalnya

public class MyApplication extends MultiDexApplication

Langkah3: Timpa attachBaseContext

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

Step4: Langkah selanjutnya adalah menambahkan yang berikut ini ke bagian android dari aplikasi Anda build.gradle

 dexOptions {
      preDexLibraries = false
   }

Langkah 5: Terakhir, mengikuti bagian umum dari aplikasi Anda build.gradle

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

Untuk detailnya, silakan checkout

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

Pawan Maheshwari
sumber
Bekerja untuk saya !! jangan lupa untuk mengubah kelas Aplikasi menjadi "MultiDexApplication".
Ganesh
Anda menyelamatkan saya orang besar waktu. Ini harus menjadi jawaban yang diterima.
Rohit Rokde
3

Dalam kasus saya, itu terjadi ketika saya memperbarui dari Eclipse Indigo ke Eclipse Juno: Saya tidak yakin apa alasan sebenarnya, tetapi, proyek Android saya yang saya kerjakan untuk waktu yang lama berhenti berfungsi karena pengecualian itu.

Setelah berjam - jam mencoba memperbaikinya, saya menemukan solusinya untuk saya.

Dalam proyek Android saya, saya menggunakan proyek lain (katakanlah, "MyUtils") yang ada di ruang kerja yang sama. Jadi, saya perlu melakukan hal berikut:

Klik kanan pada proyek Android -> Build path -> Configure build path

Sekarang, masuk ke tab "Order and Export" dan buat "MyUtils" dicentang. Itu dia: Saya menyingkirkan pengecualian yang mengganggu ini.

Dmitry Frank
sumber
Itulah yang memperbaikinya untuk saya ... kami memiliki proyek besar jadi saya berkeliling dan hanya memeriksa bendera "ekspor" pada semuanya. Masalah PITA.
Seseorang di suatu tempat
3

Saya menurunkan versi gradle dari 2.0.0-alpha2 ke 1.5.0 yang memecahkan masalah ini.

Sun Zhengchang
sumber
2

Masalahnya juga bisa disebabkan oleh ketidakcocokan antara dua project Android. Misalnya jika Anda telah mengembangkan pustaka android menggunakan paket "com.perusahaananda", maka Anda memiliki proyek aplikasi utama yang menggunakan paket yang sama sebagai paket dasar. Kemudian katakanlah Anda ingin mengubah versi aplikasi utama Anda, jadi Anda mengubah nilai file manifes: Kode Versi dan Nama versi. Jika Anda menjalankan aplikasi tanpa mengubah nilai-nilai itu untuk pustaka, Anda akan mendapatkan kesalahan verifikasi pada setiap panggilan metode pada objek dari pustaka.

Kosong satu
sumber
2

Saya memiliki masalah yang sama. Saya membangun dengan 2.1 r1 dan memperbarui ke 2.1 r3 dengan adt 17 yang baru. Saya telah memverifikasi kesalahan pada mail.jar javamail dan itu membuat saya gila. Inilah cara saya memecahkan masalah:

  1. membuat folder libs / dan menambahkan toples.
  2. klik kanan> tambahkan sebagai folder sumber

saya mencoba membangun kembali dan gagal. Saya menghapus direktori libs / sebagai folder sumber dan menghapus ref ke 3 file jar di jalur build. Kemudian saya menambahkan folder libs / lagi, dan menambahkan setiap jar di folder libs / ke jalur build. Sekarang berfungsi seperti yang diharapkan. Ini adalah solusi yang aneh tetapi berhasil untuk saya.

ThumbsDP
sumber
2

Dalam Eclipse 4.x, jika Anda mengalami masalah ini, coba di bawah ini:

  1. migrasikan semua toples pihak ketiga yang disertakan ke dalam User-Libaray
  2. naikkan lib pengguna sebelum android lib dan periksa di tab Order and Export
  3. bersihkan dan bangun kembali untuk dijalankan
pengguna1691964
sumber
2

Saya mengalami masalah ini setelah pembaruan SDK. Kompiler mengalami masalah dengan perpustakaan eksternal saya. Saya melakukan ini: klik kanan pada proyek, lalu "Alat android> tambahkan pustaka pendukung ..." pemasangan ini di pustaka proyek saya "android-support-v4.jar".

Andreu
sumber
2

java.lang.VerifyErrorberarti bytecode Anda yang dikompilasi mengacu pada sesuatu yang tidak dapat ditemukan Android saat runtime. VerifikasiError ini Masalah saya hanya dengan kitkat4.4 dan versi yang lebih rendah tidak di versi di atas itu bahkan saya menjalankan build yang sama di kedua Perangkat. ketika saya menggunakan parser jackson json dari versi yang lebih lama itu terlihatjava.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.+'

Kemudian saya telah mengubah Dependancy ke versi terbaru 2.2 menjadi 2.7 tanpa pustaka inti (ketika saya menyertakan core2.7 itu memberikan verifikasiError), kemudian berfungsi. yang berarti Metode dan konten inti lainnya dipindahkan ke versi terbaru Databind2.7 . Ini memperbaiki Masalah saya.

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
anand krish
sumber
1

Saya mendapatkan VerfiyError juga ... tidak dapat menemukan alasan sebenarnya. Ini membantu untuk membungkus baris kode baru ke dalam metode (Eclipse, 'Metode Ekstrak ...'). Jadi dalam kasus saya, alasannya bukanlah metode yang tidak didukung.

asdf wer
sumber
1

Saya memiliki masalah yang sangat mirip. Saya telah menambahkan stoples Apache POI dan masalah muncul ketika saya memperbarui ke Android SDK 22.3.

Saya telah memeriksa Perpustakaan Pribadi Android jadi ini bukan masalah umum dengan SDK Android. Saya menghapus centang semua stoples Apache POI dan menambahkan satu per satu. Saya menemukan bahwa poi-3.9-20121203.jar harus sebelum poi-ooxml-3.9-20121203.jar . Jika tidak, itu tidak akan berhasil.

Grzegorz Bielański
sumber
1

Jika Anda memiliki tes, coba komentari baris ini dari build.gradefile Anda :

testCoverageEnabled = true

Bagi saya ini menyebabkan pengecualian VerifyError pada kelas yang menggunakan fitur Java 1.7, terutama pernyataan saklar string.

aluxian.dll
sumber
1

Saya memiliki masalah yang sama setelah melakukan git pull.

Solusi: Bangun -> Proyek Bersih.

Semoga ini membantu.

Vingtoft
sumber
1
Benar-benar tidak menarik atau melakukan apa pun, tetapi bersih berhasil, terima kasih!
Alexandre G
1

Saya telah menemukan kasus lain.

Kondisi:

  • Gunakan Retrolambda (tidak yakin apakah itu perlu);
  • Buat metode statis dalam sebuah antarmuka.

Dan hasilnya booming! java.lang.VerifyError saat mencoba mengakses kelas yang menggunakan antarmuka itu. Sepertinya Android (4.4. * Dalam kasus saya) tidak menyukai metode statis dalam antarmuka. Menghapus metode statis dari antarmuka membuat VerifyError pergi.

Nama tampilan
sumber
0

Saya juga mengalami masalah ini, seperti stoples saya di perpustakaan pengguna ...

Cara saya menyelesaikan ini adalah dengan menambahkannya ke folder lib dan kemudian menambahkannya di properti build di eclipse ...

Pertama kali saya melakukan ini, itu tidak berhasil, tetapi kemudian saya menghapusnya dan membacanya lagi dan itu mulai berfungsi ...

sedikit yang aneh! tapi sekarang bekerja sepanjang waktu.

Semoga berhasil

Benjamin Lambe
sumber
0

Saya telah mengkodekan metode / kelas Android API yang ada di SDK 2.1, dan mencoba menjalankannya di emulator Android 1.6. Jadi saya mendapat kesalahan itu.

SOLUSI: Mengubahnya menjadi versi emulator yang benar.

INI BERHASIL UNTUK SAYA .. Terima kasih.

Piyush Patel
sumber
0

Untuk anak cucu, saya baru saja mendapatkan kesalahan ini karena saya menggunakan Arrays.copyOf()yang bukan merupakan metode yang didukung oleh Java 1.5 yang sesuai dengan Android Level 4. Karena saya menjalankan termasuk pustaka yang dikembangkan di bawah 1.6, mereka dikompilasi dengan baik. Saya hanya melihat masalah ketika saya memindahkan kelas yang dimaksud ke proyek Android saya - kemudian kesalahan itu disorot.

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)

Pada baris itu saya mencoba untuk melakukan new DaoConfigArraydan kelas itu memiliki baris berikut:

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

Yang membuatnya lebih rumit adalah bahwa baris 71 menunjuk ke ThreadLocalinisialisasi yang menurut saya adalah alasan dari masalah awalnya.

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

Saya harus menghapus proyek dependen dan sebagai gantinya mengkompilasi proyek dependen adalah jar dan memasukkannya ke dalam folder libs.

Siddharth
sumber
0

Saya yakin tujuan saya berbeda dari tujuan Anda, tetapi karena ini adalah salah satu hit teratas saat menelusuri "Android java.lang.VerifyError", saya pikir saya akan merekamnya di sini untuk anak cucu.

Saya memiliki beberapa kelas di sepanjang baris:

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

Dan metode yang:

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

// Fill result
...

Selama kode ini ada di file, saya akan mendapatkan VerifyError saat pertama kali kelas yang berisi metode ini dimuat. Memisahkannya menjadi dua metode terpisah (satu yang hanya berurusan dengan B, dan satu yang berurusan hanya dengan C) memperbaiki masalah.

benkc
sumber
1
Dan, ngomong-ngomong, cara saya melakukan root adalah mengomentari badan metode (mengganti dengan return null / 0 / false) sampai VerifyError hilang, lalu memulihkan hal-hal sampai kembali lagi; kemudian melakukan hal yang sama dalam metode soal. Bukan cara yang menyenangkan untuk men-debug, tetapi berhasil.
benkc
0

Dalam kasus saya, kesalahan ini terjadi karena layanan- google-play saya bukan yang terbaru .

Jika proyek Anda tidak mendukung beberapa kelas dalam .jar, kesalahan ini terjadi (mis. ImageView.setLayerType, AdvertisingIdClient, dll.).

Allen
sumber
0

Saya baru saja mengidentifikasi situasi lain yang terjadi, tidak hanya karena libs bukan dx 'ed. Saya memiliki AsyncTask dengan mehtod doInBackground yang sangat panjang. Untuk beberapa alasan, metode dengan lebih dari 145 baris ini mulai terputus. Itu terjadi di aplikasi 2.3. Ketika saya baru saja merangkum beberapa bagian menjadi metode, itu bekerja dengan baik.

Jadi bagi mereka yang tidak dapat menemukan kelas yang tidak dx dengan benar , coba kurangi panjang metode Anda.

Rafael Coutinho
sumber
0

Bagi saya, masalahnya sebenarnya adalah saya menggunakan klausa multi-catch di suatu tempat di kelas yang merupakan fitur Java 7 (dan API 19+). Jadi itu akan crash VerifyErrordi semua perangkat pra-19.

Jin
sumber
0

Bagi saya itu adalah korelasi antara compileSdkVersion dan buildToolsVersion. Saya punya:

compileSdkVersion 21
buildToolsVersion '19.1.0'

Saya mengubahnya menjadi:

compileSdkVersion 21
buildToolsVersion '21.1.2'
gingo
sumber
0

Bagi saya, ini adalah masalah compileSdkVersion. Saat saya menggunakan API level 21 di aplikasi android tertentu ( https://github.com/android10/Android-AOPExample ):

compileSdkVersion 21

java.lang.verifyerror terjadi. Jadi saya mengubah compileSdkVersion menjadi 19

compileSdkVersion 19

Ini bekerja dengan baik. Saya pikir itu mungkin masalah SDK buildTools, dan tampaknya OK ketika API level <21.

lilin
sumber