Android java.lang.VerifyError?


100

Trong ứng dụng Android của mình, tôi luôn nhận được VerifyErrors! Và tôi không thể hiểu tại sao. Bất cứ khi nào tôi bao gồm một JAR bên ngoài, tôi luôn nhận được VerifyErrors khi cố khởi chạy ứng dụng của mình (ngoại trừ một lần, khi tôi bao gồm Apache Log4j.)

Tôi thường giải quyết vấn đề này bằng cách lấy nguồn của thư viện và thêm nó vào dự án của mình, nhưng tôi đang cố gắng đưa thư viện khách GData vào .

Tôi có thể lấy điều này trong nguồn, nhưng đó là các phụ thuộc (mail.jar, kích hoạt.jar, servlet-api.jar) Tôi không thể lấy được, vì vậy tôi gặp lỗi xác minh. Tôi muốn đi vào gốc rễ của vấn đề này một lần và mãi mãi. Tôi đã xem trên internet, nhưng dường như tất cả đều nói về các tệp lớp chưa hoàn chỉnh? mà tôi không biết.


GData được biết là không hoạt động trong Android. Tìm kiếm chủ đề trong Nhóm Google dành cho nhà phát triển android. Chúng tôi cần đợi GData chính thức cho Android, trong một bản phát hành SDK trong tương lai.
mparaz

1
Bạn có đang sử dụng Gradle để xây dựng dự án của mình không? Tôi có vấn đề này khi tôi quên để chạy các nhiệm vụ làm sạch trước khi assembleRelease nhiệm vụ ...
IgorGanapolsky

Câu trả lời:


35

Android sử dụng một định dạng tệp lớp khác. Bạn có đang chạy các tệp JAR của bên thứ ba thông qua công cụ "dx" đi kèm với Android SDK không?


4
Sẽ rất tuyệt nếu có thêm một số thông tin về công cụ "dx".
Daniel Magnusson

2
Tìm trong phần "Thư viện" của tùy chọn dự án Android, bên dưới danh sách các phiên bản SDK. Các dự án bên ngoài mà bạn đang dựa vào trong công trình của mình có hiển thị ở đó không, với dấu tích màu xanh lá cây bên cạnh chúng?
Adam

@Adam CẢM ƠN BẠN về nhận xét đó! Bạn vừa giải quyết một vấn đề mà tôi đã mất quá nhiều thời gian để tìm ra.
Simon Forsberg

118

Nhìn vào LogCat và xem điều gì gây ra lỗi xác minh. Đó có thể là một số phương thức trong lớp java.lang không được hỗ trợ ở cấp SDK android mà bạn đang sử dụng (ví dụ: String.isEmpty ()).


4
Đây phải được đánh dấu là câu trả lời thực sự. Ít nhất đó là gì chính xác trong trường hợp của tôi kể từ khi tôi đã nhận lỗi lẻ tẻ từ người dùng của tôi và tôi theo dõi nó xuống để View.getTag (int) cuộc gọi mà không được hỗ trợ trong câu 3 của API.
Bostone

1
Đã đồng ý. Tôi đã gặp phải điều này một vài lần và mỗi lần đó là tôi đang nhắm mục tiêu 2.x và sử dụng thứ gì đó không phải trong 1.5. Điều khiến bạn khó chịu là nó bị ném khi lớp được tạo / sử dụng lần đầu tiên, vì vậy nếu đó là điều gì đó xảy ra không thường xuyên, bạn có thể không nhận thấy nó trong một thời gian.
mbafford

1
Nếu đúng như vậy, bạn nên kiểm tra các liên kết sau: developer.android.com/resources/articles/…doandroids.com/blogs/2010/5/8/backwards-compatibility
MyName

"Đây nên được đánh dấu là câu trả lời thực." Tôi đi qua chủ đề này vì tôi có cùng một vấn đề. Tôi đoán lý do tại sao điều này không được đánh dấu là câu trả lời thực sự là vì LogCat cung cấp một tham chiếu dòng đến nơi tôi đang tạo một phiên bản của thư viện nhưng không phải dòng gây ra sự cố. Nói cách khác, trong trường hợp này LogCat gần như vô dụng.
NotACleverMan

logcat tại WARN mức sẽ hiển thị cho bạn những thông tin chi tiết về lý do tại sao nó không xác minh
mmeyer

56

Từ các nhà phát triển Android :

