Android,Proguard和Javamail

问题描述 投票:4回答:2

首先,我已经提到了一个类似的帖子,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.** {*;}

乍一看,这似乎是有效的,因为它编译时没有任何警告。但是,它无法读取消息内容,只是跳过它。我尝试过以下方法:

  1. -includelibraryjars明确命名javamail所需的3个jar文件。
  2. - 将jar作为外部库删除,遵循新的libs / include格式。
  3. - 维护proguard-android.txt中的默认android设置
  4. - 跟随proguard常见问题解答中的故障排除指南。
  5. - 启动一个新项目并将源文件复制到它。
  6. - 各种程序选项,包括-dontshrink,keepnames等
  7. - 专业项目/清洁

经过几个小时的挫折之后,我发现这似乎有用了:

-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)进行构建。如果我可以完全从过程中排除罐子呢?在这一点上,任何建议都是天赐之物。

android javamail proguard
2个回答
14
投票

问题解决了。我已经在这里发布了解决方案,以解决上面链接中提到的其他解决方案的问题。

因为我正在使用带有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.**

0
投票

在我的情况下,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.**
© www.soinside.com 2019 - 2024. All rights reserved.