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

时间:2015-01-19 19:12:50

标签: 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)

我在类中注入了我的工具栏和自定义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)

10 个答案:

答案 0 :(得分:73)

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

运行gradle clean任务并未完全清除build文件夹。我必须手动完成,但clean可能适用于某些人。

答案 1 :(得分:11)

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

显然,在synchronized数据块中放置try/catch语句会导致VerifyError报告here on SOofficial 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"还远没有稳定......

这样做:

  1. 转到"文件" > "设置" > "构建,执行,部署" > "即时运行"
  2. 取消选中框"启用即时运行..."然后单击"确定"按钮

答案 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

相关问题