Kết quả từ "adb logcat" chỉ ra lớp không thể tìm thấy cũng như lớp có tham chiếu không hợp lệ. Vị trí được xác định theo hướng dẫn cụ thể của Dalvik. Bí quyết là xem các bản ghi bên trên ngoại lệ.


6
Nhìn bên trên ngoại lệ cũng giúp tôi xác định phương pháp gây ra lỗi. Đối với tôi, đó là biểu thức Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR, khá rõ ràng, cuối cùng, nếu bạn thử điều đó trên Cupcake ...
Manuel

2
Cảm ơn! Đây là vấn đề tôi đã nhận được ... các bản ghi hữu ích được ngay trên ngoại lệ: WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;(nay là tìm ra cách để làm mà không DatatypeFactory)
pyko

Nhìn trên lỗi cũng giúp tôi. Tìm kiếm thông báo bắt đầu bằng "VFY:" Trong trường hợp của tôi, thông báo cho biết "tùy ý từ chối phương pháp lớn". Có lẽ vì nó tạo ra một số lượng lớn các mảng :) dù sao, cảm ơn vì mẹo!
Amplify91

Cảm ơn! Tôi thấy vấn đề của mình nằm trên trình xử lý ngoại lệ: NetworkOnMainThreadException không được triển khai trong Android 2.3. Nhìn xuống câu trả lời của tôi. Cảm ơn một lần nữa! :)
Seraphim's

Cảm ơn! Trong trường hợp của tôi, tôi đang nhắm mục tiêu Android2.3 và tôi đang sử dụng android-support-v4.jar và nó không tìm thấy các lớp trong jar này. Tôi đã phải nhấp vào tab "xuất" cho lớp này trong thuộc tính và đưa nó lên trên thư viện android2.3.3. Vâng, xuất khẩu điều này thực sự là một cái gì đó tôi không hiểu rõ ...
xtof54

14

Để làm cho nó hoạt động, bạn cần thêm jar của thư viện vào một trong các thư mục nguồn (ngay cả khi bạn đã thêm nó dưới dạng thư viện nhật thực, bạn vẫn cần thêm nó làm nguồn).

  1. Tạo một thư mục trong dự án của bạn (ví dụ: "libs") và đặt thư viện jar ở đó.
  2. Thêm thư mục vào đường dẫn lớp xây dựng bằng cách (nhấp chuột phải vào thư mục và chọn "Đường dẫn xây dựng" -> "Sử dụng làm thư mục nguồn").
  3. Xây dựng lại dự án của bạn.

Chúng ta có thể thêm "Thư viện dự án" thay vì JAR vào thư mục 'libs' không?
Ahmed

Thật kỳ lạ ... tôi phải thêm nó như một thư viện Java bình thường - không phải như một thư viện trong menu "Android" trong Eclipse.
Phil

Cảm ơn Maksim, giải pháp tốt.
Arun Badole

8

Nó đã xảy ra với tôi ngay bây giờ. Lỗi xảy ra do tôi đang sử dụng các phương pháp từ SDK mới hơn mà thiết bị của tôi có.

Thiết bị Android 1.5 đã cài đặt một gói ứng dụng sau:

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

8

Tôi tìm thấy một trường hợp thú vị. Tôi sử dụng:

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

Vì vậy, một số tính năng mới của Android 4 không được áp dụng trong Android 2.3 như ImageView.setLayerType. Để tránh lỗi thời gian chạy, chỉ cần:

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

Cách tiếp cận này cũng nên được sử dụng với xử lý ngoại lệ:

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

NetworkOnMainThreadExceptionkhông được triển khai trong Android 2.3 nên khi lớp được tải (và không phải trước đó!), ngoại lệ sẽ java.lang.VerifyErrorxảy ra.


1
Điều tương tự cũng xảy ra với tôi. Tôi sử dụng java.lang.ReflectiveOperationExceptionmà không được bao gồm trong các phiên bản Android cũ hơn (ví dụ 4.2), nhưng Lint không cảnh báo tôi về vấn đề này ...
WonderCsabo

Đối với tôi, vấn đề là khai báo mã của tôi a CameraAccessException, được giới thiệu ở Android 5.0, nhưng khi tôi chạy trong thiết bị Android 4.3, VerifyError sẽ xuất hiện.
Piasy

7

Nếu đang sử dụng Retrolambda, bạn có thể đã thêm một phương thức tĩnh vào một giao diện (điều này chỉ được phép trong Java 8).


