如何为 Amazon IAP 设置 ProGuard?

Posted

技术标签:

【中文标题】如何为 Amazon IAP 设置 ProGuard?【英文标题】:How to set up ProGuard for Amazon IAP? 【发布时间】:2012-06-19 16:08:57 【问题描述】:

我正在尝试设置一个集成了 Amazon IAP 的基本 ProGuard。但是,当我尝试导出我的 APK 时,出现以下错误:

[2012-06-17 10:59:44 - sc] Proguard returned with error code 1. See console
[2012-06-17 10:59:44 - sc] Unexpected error while performing partial evaluation:
[2012-06-17 10:59:44 - sc]   Class       = [com/amazon/inapp/purchasing/KiwiResponseHandler$PurchaseResponseHandlerRunnable]
[2012-06-17 10:59:44 - sc]   Method      = [run()V]
[2012-06-17 10:59:44 - sc]   Exception   = [java.lang.IllegalArgumentException] (Can't find common super class of [java/lang/String] (with 4 known super classes) and [com/amazon/inapp/purchasing/KiwiPurchaseResponseCommandTask] (with 1 known super classes))
[2012-06-17 10:59:44 - sc] java.lang.IllegalArgumentException: Can't find common super class of [java/lang/String] (with 4 known super classes) and [com/amazon/inapp/purchasing/KiwiPurchaseResponseCommandTask] (with 1 known super classes)
[2012-06-17 10:59:44 - sc]  at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:344)
[2012-06-17 10:59:44 - sc]  at proguard.evaluation.value.IdentifiedReferenceValue.generalize(IdentifiedReferenceValue.java:65)
[2012-06-17 10:59:44 - sc]  at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:481)
...

我有默认的 ProGuard 配置文件,并且我已经添加了:

 -dontwarn com.amazon.**
 -keep class com.amazon.** *;
 -keepattributes *Annotation*

行。有什么建议吗?

【问题讨论】:

您查看过此页面吗? amazonappstoredev.com/2012/04/… 你找到解决方案了吗? 类似问答:***.com/questions/26061795/… 【参考方案1】:

亚马逊的推荐配置有一些可疑的东西。

1) -dontwarn 隐藏了一个更深层次的潜在问题,其中一些 Amazon 特定库不存在,但被引用以便 proguard 将尝试一些可能导致上述堆栈跟踪的有线优化。

2) -dontoptimize 正在禁用所有优化,这显然是错误的,因为它很可能只是导致此问题的一个特定优化,并且 proguard 优化正在从您的应用程序及其库中删除大量无效和未使用的代码,所以它缩小了总的 dex 大小。

我想修复 1) 是真正的解决方案。这最终可以通过从设备中提取 Amazon 的系统库并在构建时使它们存在(作为提供的库)来实现 应用程序。

对于 2) 你可以试试:

-dontwarn com.amazon.**
-keep class com.amazon.** 
    *;


-optimizations !code/allocation/variable

这为我解决了这个问题。

【讨论】:

这是最好的答案。感谢-optimizations !code/allocation/variable 部分,它为我节省了很多时间。 好吧,我自己也花了一些时间在这上面,所以这是我能做的最少的事情来恢复世界“花在愚蠢掩盖上的时间”的平衡。 我现在正在和亚马逊谈一些事情。这将在我的下一封电子邮件中提出。 谢谢!最佳答案!工作并保持优化! 谢谢。看起来比使用“-dontoptimise”更安全。【参考方案2】:

根据Amazon's SDK Docs,您应该包括以下几行:

防止混淆应用内购买 API

在将 In-App Purchasing API 合并到您的库中时,您需要指定要“保留”而不是混淆的类。在 proguard.cfg 文件中的任意位置添加以下行。

-dontwarn com.amazon.**
-keep class com.amazon.** *;
-keepattributes *Annotation*

此外,您还需要跳过 Proguard 的优化步骤。

-dontoptimize

注意:确保删除任何其他处理优化的标志,或任何可能与上述设置冲突的标志。

【讨论】:

很高兴有那个链接到“主要来源”。 如果我只使用默认的 proguard-android.txt 我可以让我的代码在启用优化的情况下工作。但是,如果我使用 proguard-android-optimize.txt 我必须跳过优化。最终结果是相同的,即。 APK 大小相同。【参考方案3】:

此外,您还需要将优化次数减少到 1,或者跳过 proguard 的优化步骤。

-优化通过 1

-不要优化

【讨论】:

ProGuard 基本上做了两件事(混淆和优化)。您的解决方案是禁用其中一个。对于那些一开始就致力于启用 ProGuard 的人来说,我不确定这是否可以接受。 这不是真的。我能够通过 -optimizationpasses 5 让 proguard 与 Amazon IAP 一起工作。 @greg7gkb:嗨,你能告诉我你的应用程序中的 proguard 版本是什么吗? 这是与 Android 工具修订版 20 一起使用的,它是目前最新的。 +1,不管效果如何,这是在官方指南中(developer.amazon.com/public/apis/earn/in-app-purchasing/docs/…)。

以上是关于如何为 Amazon IAP 设置 ProGuard?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 IP 地址设置 Amazon S3 策略

如何为 Amazon EC2 实例设置 SSH 访问?

我们如何为 Amazon S3 存储桶中的文件夹设置 CORS

如何为Amazon AWS部署设置composer标志--no-dev

如何为 Amazon CloudFront 签署 RTMP URL

如何为 Heroku 应用程序配置带有 SSL 的 Amazon Route