Android java.lang.VerifyError?
Posted
技术标签:
【中文标题】Android java.lang.VerifyError?【英文标题】:Android java.lang.VerifyError? 【发布时间】:2010-10-14 16:53:47 【问题描述】:在我的 android 应用程序中,我总是收到 VerifyErrors!我不知道为什么。每当我包含一个外部 JAR 时,当我尝试启动我的应用程序时总是会收到 VerifyErrors(除了一次,当我包含 Apache Log4j 时。)
我通常通过获取库的源代码并将其添加到我的项目中来解决这个问题,但我正在尝试将GData client library。
我可以在源代码中获得它,但它的依赖项(mail.jar、activation.jar、servlet-api.jar)我不能,所以我得到验证错误。我想一劳永逸地找到这个问题的根源。我在网上看了,但他们似乎都在谈论不完整的类文件?我不知道。
【问题讨论】:
已知 GData 在 Android 中不起作用。在 android-developers Google Group 中搜索主题。我们需要等待 Android 的官方 GData,在未来的 SDK 版本中。 您是否使用 Gradle 来构建您的项目?当我忘记在 assembleRelease 任务之前运行 clean 任务时,我遇到了这个问题... 【参考方案1】:Android 使用不同的类文件格式。您是否通过 Android SDK 附带的“dx”工具运行第 3 方 JAR 文件?
【讨论】:
如果有更多关于“dx”工具的信息会很棒。 查看 Android 项目首选项的“库”部分,位于 SDK 版本列表下方。您在构建中依赖的外部项目是否显示在那里,旁边有一个绿色勾号? @Adam 谢谢你的评论!你刚刚解决了一个我花了太多时间试图弄清楚的问题。【参考方案2】:查看 LogCat 并查看导致验证错误的原因。这可能是您正在使用的 android SDK 级别不支持的 java.lang 类中的某些方法(例如,String.isEmpty())。
【讨论】:
这应该被标记为真实答案。至少在我的情况下是这样,因为我从用户那里收到零星的错误,我将其追踪到 API 的 v.3 中不支持的 View.getTag(int) 调用 同意。我遇到过几次这种情况,每次都是我的目标是 2.x 并使用 1.5 中没有的东西。让你失望的是它只在第一次创建/使用类时抛出,所以如果它是偶尔发生的事情,你可能暂时不会注意到它。 如果是这种情况,您应该查看以下链接:developer.android.com/resources/articles/… 和 doandroids.com/blogs/2010/5/8/backwards-compatibility "这应该被标记为真实答案。"我遇到了这个线程,因为我有同样的问题。我猜这没有被标记为真正的答案的原因是因为 LogCat 提供了一个行引用我在哪里创建一个库的实例,而不是导致问题的行。换句话说,在这种情况下,LogCat 几乎没用。 警告级别的 logcat 应该向您显示有关验证失败原因的详细信息【参考方案3】:我也收到 VerfiyError...找不到真正的原因。它有助于将新的代码行包装到一个方法中(Eclipse,'Extract Method...')。所以在我的情况下,原因不是不受支持的方法。
【讨论】:
【参考方案4】:它现在发生在我身上。 错误是因为我使用了我的设备具有的较新 SDK 中的方法。
Android 1.5 设备使用此安装了一个 apk:
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
【讨论】:
【参考方案5】:来自android-developers:
“adb logcat”的输出表明不能被 找到以及具有错误参考的类。那个地点 被识别到特定的 Dalvik 指令。诀窍是 查看异常上方的日志。
【讨论】:
查看异常上方也帮助我确定了导致错误的方法。对我来说,这是表达式 Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR 这很明显,最后,如果你在 Cupcake 上尝试... 谢谢!这是我遇到的问题......有用的日志就在异常之上:WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;
(现在要弄清楚如何在没有 DatatypeFactory 的情况下做)
查看错误对我也有帮助。查找以“VFY:”开头的消息,在我的例子中,它表示“任意拒绝大方法”。可能是因为它创建了大量的数组 :) 无论如何,谢谢你的提示!
谢谢!我发现我的问题出在异常处理程序上:Android 2.3 中未实现 NetworkOnMainThreadException。低头看我的回复。再次感谢! :)
谢谢!就我而言,我的目标是 Android2.3,我使用的是 android-support-v4.jar,但它没有在这个 jar 中找到类。我必须在属性中单击此类的“导出”选项卡并将其置于 android2.3.3 库之上。嗯,这个导出真的是我没看清楚……【参考方案6】:
要使其工作,您需要将库的 jar 添加到源文件夹之一(即使您已经将其添加为 eclipse 库,您仍然需要将其添加为源)。
-
在您的项目中创建一个目录
(例如“libs”)并放置库 jar
那里。
将目录添加到构建类
路径(点击右键
文件夹并选择“构建路径”->“使用
作为源文件夹”)。
重建您的项目。
【讨论】:
我们可以在“libs”文件夹中添加“项目库”而不是 JAR 吗? 奇怪...我不得不将它添加为普通的 Java 库 - 而不是 Eclipse 中“Android”菜单下的库。 感谢 Maksim,很好的解决方案。【参考方案7】:我也有这个问题,就像我在用户库中的 jars 一样......
我解决这个问题的方法是将它们添加到lib文件夹中,然后将它们添加到eclipse的构建属性中......
我第一次这样做时它不起作用,但后来我将它们删除并再次读取它们并开始工作......
有点奇怪!但现在一直在工作。
祝你好运
【讨论】:
【参考方案8】:我编写了 SDK 2.1 中的 Android API 方法/类,并试图在 Android 1.6 模拟器上运行它。所以我得到了那个错误。
解决方案: 将其更改为正确的模拟器版本。
这为我工作..谢谢。
【讨论】:
【参考方案9】:这个问题也可能是由两个 androids 项目之间的不匹配引起的。例如,如果您使用包“com.yourcompany”开发了一个 android 库,那么您的主应用程序项目使用与基本包相同的包。然后假设您想更改主应用程序的版本,因此您更改清单文件的值:版本代码和版本名称。如果您在不更改库的这些值的情况下运行您的应用程序,则对库中的对象的任何方法调用都会出现验证错误。
【讨论】:
【参考方案10】:我有同样的问题。我正在使用 2.1 r1 构建并使用新的 adt 17 更新到 2.1 r3。我在 javamail 的 mail.jar 上验证了错误,这让我发疯了。这是我解决问题的方法:
-
创建了一个 libs/ 文件夹并添加了 jars。
右键单击>添加为源文件夹
我尝试了重建,但失败了。我删除了 libs/ 目录作为源文件夹,并删除了构建路径中 3 个 jar 文件的引用。然后我再次添加了 libs/ 文件夹,并将 libs/ 文件夹中的每个 jar 添加到构建路径中。现在它按预期工作。这是一个奇怪的解决方法,但它对我有用。
【讨论】:
【参考方案11】:对于后代,我刚刚收到此错误,因为我使用的是 Arrays.copyOf()
,这不是 Java 1.5 支持的方法,它对应于 Android 4 级。因为我正在运行包括在 1.6 下开发的库,它们编译得很好。我只是在将有问题的课程移到我的 Android 项目时才看到问题——然后突出显示了错误。
Uncaught handler: thread main exiting due to uncaught exception
java.lang.VerifyError: com.j256.ormlite.dao.BaseDaoImpl$DaoConfigArray
at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:71)
at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:1)
at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:429)
at java.lang.ThreadLocal.get(ThreadLocal.java:66)
在那一行我试图做一个new DaoConfigArray
并且那个类有以下行:
// copyOf is only supported in Java >= 1.6
doArray = Arrays.copyOf(daoArray, newLength);
让事情变得更加复杂的是,第 71 行指向 ThreadLocal
初始化,我最初认为这是问题的原因。
private static final ThreadLocal<DaoConfigArray> daoConfigLevelLocal
= new ThreadLocal<DaoConfigArray>()
@Override
protected DaoConfigArray initialValue()
return new DaoConfigArray();
;
【讨论】:
【参考方案12】:在Eclipse 4.x
,如果你遇到这个问题,试试下面:
-
将所有包含的第 3 方 jar 迁移到 User-Libaray 中
将用户库上移到 android 库之前,并在“订购和导出”选项卡中检查它
清理并重建以运行
【讨论】:
【参考方案13】:我不得不删除依赖项目,而是将依赖项目编译为 jar,并将它们包含在 libs 文件夹中。
【讨论】:
【参考方案14】:我在 SDK 更新后遇到了这个问题。编译器对我的外部库有问题。我这样做了:右键单击项目,然后“android工具>添加支持库...”这个安装在我的项目库“android-support-v4.jar”上。
【讨论】:
【参考方案15】:就我而言,它发生在我从 Eclipse Indigo 更新到 Eclipse Juno 时:我不确定真正的原因是什么,但是,我长期从事的 Android 项目因此停止工作例外。
在尝试解决该问题许多小时后,我找到了适合我的解决方案。
在我的 Android 项目中,我使用了位于同一工作区中的其他项目(例如“MyUtils”)。所以,我需要做以下事情:
Android项目右键->构建路径->配置构建路径
现在,转到“订购和导出”选项卡并选中“MyUtils”。就是这样:我摆脱了这个烦人的异常。
【讨论】:
这就是为我修复它的原因......我们有一个大项目,所以我四处走动,只是检查了所有东西上的“导出”标志。 PITA 问题。【参考方案16】:我确定我的原因与您的不同,但由于这是搜索“Android java.lang.VerifyError”时的热门搜索之一,我想我将其记录在这里以供后代使用。
我有一些类似的课程:
public class A ...
public class B extends A ...
public class C extends A ...
还有一个方法:
A[] result = null;
if (something)
result = new B[cursor.getCount()];
else
result = new C[cursor.getCount()];
// Fill result
...
只要此代码存在于文件中,我就会在第一次加载包含此方法的类时收到一个 VerifyError。将其拆分为两种单独的方法(一种只处理 B,另一种只处理 C)解决了这个问题。
【讨论】:
而且,顺便说一句,我根本原因是注释掉方法体(替换为 return null/0/false),直到 VerifyError 消失,然后恢复内容直到它再次出现;然后在问题方法中做同样的事情。当然,这不是一种有趣的调试方式,但它确实有效。【参考方案17】:我发现了一个有趣的案例。我用:
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="18" />
因此,Android 4 的一些新功能并未在 Android 2.3 中实现,例如 ImageView.setLayerType
。简单地避免运行时错误:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
这种方法也应该与异常处理一起使用:
catch (NetworkOnMainThreadException nomte)
// log this exception
catch (SocketTimeoutException socketTimeoutException)
// log this exception
NetworkOnMainThreadException
未在 Android 2.3 中实现,因此当 加载类(而不是之前!)时,会发生异常 java.lang.VerifyError
。
【讨论】:
我也遇到了同样的情况。我使用了java.lang.ReflectiveOperationException
,它不包含在较旧的 Android 版本(例如 4.2)中,但 Lint 并没有就此警告我...
对我来说,问题是我的代码声明了一个CameraAccessException
,它是在 Android 5.0 中引入的,但是当我在 Android 4.3 设备中运行时,会抛出 VerifyError。【参考方案18】:
我遇到了非常相似的问题。我添加了 Apache POI jar,当我更新到 android SDK 22.3 时出现了问题。
我检查了 Android 私有库,所以这不是 android SDK 的常见问题。我取消选中所有 Apache POI jar 并一一添加。我发现 poi-3.9-20121203.jar 应该在 poi-ooxml-3.9-20121203.jar 之前。否则将无法正常工作。
【讨论】:
【参考方案19】:如果您有测试,请尝试从您的 build.grade
文件中注释掉这一行:
testCoverageEnabled = true
对我来说,这会导致使用 Java 1.7 功能的类出现 VerifyError 异常,尤其是字符串 switch 语句。
【讨论】:
【参考方案20】:我在 git pull 后遇到了同样的问题。
解决方案:构建 -> 清理项目。
希望这会有所帮助。
【讨论】:
并没有真正拉动或做任何事情,但干净利落,谢谢!【参考方案21】:就我而言,发生此错误是因为我的 google-play-service 不是最新的。
如果您的项目不支持 .jar 中的某些类,则会发生此错误(例如 ImageView.setLayerType、AdvertisingIdClient 等)。
【讨论】:
【参考方案22】:我发现了另一个案例。
条件:
使用 Retrolambda(不确定是否有必要); 在接口中创建静态方法。结果是繁荣!尝试访问使用该接口的类时出现 java.lang.VerifyError。看起来 Android(在我的例子中是 4.4.*)不喜欢接口中的静态方法。从接口中删除静态方法会使 VerifyError 消失。
【讨论】:
【参考方案23】:如果您使用的是 Retrolambda,您可能已将静态方法添加到接口(仅在 Java 8 中允许)。
【讨论】:
【参考方案24】:这也可能是由于 Lollypop 以下版本的引用限制错误,其中限制为最大 65K 大小
上述问题的可能解决方案
第一步:Add android-support-multidex.jar to your project. The jar can be found in your Android SDK folder /sdk/extras/android/support/multidex/library/libs
第 2 步:使用 MultiDexApplication 扩展您的应用程序,例如
public class MyApplication extends MultiDexApplication
第三步:覆盖 attachBaseContext
protected void attachBaseContext(Context base)
super.attachBaseContext(base);
MultiDex.install(this);
第四步: 下一步是将以下内容添加到您的应用程序 build.gradle 的 android 部分
dexOptions
preDexLibraries = false
第五步: 最后,跟随你的应用程序 build.gradle 的一般部分
afterEvaluate
tasks.matching
it.name.startsWith('dex')
.each dx ->
if (dx.additionalParameters == null)
dx.additionalParameters = ['--multi-dex']
else
dx.additionalParameters += '--multi-dex'
详情请查看
https://developer.android.com/tools/building/multidex.html
【讨论】:
为我工作!!不要忘记将应用程序类更改为“MultiDexApplication”。 你救了我大人。这应该是公认的答案。【参考方案25】:我刚刚确定了它发生的另一种情况,这不仅是由于未 dx 的库。 我有一个非常长的 doInBackground 方法的 AsyncTask。由于某种原因,这种超过 145 行的方法开始失效。 它发生在 2.3 应用程序上。 当我只是将一些部分封装到方法中时,它工作得很好。
因此,对于那些找不到未正确 dx 的类的人,请尝试减少方法的长度。
【讨论】:
【参考方案26】:对我来说,问题最终实际上是我在类中的某处使用了 multi-catch 子句,这是 Java 7 功能(和 API 19+)。所以它会在所有 19 之前的设备上与 VerifyError
一起崩溃。
【讨论】:
【参考方案27】:我将 gradle 版本从 2.0.0-alpha2 降级到 1.5.0 解决了这个问题。
【讨论】:
【参考方案28】:java.lang.VerifyError
表示您编译的字节码指的是 Android 在运行时无法找到的内容。此 verifyError 仅向我发出 kitkat4.4 和不在上述版本中的较小版本,即使我在两个设备中运行相同的构建。当我使用旧版本的jackson json解析器时,它显示java.lang.VerifyError
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'
然后我将 Dependancy 更改为 latest version 2.2 to 2.7 没有 core library(当我包含 core2.7 时,它会给出 verifyError),然后它就可以工作了.这意味着core的方法和其他内容被迁移到最新版本的Databind2.7。这解决了我的问题。
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
【讨论】:
【参考方案29】:对我来说,compileSdkVersion 和 buildToolsVersion 之间存在相关性。我有:
compileSdkVersion 21
buildToolsVersion '19.1.0'
我改成:
compileSdkVersion 21
buildToolsVersion '21.1.2'
【讨论】:
【参考方案30】:对我来说,是compileSdkVersion的问题。当我在特定的 android 应用程序 (https://github.com/android10/Android-AOPExample) 中使用 API 级别 21 时:
compileSdkVersion 21
java.lang.verifyerror 发生了。所以我把 compileSdkVersion 改成了 19
compileSdkVersion 19
效果很好。我认为可能是SDK buildTools的问题,API级别
【讨论】:
以上是关于Android java.lang.VerifyError?的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )