Android java.lang.VerifyError?

问题描述 投票:97回答:30

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

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

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

java android gdata verifyerror
30个回答
35
投票

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


3
投票

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


2
投票

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


2
投票

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

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

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


2
投票

https://developer.android.com/tools/building/multidex.html中,如果您遇到此问题,请尝试以下操作:

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

2
投票

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


1
投票

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


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之前。否则它将无法工作。


1
投票

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

build.grade

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


1
投票

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

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

希望这可以帮助。


1
投票

我找到了另一个案例。

条件:

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

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


117
投票

查看LogCat,看看是什么导致了verifyerror。它可能是java.lang类中的一些方法,在您正在使用的android SDK级别上不受支持(例如,String.isEmpty())。


1
投票

testCoverageEnabled = true 表示您编译的字节码是指Android在运行时无法找到的内容。这个verifyError只发布了kitkat4.4和较小版本的版本,而不是上面版本的版本,即使我在两个设备中运行相同的版本。当我使用旧版本的jackson json解析器时,它会显示java.lang.VerifyError

java.lang.VerifyError

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

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.+'

0
投票

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

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

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

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

祝好运


0
投票

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

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

这为我工作..谢谢。


0
投票

对于后代,我刚刚得到这个错误,因为我使用的是compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3' compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3' ,它不是Java 1.5支持的方法,它对应于Android Level 4.因为我在运行包括在1.6下开发的库,所以编译得很好。当我将有问题的课程移到我的Android项目时,我才看到问题 - 然后突出显示错误。

Arrays.copyOf()

在那一行,我试图做一个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

让它变得更复杂的是第71行指向// copyOf is only supported in Java >= 1.6 doArray = Arrays.copyOf(daoArray, newLength); 初始化,我认为这是最初问题的原因。

ThreadLocal

0
投票

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


0
投票

我确信我的原因与你的不同,但由于这是搜索“Android java.lang.VerifyError”时的热门点击之一,我想我会把它记录下来作为后代。

我有一些课程:

private static final ThreadLocal<DaoConfigArray> daoConfigLevelLocal
    = new ThreadLocal<DaoConfigArray>() {
    @Override
    protected DaoConfigArray initialValue() {
        return new DaoConfigArray();
    }
};

并且做了一个方法:

public class A { ... }
public class B extends A { ... }
public class C extends A { ... }

只要该代码存在于文件中,我就会在第一次加载包含此方法的类时获得VerifyError。将它拆分为两个单独的方法(一个只处理B的方法,另一个只处理C的方法)解决了这个问题。


0
投票

在我的情况下,出现此错误是因为我的google-play-service不是最新的。

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


0
投票

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

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


0
投票

对我来说,问题最终实际上是我在类中的某个地方使用了多个catch子句,这是一个Java 7特性(和API 19+)。所以它会在所有19岁以前的设备上与A[] result = null; if (something) result = new B[cursor.getCount()]; else result = new C[cursor.getCount()]; // Fill result ... 崩溃。


0
投票

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

VerifyError

我改成了:

compileSdkVersion 21
buildToolsVersion '19.1.0'

56
投票

来自android-developers

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


0
投票

对我来说,这是compileSdkVersion的问题。当我在特定的Android应用程序(compileSdkVersion 21 buildToolsVersion '21.1.2' )中使用API​​级别21时:

https://github.com/android10/Android-AOPExample

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

compileSdkVersion 21

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


14
投票

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

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

8
投票

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

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

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

8
投票

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

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

因此,一些新的Android 4功能未在Android 2.3中实现,如qazxsw poi。要简单地避免运行时错误:

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 } 没有在Android 2.3中实现,所以当类加载(而不是之前!)时,会发生NetworkOnMainThreadException异常。


7
投票

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


7
投票

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

上述问题的可能解决方案

第1步:java.lang.VerifyError

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

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

第3步:覆盖attachBaseContext

public class MyApplication extends MultiDexApplication

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

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

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

 dexOptions {
      preDexLibraries = false
   }

有关详细信息,请结帐

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


3
投票

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

经过几个小时的努力来解决这个问题,我找到了解决方案。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.