web-dev-qa-db-ja.com

java.lang.VerifyError:リリースAPKの使用時に、検証者がLollipopのクラスを拒否しました

5.xデバイスにリリースAPKをインストールすると、このエラーが発生します。 Android Studioから同じコードをプッシュした場合、または4.xデバイスで実行した場合、エラーは発生しません。

Java.lang.VerifyError: Verifier rejected class com.myapp.Android.ui.activity.MainActivity$$ViewInjector due to bad method void com.myapp.Android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.Android.ui.activity.MainActivity) (declaration of 'com.myapp.Android.ui.activity.MainActivity$$ViewInjector' appears in /data/app/com.myapp.Android-2/base.apk)
       at Java.lang.Class.classForName(Class.Java)
       at Java.lang.Class.forName(Class.Java:308)
       at Java.lang.Class.forName(Class.Java:272)
       at butterknife.ButterKnife.findInjectorForClass(ButterKnife.Java:298)
       at butterknife.ButterKnife.inject(ButterKnife.Java:271)
       at butterknife.ButterKnife.inject(ButterKnife.Java:184)
       at com.myapp.Android.ui.activity.MyDrawerActivity.onCreate(MyDrawerActivity.Java:31)

クラスにツールバーとカスタムNavigationDrawerを挿入します。

@InjectView(R.id.toolbar) Toolbar mToolbar;
@InjectView(R.id.nav_drawer) MyNavigationDrawer mNavigationDrawer;

31行目:

ButterKnife.inject(this);

gradle assembleReleaseを使用する場合、Butterknife codegenと異なるものはありますか? ProGuardをまったく使用していません。

他のAndroidビルド設定:

# Android SDK settings
Android_BUILD_MIN_SDK_VERSION=14
Android_BUILD_TARGET_SDK_VERSION=21
Android_BUILD_SDK_VERSION=21
Android_BUILD_TOOLS_VERSION=21.1.2

Logcat

I/art     (21354): Verification error in void com.myapp.Android.ui.activity.MainActivity$$ViewInjector.inject(butterknife.ButterKnife$Finder, com.myapp.Android.ui.activity.MainActivity, Java.lang.Object)
I/art     (21354): void com.myapp.Android.ui.activity.MainActivity$$ViewInjector.inject(butterknife.ButterKnife$Finder, com.myapp.Android.ui.activity.MainActivity, Java.lang.Object) failed to verify: register v4 has type Reference: com.myapp.Android.ui.activity.MainActivity but expected Reference: com.myapp.Android.ui.activity.LoggedInNavActivitya.lang.Object): [0x0]
I/art     (21354): Verification error in void com.myapp.Android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.Android.ui.activity.MainActivity)
I/art     (21354): void com.myapp.Android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.Android.ui.activity.MainActivity) failed to verify: register v1 has type Reference: com.myapp.Android.ui.activity.MainActivity but expected Reference: com.myapp.Android.ui.activity.LoggedInNavActivity
E/art     (21354): Verification failed on class com.myapp.Android.ui.activity.MainActivity$$ViewInjector in /data/app/com.myapp.Android-1/base.apk because: Verifier rejected class com.myapp.Android.ui.activity.MainActivity$$ViewInjector due to bad method void com.myapp.Android.ui.activity.MainActivity$$ViewInjector.reset(com.myapp.Android.ui.activity.MainActivity)
41
Austyn Mahoney

buildフォルダーを削除することで問題は解決しました。 ARTに問題が発生した理由はわかりませんが、Dalvikには問題がありませんでした。

Gradle cleanタスクを実行すると、buildフォルダーが完全に消去されませんでした。私は手動でそれをしなければなりませんでしたが、cleanは一部の人々のために働くかもしれません。

74
Austyn Mahoney

私の場合、原因はわずかに異なっていました。

明らかに、synchronizedステートメントをtry/catchブロック内に置くと、報告されているようにVerifyErrorが発生します ここSO および 公式バグ追跡 =。

12
Sebastiano

私の場合、エラーメッセージが「悪い」と言った方法には、いくつかの未知の障害がありました。 Kotlin lambdaから通常のループに変更することで問題が解決しました。

前(エラーあり):

