java.lang.VerifyError:使用发布APK时,Verifier在Lollipop上拒绝了类

Aus*_*ney 41 java android butterknife

我在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)
Run Code Online (Sandbox Code Playgroud)

我在类中注入了我的工具栏和自定义NavigationDrawer.

@InjectView(R.id.toolbar) Toolbar mToolbar;
@InjectView(R.id.nav_drawer) MyNavigationDrawer mNavigationDrawer;
Run Code Online (Sandbox Code Playgroud)

第31行:

ButterKnife.inject(this);
Run Code Online (Sandbox Code Playgroud)

使用时,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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Aus*_*ney 74

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

运行gradle clean任务并不是一直清除我的build文件夹.我必须手动完成,但clean可能适用于某些人.

  • 尝试了这么多次,但没有帮助. (7认同)
  • 如果清除项目不起作用,请尝试使用文件 - >无效缓存/重新启动... - >无效并重新启动 (4认同)

Seb*_*ano 13

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

显然,如果在SO官方的bug跟踪器上报告,块中放置一个synchronized语句try/catch会导致这个问题.VerifyError

  • +1。这个解决了我的问题,如果没有您的回答,我肯定不会轻易找到根本原因。非常感谢! (2认同)