Android java.lang.VerifyError?

Isa*_*ler 98 java android gdata verifyerror

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

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

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

小智 118

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

  • 这应该标记为真实的答案.至少在我的情况下是什么,因为我从我的用户那里得到了零星的错误,并且我将它追溯到了API的第3版中不支持的View.getTag(int)调用 (4认同)

ADB*_*ADB 56

来自android-developers:

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

  • 查看异常上方也帮助我确定导致错误的方法.对我来说,这是表达式Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR,这有点显而易见,最后,如果你在Cupcake上尝试... (6认同)
  • 谢谢!这是我得到的问题......有用的日志就在异常之上:`WARN/dalvikvm(1052):VFY:无法解析静态方法475:Ljavax/xml/datatype/DatatypeFactory; .newInstance()Ljavax/xml/datatype/DatatypeFactory;`(现在要弄清楚如何在没有DatatypeFactory的情况下做) (2认同)

Tof*_*eer 35

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

  • 有关"dx"工具的更多信息会很棒. (4认同)
  • 查看Android项目首选项的"库"部分,在SDK版本列表下方.您在构建中依赖的外部项目是否显示在那里,旁边有绿色勾号? (2认同)

Mak*_*kin 14

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

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


Mac*_*rse 8

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

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

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
Run Code Online (Sandbox Code Playgroud)


Ser*_*m's 8

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

<uses-sdk
   android:minSdkVersion="9"
   android:targetSdkVersion="18" />
Run Code Online (Sandbox Code Playgroud)

因此,一些新的Android 4功能并未在Android 2.3中实现ImageView.setLayerType.要简单地避免运行时错误:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
Run Code Online (Sandbox Code Playgroud)

这种方法也应该用于异常处理:

} catch (NetworkOnMainThreadException nomte) {
   // log this exception
} catch (SocketTimeoutException socketTimeoutException) {
   // log this exception
}
Run Code Online (Sandbox Code Playgroud)

NetworkOnMainThreadException在Android 2.3中没有实现,因此当加载类(而不是之前!)时,java.lang.VerifyError会发生异常.


Tak*_*ion 7

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


Paw*_*ari 7

这也可能是因为在Lollypop下面的版本引用了限制错误,它被限制到最大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扩展您的应用程序,例如

public class MyApplication extends MultiDexApplication
Run Code Online (Sandbox Code Playgroud)

第3步:覆盖attachBaseContext

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}
Run Code Online (Sandbox Code Playgroud)

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

 dexOptions {
      preDexLibraries = false
   }
Run Code Online (Sandbox Code Playgroud)

第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'
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请结帐

https://developer.android.com/tools/building/multidex.html