Android java.lang.VerifyError?


100

私のAndroidアプリでは、常にVerifyErrorsを受け取ります!そして、私はその理由を理解できません。外部JARを含めるときはいつでも、アプリを起動しようとすると常にVerifyErrorsを受け取ります(Apache Log4jを含めたときは1回を除きます)。

私は通常、ライブラリのソースを取得してプロジェクトに追加することでこれを回避しますが、GDataクライアントライブラリを配置しようとしています

ソースでこれを取得できますが、依存関係(mail.jar、activation.jar、servlet-api.jar)は取得できないため、検証エラーが発生します。この問題の根源になりたいのですが。私はインターネットで調べましたが、すべてが不完全なクラスファイルについて話しているようです。私にはわかりません。


GDataはAndroidでは機能しないことがわかっています。android-developers Googleグループでトピックを検索してください。今後のSDKリリースでは、Android向けの公式GDataを待つ必要があります。
mparaz 2009年

1
Gradleを使用してプロジェクトをビルドしていますか?私がこの問題を抱えていたのは、assembleReleaseタスクの前にcleanタスクを実行するのを忘れたときです
IgorGanapolsky 2013年

回答:


35

Androidは別のクラスファイル形式を使用します。Android SDKに同梱されている「dx」ツールを介してサードパーティのJARファイルを実行していますか?


4
「dx」ツールに関するいくつかの情報があれば、きっと気になるでしょう。
Daniel Magnusson、

2
SDKバージョンのリストの下にあるAndroidプロジェクト設定の「ライブラリ」セクションを確認してください。ビルドで依存している外部プロジェクトがそこに表示され、横に緑色のチェックマークが付いていますか?
アダム

@Adamそのコメントをありがとう!あなたは私が理解しようと非常に多くの時間を費やした問題を解決しました。
Simon Forsberg

118

LogCatを見て、verifyerrorの原因を調べます。おそらく、使用しているAndroid SDKレベルではサポートされていないjava.langクラスのメソッド(たとえば、String.isEmpty())です。


4
これは実際の回答としてマークする必要があります。ユーザーから散発的なエラーが発生し、APIの
v。3

1
同意した。私はこれに何度か遭遇しましたが、そのたびに2.xをターゲットにし、1.5にないものを使用しています。あなたを驚かせるものは、クラスが最初に作成/使用されたときにのみスローされるので、それが散発的に発生するものである場合、しばらくは気付かない可能性があります。
mbafford 2010

1
この場合は、次のリンクを確認してください:developer.android.com/resources/articles/…およびdoandroids.com/blogs/2010/5/8/backwards-compatibility
MyName

「これは本当の答えとしてマークされるべきです。」私は同じ問題があるので、このスレッドに出くわしました。これが本当の答えとしてマークされなかった理由は、LogCatがライブラリのインスタンスを作成している場所への行参照を提供しているが、問題が発生している行ではないためだと思います。つまり、この場合、LogCatはほとんど役に立ちません。
NotACleverMan

WARNレベルのlogcatは、検証に失敗した理由の詳細を表示する必要があります
mmeyer

56

android-developersから:

「adb logcat」からの出力は、見つからなかったクラスと、参照が正しくないクラスを示しています。場所は、特定のDalvik命令まで識別されます。トリックは、例外の上のログを調べることです。


6
例外を上から見ると、エラーの原因となったメソッドを特定するのにも役立ちました。私にとって、それはあなたがそのカップケーキに...しようとした場合、最終的には、ちょっと明らかである表現Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIRだった
マヌエル

2
ありがとう!これは私が得ていた問題でした...有用なログは例外のすぐ上にありました:(WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;今度はDatatypeFactoryなしで行う方法を理解するために)
pyko

エラーの上を見ることは私にも役立ちました。「VFY:」で始まるメッセージを探します。私の場合、「大きなメソッドを任意に拒否します」と表示されていました。おそらくそれは膨大な数の配列を作成するためです:)とにかく、先端に感謝します!
Amplify91

ありがとう!私の問題は例外ハンドラーにあることがわかりました:NetworkOnMainThreadExceptionはAndroid 2.3に実装されていません。私の返事を見下ろしてください。再度、感謝します!:)
セラフィムの

