web-dev-qa-db-ja.com

Android Java.lang.VerifyError?

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

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

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

98
Isaac Waller

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

35
TofuBeer

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

117
Alex

Android-developers から:

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

56
ADB

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

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

興味深いケースを見つけました。私が使う:

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

そのため、新しいAndroid 4の機能は、Android 2.3のような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が発生します。

8
Seraphim's

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

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

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

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

7
Takhion

これは、最大65Kサイズまでに制限されているバージョンより下のLollypopの制限エラーを参照するためにも発生する可能性があります。

上記の問題の可能な解決策

ステップ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:次のステップは、アプリbuild.gradleの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

7

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

3
Sun Zhengchang

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

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

Androidプロジェクトでは、同じワークスペースにある他のプロジェクト(たとえば、 "MyUtils")を使用しています。そのため、次のことを行う必要がありました。

Android project-> Build path-> Configure build pathを右クリックします

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

3
Dmitry Frank

SDKの更新後にこの問題が発生します。コンパイラは私の外部ライブラリに問題がありました。私はこれを行いました:プロジェクトを右クリックし、「Androidツール>サポートライブラリを追加...」プロジェクトライブラリ「Android-support-v4.jar」にインストールします。

2
Andreu

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

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

同じ問題がありました。私は2.1 r1でビルドし、新しいadt 17で2.1 r3に更新しました。javamailのmail.jarでエラーを確認していたので、夢中になりました。ここに私が問題を解決した方法があります:

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

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

2
ThumbsDP

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

2
ZeroOne

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

1
asdf wer

Git pullを作成した後も同じ問題が発生しました。

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

お役に立てれば。

1
Vingtoft

私は非常に似た問題を抱えていました。 Apache POIjarを追加し、Android SDK 22.3。

Android Private Librariesをチェックしたため、これはAndroid SDKの一般的な問題ではありませんでした。すべてのチェックを外しましたApache POIjarファイルを1つずつ追加しました。poi-3.9-20121203.jarpoi-ooxml-3.9-20121203.jarそれ以外の場合は機能しません。

1

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

条件:

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

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

1
Sarge Borsch

Java.lang.VerifyErrorは、コンパイルされたバイトコードがAndroid実行時に見つけられないものを参照していることを意味します。このverifyErrorは、KitKat4.4以前のバージョンではないバージョン両方のデバイスで同じビルドを実行した場合でも、古いバージョンのjackson 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.+'

次に、Dependencyを最新バージョン2.2から2.7なしに変更しましたコアライブラリ(core2.7を含めるとverifyErrorが表示されます)、それから動作します。つまり、coreのメソッドとその他のコンテンツは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
anand krish

テストがある場合は、build.gradeファイル:

testCoverageEnabled = true

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

1
aluxian

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

0
Siddharth

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

compileSdkVersion 21
buildToolsVersion '19.1.0'

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

compileSdkVersion 21
buildToolsVersion '21.1.2'
0
gingo

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

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

0
Allen

私にとって、問題は実際にクラスのどこかでマルチキャッチ節を使用していたことでした。これはJava 7機能(およびAPI 19+)です。したがって、VerifyErrorすべての19以前のデバイス。

0
Jin

ユーザーライブラリのjarファイルと同様、この問題もありました...

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

初めてこれをやったときはうまくいきませんでしたが、その後、それらを削除して再度追加し、動作し始めました...

奇妙なもののビット!しかし、現在は常に機能しています。

幸運を

0
Benjamin Lambe

Android SDK 2.1にあるAPIメソッド/クラスをコーディングし、Android 1.6エミュレーターで実行しようとしていました。そのため、エラーが発生しました。

SOLUTION:エミュレーターのバージョンを修正するために変更しました。

これ[〜#〜] worked [〜#〜] FOR ME ..ありがとう。

0
Piyush Patel

dx 'edではなく、libsだけでなく、それが発生する別の状況を特定しました。私は非常に長いdoInBackgroundメソッドを持つAsyncTaskを持っています。なんらかの理由で、145行を超えるこのメソッドが壊れ始めました。 2.3アプリで発生しました。いくつかの部分をメソッドにカプセル化しただけで、うまくいきました。

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

0
Rafael Coutinho

私の原因はあなたのものとは異なると確信していますが、これは「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のみを扱うメソッド)に分割することで問題が修正されました。

0
benkc

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

compileSdkVersion 21

java.lang.verifyerrorが発生しました。だから私はcompileSdkVersionを19に変更しました

compileSdkVersion 19

うまくいきました。 SDK buildToolsの問題である可能性があり、APIレベル<21の場合は問題ないようです。

0
lilin

後世のために、Java 1.5に対応するAndroidによってサポートされるメソッドではないArrays.copyOf()を使用していたため、このエラーが発生したレベル4。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
Gray