fun validZipCode(zipcode: String): Boolean {
    val validRegexes = arrayOf(
            "0[0-9]{1}[0-9]{2}", 
            "1[0-2]{1}[0-9]{2}", 
            "1[3-4]{1}[0-9]{2}", 
            "19[0-9]{2}", 
            "2[0-1]{1}[0-9]{2}" 
    )
return validRegexes.any { zipcode.matches(it.toRegex()) }

後:

fun validZipCode(zipcode: String): Boolean {

    val validRegexes = arrayOf(
            "0[0-9]{1}[0-9]{2}", 
            "1[0-2]{1}[0-9]{2}", 
            "1[3-4]{1}[0-9]{2}",
            "19[0-9]{2}", 
            "2[0-1]{1}[0-9]{2}"
    )

    for (regex in validRegexes) {
        if (zipcode.matches(regex.toRegex())) {
            return true
        }
    }

    return false
}
3
Marius Kohmann

私の場合、「ビルド、実行、展開」の設定から「インスタントラン」オプションを無効にしました。残念ながらAndroidスタジオ機能 "Instant Run"はまだ安定していない...

そうするために:

  1. [ファイル]> [設定]> [ビルド、実行、展開]> [インスタントラン]に移動します
  2. [インスタントランを有効にする...]チェックボックスをオフにして、[OK]ボタンをクリックします
2
ahmed_khan_89

私のアプリはほとんどのプラットフォームで動作していましたが、すぐにクラッシュしましたAndroid5.1。Googleの情報を読んで新しいD8 dexコンパイラが疑われるようになりました。プロジェクトのキャッシュのクリーン/無効化では修正されませんでした。同期ブロックがいくつかありましたが、それらを削除しても修正されませんでした。インスタントランをオフにしても修正されませんでした。それを修正しませんでした。

D8を無効にする方法は次のとおりです。
-プロジェクトのルートにgradle.propertiesというファイルが存在しない場合は作成します
-次の行を追加:Android.enableD8 = false

非推奨の警告が表示されます。 Googleが廃止されたDXを完全に削除する前にD8を実際に修正することを願っています。私のコードの何がそれを引き起こすのか分かりません。 Android Studio 3.2.1とgradleバージョン4.6を使用しています。編集:このバグを報告し、Google開発者は積極的に調査しています

2
Georgie

私の場合、原因はプロガードです。 sumsung note3でのアプリのシャットダウンはAndroid 5.0。
Android-async-http-1.4.9.jarをインポートしました。プロガードは次のとおりです。

-dontwarn com.loopj.Android.http.**
-keep class com.loopj.Android.http.**{*;}

それは十分ではありません。追加した:

-dontwarn cz.msebera.**
-keep class cz.msebera.**{*;}

バグがなくなった。

したがって、このバグが発生した場合、根深い理由はおそらく明らかではないかもしれませんが、プロガードファイルに注意する必要があります。

1
user1452641

GoogleTagManagerによってスローされた同じ問題がありました。

Java.lang.VerifyError:Verifierはクラスcom.google.Android.gms.tagmanager.TagManagerを拒否しました:com.google.Android.gms.common.api.PendingResult com.google.Android.gms.tagmanager.TagManager.loadContainerDefaultOnly(Java。 lang.String、int)の検証に失敗しました:com.google.Android.gms.common.api.PendingResult com.google.Android.gms.tagmanager.TagManager.loadContainerDefaultOnly(Java.lang.String、int):[0x11] return '参照:com.google.Android.gms.tagmanager.zzp'、ただし宣言から期待される '参照:com.google.Android.gms.common.api.PendingResult'

マージ後に発生しました。同僚がライブラリを10.0.1から10.2.1に更新しました。クリーンビルドが機能しませんでした。

時間の制約のため、私は古いバージョンにロールバックしましたが、うまくいきました。

0
Irshu

シンプルな(3)ステップ私のために働いた:

1-​​= Android studio build-> clean projectのトップメニューから

2- Android studio build-> make projectのトップメニューから

- Android studio build-> rebuild projectのトップメニューから

すべてのセットアップ..

0
Ali Nawaz

これは、Debug Buildでこの問題に直面している人にも役立つかもしれません。

私も同じエラーに直面していました。GoogleAPI Consoleプロジェクトを設定するのを逃しました。 this の後にGoogle APIコンソールプロジェクトを構成し、プロンプトが表示されたらアプリのパッケージ名を指定します。また、署名証明書のSHA-1ハッシュも提供する必要があります。詳細については、クライアントの認証を参照してください。

0
mannu