java.lang.VerifyError: Verifier rejected class on Lollipop when using release APK

java.lang.VerifyError: Verifier rejected class on Lollipop when using release APK

我在 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)

我在 class.

中注入了我的工具栏和自定义 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)

清理 build 文件夹解决了问题。不确定为什么 ART 有问题但 Dalvik 没有。

运行 gradle clean 任务没有完全清除我的 build 文件夹。我不得不手动完成,但 clean 可能对某些人有用。

就我而言,原因略有不同。

显然,将 synchronized 语句放在 try/catch 块中会导致 VerifyError,据报道 here on SO and on the official bug tracker

就我而言,原因是混淆器。我在 sumsung note3 上的应用程序关闭是 android 5.0.
我导入了 android-async-http-1.4.9.jar,proguard 是:

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

这还不够。我补充说:

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

bug 消失了。

所以如果你遇到这个bug,深层次的原因可能不明显,需要注意proguard文件。

我遇到了 GoogleTagManager 抛出的同样问题。

java.lang.VerifyError: Verifier rejected class com.google.android.gms.tagmanager.TagManager: com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java.lang.String, int) failed to verify: com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java.lang.String, int): [0x11] returning 'Reference: com.google.android.gms.tagmanager.zzp', but expected from declaration 'Reference: com.google.android.gms.common.api.PendingResult'

合并后发生。我的同事将库从 10.0.1 更新为 10.2.1。清理构建无效。

由于时间关系,我回滚到旧版本,并且成功了。

编辑:由于人们仍在对这个答案进行投票,我想提一下它是从 2017 年开始的。我不确定它是否仍然正确......我希望它对你们中的一些人仍然有用...

就我而言,我只是从“构建、执行、部署”设置中禁用了“即时 运行”选项。

这样做:

  1. 转到“文件”>“设置”>“构建、执行、部署”>“即时 运行”
  2. 取消选中“启用即时 运行...”框并单击“确定”按钮

在我的例子中,错误消息所说的方法是 'bad',有一些未知的错误。从 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) 个步骤 对我有用:

1 - 来自 android studio build 的顶部菜单 --> clean project

2 - 来自 android studio build 的顶部菜单 --> make project

3 - 来自 android studio build 的顶部菜单 --> rebuild project

全部设置..

我的应用程序可以在大多数平台上运行,但在 Android 5.1 上立即崩溃。在阅读 Google 关于它有多棒的信息后,我开始怀疑新的 D8 dex 编译器。禁用 D8,因此它使用原始的 DX 编译器,是唯一对我有用的东西。 项目 clean/invalidate 缓存没有修复它。 我有一些同步块,但删除它们并没有解决问题。 关闭即时 运行 并没有解决它。 禁用混淆器并没有解决它。

以下是禁用 D8 的方法:
-在项目的根目录中创建一个名为 gradle.properties 的文件(如果不存在)
-在里面放这一行:android.enableD8=false

您将收到已弃用的警告。希望 Google 在完全删除已弃用的 DX 之前实际修复 D8。我不知道我的代码中是什么触发了它。我正在使用 Android Studio 3.2.1 和 gradle 4.6 版。 编辑:我已经报告了这个错误,Google 开发人员正在积极调查

也许这可以帮助一些在调试构建中也面临这个问题的人。

我也遇到了同样的问题 error.I 未能配置 Google API 控制台项目。 所以 配置 Google API 控制台项目 跟随 this 并在出现提示时指定您的应用程序包名称。您还需要提供签名证书的 SHA-1 哈希值。有关信息,请参阅验证您的客户端。

验证错误主要发生在某些情况下 如果我们更改了 class A 的定义,但是 class B 是使用旧版本的 class A. 这就是为什么如果我们清除我们的项目并用相同版本的 Java 重建所有 classes,它就会得到解决。

下面link列出了一些可能会出现验证错误的场景。 java.lang.VerifyError – How to solve VerifyError

我在使用 Kotlin 1.5.x1.6.x 时遇到稳定版 Android Studio Arctic Fox Patch 3 (AGP 7.0.3) 的问题。当我设置 "1.5""1.6" 作为我的 Kotlin 语言版本 时,大多数用 Kotlin 编写的 类 都遇到了 VerifyError。原来语言版本是罪魁祸首,将其减少到 "1.4"(同时使用 Kotlin 1.5.x)为我修复了错误:

应用build.gradle.kts:

kotlinOptions {
    languageVersion = "1.4"
    jvmTarget = "11"
}