7

Điều này cũng có thể xảy ra do lỗi giới hạn tham chiếu trên Lollypop các phiên bản dưới đây, trong đó nó bị giới hạn kích thước tối đa tối đa 65K

Giải pháp khả thi cho vấn đề trên

Bước 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

Bước 2: Mở rộng ứng dụng của bạn với MultiDexApplication, ví dụ:

public class MyApplication extends MultiDexApplication

Bước 3: Ghi đè lên tệp đính kèm

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

Bước 4: Bước tiếp theo là thêm phần sau vào phần android của ứng dụng build.gradle của bạn

 dexOptions {
      preDexLibraries = false
   }

Bước 5: Cuối cùng, hãy làm theo phần chung của ứng dụng build.gradle

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

Để biết chi tiết, vui lòng kiểm tra

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


Đã làm cho tôi!! đừng quên thay đổi lớp Ứng dụng thành "MultiDexApplication".
Ganesh

Bạn đã cứu tôi rất nhiều thời gian người đàn ông. Đây phải là câu trả lời được chấp nhận.
Rohit Rokde

3

Trong trường hợp của tôi, nó đã xảy ra khi tôi cập nhật từ Eclipse Indigo lên Eclipse Juno: Tôi không chắc lý do thực sự là gì, nhưng, dự án Android mà tôi đang làm việc trong một thời gian dài đã ngừng hoạt động vì ngoại lệ đó.

Sau nhiều giờ cố gắng khắc phục điều đó, tôi đã tìm ra giải pháp cho mình.

Trong dự án Android của mình, tôi sử dụng dự án khác (giả sử "MyUtils") trong cùng một không gian làm việc. Vì vậy, tôi cần làm những việc sau:

Nhấp chuột phải vào dự án Android -> Đường dẫn xây dựng -> Định cấu hình đường dẫn xây dựng

Bây giờ, hãy chuyển đến tab "Đặt hàng và Xuất" và chọn "MyUtils". Đó là nó: Tôi đã thoát khỏi ngoại lệ khó chịu này.


Đó là những gì đã sửa nó cho tôi ... chúng tôi có một dự án lớn nên tôi đã đi vòng quanh và chỉ kiểm tra cờ "xuất khẩu" trên mọi thứ. Vấn đề PITA.
Ai đó ở đâu đó vào

3

Tôi hạ cấp phiên bản gradle từ 2.0.0-alpha2 xuống 1.5.0 đã giải quyết được vấn đề này.


2

Vấn đề cũng có thể do sự không khớp giữa hai dự án android. Ví dụ: nếu bạn đã phát triển một thư viện android bằng gói "com.yourcompany", thì bạn có dự án của ứng dụng chính bằng cách sử dụng gói tương tự như gói cơ sở. Sau đó, giả sử bạn muốn thay đổi phiên bản của ứng dụng chính của mình, vì vậy bạn thay đổi các giá trị của tệp kê khai: Mã phiên bản và Tên phiên bản. Nếu bạn chạy ứng dụng của mình mà không thay đổi các giá trị đó cho thư viện, bạn sẽ gặp lỗi xác minh trên bất kỳ lệnh gọi phương thức nào trên một đối tượng từ thư viện.


2

Tôi gặp vấn đề tương tự. Tôi đang xây dựng với 2.1 r1 và cập nhật lên 2.1 r3 với adt mới 17. Tôi đã xác minh lỗi trên mail.jar của javamail và điều đó khiến tôi phát điên. Đây là cách tôi giải quyết vấn đề:

  1. đã tạo một thư mục libs / và thêm các lọ.
  2. nhấp chuột phải> thêm làm thư mục nguồn

tôi đã thử xây dựng lại và nó không thành công. Tôi đã xóa thư mục libs / dưới dạng thư mục nguồn và loại bỏ các tham chiếu đến 3 tệp jar trong đường dẫn xây dựng. Sau đó, tôi thêm lại thư mục libs / và thêm từng jar trong thư mục libs / vào đường dẫn xây dựng. Bây giờ nó hoạt động như mong đợi. Đây là một cách giải quyết kỳ lạ nhưng nó đã hiệu quả với tôi.


2

Trong Eclipse 4.x, nếu bạn gặp sự cố này, hãy thử bên dưới:

  1. di chuyển tất cả các lọ của bên thứ 3 được bao gồm vào User-Libaray
  2. di chuyển người dùng lib lên trước lib android và kiểm tra nó trong tab Đặt hàng và xuất
  3. dọn dẹp và xây dựng lại để chạy

