Android java.lang.VerifyError?


100

在我的Android应用中,我总是会收到VerifyErrors!我不知道为什么。每当我包含一个外部JAR时,当我尝试启动我的应用程序时总是会收到VerifyErrors(除了一次,当我包含Apache Log4j时)。

通常,我会通过获取库的源代码并将其添加到我的项目中来解决此问题,但是我正在尝试放置GData客户端库

我可以在源代码中获得它,但它不能依赖(mail.jar,activation.jar,servlet-api.jar),因此会出现验证错误。我想一劳永逸地解决这个问题。我在互联网上看过,但他们似乎都在谈论不完整的课程文件?我不知道。


众所周知,GData在Android中不起作用。在android-developers Google网上论坛中搜索主题。在以后的SDK版本中,我们需要等待Android的正式GData。
mparaz

1
您是否正在使用Gradle构建项目?当我忘记在assembleRelease任务之前运行clean任务时,我遇到了这个问题……
IgorGanapolsky 2013年

Answers:


35

Android使用其他类文件格式。您是否通过Android SDK附带的“ dx”工具运行第三方JAR文件?


4
在“ dx”工具上有更多信息会很麻烦。
Daniel Magnusson

2
在SDK版本列表下方的Android项目偏好设置的“库”部分中查找。您在构建中依赖的外部项目是否在其中显示绿色勾号?
亚当

@亚当谢谢你的评论!您刚刚解决了一个问题,我花了太多时间试图弄清楚。
西蒙·佛斯伯格

118

查看LogCat,看看是什么引起了verifyerror。这可能是您正在使用的android SDK级别不支持的java.lang类中的某些方法(例如String.isEmpty())。


4
这应该标记为真实答案。至少在我的情况下,正是这种情况,因为我从用户那里得到了零星的错误,并且将其追溯到API
v。3中

1
同意 我已经遇到过几次了,每次我都以2.x为目标并且使用的不是1.5。让您大吃一惊的是,它仅在第一次创建/使用该类时抛出,因此,如果它偶尔发生,您可能会在一段时间内不会注意到它。
mbafford 2010年


“这应该被标记为真实答案。” 我遇到这个问题是因为我遇到了同样的问题。我猜测未将此标记为真正答案的原因是因为LogCat给出了我在哪里创建库实例的行引用,而不是引起问题的行。换句话说,在这种情况下,LogCat几乎没有用。
NotACleverMan 2012年

WARN级别的logcat应该向您显示有关验证失败原因的详细信息
mmeyer 2012年

56

来自android-developers

“ adb logcat”的输出指示找不到的类以及具有错误引用的类。根据具体的Dalvik指令确定位置。诀窍是在异常上方查看日志。


6
在异常上方查看也有助于我识别导致错误的方法。对我来说,它是Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR表达式,如果您在Cupcake上尝试,那是很明显的……
Manuel

2
谢谢!这就是我得到的问题...有用的日志仅在异常之上:(WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;现在想知道如何在没有DatatypeFactory的情况下进行)
pyko

在错误上方查看也对我有帮助。查找以“ VFY:”开头的消息,在我的情况下,它显示为“任意拒绝大方法”。可能是因为它创建了大量的数组:),谢谢您的提示!
Amplify91 2011年

谢谢!我发现我的问题出在异常处理程序上:NetworkOnMainThreadException在Android 2.3中未实现。看不起我的答复。再次感谢!:)
塞拉芬

谢谢!就我而言,我的目标是Android2.3,并且我使用的是android-support-v4.jar,但在此jar中找不到类。我必须在属性中单击此类的“导出”选项卡,并将其置于android2.3.3库上方。好吧,这种出口确实是我不清楚的东西……
xtof54

14

为了使其工作,您需要将库的jar添加到一个源文件夹中(即使您已经将其添加为eclipse库,您仍然需要将其添加为源)。

  1. 在您的项目中创建一个目录(例如“ libs”),然后在其中放置库jar。
  2. 通过以下方式将目录添加到构建类路径(单击文件夹上的右键,然后选择“构建路径”->“用作源文件夹”)。
  3. 重建您的项目。

我们可以在“ libs”文件夹中添加“ Project Library”而不是JAR吗?
艾哈迈德(Ahmed)

