Android java.lang.VerifyError?

时间:2009-03-21 05:24:20

标签: java android gdata verifyerror

在我的Android应用中,我总是得到验证错误!我无法弄清楚原因。每当我包含一个外部JAR时,我总是在尝试启动我的应用程序时获得VerifyErrors(除了一次,当我包含Apache Log4j时。)

我通常通过获取库的源代码并将其添加到我的项目中来解决这个问题,但我试图放置GData client library

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

30 个答案:

答案 0 :(得分:117)

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

答案 1 :(得分:56)

来自android-developers

“adb logcat”的输出表示无法进行的类 发现以及有不良参考的类。那个地点 被识别为特定的Dalvik指令。诀窍是 查看异常上方的日志。

答案 2 :(得分:35)

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

答案 3 :(得分:14)

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

  1. 在项目中创建目录 (e.x.“libs”)并放入库jar 那里。
  2. 将目录添加到构建类 路径(单击右键) 文件夹并选择“构建路径” - >“使用 作为源文件夹“)。
  3. 重建您的项目。

答案 4 :(得分:8)

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

Android 1.5设备使用此安装了apk:

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

答案 5 :(得分: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

答案 6 :(得分:7)

这也可能是因为在Lollypop下面的版本引用了限制错误,它被限制到最大65K大小

上述问题的可能解决方案

第1步:public class MyApplication extends MultiDexApplication

步骤2:使用MultiDexApplication扩展您的应用程序,例如

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

Step3:覆盖attachBaseContext

 dexOptions {
      preDexLibraries = false
   }

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

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

步骤5: 最后,关注应用build.gradle的一般部分

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;

有关详细信息,请结帐

https://developer.android.com/tools/building/multidex.html

答案 7 :(得分:7)

如果你正在使用Retrolambda,你可能已经为接口添加了一个静态方法(仅在Java 8中允许)。

答案 8 :(得分:3)

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

答案 9 :(得分:3)

就我而言,当我从Eclipse Indigo更新到Eclipse Juno时发生了这样的事情:我不确定究竟是什么原因,但是,我正在研究的Android项目已经停止工作了很长时间异常。

很多小时尝试解决之后,我找到了适合我的解决方案。

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

右键点击Android项目 - &gt;构建路径 - &gt;配置构建路径

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

答案 10 :(得分:2)

问题还可能是两个机器人项目之间不匹配造成的。例如,如果您使用“com.yourcompany”包开发了一个android库,那么您的主应用程序项目使用与基础包相同的包。然后,假设您要更改主应用程序的版本,以便更改清单文件的值:版本代码和版本名称。如果您在不更改库的这些值的情况下运行应用程序,则在对库中对象的任何方法调用时都会出现验证错误。

答案 11 :(得分:2)

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

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

答案 14 :(得分:1)

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更改为最新版本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'

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

testCoverageEnabled = true

对我来说,这会导致使用Java 1.7功能的类的VerifyError异常,特别是字符串切换语句。

答案 17 :(得分:1)

在做一个git pull之后我遇到了同样的问题。

解决方案:构建 - &gt;清洁项目。

希望这有帮助。

答案 18 :(得分:1)

我找到了另一个案例。

条件:

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

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

答案 19 :(得分:1)

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

答案 20 :(得分:0)

对我来说,问题最终实际上是我在类中的某个地方使用了多个catch子句,这是一个Java 7特性(和API 19+)。所以它会在所有19岁以前的设备上与VerifyError一起崩溃。

答案 21 :(得分:0)

对我来说,它是在compileSdkVersion和buildToolsVersion之间的相关性。我有:

compileSdkVersion 21
buildToolsVersion '19.1.0'

我把它改为:

compileSdkVersion 21
buildToolsVersion '21.1.2'

答案 22 :(得分:0)

我刚刚发现了它发生的另一种情况,不仅仅是因为libs不是 dx 'ed。 我有一个非常长的doInBackground mehtod AsyncTask。出于某种原因,超过145行的这种方法开始破裂。 它发生在2.3应用程序上。 当我将一些部分封装到方法中时,它工作正常。

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

答案 23 :(得分:0)

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

compileSdkVersion 21

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

compileSdkVersion 19

效果很好。我认为它可能是SDK buildTools的问题,并且当API级别&lt; 21.

答案 24 :(得分:0)

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

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

答案 25 :(得分: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的方法)解决了这个问题。

答案 26 :(得分:0)

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

答案 27 :(得分:0)

对于后代,我刚收到此错误,因为我使用的是Arrays.copyOf(),这不是Java 1.5支持的与Android Level 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();
    }
};

答案 28 :(得分:0)

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

<强>解: 将其更改为更正的模拟器版本。

这个工作对我来说.. 谢谢。

答案 29 :(得分:0)

我也有这个问题,就像我在用户库中的jar ...

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

我第一次这样做却没有用,但随后我将它们删除并重新读回来并开始工作......

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

祝你好运