2

Tôi gặp sự cố này sau khi cập nhật SDK. Trình biên dịch gặp sự cố với các thư viện bên ngoài của tôi. Tôi đã làm điều này: nhấp chuột phải vào dự án, sau đó "Công cụ android> thêm thư viện suport ..." cài đặt này trên thư viện dự án của tôi "android-support-v4.jar".


2

java.lang.VerifyErrorcó nghĩa là mã bytecode được biên dịch của bạn đang đề cập đến thứ mà Android không thể tìm thấy trong thời gian chạy. VeriError này chỉ vấn đề với tôi với phiên bản kitkat4.4 trở xuống không có trong phiên bản trên của phiên bản đó ngay cả khi tôi đã chạy cùng một bản dựng trong cả hai Thiết bị. khi tôi sử dụng trình phân tích cú pháp jackson json của phiên bản cũ hơn, nó hiển thịjava.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.+'

Sau đó, tôi đã thay đổi Dependancy thành phiên bản mới nhất 2.2 thành 2.7 mà không có thư viện lõi (khi tôi bao gồm core2.7, nó sẽ đưa ra verifyError), sau đó nó hoạt động. có nghĩa là Phương thức và các nội dung khác của lõi được chuyển sang phiên bản mới nhất của Databind2.7 . Điều này khắc phục sự cố của tôi.

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

1

Tôi cũng nhận được VerfiyError ... không thể tìm ra lý do thực sự. Nó giúp gói các dòng mã mới thành một phương thức (Eclipse, 'Phương pháp giải nén ...'). Vì vậy, trong trường hợp của tôi, lý do không phải là một phương pháp không được hỗ trợ.


1

Tôi đã có vấn đề rất giống nhau. Tôi đã thêm Apache POI các lọ và sự cố đã xuất hiện khi tôi cập nhật lên Android SDK 22.3.

Tôi đã kiểm tra Thư viện riêng của Android nên đây không phải là vấn đề phổ biến với Android SDK. Tôi đã bỏ chọn tất cả các lọ Apache POI và thêm từng cái một. Tôi thấy rằng poi-3.9-20121203.jar phải ở trước poi-ooxml-3.9-20121203.jar . Nếu không nó sẽ không hoạt động.


1

Nếu bạn có bài kiểm tra, hãy thử nhận xét dòng này từ build.gradetệp của bạn :

testCoverageEnabled = true

Đối với tôi, điều này gây ra ngoại lệ VerifyError trên các lớp sử dụng các tính năng của Java 1.7, đặc biệt là các câu lệnh chuyển đổi chuỗi.


1

Tôi đã gặp vấn đề tương tự sau khi thực hiện kéo git.

Giải pháp: Xây dựng -> Dự án sạch.

Hi vọng điêu nay co ich.


1
Không thực sự kéo hoặc làm bất cứ điều gì, nhưng một người đã làm sạch, cảm ơn!
Alexandre G

1

Tôi đã tìm thấy một trường hợp khác.

Điều kiện:

  • Sử dụng Retrolambda (không chắc có cần thiết không);
  • Tạo một phương thức tĩnh trong một giao diện.

Và kết quả là sự bùng nổ! java.lang.VerifyError khi cố gắng truy cập lớp sử dụng giao diện đó. Có vẻ như Android (4.4. * Trong trường hợp của tôi) không thích các phương thức tĩnh trong giao diện. Xóa phương thức tĩnh khỏi giao diện làm cho VerifyError biến mất.


0

Tôi cũng gặp sự cố này, cũng như các lọ của tôi trong thư viện người dùng ...

Cách tôi giải quyết vấn đề này là thêm chúng vào thư mục lib và sau đó thêm chúng vào thuộc tính xây dựng trong eclipse ...

Lần đầu tiên tôi làm điều này, nó không hoạt động, nhưng sau đó tôi gỡ bỏ chúng và đọc lại chúng và nó bắt đầu hoạt động ...

một chút kỳ lạ! nhưng bây giờ làm việc mọi lúc.

Chúc may mắn


0

Tôi đã mã hóa các phương thức / lớp API Android trong SDK 2.1 và đang cố gắng chạy nó trên trình mô phỏng Android 1.6. Vì vậy, tôi đã nhận được lỗi đó.

GIẢI PHÁP: Đã thay đổi nó thành đúng phiên bản giả lập.

