51

我在设备上安装我的发行版 APK 时收到此错误5.x。当我从 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)

我在课堂上注入了我的 Toolbar 和一个自定义 NavigationDrawer。

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

第 31 行:

ButterKnife.inject(this);

Butterknife codegen 在使用时有什么不同gradle assembleRelease吗?我根本没有使用 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

日志猫

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)
4

11 回答 11

82

清理build文件夹解决了这个问题。不知道为什么 ART 有问题,但 Dalvik 没有。

运行 gradleclean任务并没有一直清除我的build文件夹。我必须手动完成,但clean可能对某些人有用。

于 2015-01-19T20:08:38.407 回答
18

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

显然,将synchronized语句放入try/catch块中会导致,如此处在 SO官方错误跟踪器VerifyError上所报告的那样。

于 2015-02-06T14:38:50.773 回答
4

在我的情况下,错误消息所说的方法是“坏的”,有一些未知的错误。从 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
}
于 2018-02-16T12:52:18.360 回答
3

我的应用可以在大多数平台上运行,但在 Android 5.1 上立即崩溃。在阅读了谷歌关于它有多棒的信息后,我开始怀疑新的 D8 dex 编译器。禁用 D8,因此它使用原始的 DX 编译器,是唯一对我有用的方法。项目清理/无效缓存没有修复它。我有一些同步块,但删除它们并没有解决它。关闭即时运行并没有解决它。禁用proguard并没有解决它。

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

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

于 2018-11-03T19:20:46.517 回答
2

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

以下链接列出了可能发生验证错误的一些场景。 java.lang.VerifyError – 如何解决验证错误

于 2020-01-24T12:04:15.887 回答
1

我遇到了同样的问题GoogleTagManager

java.lang.VerifyError: 验证程序拒绝类 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] 返回'参考:com.google.android.gms.tagmanager.zzp',但预期来自声明'参考:com.google.android.gms.common.api.PendingResult'

它发生在合并之后。我的同事将图书馆从 更新10.0.110.2.1。干净的构建没有工作。

由于时间限制,我回滚到旧版本,它工作。

于 2017-02-27T09:48:48.087 回答
1

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

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

为此:

  1. 转到“文件”>“设置”>“构建、执行、部署”>“即时运行”
  2. 取消选中“启用即时运行...”框,然后单击“确定”按钮
于 2017-03-07T13:30:51.637 回答
0

就我而言,原因是proguard。我在 sumsung note3 whick 上关闭的应用程序是 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,深层次的原因可能不明显,要注意proguard文件。

于 2016-05-23T07:48:51.600 回答
0

简单的(3) 步骤对我有用:

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

2 -从 android studio build 的顶部菜单->制作项目

3 -从 android studio build 的顶部菜单 -->重建项目

都装好了。。

于 2018-04-17T08:12:01.143 回答
0

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

我也面临同样的错误。我错过了配置 Google API 控制台项目。因此,请按照配置 Google API 控制台项目 ,并在出现提示时指定您的应用程序包名称。您还需要提供签名证书的SHA-1 哈希。有关信息,请参阅验证您的客户。

于 2019-05-09T20:36:58.870 回答
0

在使用 Kotlin1.5.x1.6.x. 当我设置"1.5""1.6"作为我的Kotlin 语言版本时,大多数用 Kotlin 编写的课程都会遇到VerifyError. 原来语言版本是罪魁祸首,将其减少为"1.4"(在使用 Kotlin 时1.5.x)为我修复了错误:

应用程序build.gradle.kts:

kotlinOptions {
    languageVersion = "1.4"
    jvmTarget = "11"
}
于 2021-10-20T08:35:36.613 回答