奇怪...我必须将其添加为普通的Java库-而不是作为Eclipse中“ Android”菜单下的库。
Phil

感谢Maksim,很好的解决方案。
阿伦·巴多

8

现在发生在我身上。造成该错误的原因是,我使用的是我设备上的更新SDK中的方法。

Android 1.5设备使用以下命令安装了apk:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>

8

我发现了一个有趣的案例。我用:

<uses-sdk
   android:minSdkVersion="9"
   android:targetSdkVersion="18" />

因此,Android 2.3中并没有实现某些新的Android 4功能,例如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会发生异常。


1
我也发生了同样的事情。我使用的java.lang.ReflectiveOperationException是旧版Android中未包含的版本(例如4.2),但是Lint并没有就此警告我...
WonderCsabo 2014年

对我来说,问题是我的代码声明了一个CameraAccessExceptionAndroid 5.0引入的,但是当我在Android 4.3设备上运行时,会抛出VerifyError。
Piasy

7

如果使用Retrolambda,则可能已向接口添加了静态方法(仅Java 8中允许)。


7

由于在以下版本的Lollypop上引用限制错误,该错误限制为最大65K大小,因此也会发生这种情况

上述问题的可能解决方案

第1步: 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

步骤3:覆盖attachBaseContext

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

步骤4:下一步是将以下内容添加到应用程序build.gradle的android部分

 dexOptions {
      preDexLibraries = false
   }

步骤5:最后,遵循您应用的一般部分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


为我工作!不要忘记将Application类更改为“ MultiDexApplication”。
Ganesh 2015年

你救了我一个大人物。这应该是公认的答案。
罗希特·洛克德

3

以我为例,它是在我从Eclipse Indigo更新到Eclipse Juno时发生的:我不确定真正的原因是什么,但是,我长期从事的Android项目由于该异常而停止工作。

经过许多小时的修复,我找到了解决方案。

在我的Android项目中,我使用同一工作区中的其他项目(例如“ MyUtils”)。因此,我需要执行以下操作:

右键单击Android项目->构建路径->配置构建路径

现在,转到“订单和导出”标签,并选中“ MyUtils”。就是这样:我摆脱了这个烦人的例外。


那就是为我解决的问题……我们有一个大项目,所以我四处走走,只是检查了所有内容上的“ export”标志。PITA问题。
某处某人2013年

3

我将gradle版本从2.0.0-alpha2降级到了1.5.0,从而解决了此问题。


2

该问题也可能由两个android项目之间的不匹配引起。例如,如果您使用“ com.yourcompany”包开发了一个android库,则您的主应用程序项目将使用与基本包相同的包。然后,假设您要更改主应用程序的版本,因此要更改清单文件的值:“版本代码”和“版本名称”。如果在不更改库值的情况下运行应用程序,则对库中对象的任何方法调用都会收到验证错误。


2

我遇到过同样的问题。我使用2.1 r1进行构建,并使用新的adt 17更新到2.1 r3。我在javamail的mail.jar中验证了错误,这使我发疯。这是我解决问题的方法:

  1. 创建了一个libs /文件夹并添加了jar。
  2. 右键单击>添加为源文件夹

我尝试重建,但失败了。我删除了libs /目录作为源文件夹,并删除了构建路径中对3个jar文件的引用。然后,我再次添加了libs /文件夹,并将libs /文件夹中的每个jar添加到了构建路径。现在它可以按预期工作了。这是一个怪异的解决方法,但对我有用。


2

在中Eclipse 4.x,如果遇到此问题,请尝试以下操作:

  1. 将所有随附的第3方jar迁移到User-Libaray
  2. 在android lib之前将用户lib上移并在Order and Export选项卡中检查它
  3. 清理并重建运行

2

SDK更新后出现此问题。编译器对我的外部库有问题。我这样做是:右键单击项目,然后单击“ android工具>添加suport库...”,将其安装在我的项目库“ android-support-v4.jar”上。


2

java.lang.VerifyError表示您编译的字节码是指Android在运行时找不到的内容。这个verifyError仅向我提供了kitkat4.4和更低版本,即使我在两个设备中都运行了相同的版本,也没有高于该版本。当我使用旧版本的杰克逊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更改为不带核心库最新版本2.2至2.7(当我包含core2.7时,它提供了verifyError),然后它可以工作。这意味着核心的“方法”和其他内容已迁移到最新版本的Databind2.7。这解决了我的问题。

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'

