私のAndroidアプリでは、常にVerifyErrorsを受け取ります!そして、理由を理解することはできません。外部JARを含めるたびに、アプリを起動しようとすると常にVerifyErrorsを受け取ります(一度だけ、 Apache Log4jを含めました。)
通常、ライブラリのソースを取得してプロジェクトに追加することでこれを回避しますが、 GData client library を配置しようとしています。
これはソースで取得できますが、依存関係(mail.jar、activation.jar、servlet-api.jar)ではできないため、検証エラーが発生します。私はこの問題の根源にたどり着きたいと思います。私はインターネットを見ましたが、それらはすべて不完全なクラスファイルについて話しているようです?私は知りません。
Androidは異なるクラスファイル形式を使用します。 Android SDKに同梱されている「dx」ツールを使用してサードパーティのJARファイルを実行していますか?
LogCatを見て、verifyerrorの原因を確認してください。おそらく、使用しているAndroid SDKレベルでサポートされていないJava.langクラスのメソッド(たとえば、String.isEmpty())です。
「adb logcat」からの出力は、見つけられなかったクラスと、不正な参照を持つクラスを示しています。場所は、特定のDalvik命令まで識別されます。コツは、例外の上のログを調べることです。
動作させるには、ライブラリのjarをソースフォルダの1つに追加する必要があります(すでにEclipseライブラリとして追加している場合でも、ソースとして追加する必要があります)。
興味深いケースを見つけました。私が使う:
<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
が発生します。
それは今私に起こりました。このエラーは、デバイスにある新しいSDKのメソッドを使用していたために発生しました。
Android 1.5デバイスは、これを使用してapkをインストールしました。
<uses-sdk Android:minSdkVersion="3" Android:targetSdkVersion="4"/>
Retrolambdaを使用している場合は、インターフェイスに静的メソッドを追加した可能性があります(Java 8)でのみ許可されています)。
これは、最大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'
}
}
}
詳細については、チェックアウトしてください
この問題を解決したgradleバージョンを2.0.0-alpha2から1.5.0にダウングレードしました。
私の場合、Eclipse IndigoからEclipse Junoに更新したときに起こりました:本当の理由はわかりませんが、私のAndroid私が長い間取り組んでいるプロジェクトその例外のために時間が止まった。
多くそれを修正しようとして数時間後、私は解決策を見つけました。
Androidプロジェクトでは、同じワークスペースにある他のプロジェクト(たとえば、 "MyUtils")を使用しています。そのため、次のことを行う必要がありました。
Android project-> Build path-> Configure build pathを右クリックします
次に、[注文とエクスポート]タブに移動し、[MyUtils]をオンにします。それだけです:この迷惑な例外を取り除きました。
SDKの更新後にこの問題が発生します。コンパイラは私の外部ライブラリに問題がありました。私はこれを行いました:プロジェクトを右クリックし、「Androidツール>サポートライブラリを追加...」プロジェクトライブラリ「Android-support-v4.jar」にインストールします。
Eclipse 4.x
、この問題が発生した場合は、以下を試してください。
同じ問題がありました。私は2.1 r1でビルドし、新しいadt 17で2.1 r3に更新しました。javamailのmail.jarでエラーを確認していたので、夢中になりました。ここに私が問題を解決した方法があります:
再構築を試みましたが失敗しました。ソースフォルダとしてlibs /ディレクトリを削除し、ビルドパス内の3つのjarファイルへの参照を削除しました。次に、libs /フォルダーを再度追加し、libs /フォルダー内の各jarをビルドパスに追加しました。期待どおりに動作するようになりました。これは奇妙な回避策ですが、私にとってはうまくいきました。
この問題は、2つのandroidsプロジェクト間の不一致によっても発生する可能性があります。たとえば、パッケージ "com.yourcompany"を使用してAndroidライブラリを開発した場合、ベースパッケージと同じパッケージを使用するメインアプリケーションのプロジェクトがあります。マニフェストファイルの値を変更するため、バージョンコードとバージョン名ライブラリのこれらの値を変更せずにアプリを実行すると、オブジェクトのメソッドの呼び出しで検証エラーが発生します図書館。
VerfiyErrorも表示されます...本当の理由が見つかりません。新しい行のコードをメソッドにラップするのに役立ちます(Eclipse、「メソッドの抽出...」)。したがって、私の場合、理由はサポートされていない方法ではありません。
Git pullを作成した後も同じ問題が発生しました。
解決策:ビルド->クリーンプロジェクト。
お役に立てれば。
私は非常に似た問題を抱えていました。 Apache POIjarを追加し、Android SDK 22.3。
Android Private Librariesをチェックしたため、これはAndroid SDKの一般的な問題ではありませんでした。すべてのチェックを外しましたApache POIjarファイルを1つずつ追加しました。poi-3.9-20121203.jarはpoi-ooxml-3.9-20121203.jarそれ以外の場合は機能しません。
別のケースを見つけました。
条件:
そして結果はブームです!そのインターフェースを使用するクラスにアクセスしようとすると、Java.lang.VerifyError。 Android(私の場合は4.4。*)はインターフェースの静的メソッドを好みません。インターフェースから静的メソッドを削除すると、VerifyErrorはなくなります。
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'
テストがある場合は、build.grade
ファイル:
testCoverageEnabled = true
私にとって、これはJava 1.7機能、特に文字列スイッチステートメントを使用するクラスでVerifyError例外を引き起こしました。
依存プロジェクトを削除し、代わりに依存プロジェクトをjarファイルとしてコンパイルし、libsフォルダに含める必要がありました。
私にとっては、compileSdkVersionとbuildToolsVersionの間には相関関係がありました。私が持っていた:
compileSdkVersion 21
buildToolsVersion '19.1.0'
私はそれを次のように変更しました:
compileSdkVersion 21
buildToolsVersion '21.1.2'
私の場合、このエラーは、私のgoogle-play-serviceが最新ではないであるために発生します。
プロジェクトが.jarの一部のクラスをサポートしていない場合、このエラーが発生します(例:ImageView.setLayerType、AdvertisingIdClientなど)。
私にとって、問題は実際にクラスのどこかでマルチキャッチ節を使用していたことでした。これはJava 7機能(およびAPI 19+)です。したがって、VerifyError
すべての19以前のデバイス。
ユーザーライブラリのjarファイルと同様、この問題もありました...
私がこれを解決したのは、それらをlibフォルダーに追加してから、Eclipseのビルドプロパティに追加することでした...
初めてこれをやったときはうまくいきませんでしたが、その後、それらを削除して再度追加し、動作し始めました...
奇妙なもののビット!しかし、現在は常に機能しています。
幸運を
Android SDK 2.1にあるAPIメソッド/クラスをコーディングし、Android 1.6エミュレーターで実行しようとしていました。そのため、エラーが発生しました。
SOLUTION:エミュレーターのバージョンを修正するために変更しました。
これ[〜#〜] worked [〜#〜] FOR ME ..ありがとう。
dx 'edではなく、libsだけでなく、それが発生する別の状況を特定しました。私は非常に長いdoInBackgroundメソッドを持つAsyncTaskを持っています。なんらかの理由で、145行を超えるこのメソッドが壊れ始めました。 2.3アプリで発生しました。いくつかの部分をメソッドにカプセル化しただけで、うまくいきました。
したがって、正しくないクラスを見つけることができなかった場合dx 'ed、メソッドの長さを短くしてみてください。
私の原因はあなたのものとは異なると確信していますが、これは「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のみを扱うメソッド)に分割することで問題が修正されました。
私にとっては、compileSdkVersionの問題です。特定のAndroid=アプリケーション( https://github.com/Android10/Android-AOPExample )でAPIレベル21を使用した場合:
compileSdkVersion 21
java.lang.verifyerrorが発生しました。だから私はcompileSdkVersionを19に変更しました
compileSdkVersion 19
うまくいきました。 SDK buildToolsの問題である可能性があり、APIレベル<21の場合は問題ないようです。
後世のために、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();
}
};