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

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

我可以在源代码中获取它,但它的依赖项(mail.jar、activation.jar、servlet-api.jar)我不能,所以我收到验证错误。我想一劳永逸地找出这个问题的根源。我上网查了一下,好像都是说类文件不完整?我不知道。

有帮助吗?

解决方案

Android使用一个不同的类文件格式。你通过“DX”工具运行的第三方JAR文件附带的Android SDK中?

其他提示

看logcat的,看看什么东西导致的VerifyError。这也可能是在java.lang中类中的一些方法,不支持您使用Android SDK的级别(例如,String.isEmpty())。

机器人开发人员

从“亚行logcat”的输出表示不能在类 发现以及具有错误引用的类。那个地点 被确定下来具体的Dalvik指令。诀窍是 看在异常以上的日志。

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

  1. 在您的项目中创建一个目录(ex“ libs”)并将图书馆罐放在那里。
  2. 将目录添加到构建类 路径(点击 文件夹,并选择 "构建路径"->"使用 作为源文件夹")。
  3. 重建您的项目。

这发生在我身上现在。 错误是因为我用从我的设备有一个较新的SDK的方法引起的。

机器人1.5设备使用该安装的APK:

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

我发现了一个有趣的情况。我使用:

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

因此,一些新的Android 4种能力中的Android 2.3不implenented像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发生。

如果您使用Retrolambda您可能已添加到接口一个静态方法(其只允许在Java中8)。

这也可能发生,因为在棒糖引用限制错误下面的版本,在那里它被限制高达最大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扩展应用程序,用于e.g

public class MyApplication extends MultiDexApplication

步骤3:覆盖attachBaseContext

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

步骤4: 下一步骤是将以下添加到你的应用程序的机器人部分的build.gradle

 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

在我的情况下,它发生了,当我从Eclipse的靛蓝更新到Eclipse朱诺:我不知道什么是真正的原因,但是,我的Android项目,我工作了很长一段时间停止,因为那工作异常。

许多小时试图解决这个问题,我找到了解决办法我。

在我的Android项目,我用其他的项目(比如,“MyUtils”)是在同一个工作区。所以,我需要做到以下几点:

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

现在,去标签“排序和导出”,并“MyUtils”检查。就是这样。我摆脱这恼人的异常

我的gradle降级版本2.0.0从-α-2至1.5.0的是解决了这个问题。

的问题也由两个机器人的项目之间的不匹配引起的。例如,如果你开发使用包“com.yourcompany”的机器人库,然后,你必须使用相同的包作为基础包的主要应用程序的项目。然后让说你想改变你的主应用程序的版本,所以你改变清单文件的价值观:版本代码和版本名称。如果你不改变这些值的库运行你的应用程序,你会得到一个方法,从库中的对象上任何呼叫校验错误。

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

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

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

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

  1. 将所有包含的第 3 方 jar 迁移到 User-Libaray
  2. 将用户库移到 Android 库之前,并在“订单和导出”选项卡中检查它
  3. 清理并重建以运行

我有一个SDK更新后这个问题。编译器与我的外部图书馆的问题。我这样做:右击项目,然后“机器人工具>添加询问服务图书馆......”这个安装在我的项目库“Android的支持 - v4.jar”。

我得到的VerfiyError以及...找不到真正的原因。它有助于新的代码行包装成一个方法(Eclipse中,“提取方法......”)。所以,在我的情况的原因不是不支持的方法。

我有非常类似的问题。我又增加了的Apache POI 罐子和问题出现时,我更新到Android SDK 22.3。

我使用的是Android私家藏书检查所以这是不是与Android SDK中的常见问题。我未选中所有的的Apache POI 罐子和逐一加。我发现的 POI-3.9-20121203.jar 应之前的 POI-OOXML-3.9-20121203.jar 即可。否则将不工作。

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

testCoverageEnabled = true

有关我这导致在其上使用Java 1.7的特性,特别是串开关语句的类的VerifyError异常。

我制作一个git拉后有同样的问题。

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

希望这有助于。

我又发现了一个案例。

状况:

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

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

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),那么它的工作原理。这意味着方法和的其它内容,将被迁移到的的 Databind2.7 最新版本。这解决我的问题。

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

我也有这个问题,因为有我的罐子在用户库...

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

在我第一次这样做也没有工作,但后来我把他们赶走,再重新添加它们,它开始工作......

奇怪一个的位!但现在工作的所有时间。

好运

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

<强>解: 改变它来校正仿真器的版本。

此的保护正常工作作为ME .. 感谢。

有关后人,我只是因为我用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();
    }
};

我不得不删除依赖项目和代替编译依赖项目是JAR的和它们包括在库文件夹中。

我敢肯定,我的事业比你的不同,但由于这是搜索“的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的处理)解决了问题。

在我的情况下,发生该错误,因为我的谷歌播放服务是不是最新

如果您的项目不支持该.jar一些类,出现此错误时(例如,ImageView.setLayerType,AdvertisingIdClient,等等)。

我只确定了它出现另一种情况,这不仅是由于不库 DX '编 我有一个很长的doInBackground mehtod一个的AsyncTask。出于某种原因,这种方法有超过145线开始突破。 这件事发生在一个2.3的应用程序。 当我刚包封某些部分进入方法,它工作得很好。

因此,对于那些找不到,这不是正确的类DX 的'版,尝试降低你的方法的长度。

对于我来说,这个问题最终实际上正在,我用多catch子句某处这是一个Java 7的功能(和API 19+)类。因此,这将与VerifyError崩溃上所有预先19的设备。

有关我,在compileSdkVersion和buildToolsVersion之间的相关性。我有:

compileSdkVersion 21
buildToolsVersion '19.1.0'

我改成:

compileSdkVersion 21
buildToolsVersion '21.1.2'

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

compileSdkVersion 21

的java.lang.VerifyError的发生。因此,我改变的compileSdkVersion至19

compileSdkVersion 19

它运作良好。我认为,这可能是SDK编译工具的问题,而且看起来OK时API级别<21

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top