代码之家  ›  专栏  ›  技术社区  ›  Isaac Waller

Android java.lang.VerifyError?

  •  97
  • Isaac Waller  · 技术社区  · 17 年前

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

    GData client library

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

    30 回复  |  直到 8 年前
        1
  •  118
  •   Alex    16 年前

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

        2
  •  56
  •   ADB    16 年前

    从…起 android-developers

    “adb logcat”的输出表示无法访问的类 根据特定的Dalvik指令进行识别。诀窍是 查看异常上方的日志。

        3
  •  35
  •   TofuBeer    17 年前

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

        4
  •  15
  •   Maksim Golivkin    15 年前

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

    1. 在项目中创建目录 (e.x.“libs”)并放入库jar 那里
    2. 将目录添加到构建类 文件夹并选择“生成路径”->“使用 作为“源文件夹”)。
    3. 重建您的项目。
        5
  •  8
  •   Macarse    16 年前

    导致此错误的原因是我使用的方法来自我的设备拥有的较新SDK。

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

    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
    
        6
  •  8
  •   Seraphim's    12 年前

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

    因此,一些新的安卓4功能并不像安卓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 发生。

        7
  •  7
  •   Takhion    11 年前

    如果您使用的是Retrolambda,您可能已经向接口添加了一个静态方法(仅在Java8中允许)。

        8
  •  7
  •   Pawan Maheshwari    11 年前

    步骤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:

     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

        9
  •  3
  •   Valery Viktorovsky    11 年前

    之后 许多的

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

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

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

        10
  •  3
  •   Sun Zhengchang    10 年前

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

        11
  •  2
  •   ZeroOne    14 年前

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

        12
  •  2
  •   ThumbsDP    14 年前

    我也有同样的问题。我使用2.1 r1构建,并使用新的adt 17更新为2.1 r3。我在javamail的mail.jar上验证了错误,这让我抓狂。下面是我如何解决这个问题的:

    1. 创建了一个libs/文件夹并添加了jar。

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

        13
  •  2
  •   John Conde    13 年前

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

    1. 将所有包含的第三方JAR迁移到用户库中
    2. 在android库之前向上移动用户库,并在Order and Export选项卡中选中它
    3. 清理并重建以运行
        14
  •  2
  •   Andreu    13 年前

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

        15
  •  2
  •   Koen.    8 年前

    java.lang.VerifyError 这意味着您编译的字节码引用了Android在运行时无法找到的内容。这个verifyError只向我发出 kitkat4.4及以下版本不在上述版本中 甚至我在两台设备上都运行了相同的构建。当我使用旧版本的jackson json解析器时,它显示

    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),然后它就可以工作了。这意味着研究的方法和其他内容 果心 已迁移到的最新版本 . 这可以解决我的问题。

    compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
    
        16
  •  1
  •   asdf wer    16 年前

        17
  •  1
  •   Grzegorz Bielański    12 年前

    阿帕奇POI 当我更新到android SDK 22.3时,JAR和问题出现了。

    我检查了Android私有库,所以这不是Android SDK的常见问题。我检查了所有的 阿帕奇POI 一罐一罐地加上。我发现 poi-3.9-20121203.jar poi-ooxml-3.9-20121203.jar . 否则它将无法工作。

        18
  •  1
  •   aluxian    12 年前

    如果您有测试,请尝试从您的 build.grade 文件:

    testCoverageEnabled = true
    

    对我来说,这导致使用Java 1.7特性的类出现VerifyError异常,特别是字符串开关语句。

        19
  •  1
  •   Vingtoft    11 年前

    我拉了一个git后也有同样的问题。

    希望这有帮助。

        20
  •  1
  •   Display Name    11 年前

    我发现了另一个病例。

    条件:

    • 使用Retrolambda(不确定是否有必要);

        21
  •  0
  •   Benjamin Lambe    15 年前

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

    我第一次这么做时,它不起作用,但后来我删除了它们并重新阅读,它开始起作用。。。

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

    祝你好运

        22
  •  0
  •   Piyush Patel    15 年前

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

    工作 为了我。。 谢谢

        23
  •  0
  •   Gray droiddeveloper    14 年前

    对于后代来说,我只是因为使用了 Arrays.copyOf() 这不是对应于Android级别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();
        }
    };
    
        24
  •  0
  •   Siddharth    13 年前

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

        25
  •  0
  •   benkc    13 年前

    我上了一些课程,内容大致如下:

    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
  •   Allen    11 年前

    在我的例子中,发生此错误是因为 谷歌播放服务不是最新的 .

        27
  •  0
  •   Rafael Coutinho    11 年前

    我刚刚发现了另一种情况,它发生了,不仅仅是由于LIB,而不是 dx “埃德。 它发生在一个2.3版本的应用程序上。 当我只是将一些部分封装到方法中时,它工作得很好。

    dx “ed,试着缩短你的方法的长度。

        28
  •  0
  •   Jin    11 年前

    对我来说,问题最终实际上是我在类的某个地方使用了multi-catch子句,这是一个Java7特性(和API19+)。所以它会与 VerifyError 在所有19岁以前的设备上。

        29
  •  0
  •   gingo    10 年前

    compileSdkVersion 21
    buildToolsVersion '19.1.0'
    

    我把它改成:

    compileSdkVersion 21
    buildToolsVersion '21.1.2'
    
        30
  •  0
  •   Community Mohan Dere    9 年前

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

    compileSdkVersion 21
    

    发生java.lang.verifyerror错误。所以我把compileSdkVersion改为19

    compileSdkVersion 19
    

    推荐文章