Java VerifyError:当使用release APK时,验证器拒绝了棒棒糖上的类
当我在Java VerifyError:当使用release APK时,验证器拒绝了棒棒糖上的类,java,android,butterknife,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$$Vie
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 assembleerelease
时,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
文件夹解决了问题。不知道为什么艺术会有问题,但达尔维克没有
运行gradle
clean
任务并没有一直清除我的build
文件夹。我必须手动操作,但是清洁可能对某些人有用。在我的情况下,原因略有不同
显然,将
synchronized
语句放在try/catch
块中会导致VerifyError
,正如报告和上所述。在我的例子中,原因是proguard。我的应用程序在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.**{*;}
虫子不见了
因此,如果您遇到这个错误,深层次的原因可能并不明显,需要注意的是proguard文件。我也遇到了由Google TagManager引发的相同问题 java.lang.VerifyError:Verifier拒绝类com.google.android.gms.tagmanager.tagmanager:com.google.android.gms.common.api.pendingreult.com.google.android.gms.tagmanager.loadContainerDefaultOnly(java.lang.String,int)未能验证:com.google.android.gms.common.api.pendingreult com.google.android.gms.tagmanager.tagmanager.loadContainerDefaultOnly(java.lang.String,int):[0x11]返回“Reference:com.google.android.gms.tagmanager.zzp”,但应来自声明“Reference:com.google.android.gms.common.api.pendingreult” 它发生在合并之后。我的同事将库从
10.0.1
更新为10.2.1
。干净的建筑不起作用
由于时间的限制,我回滚到旧版本,它成功了。编辑:由于人们仍在投票这个答案,我想说的是,它是从2017年开始的。我不确定它是否仍然正确。。。我希望它对你们中的一些人仍然有用… 在我的例子中,我只是从“构建、执行、部署”设置中禁用了“即时运行”选项 为此:
在我的例子中,错误消息说的方法是“坏的”,有一些未知的错误。从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}"
)
for (regex in validRegexes) {
if (zipcode.matches(regex.toRegex())) {
return true
}
}
return false
}
简单的(3)步骤对我来说很有效:
1-从android studio build的顶部菜单-->clean project
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)
2-从android studio build的顶部菜单-->制作项目
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)
3-从android studio build的顶部菜单-->重建项目
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)
所有设置..我的应用程序在大多数平台上都可以运行,但在Android 5.1上立即崩溃。我开始怀疑新的D8DEX编译器在阅读了谷歌关于它有多棒的信息后。禁用D8,所以它使用原始的DX编译器,是唯一对我有效的事情。 Project clean/invalidate缓存没有修复它。 我有一些已同步的块,但删除它们并不能修复它。 关闭instant run无法解决此问题。 禁用proguard并没有修复它 以下是禁用D8的方法:
-在项目根目录中创建一个名为gradle.properties的文件(如果不存在)
-在它里面放一行:android.enableD8=false 您将收到不推荐使用的警告。希望谷歌能在完全删除不推荐的DX之前修复D8。我不知道是什么在我的代码触发它。我正在使用Android Studio 3.2.1和gradle版本4.6。
编辑:我已经报告了这个错误,谷歌开发人员正在积极调查,这可能对在调试构建中遇到这个问题的人也有帮助 我也面临着同样的错误,我没有配置GoogleAPI控制台项目。 因此配置Google API控制台项目如下
并在出现提示时指定应用程序的程序包名称。您还需要提供签名证书的SHA-1哈希值。有关信息,请参阅验证您的客户端。验证在某些情况下是否会引发错误,如果我们更改了A类的定义,但是类B是使用类A的旧版本编译的。这就是为什么如果我们清除项目并用同一版本的Java一起重建所有类,它就会得到解决 下面的链接列出了可能发生验证错误的一些场景。
能否显示logcat输出?在异常发生之前,日志中可能有一些附加信息。(在Dalvik中有,不知道艺术展是什么。)我添加了在错误之前显示的日志。我马上看到一个问题。第2行显示了一个名为
LoggedInNavActivitya
的父类,a
不是实际名称。另一个突出的问题是,LoggedInNavActivity
甚至不再存在于我的代码库中。。。我刚才删除了那个文件。这一次解决了我的问题,如果没有你的回答,我肯定不会轻易找到根本原因。谢谢!如果清除项目不起作用,请尝试使用文件->使缓存无效/重新启动…->Invalidate和RestartDid清除项目和使缓存无效/重新启动。不确定是哪一个,但当我同时使用这两个函数时,它都起作用了。我在stdlib函数上遇到了同样的问题。这就是bug