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 年开始的。我不确定它是否仍然正确......我希望它对你们中的一些人仍然有用...
就我而言,我只是从“构建、执行、部署”设置中禁用了“即时 运行”选项。
这样做:
- 转到“文件”>“设置”>“构建、执行、部署”>“即时 运行”
- 取消选中“启用即时 运行...”框并单击“确定”按钮
在我的例子中,错误消息所说的方法是 '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.x
或 1.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"
}
我在 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 年开始的。我不确定它是否仍然正确......我希望它对你们中的一些人仍然有用...
就我而言,我只是从“构建、执行、部署”设置中禁用了“即时 运行”选项。
这样做:
- 转到“文件”>“设置”>“构建、执行、部署”>“即时 运行”
- 取消选中“启用即时 运行...”框并单击“确定”按钮
在我的例子中,错误消息所说的方法是 '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.x
或 1.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"
}