101

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

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

我可以在源代码中得到它,但它的依赖项(mail.jar、activation.jar、servlet-api.jar)我不能,所以我得到验证错误。我想一劳永逸地找到这个问题的根源。我在网上看了,但他们似乎都在谈论不完整的类文件?我不知道。

4

30 回答 30

118

查看 LogCat 并查看导致验证错误的原因。这可能是您使用的 android SDK 级别不支持的 java.lang 类中的某些方法(例如,String.isEmpty())。

于 2010-02-04T20:17:18.140 回答
56

来自安卓开发者

“adb logcat”的输出指示找不到的类以及具有错误引用的类。该位置被识别到特定的 Dalvik 指令。诀窍是查看异常上方的日志。

于 2010-08-23T15:37:26.510 回答
35

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

于 2009-03-21T07:22:05.383 回答
15

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

  1. 在您的项目中创建一个目录(例如“libs”)并将库 jar 放在那里。
  2. 通过(单击文件夹上的右键并选择“构建路径”->“用作源文件夹”)将目录添加到构建类路径。
  3. 重建你的项目。
于 2010-11-29T08:21:42.900 回答
8

它现在发生在我身上。该错误是因为我使用了我的设备具有的较新 SDK 中的方法。

Android 1.5 设备使用以下方式安装了一个 apk:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
于 2010-05-11T17:04:10.597 回答
8

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

<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

于 2013-09-19T19:19:03.537 回答
7

如果您使用的是 Retrolambda,您可能已将静态方法添加到接口(仅在 Java 8 中允许)。

于 2015-03-23T13:11:43.497 回答
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

第三步:覆盖 attachBaseContext

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

Step4:下一步是将以下内容添加到您的应用程序 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

于 2015-07-30T14:08:51.287 回答
3

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

经过几个小时的尝试解决这个问题,我找到了适合我的解决方案。

在我的 Android 项目中,我使用位于同一工作区中的其他项目(例如“MyUtils”)。所以,我需要做以下事情:

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

现在,转到“订购和导出”选项卡并选中“MyUtils”。就是这样:我摆脱了这个烦人的异常。

于 2013-03-14T08:20:05.677 回答
3

我将 gradle 版本从 2.0.0-alpha2 降级到 1.5.0 解决了这个问题。

于 2015-12-15T04:46:24.197 回答
2

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

于 2012-02-17T13:30:48.850 回答
2

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

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

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

于 2012-04-01T16:07:42.023 回答
2

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

  1. 将所有包含的第 3 方 jar 迁移到 User-Libaray
  2. 在 android lib 之前上移 user lib 并在 Order and Export 选项卡中检查它
  3. 清理并重建以运行
于 2012-09-23T07:08:36.463 回答
2

我在 SDK 更新后遇到了这个问题。编译器对我的外部库有问题。我这样做了:右键单击项目,然后“android工具>添加支持库...”这个安装在我的项目库“android-support-v4.jar”上。

于 2012-11-20T15:23:20.890 回答
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.+'

然后我将依赖关系更改为最新版本 2.2 到 2.7,没有核心库(当我包含 core2.7 时,它给出了 verifyError),然后它就可以工作了。这意味着core的 Methods 和其他内容被迁移到最新版本的Databind2.7。这解决了我的问题。

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
于 2016-02-18T12:31:04.183 回答
1

我也得到了 VerfiyError ......找不到真正的原因。它有助于将新的代码行包装到一个方法中(Eclipse,'Extract Method...')。所以在我的情况下,原因不是不受支持的方法。

于 2010-03-21T14:21:14.333 回答
1

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

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

于 2014-01-08T12:29:33.830 回答
1

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

testCoverageEnabled = true

对我来说,这会导致使用 Java 1.7 功能的类出现 VerifyError 异常,尤其是字符串 switch 语句。

于 2014-07-26T13:57:32.493 回答
1

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

解决方案:构建 -> 清理项目。

希望这可以帮助。

于 2014-10-23T12:41:07.193 回答
1

我发现了另一个案例。

条件:

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

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

于 2015-02-22T09:21:43.633 回答
0

我也有这个问题,就像我在用户库中的罐子一样......

我解决这个问题的方法是将它们添加到lib文件夹中,然后将它们添加到eclipse的构建属性中......

我第一次这样做时它不起作用,但后来我删除它们并再次读取它们并开始工作......

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

祝你好运

于 2011-01-26T15:00:29.790 回答
0

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

解决方案: 将其更改为正确的模拟器版本。

这对我有用..谢谢。

于 2011-02-08T19:24:31.533 回答
0

对于后代,我刚刚收到此错误,因为我使用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();
    }
};
于 2012-04-15T20:53:23.337 回答
0

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

于 2012-11-07T15:58:06.160 回答
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)解决了这个问题。

于 2013-07-15T21:04:28.707 回答
0

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

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

于 2015-01-08T03:27:15.517 回答
0

我刚刚确定了它发生的另一种情况,不仅是由于 libs not dx 'ed。我有一个非常长的 doInBackground 方法的 AsyncTask。由于某种原因,这种超过 145 行的方法开始失效。它发生在 2.3 应用程序上。当我只是将一些部分封装到方法中时,它工作得很好。

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

于 2015-08-18T12:57:58.123 回答
0

对我来说,问题最终实际上是我在类中的某处使用了 multi-catch 子句,这是 Java 7 功能(和 API 19+)。所以它会VerifyError在所有 19 之前的设备上崩溃。

于 2015-09-14T18:12:44.393 回答
0

对我来说,compileSdkVersion 和 buildToolsVersion 之间存在关联。我有:

compileSdkVersion 21
buildToolsVersion '19.1.0'

我将其更改为:

compileSdkVersion 21
buildToolsVersion '21.1.2'
于 2016-03-11T21:20:56.810 回答
0

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

compileSdkVersion 21

java.lang.verifyerror 发生了。所以我把 compileSdkVersion 改成了 19

compileSdkVersion 19

它运作良好。我认为这可能是SDK buildTools的问题,API级别<21时似乎可以。

于 2016-08-26T01:45:46.120 回答