Android的java.lang.VerifyError?
在我的Android应用程序中,我总是得到VerifyErrors! 我不明白为什么。 每当我包含一个外部JAR时,当我尝试启动我的应用程序时,我总是得到VerifyErrors(除了一次,当我包含Apache Log4j时)。
我通常通过获取库的源代码并将其添加到我的项目中来解决这个问题,但是我正在尝试使用GData客户端库( http://code.google.com/p/gdata-java-client/
)。
我可以得到这个来源,但它的依赖(mail.jar,activation.jar,servlet-api.jar)我不能,所以我得到validation错误。 我想一劳永逸地解决这个问题的根源。 我在网上查看,但是他们似乎都在谈论不完整的课程档案? 这我不知道。
Android使用不同的类文件格式。 您是否通过Android SDK附带的“dx”工具运行第三方JAR文件?
看看LogCat,看看是什么导致了validation错误。 这可能是您在使用的android SDK级别上不支持的java.lang类中的一些方法(例如String.isEmpty())。
来自android开发者 :
来自“adb logcat”的输出表示找不到的类以及具有不良引用的类。 该位置被确定为特定的Dalvik指令。 诀窍是查看exception之上的日志。
为了使它工作,你需要添加库的jar到其中一个源文件夹(即使你已经添加它作为eclipse库,你仍然需要添加它作为源)。
- 在你的项目中创build一个目录(例如“libs”)并将库jar放在那里。
- 通过(点击文件夹上的右键并select“Build path” – >“用作源文件夹”)将目录添加到构build类path。
- 重build你的项目。
它现在发生在我身上。 该错误是由于我使用我的设备具有的较新SDK中的方法而导致的。
Android 1.5设备安装了一个apk使用这个:
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
如果你使用的是Retrolambda,你可能会在接口中添加一个静态方法(只有在Java 8中才允许)。
我发现了一个有趣的案例。 我用:
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18" />
因此,一些新的Android 4function不像Android 2.3那样在ImageView.setLayerType
。 简单地避免运行时错误:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
这种方法也应该用于exception处理:
} catch (NetworkOnMainThreadException nomte) { // log this exception } catch (SocketTimeoutException socketTimeoutException) { // log this exception }
NetworkOnMainThreadException
没有在Android 2.3中实现,所以当类加载 (而不是在!)之前,会发生java.lang.VerifyError
exception。
这也可能是因为Lollypop的版本低于最大65K的限制错误而引起的限制错误
上述问题的可能解决scheme
第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
: 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
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
第三步:重写attachBaseContext
protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
第4步:下一步是将以下添加到您的应用程序build.gradle的Android部分
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' } } }
详情请查看
在Eclipse 4.x
,如果遇到这个问题,请尝试以下方法:
- 将所有包含的第三方jar子迁移到User-Libaray中
- 在android lib之前移动用户库,并在Order和Export选项卡中检查它
- 清理并重build运行
就我而言,当我从Eclipse Indigo更新到Eclipse Juno时,发生了这种情况:我不确定真正的原因是什么,但是由于这个exception,我长时间工作的Android项目停止了工作。
经过几个小时的努力修复,我find了解决scheme。
在我的Android项目中,我使用了在同一工作区中的其他项目(比如“MyUtils”)。 所以,我需要做到以下几点:
右键单击Android项目 – >构buildpath – >configuration构buildpath
现在,转到选项卡“订单和导出”,并选中“MyUtils”。 就是这样:我摆脱了这个恼人的例外。
我将gradle版本从2.0.0-alpha2降级到1.5.0,解决了这个问题。
这个问题也可能是由两个androids项目之间的不匹配造成的。 例如,如果您使用包“com.yourcompany”开发了一个android库,那么您的主应用程序的项目使用与基本包相同的包。 然后假设您想要更改主应用程序的版本,以便更改清单文件的值:版本代码和版本名称。 如果您在不更改库的这些值的情况下运行应用程序,那么在库中的任何对象方法调用时都会出现validation错误。
我遇到过同样的问题。 我正在build设2.1 r1和更新到2.1 r3与新的adt 17.我已经validation错误在javamail的mail.jar,这是让我疯了。 这是我如何解决这个问题:
- 创build一个库/文件夹,并添加jar子。
- 右键单击>添加为源文件夹
我试图重build,失败了。 我将libs /目录作为源文件夹移除,并将构buildpath中的3个jar文件移除。 然后我再次添加libs /文件夹,并将libs /文件夹中的每个jar添加到构buildpath。 现在它按预期工作。 这是一个奇怪的解决方法,但它为我工作。
SDK更新后,我有这个问题。 编译器与我的外部图书馆有问题。 我这样做:右键点击项目,然后“安卓工具>添加suport库…”这个安装在我的项目库“android-support-v4.jar”。
我也得到VerfiyError …找不到真正的原因。 它有助于将新的代码行包装到一个方法中(Eclipse,“提取方法…”)。 所以在我的情况下,原因不是一个不受支持的方法。
我有非常类似的问题。 我已经添加了Apache POI jar,并且在更新到android SDK 22.3时出现了问题。
我有Android的私人图书馆检查,所以这不是android SDK的常见问题。 我取消了所有的Apache POI的jar子,并逐一添加。 我发现poi-3.9-20121203.jar应该在poi-ooxml-3.9-20121203.jar之前 。 否则,它将无法正常工作。
如果您有testing,请尝试从您的build.grade
文件注释掉这一行:
testCoverageEnabled = true
对我而言,这会导致使用Java 1.7function的类(尤其是string切换语句)的VerifyErrorexception。
我做了一个git pull之后也有同样的问题。
解决scheme:构build – >清理项目。
希望这可以帮助。
我发现了另一个案子。
条件:
- 使用Retrolambda(不知道是否有必要);
- 在界面中创build一个静态方法。
结果是繁荣! 尝试访问使用该接口的类时发生java.lang.VerifyError。 看起来像Android(4.4。*在我的情况下)不喜欢接口中的静态方法。 从接口中移除静态方法会使VerifyError消失。
我也有这个问题,因为我的jar子在用户库…
我解决这个问题的方法是将它们添加到lib文件夹中,然后将它们添加到eclipse中的构build属性中。
我第一次做到这一点是行不通的,但是我删除了它们,重新读了它们,并开始工作。
一个奇怪的一点! 但现在一直在工作。
祝你好运
我编写了SDK 2.1中的Android API方法/类,并试图在Android 1.6模拟器上运行它。 所以我得到了这个错误。
解决scheme:将其更改为更正模拟器版本。
这工作我..谢谢。
对于后人,我刚刚得到这个错误,因为我使用的是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(); } };
我不得不删除依赖项目,而是编译依赖项目是jar的,并将它们包含在libs文件夹中。
我确定我的原因与你的不同,但是因为这是search“Android java.lang.VerifyError”时的头号命中之一,所以我想我会在这里logging它的后代。
我有以下几个课程:
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等)。
我刚刚发现了另一种情况,不仅是因为没有编辑库。 我有一个非常长的doInBackground mehtod AsyncTask。 由于某种原因,这种超过145行的方法开始中断。 它发生在一个2.3应用程序。 当我只是将一些部分封装到方法中时,它运行良好。
所以对于那些找不到没有正确使用的类的人,尽量减less你的方法的长度。
对于我来说,这个问题实际上是我在Java 7function类(和API 19+)中的某个地方使用了multi-catch子句。 所以它会在所有的19之前的设备上使用VerifyError
。
对我来说,它是在compileSdkVersion和buildToolsVersion之间的相关性。 我有:
compileSdkVersion 21 buildToolsVersion '19.1.0'
我把它改成:
compileSdkVersion 21 buildToolsVersion '21.1.2'
对我来说,这是compileSdkVersion的问题。 当我在特定的android应用程序( https://github.com/android10/Android-AOPExample )中使用API级别21时:
compileSdkVersion 21
java.lang.verifyerror发生了。 所以我把compileSdkVersion改成了19
compileSdkVersion 19
它运作良好。 我认为这可能是SDK buildTools的问题,并且在API级别<21时似乎还可以。
java.lang.VerifyError
意味着你编译的字节码是指Android在运行时找不到的东西。 这个verifyError问题只与kitkat4.4和较小的版本不在上述版本 ,即使我在两个设备上运行相同的生成。 当我使用老版本的jackson jsonparsing器时,它显示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'