101

私の Android アプリでは、常に VerifyErrors が発生します。そして、私はその理由を理解できません。外部 JAR を含めるたびに、アプリを起動しようとすると常に VerifyErrors が発生します (ただし、Apache Log4j を含めたときの 1 回を除きます)。

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

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

4

30 に答える 30

118

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

于 2010-02-04T20:17:18.140 に答える
56

android-developersから:

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

于 2010-08-23T15:37:26.510 に答える
35

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

于 2009-03-21T07:22:05.383 に答える
15

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

  1. プロジェクトにディレクトリ (例: "libs") を作成し、そこにライブラリ jar を配置します。
  2. ディレクトリをビルド クラス パスに追加します (フォルダを右クリックし、[ビルド パス] -> [ソース フォルダとして使用] を選択します)。
  3. プロジェクトを再構築します。
于 2010-11-29T08:21:42.900 に答える
8

面白い事例を見つけました。私が使う:

<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が発生します。

于 2013-09-19T19:19:03.537 に答える
8

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

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

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
于 2010-05-11T17:04:10.597 に答える
7

これは、最大 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

Step3: attachBaseContext をオーバーライドする

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

ステップ 4: 次のステップは、アプリ build.gradle の android 部分に以下を追加することです。

 dexOptions {
      preDexLibraries = false
   }

Step5: 最後に、アプリの一般的な部分に従います 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

于 2015-07-30T14:08:51.287 に答える
3

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

于 2015-12-15T04:46:24.197 に答える
3

私の場合、Eclipse Indigo から Eclipse Juno にアップデートしたときに発生しました。本当の理由はわかりませんが、その例外のために、長い間取り組んでいた Android プロジェクトが停止しました。

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

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

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

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

于 2013-03-14T08:20:05.677 に答える
2

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.+'

次に、依存関係をコアライブラリなしで最新バージョンの 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'
于 2016-02-18T12:31:04.183 に答える
2

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

  1. 含まれているすべてのサードパーティの jar を User-Libaray に移行します
  2. Android ライブラリの前にユーザー ライブラリを上に移動し、[注文とエクスポート] タブで確認します。
  3. クリーンアップして再構築して実行する
于 2012-09-23T07:08:36.463 に答える
2

同じ問題がありました。私は 2.1 r1 で構築し、新しい adt 17 で 2.1 r3 に更新しました。javamail の mail.jar で検証エラーが発生し、気が狂いそうになりました。これが私が問題を解決した方法です:

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

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

于 2012-04-01T16:07:42.023 に答える
2

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

于 2012-02-17T13:30:48.850 に答える
2

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

于 2012-11-20T15:23:20.890 に答える
1

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

于 2010-03-21T14:21:14.333 に答える
1

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

条件:

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

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

于 2015-02-22T09:21:43.633 に答える
1

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

解決策: ビルド -> プロジェクトをクリーンアップします。

お役に立てれば。

于 2014-10-23T12:41:07.193 に答える
0

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

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

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

于 2011-02-08T19:24:31.533 に答える
0

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

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

于 2015-08-18T12:57:58.123 に答える
0

ユーザーライブラリに私のjarがあったように、私もこの問題を抱えていました...

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

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

少し奇妙なもの!しかし、今はずっと働いています。

幸運を

于 2011-01-26T15:00:29.790 に答える
0

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

于 2012-11-07T15:58:06.160 に答える
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();
    }
};
于 2012-04-15T20:53:23.337 に答える
0

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

compileSdkVersion 21
buildToolsVersion '19.1.0'

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

compileSdkVersion 21
buildToolsVersion '21.1.2'
于 2016-03-11T21:20:56.810 に答える
0

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

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

于 2015-01-08T03:27:15.517 に答える
0

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

于 2015-09-14T18:12:44.393 に答える