6

首先,我已经提到过类似的帖子,Android、javamail 和 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. - 按照新的 libs/include 格式,将 jar 删除为外部库。
  3. - 维护 proguard-android.txt 中的默认 android 设置
  4. - 遵循 proguard 常见问题解答中的故障排除指南。
  5. - 开始一个新项目并将源文件复制到它。
  6. - 尝试了各种 proguard 选项,包括 -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) 进行构建。如果我可以将罐子完全排除在流程之外?在这一点上,任何建议都将是天赐之物。

4

3 回答 3

18

问题解决了。我已在此处为任何对上面链接中提到的其他解决方案有问题的人发布了解决方案。

因为我在 javamail (Mail.java) 中使用了一个辅助类,所以我需要将该类作为 -keep 包含在内,这样它才能工作。我编辑了Android、javamail 和 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.**
于 2012-06-02T21:51:04.803 回答
1

就我而言, 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

所以我不得不添加-dontwarn javax.activation.**ThumbsDP 解决方案。所以所有这些都是对我有用的 proguard-rules 的以下补充:

-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.**
于 2019-04-06T17:47:22.720 回答
0

现有的解决方案对我来说有点牵强。:)

我认为这是一个更好的解决方案,放在 proguard-rules.pro 文件中:

-libraryjars libs/mail.jar
-libraryjars libs/activation.jar
-libraryjars libs/additionnal.jar

作为奖励

解决proguard问题后,我也确实得到了以下异常:“com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found”

为了解决它,还要加上以下行:

-keep class com.google.** {*;}
于 2020-02-01T15:40:41.387 回答