java.lang.VerifyError:validation程序在使用发行版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) 

我注入我的工具栏和一个自定义的NavigationDrawer类。

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

31行:

 ButterKnife.inject(this); 

使用gradle assembleRelease时,Butterknife代码有什么不同的地方? 我根本不使用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) 

Solutions Collecting From Web of "java.lang.VerifyError:validation程序在使用发行版APK时拒绝了棒棒堂上的类"

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

运行gradle clean任务不会清除我的build文件夹。 我必须手动执行,但clean可能会为一些人工作。

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

显然,在一个try/catch块中放置一个synchronized语句会导致VerifyError ,正如SO和官方bug跟踪器中所报告的那样 。

在我的情况下,我只是从我的“构build,执行,部署”设置中禁用“即时运行”选项。 不幸的是,Android的工作室function“即时运行”还远远不够稳定。

要做到这一点:

  1. 转到“文件”>“设置”>“构build,执行,部署”>“即时运行”
  2. 取消勾选“启用即时运行…”并点击“确定”button

在我的情况下,原因是proguard。 我的应用程序closuressumsung 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文件。

我遇到了GoogleTagManager引发的相同问题。

java.lang.VerifyError:validation器被拒绝类com.google.android.gms.tagmanager.TagManager:com.google.android.gms.common.api.PendingResult com.google.android.gms.tagmanager.TagManager.loadContainerDefaultOnly(java。 lang.String,int)未能validation: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',但是从声明'Reference:com.google.android.gms.common.api.PendingResult'

这发生在合并后。 我的同事把图书馆从10.0.1更新到了10.2.1 。 清理版本不起作用。

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