首先,我已经提到了一个类似的帖子,Android, javamail and proguard
提到的解决方案是在proguard-project.txt中明确地保留以下内容:
-dontwarn java.awt.**
-dontwarn java.beans.Beans
-dontwarn javax.security.**
-keep class javamail.** {*;}
-keep class javax.mail.** {*;}
-keep class javax.activation.** {*;}
-keep class com.sun.mail.dsn.** {*;}
-keep class com.sun.mail.handlers.** {*;}
-keep class com.sun.mail.smtp.** {*;}
-keep class com.sun.mail.util.** {*;}
-keep class mailcap.** {*;}
-keep class mimetypes.** {*;}
-keep class myjava.awt.datatransfer.** {*;}
-keep class org.apache.harmony.awt.** {*;}
-keep class org.apache.harmony.misc.** {*;}
乍一看,这似乎是有效的,因为它编译时没有任何警告。但是,它无法读取消息内容,只是跳过它。我尝试过以下方法:
经过几个小时的挫折之后,我发现这似乎有用了:
-dontobfuscate
-dontshrink
-keepdirectories
-keeppackagenames javax.mail.**
-keeppackagenames javax.activation.**
-keeppackagenames com.sun.mail.**
-keeppackagenames myjava.**
-keeppackagenames org.apache.harmony.**
-keeppackagenames mailcap.**
-keeppackagenames mimetypes.**
-keep class javamail.** {*;}
-keep class javax.mail.** {*;}
-keep class javax.activation.** {*;}
-keep class com.sun.mail.dsn.** {*;}
-keep class com.sun.mail.handlers.** {*;}
-keep class com.sun.mail.smtp.** {*;}
-keep class com.sun.mail.util.** {*;}
-keep class mailcap.** {*;}
-keep class mimetypes.** {*;}
-keep class myjava.awt.datatransfer.** {*;}
-keep class org.apache.harmony.awt.** {*;}
-keep class org.apache.harmony.misc.** {*;}
-dontwarn java.awt.**
-dontwarn java.beans.Beans
-dontwarn javax.security.**
当然这是荒谬的,因为我正在开启-dontobfuscate和-dontshrink。任何proguard和javamail专家都有解决方案吗?我是ADT17,使用2.1(api7)进行构建。如果我可以完全从过程中排除罐子呢?在这一点上,任何建议都是天赐之物。
问题解决了。我已经在这里发布了解决方案,以解决上面链接中提到的其他解决方案的问题。
因为我正在使用带有javamail(Mail.java)的帮助器类,所以我需要将该类包含为-keep以便它可以工作。我编辑了Android, javamail and proguard提供的解决方案以包含帮助程序类,因为许多人使用它,而另一个解决方案可能会在没有它的情况下失败。
把它放在你的proguard-project.txt文件中。我使用了默认的android设置。
-dontshrink
-keep class javax.** {*;}
-keep class com.sun.** {*;}
-keep class myjava.** {*;}
-keep class org.apache.harmony.** {*;}
-keep public class Mail {*;}
-dontwarn java.awt.**
-dontwarn java.beans.Beans
-dontwarn javax.security.**
在我的情况下,javax.activation导致以下问题:
Warning: com.sun.mail.handlers.handler_base: can't find referenced method 'boolean equals(java.awt.datatransfer.DataFlavor)' in program class javax.activation.ActivationDataFlavor
所以我不得不在ThumbsDP解决方案中添加-dontwarn javax.activation.**
。所有这些都是关于proguard规则的下面的补充,它对我有用:
-dontshrink
-keep class javax.** {*;}
-keep class com.sun.** {*;}
-keep class myjava.** {*;}
-keep class org.apache.harmony.** {*;}
-keep public class Mail {*;}
-dontwarn java.awt.**
-dontwarn java.beans.Beans
-dontwarn javax.security.**
-dontwarn javax.activation.**