ありがとう!私の場合、私はAndroid2.3をターゲットとしていて、android-support-v4.jarを使用していましたが、このjarでクラスが見つかりませんでした。プロパティでこのクラスの「エクスポート」タブをクリックして、android2.3.3ライブラリの上に移動する必要がありました。まあ、このエクスポートは本当にはっきりと理解できないものです...
xtof54

14

これを機能させるには、ライブラリーのjarをソースフォルダーの1つに追加する必要があります(すでにEclipseライブラリーとして追加した場合でも、それをソースとして追加する必要があります)。

  1. プロジェクトにディレクトリを作成し(ex "libs")、そこにライブラリjarを配置します。
  2. (フォルダーを右クリックして、「ビルドパス」->「ソースフォルダーとして使用」を選択して)、ビルドクラスパスにディレクトリを追加します。
  3. プロジェクトをリビルドします。

JARの代わりに「プロジェクトライブラリ」を「libs」フォルダに追加できますか?
アフメド

奇妙なことに、私はそれを通常のJavaライブラリとして追加する必要がありました-Eclipseの「Android」メニューの下のライブラリとしてではありません。
フィル

Maksim、素晴らしいソリューションに感謝します。
Arun Badole 2014

8

それは今私に起こりました。このエラーは、デバイスにある新しいSDKのメソッドを使用していたために発生しました。

Android 1.5デバイスはこれを使用してAPKをインストールしました:

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

8

面白いケースを見つけました。私が使う:

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

そのため、Android 2.3には、のような新しいAndroid 4機能の一部が含まれていませんImageView.setLayerType。実行時エラーを簡単に回避するには:

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

このアプローチは、例外処理にも使用する必要があります。

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

NetworkOnMainThreadExceptionはAndroid 2.3に実装されていないため、クラスがロードされると(前ではなく)、例外java.lang.VerifyErrorが発生します。


1
同じことが私にも起こりました。java.lang.ReflectiveOperationException以前のAndroidバージョン(4.2など)に含まれていないものを使用しましたが、Lintはこれについて警告しませんでした...
WonderCsabo

私にとって問題は、コードCameraAccessExceptionがAndroid 5.0で導入されたを宣言していることですが、Android 4.3デバイスで実行するとVerifyErrorがスローされます。
Piasy

7

Retrolambdaを使用している場合は、静的メソッドをインターフェースに追加した可能性があります(Java 8でのみ許可されています)。


7

これは、Lollypop以下のバージョンでの参照制限エラーが原因で発生することもあり、最大65Kサイズに制限されています。

上記の問題の考えられる解決策

ステップ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

ステップ2:アプリケーションをMultiDexApplicationで拡張します。

public class MyApplication extends MultiDexApplication

ステップ3:attachBaseContextをオーバーライドする

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

ステップ4:次のステップは、次のコードをアプリのAndroid部分に追加することです。

 dexOptions {
      preDexLibraries = false
   }

ステップ5:最後に、アプリの一般的な部分に続くbuild.gradle

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

詳細はチェックアウトしてください

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


私のために働いた!! Applicationクラスを「MultiDexApplication」に変更することを忘れないでください。
ガネーシャ2015

あなたは私に大きな時間を節約しました。これは受け入れられる答えになるはずです。
Rohit Rokde 2016

3

私の場合、それはEclipse IndigoからEclipse Junoに更新したときに起こりました:本当の理由はわかりませんが、長い間取り組んでいる私のAndroidプロジェクトは、その例外のために作業を停止しました。

時間もそれを修正しようとした後、私は解決策を見つけました。

私のAndroidプロジェクトでは、同じワークスペースにある他のプロジェクト(たとえば、「MyUtils」)を使用しています。だから、私は次のことをする必要がありました:

Androidプロジェクトを右クリック->ビルドパス->ビルドパスの構成

次に、[注文とエクスポート]タブに移動し、[MyUtils]をオンにします。それだけです。この厄介な例外を取り除きました。


それが私のためにそれを修正したものです...私たちは大規模なプロジェクトを持っているので、周りに行き、すべての「エクスポート」フラグをチェックしました。PITAの問題。
誰かどこか

