【发布时间】:2021-02-27 18:20:10
【问题描述】:
在 Android 上,我们使用 org.apache.commons.mail.util 中的 MimeMessageParser 将 mime 对象解析为 javax.mail.internet.MimeMessage 对象。
为此,我们安装了一个 MailcapCommandMap,例如
mailcap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
当我在 Android 11 (API 30) x86 模拟器或 Android 11 设备 (Pixel 4a) 上以调试模式运行应用程序时,MailcapCommandMap 类会引发 VerifyError:
Rejecting class com.sun.mail.handlers.multipart_mixed that attempts to sub-type erroneous class com.sun.mail.handlers.handler_base (declaration of 'com.sun.mail.handlers.multipart_mixed'
原因如下
java.lang.VerifyError: Verifier rejected class com.sun.mail.handlers.handler_base: java.awt.datatransfer.DataFlavor[] com.sun.mail.handlers.handler_base.getTransferDataFlavors() failed to verify: java.awt.datatransfer.DataFlavor[] com.sun.mail.handlers.handler_base.getTransferDataFlavors(): [0x4] can't resolve returned type 'Unresolved Reference: java.awt.datatransfer.DataFlavor[]' or 'Reference: javax.activation.ActivationDataFlavor[]'
类似的错误似乎与 Proguard resp R8 有关,但混淆被禁用,并且完全相同的代码在发布版本中运行。 由于这只发生在 Android 11 模拟器上,而且 javamail 似乎使用反射,我想知道是否可以以某种方式避免这种行为。
编辑:负责的代码似乎是这样的:
// First try the "application's" class loader.
cld = SecuritySupport.getContextClassLoader();
if (cld == null)
cld = this.getClass().getClassLoader();
Class cl = null;
try {
cl = cld.loadClass(name);
} catch (Exception ex) {
// if anything goes wrong, do it the old way
cl = Class.forName(name);
}
if (cl != null) // XXX - always true?
return (DataContentHandler)cl.newInstance();
【问题讨论】:
标签: android jakarta-mail mime-message