1

我也收到了VerfiyError ...找不到真正的原因。它有助于将新的代码行包装到一个方法中(Eclipse,“ Extract Method ...”)。因此,就我而言,原因并非不受支持的方法。


1

我有非常类似的问题。我添加了Apache POI罐,当我更新到android SDK 22.3时出现了问题。

我检查了Android Private Libraries,所以这不是android SDK的常见问题。我取消选中所有Apache POI jar,并逐一添加。我发现poi-3.9-20121203.jar应该在poi-ooxml-3.9-20121203.jar之前。否则它将无法正常工作。


1

如果您有测试,请尝试从build.grade文件中注释掉这一行:

testCoverageEnabled = true

对我来说,这导致使用Java 1.7功能的类(尤其是字符串切换语句)上的VerifyError异常。


1

进行git pull后,我遇到了同样的问题。

解决方案:生成->清理项目。

希望这可以帮助。


1
确实没有拉扯或做任何事情,但是很干净,谢谢!
Alexandre G

1

我发现了另一种情况。

条件:

  • 使用Retrolambda(不确定是否有必要);
  • 在接口中创建静态方法。

结果就是繁荣!尝试访问使用该接口的类时发生java.lang.VerifyError。看起来Android(在我的情况下为4.4。*)不喜欢接口中的静态方法。从接口中删除静态方法会使VerifyError消失。


0

我也遇到了这个问题,就像用户库中的jar一样。

我解决此问题的方法是将它们添加到lib文件夹,然后将它们添加到eclipse的build属性中。

第一次执行此操作不起作用,但后来我将其删除并再次读取它们,然后开始工作...

有点奇怪!但现在一直在工作。

祝好运


0

我已经编码了SDK 2.1中的Android API方法/类,并试图在Android 1.6模拟器上运行它。所以我得到了那个错误。

解决方案: 已将其更改为正确的仿真器版本。

有用 ..谢谢。


0

为了后代,我刚得到这个错误是因为我使用Arrays.copyOf()的不是与Android Level 4对应的Java 1.5支持的方法。因为我正在运行,包括在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();
    }
};

0

我不得不删除依赖项目,而是将依赖项目编译为jar,并将其包含在libs文件夹中。


0

我确定我的原因与您的原因不同,但是由于这是搜索“ 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的方法)解决了该问题。


1
而且,顺便说一句,我引起问题的原因是注释掉了方法主体(用return null / 0 / false代替),直到VerifyError消失,然后恢复内容,直到再次出现为止。然后在问题方法中做同样的事情。当然,这不是一种有趣的调试方法,但它确实有效。
benkc

0

就我而言,发生此错误是因为我的google-play-service不是最新的

如果您的项目不支持.jar中的某些类,则会发生此错误(例如ImageView.setLayerType,AdvertisingIdClient等)。


0

我刚刚发现了发生这种情况的另一种情况,不仅是因为libs而不是dx。我有一个非常长的doInBackground方法的AsyncTask。由于某种原因,这种使用145行以上的方法开始被打破。它发生在2.3应用程序上。当我只是将某些部分封装到方法中时,它运行良好。

因此,对于那些找不到未正确dx的类的人,请尝试减少方法的长度。


0

对我而言,问题最终实际上是我在类中某个地方使用了multi-catch子句,这是Java 7功能(和API 19+)。因此它将VerifyError在所有19之前的设备上崩溃。


0

对我来说,这是compileSdkVersion和buildToolsVersion之间的关联。我有:

compileSdkVersion 21
buildToolsVersion '19.1.0'

我将其更改为:

compileSdkVersion 21
buildToolsVersion '21.1.2'

0

对我来说,这是compileSdkVersion的问题。当我在特定的android应用程序(https://github.com/android10/Android-AOPExample)中使用API​​级别21时:

compileSdkVersion 21

发生java.lang.verifyerror。所以我将compileSdkVersion更改为19

compileSdkVersion 19

运行良好。我认为这可能是SDK buildTools的问题,并且当API级别<21时似乎还可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.