3

この問題を解決するGradleバージョンを2.0.0-alpha2から1.5.0にダウングレードしました。


2

この問題は、2つのAndroidプロジェクト間の不一致によっても発生する可能性があります。たとえば、「com.yourcompany」パッケージを使用してAndroidライブラリを開発した場合、ベースパッケージと同じパッケージを使用するメインアプリケーションのプロジェクトがあります。次に、メインアプリのバージョンを変更して、マニフェストファイルの値(バージョンコードとバージョン名)を変更するとします。ライブラリのこれらの値を変更せずにアプリを実行すると、ライブラリからオブジェクトのメソッドを呼び出すと、検証エラーが発生します。


2

同じ問題がありました。私は2.1 r1でビルドしていて、新しいadt 17で2.1 r3に更新しました。javamailのmail.jarでエラーを確認したところ、気が狂いました。これが私が問題をどのように解決したかです:

  1. libs /フォルダーを作成し、jarを追加しました。
  2. 右クリック>ソースフォルダとして追加

再構築を試みましたが失敗しました。libs /ディレクトリをソースフォルダーから削除し、ビルドパスの3つのjarファイルへの参照を削除しました。次に、libs /フォルダーを再度追加し、libs /フォルダー内の各jarをビルドパスに追加しました。これで期待どおりに動作します。これは奇妙な回避策ですが、私にとってはうまくいきました。


2

Eclipse 4.x、この問題が発生した場合は、以下を試してください。

  1. 含まれているすべてのサードパーティのjarをUser-Libarayに移行します
  2. android libの前にユーザーlibを上に移動し、[注文とエクスポート]タブで確認します。
  3. クリーンにして再構築して実行する

2

SDKのアップデート後にこの問題が発生しました。コンパイラは私の外部ライブラリに問題がありました。私はこれを行いました:プロジェクトを右クリックして、「android Tools> add support library ...」をこのプロジェクトライブラリ「android-support-v4.jar」にインストールします。


2

java.lang.VerifyErrorコンパイルされたバイトコードが、Androidが実行時に検出できないものを参照していることを意味します。このverifyError は、両方のデバイスで同じビルドを実行したとしても、上記のバージョンではなく、kitkat4.4以下のバージョンでのみ問題を引き起こします。古いバージョンのジャクソンjsonパーサーを使用したときに表示されます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.+'

次に、依存関係をコアライブラリなしの最新バージョン2.2から2.7に変更しました(core2.7を含めると、verifyErrorが表示されます)。これは、メソッドとコアの他のコンテンツが最新バージョンのDatabind2.7に移行されることを意味します。これは私の問題を修正します。

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

1

VerfiyErrorも表示されます...本当の理由が見つかりません。新しいコード行をメソッド(Eclipse、 'Extract Method ...')にラップするのに役立ちます。だから私の場合、理由はサポートされていない方法ではありません。


1

非常に似た問題がありました。私はApache POI jarを追加しており、android SDK 22.3に更新すると問題が発生しました。

私はAndroid Private Librariesをチェックしていたので、これはAndroid SDKの一般的な問題ではありませんでした。すべてのApache POI jarのチェックを外し、1つずつ追加しました。私は見つけポイ-3.9-20121203.jarが前にあるべきPOI-OOXML-3.9-20121203.jar。そうしないと機能しません。


1

テストがある場合は、build.gradeファイルから次の行をコメント化してみてください。

testCoverageEnabled = true

私にとって、これはJava 1.7機能を使用するクラス、特に文字列スイッチステートメントでVerifyError例外を引き起こしました。


1

git pullを実行した後も同じ問題が発生しました。

解決策:ビルド->クリーンプロジェクト。

お役に立てれば。


1
引っ張ったり、実際には何もしなかったが、きれいにしてくれた、ありがとう!
Alexandre G

1

別のケースを見つけました。

条件:

  • Retrolambdaを使用します(必要かどうかは不明です)。
  • インターフェイスで静的メソッドを作成します。

そして結果はブームです!そのインターフェースを使用するクラスにアクセスしようとすると、java.lang.VerifyError。Android(私の場合は4.4。*)はインターフェースの静的メソッドが好きではないようです。インターフェイスから静的メソッドを削除すると、VerifyErrorがなくなります。


0

私のjarファイルがユーザーライブラリにあるのと同様に、この問題も発生しました...

私がこれを解決した方法は、それらをlibフォルダーに追加してから、Eclipseのビルドプロパティに追加することでした...

初めてこれを実行したときは機能しませんでしたが、それらを削除して再度追加すると、機能し始めました...

少し奇妙なもの!今はいつも働いています。

幸運を


0

SDK 2.1にあるAndroid APIメソッド/クラスをコーディングし、Android 1.6エミュレーターで実行しようとしました。だから私はそのエラーを得ました。

解決策: 正しいエミュレータバージョンに変更しました。

これは私のために働いたありがとう。


0

後世のためにArrays.copyOf()、Androidレベル4に対応するJava 1.5でサポートされるメソッドではない方法を使用していたため、このエラーが発生しました。1.6で開発されたライブラリを含めて実行していたため、正常にコンパイルされました。問題のクラスをAndroidプロジェクトに移動したときにのみ問題が発生し、エラーが強調表示されました。

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)

その行で私はやろうとしていました、new DaoConfigArrayそしてそのクラスは次の行を持っていました:

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

さらに複雑になったのは、71行目がThreadLocal初期化を指していて、それが最初に問題の原因であると私が思ったということです。

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

0

依存プロジェクトを削除する必要があり、代わりに依存プロジェクトをコンパイルしてjarファイルにし、libsフォルダーに含めました。


0

私の原因はあなたのものとは違っていたと思いますが、これは「Android java.lang.VerifyError」を検索する際のトップヒットの1つであるため、後世のためにここに記録したいと思いました。

私は次のようにいくつかのクラスを持っていました:

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

そしてそれをした方法:

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

// Fill result
...

このコードがファイルにある限り、このメソッドを含むクラスが初めて読み込まれたときにVerifyErrorが発生します。それを2つの別々のメソッド(Bのみを処理する方法とCのみを処理する方法)に分割すると、問題が修正されました。


1
そして、ちなみに、根本原因は、VerifyErrorがなくなるまでメソッド本体をコメント化し(return null / 0 / falseに置き換えて)、それから再び戻ってくるまで内容を復元することでした。次に、問題のメソッド内で同じことを行います。確かにデバッグする楽しい方法ではありませんが、うまくいきました。
benkc 2013

0

私の場合、このエラーは、google-play-serviceが最新ではないために発生します。

プロジェクトが.jarの一部のクラスをサポートしていない場合、このエラーが発生します(例:ImageView.setLayerType、AdvertisingIdClientなど)。


0

ライブラリがdxされていないだけでなく、それが発生する別の状況を特定しました。非常に長いdoInBackgroundメソッドを持つAsyncTaskがあります。何らかの理由で、145行を超えるこのメソッドは壊れ始めました。2.3アプリで発生しました。一部のパーツをメソッドにカプセル化したところ、うまくいきました。

したがって、正しくdxされなかったクラスを見つけることができなかった場合は、メソッドの長さを短くしてみてください。


0

私にとっての問題は、Java 7機能(およびAPI 19+)であるクラスのどこかでmulti-catch句を使用していたことでした。そのため、VerifyError19未満のすべてのデバイスでクラッシュします。


0

私にとっては、compileSdkVersionとbuildToolsVersionの間の相関関係でした。私が持っていた:

compileSdkVersion 21
buildToolsVersion '19.1.0'

私はそれを次のように変更しました:

compileSdkVersion 21
buildToolsVersion '21.1.2'

0

私にとって、それはcompileSdkVersionの問題です。特定のAndroidアプリケーション(https://github.com/android10/Android-AOPExample)でAPIレベル21を使用した場合:

compileSdkVersion 21

java.lang.verifyerrorが発生しました。そこで、compileSdkVersionを19に変更しました

compileSdkVersion 19

うまくいきました。SDK buildToolsの問題かもしれないと思いますが、APIレベルが21以下の場合は問題ないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.