在Android中使用DigestUtils找不到方法 您所在的位置:网站首页 commons-codec-110jar 在Android中使用DigestUtils找不到方法

在Android中使用DigestUtils找不到方法

2023-01-22 00:19| 来源: 网络整理| 查看: 265

由于这个问题的根本原因没有明确的答案,我想澄清这里发生了什么。

为什么首先抛出NoSuchMethodError?

根据异常堆栈跟踪,在DigestUtils#md5hex方法中导致错误的行是226。让我们看看我们有什么there (我假设您使用的是1.4版,因为这是在第226行调用Hex#encodeHexString方法的唯一版本):

public static String md5Hex(String data) { return Hex.encodeHexString(md5(data)); }

异常显示为java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Hex.encodeHexString。让我们来理解其中的原因。

首先,Android框架已经包含了Commons Codec库(除了DigestUtils类)。是的,它不会作为Android SDK的一部分公开,您不能直接使用它。但是你仍然想要使用它。那你是做什么的?将Commons Codec库添加为应用程序的一部分。编译器不会抱怨--从他的角度来看,一切都很好。

但是在运行时会发生什么呢?让我们跟踪您的异常堆栈跟踪:

首先,从活动的onCreate方法调用DigestUtils#md5Hex。正如我在上面所写的,框架不包含这个类,所以DigestUtils (来自Commons Codec版本1.4)是从您的dex加载的。

接下来,md5hex方法尝试调用Hex#encodeHexString方法。Hex类是框架中包含的Commons Codec库的一部分。问题是它的版本是1.3 (2004年7月的老版本)。Hex类存在于引导类路径中,这意味着运行时总是偏爱它,而不是打包在您的dex中的Hex类。当您启动应用程序(使用Dalvik运行时)时,您可以在您的应用程序日志中看到有关它的警告:

D/dalvikvm? DexOpt: 'Lorg/apache/commons/codec/binary/Hex;' has an earlier definition; blocking out I/dalvikvm? DexOpt: not resolving ambiguous class 'Lorg/apache/commons/codec/binary/Hex;' D/dalvikvm? DexOpt: not verifying/optimizing 'Lorg/apache/commons/codec/binary/Hex;': multiple definitions I/dalvikvm? Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.md5Hex

Commons Codec库的1.4版本中引入了Hex#encodeHexString方法,因此它不存在于框架的Hex类中。运行库找不到此方法,因此抛出NoSuchMethodError异常。

为什么接受答案的解决方案有效?

String s = new String(Hex.encodeHex(DigestUtils.md5(data)));

首先,调用DigestUtils#md5方法。正如我已经说过的,将要使用的DigestUtils类是打包在您的dex中的类。此方法不使用任何其他Commons Codec类,因此使用它没有问题。

接下来,将调用Hex#encodeHex。将使用的Hex类是框架的类(1.3版)。Commons Codec库的1.3版本中存在encodeHex方法(只接受一个参数字节数组),因此这段代码可以很好地工作。

我该怎么建议呢?

我建议的解决方案是重命名类的名称空间/包。通过这样做,我显式地指定将执行哪些代码,并防止由于版本控制问题而可能发生的奇怪行为。

您可以手动完成(正如考蒙斯在他的答案中所写的那样),也可以使用jarjar工具自动完成。

请参阅此问题摘要和在my blogpost中使用jarjar的提示。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有