在我的Android应用程序中,我总是得到VerifyErrors!我无法弄清楚原因。每当我包含一个外部JAR时,我总是在尝试启动我的应用程序时获得VerifyErrors(除了一次,当我包含Apache Log4j时)。
我通常通过获取库的源代码并将其添加到我的项目来解决这个问题,但我试图把GData client library。
我可以在源代码中获取它,但它的依赖项(mail.jar,activation.jar,servlet-api.jar)我不能,所以我得到验证错误。我想一劳永逸地找到这个问题的根源。我在互联网上看了一下,但他们似乎都在谈论不完整的类文件?我不知道。
Android使用不同的类文件格式。您是否通过Android SDK附带的“dx”工具运行第三方JAR文件?
我将gradle版本从2.0.0-alpha2降级到1.5.0解决了这个问题。
这个问题也可能是由两个机器人项目之间的不匹配引起的。例如,如果您使用“com.yourcompany”包开发了一个android库,那么您的主应用程序项目使用与基础包相同的包。然后,假设您要更改主应用程序的版本,以便更改清单文件的值:版本代码和版本名称。如果您在不更改库的这些值的情况下运行应用程序,则在从库中对象的任何方法调用时都会收到验证错误。
我遇到过同样的问题。我用2.1 r1构建并使用新的adt 17更新到2.1 r3。我在javamail的mail.jar上验证了错误,这让我发疯了。这是我如何解决这个问题:
我尝试重建,但失败了。我删除了libs /目录作为源文件夹,并删除了refs到构建路径中的3个jar文件。然后我再次添加了libs /文件夹,并将libs /文件夹中的每个jar添加到构建路径中。现在它按预期工作。这是一个奇怪的解决方法,但它对我有用。
在https://developer.android.com/tools/building/multidex.html中,如果您遇到此问题,请尝试以下操作:
SDK更新后我遇到此问题。编译器与我的外部库存有问题。我这样做了:右键单击项目,然后“android工具>添加支持库......”这个安装在我的项目库“android-support-v4.jar”上。
我也得到了VerfiyError ......找不到真正的原因。它有助于将新的代码行包装到一个方法中(Eclipse,'Extract Method ...')。所以在我的情况下,原因不是一个不受支持的方法。
我有类似的问题。当我更新到android SDK 22.3时,我添加了Apache POI jar并出现了问题。
我检查了Android私有库,所以这不是android SDK的常见问题。我取消选中所有Apache POI jar并逐个添加。我发现poi-3.9-20121203.jar应该在poi-ooxml-3.9-20121203.jar之前。否则它将无法工作。
如果您有测试,请尝试从Eclipse 4.x
文件中注释掉这一行:
build.grade
对我来说,这会导致使用Java 1.7功能的类的VerifyError异常,特别是字符串切换语句。
在做一个git pull之后我遇到了同样的问题。
解决方案:构建 - >清理项目。
希望这可以帮助。
我找到了另一个案例。
条件:
结果就是繁荣!尝试访问使用该接口的类时java.lang.VerifyError。看起来像Android(4.4。*在我的情况下)不喜欢接口中的静态方法。从接口中删除静态方法会使VerifyError消失。
查看LogCat,看看是什么导致了verifyerror。它可能是java.lang类中的一些方法,在您正在使用的android SDK级别上不受支持(例如,String.isEmpty())。
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.+'
我也有这个问题,就像我在用户库中的罐子一样......
我解决这个问题的方法是将它们添加到lib文件夹中,然后将它们添加到eclipse中的构建属性中...
我第一次这样做它没有用,但后来我删除了它们并再次读取它们开始工作......
有点奇怪!但现在一直在工作。
祝好运
我编写了SDK 2.1中的Android API方法/类,并试图在Android 1.6模拟器上运行它。所以我得到了那个错误。
解决方案:将其更改为更正的仿真器版本。
这为我工作..谢谢。
对于后代,我刚刚得到这个错误,因为我使用的是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
我不得不删除依赖项目,而是编译依赖项目是jar,并将它们包含在libs文件夹中。
我确信我的原因与你的不同,但由于这是搜索“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的方法)解决了这个问题。
在我的情况下,出现此错误是因为我的google-play-service不是最新的。
如果您的项目不支持.jar中的某个类,则会发生此错误(例如ImageView.setLayerType,AdvertisingIdClient等)。
我刚刚确定了它发生的另一种情况,不仅仅是因为libs没有dx'ed。我有一个非常长的doInBackground mehtod AsyncTask。出于某种原因,超过145行的这种方法开始破裂。它发生在2.3应用程序上。当我将一些部分封装到方法中时,它工作正常。
因此,对于那些找不到正确dx的类,请尝试减少方法的长度。
对我来说,问题最终实际上是我在类中的某个地方使用了多个catch子句,这是一个Java 7特性(和API 19+)。所以它会在所有19岁以前的设备上与A[] result = null;
if (something)
result = new B[cursor.getCount()];
else
result = new C[cursor.getCount()];
// Fill result
...
崩溃。
对我来说,它是在compileSdkVersion和buildToolsVersion之间的相关性。我有:
VerifyError
我改成了:
compileSdkVersion 21
buildToolsVersion '19.1.0'
“adb logcat”的输出表示无法找到的类以及具有错误引用的类。该位置被识别为特定的Dalvik指令。诀窍是查看异常上方的日志。
对我来说,这是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时似乎没问题。
要使其工作,您需要将库的jar添加到其中一个源文件夹(即使您已将其添加为eclipse库,您仍需要将其添加为源代码)。
它现在发生在我身上。导致该错误是因为我使用的是我的设备所具有的较新SDK中的方法。
Android 1.5设备安装了一个apk使用此:
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
我发现了一个有趣的案例。我用:
<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
异常。
如果您正在使用Retrolambda,则可能已向接口添加了静态方法(仅在Java 8中允许)。
这也可能是因为在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'
}
}
}
就我而言,当我从Eclipse Indigo更新到Eclipse Juno时发生了这种情况:我不确定是什么原因,但是,我正在研究的Android项目因为该异常而停止工作了很长时间。
经过几个小时的努力来解决这个问题,我找到了解决方案。
在我的Android项目中,我使用位于同一工作区中的其他项目(例如,“MyUtils”)。所以,我需要做以下事情:
右键单击Android项目 - >构建路径 - >配置构建路径
现在,转到“订购和导出”选项卡并选中“MyUtils”。就是这样:我摆脱了这个烦人的异常。