安卓:ProGuard混淆问题

5

我使用javamail api为安卓开发了一款邮件客户端,并且该应用在模拟器或设备上运行良好... 现在我想使用eclipse导出项目,但是遇到了以下错误:

     Warning: org.apache.harmony.awt.datatransfer.DataProxy: can't find superclass or interface java.awt.datatransfer.Transferable
 Warning: org.apache.harmony.awt.datatransfer.NativeClipboard: can't find superclass or interface java.awt.datatransfer.Clipboard
 Warning: javax.activation.CommandInfo: can't find referenced class java.beans.Beans
 Warning: com.sun.mail.imap.protocol.IMAPSaslAuthenticator: can't find referenced class javax.security.sasl.Sasl
 Warning: com.sun.mail.imap.protocol.IMAPSaslAuthenticator: can't find referenced class javax.security.sasl.SaslClient
 Warning: com.sun.mail.imap.protocol.IMAPSaslAuthenticator: can't find referenced class javax.security.sasl.SaslException
 Warning: org.apache.harmony.awt.datatransfer.DragSourceEventProxy: can't find referenced class java.awt.Point
 Warning: org.apache.harmony.awt.datatransfer.DragSourceEventProxy: can't find referenced class java.awt.dnd.DragSourceContext
 Warning: org.apache.harmony.awt.datatransfer.DragSourceEventProxy: can't find referenced class java.awt.dnd.DragSourceEvent

我看到javamail api使用java.awt和javax.security库... 我该如何将它们添加到我的项目中,以便我可以导出我的项目并混淆它?

非常感谢!

更新:

我尝试在我的项目中导入jre库,这些错误已经消失了,但是新的错误出现了:

Proguard returned with error code 1. See console
 Note: there were 4243 duplicate class definitions.
 Warning: library class com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler extends or implements program class javax.activation.DataContentHandler
 Warning: library class com.sun.xml.internal.ws.encoding.XmlDataContentHandler extends or implements program class javax.activation.DataContentHandler
 Warning: library class com.sun.xml.internal.messaging.saaj.soap.MessageImpl$1 extends or implements program class javax.activation.DataSource
 Warning: library class com.sun.xml.internal.ws.encoding.StringDataContentHandler extends or implements program class javax.activation.DataContentHandler 

What can I do?

2个回答

11

这些列出的Java类不是Android运行时的一部分。最干净的解决方法是从javamail库中删除引用它们的类,因为它们在这个环境下永远无法工作。

通常情况下,您也可以在ProGuard配置中过滤它们,但Android构建脚本不支持过滤器。

作为一个简单的替代方案,您可以抑制这些警告:

-dontwarn java.awt.**,javax.security.**,java.beans.**

ProGuard 将会在不抱怨的情况下继续执行。


这个可以运行,但我没有找到任何关于Android构建脚本不支持过滤器的信息。你有相关链接吗? - phunehehe
@phunehehe 理论上,您可以在Ant构建文件android-sdk/tools/ant/build.xml的'injars'行中添加过滤器。正如您在那里看到的,它默认不定义任何过滤器。 - Eric Lafortune

4

我通过在项目中添加jre库,然后将以下命令添加到proguard.cfg文件中解决了问题:

-libraryjars <java.home>/lib/rt.jar(java/**,javax/security/**,javax/activation/**)

希望这篇文章能对某些人有所帮助 :P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接