NÀY LÀM VIỆC CHO ME .. Cảm ơn.


0

Đối với hậu thế, tôi chỉ gặp lỗi này vì tôi đang sử dụng Arrays.copyOf()không phải là phương pháp được hỗ trợ bởi Java 1.5 tương ứng với Android Cấp 4. Vì tôi đang chạy bao gồm các thư viện được phát triển dưới 1.6 nên chúng được biên dịch tốt. Tôi chỉ thấy các vấn đề khi tôi chuyển lớp được đề cập sang dự án Android của mình - sau đó lỗi được đánh dấu.

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)

Trên dòng đó, tôi đã cố gắng thực hiện một new DaoConfigArrayvà lớp đó có dòng sau:

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

Điều khiến nó thậm chí còn phức tạp hơn là dòng 71 đang chỉ đến một lần ThreadLocalkhởi tạo mà tôi nghĩ là lý do ban đầu cho sự cố.

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

0

Tôi đã phải xóa các dự án phụ thuộc và thay vào đó biên dịch các dự án phụ thuộc là jar và đưa chúng vào thư mục libs.


0

Tôi chắc rằng nguyên nhân của tôi khác với nguyên nhân của bạn, nhưng vì đây là một trong những điểm truy cập hàng đầu khi tìm kiếm "Android java.lang.VerifyError", tôi nghĩ rằng tôi sẽ ghi lại nó ở đây cho hậu thế.

Tôi đã có một số lớp học dọc theo dòng:

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

Và một phương pháp đã làm:

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

// Fill result
...

Miễn là mã này có trong tệp, tôi sẽ nhận được Lỗi VerifyError lần đầu tiên lớp chứa phương thức này được tải. Việc chia nó ra thành hai phương pháp riêng biệt (một phương pháp chỉ xử lý B và một phương pháp chỉ xử lý phương pháp C) đã khắc phục được sự cố.


1
Và, nhân tiện, cách tôi root gây ra nó là nhận xét các phần thân phương thức (thay thế bằng return null / 0 / false) cho đến khi VerifyError biến mất, sau đó khôi phục nội dung cho đến khi nó hoạt động trở lại; sau đó làm tương tự trong phương pháp vấn đề. Không phải là một cách thú vị để gỡ lỗi, nhưng nó đã hoạt động.
benkc

0

Trong trường hợp của tôi, lỗi này xảy ra do dịch vụ google-play của tôi không phải là dịch vụ mới nhất .

Nếu dự án của bạn không hỗ trợ một số lớp trong .jar, lỗi này sẽ xảy ra (ví dụ: ImageView.setLayerType, AdvertisingIdClient, v.v.).


0

Tôi chỉ xác định một tình huống khác mà nó xảy ra, không chỉ do libs không dx 'ed. Tôi có một AsyncTask với mehtod doInBackground rất dài. Vì lý do nào đó, phương pháp này với hơn 145 dòng bắt đầu bị phá vỡ. Nó đã xảy ra trên một ứng dụng 2,3. Khi tôi chỉ gói gọn một số phần thành các phương thức, nó hoạt động tốt.

Vì vậy, đối với những người không thể tìm thấy lớp không đúng dx 'ed, hãy thử giảm độ dài phương thức của bạn.


0

Đối với tôi, vấn đề thực sự kết thúc là tôi đang sử dụng mệnh đề multi-catch ở đâu đó trong lớp là một tính năng Java 7 (và API 19+). Vì vậy, nó sẽ gặp sự cố VerifyErrortrên tất cả các thiết bị trước 19.


0

Đối với tôi, nó tương quan giữa compileSdkVersion và buildToolsVersion. Tôi đã có:

compileSdkVersion 21
buildToolsVersion '19.1.0'

Tôi đã thay đổi nó thành:

compileSdkVersion 21
buildToolsVersion '21.1.2'

0

Đối với tôi, đó là vấn đề của compileSdkVersion. Khi tôi sử dụng API cấp 21 trong một ứng dụng Android cụ thể ( https://github.com/android10/Android-AOPExample ):

compileSdkVersion 21

java.lang.verifyerror đã xảy ra. Vì vậy, tôi đã thay đổi compileSdkVersion thành 19

compileSdkVersion 19

Nó hoạt động tốt. Tôi nghĩ rằng đó có thể là vấn đề của SDK buildTools và có vẻ như ổn khi cấp API <21.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.