我在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)
答案 0 :(得分:73)
清理build
文件夹解决了问题。不确定为什么ART有问题,但Dalvik没有。
运行gradle clean
任务并未完全清除build
文件夹。我必须手动完成,但clean
可能适用于某些人。
答案 1 :(得分:11)
就我而言,原因略有不同。
显然,在synchronized
数据块中放置try/catch
语句会导致VerifyError
报告here on SO和official bug tracker。{/ p>
答案 2 :(得分:3)
在我的情况下,错误消息所说的“坏”的方法有一些未知的错误。从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 :(得分:2)
就我而言,我只是禁用了" Instant Run"来自我的"构建,执行,部署"设置。不幸的是Android工作室功能" Instant Run"还远没有稳定......
这样做:
答案 4 :(得分:2)
我的应用程序可在大多数平台上运行,但在Android 5.1上立即崩溃。在阅读有关它的强大功能的Google信息之后,我开始怀疑新的D8 dex编译器。禁用D8,以便它使用原始的DX编译器,对我来说唯一有效。 项目清除/无效缓存无法解决。 我有一些同步块,但是删除它们并不能解决问题。 关闭即时运行并不能解决问题。 禁用proguard不能解决问题。
以下是禁用D8的方法:
-在项目的根目录中创建一个名为gradle.properties的文件(如果该文件不存在)
-在其中放置以下行:android.enableD8 = false
您将获得过时的警告。希望Google在完全删除不推荐使用的DX之前先对其进行修复。我不知道我的代码触发了什么。我正在使用Gradle 4.6版的Android Studio 3.2.1。 编辑:我已经报告了此错误,并且Google开发人员正在积极调查
答案 5 :(得分:1)
在我的情况下,原因是预测。我的应用程序关闭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文件。
答案 6 :(得分:0)
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]返回'参考:com.google.android.gms.tagmanager.zzp',但预期来自声明'参考:com.google.android.gms.common.api.PendingResult'
合并后发生了这件事。我的同事将图书馆从10.0.1
更新为10.2.1
。干净的构建不起作用。
由于时间限制,我回滚到旧版本,它运作良好。
答案 7 :(得分:0)
简单的(3)步骤为我工作:
从android studio build的顶层菜单中1 - - > 清洁项目
从android studio build的顶层菜单中2 - - > 制作项目
从android studio build的顶层菜单中3 - - > 重建项目
全部设置..
答案 8 :(得分:0)
也许这可以帮助一些在Debug Build中面临此问题的人。
我也遇到了同样的错误。我错过了“配置Google API控制台”项目。 因此,在this之后,配置Google API控制台项目 并在出现提示时指定应用程序的软件包名称。您还需要提供签名证书的 SHA-1哈希。有关信息,请参见验证客户端。
答案 9 :(得分:0)
在某些情况下主要会引发验证错误。如果我们更改了类A的定义,但发生了错误,但是使用较旧版本的类A编译了类B。这就是为什么如果我们清除,它将得到解决我们的项目,并使用相同版本的Java重建所有类。
下面的链接列出了可能发生验证错误的某些情况。 java.lang.VerifyError – How to solve VerifyError