【问题标题】:How to set up ProGuard for Amazon IAP?如何为 Amazon IAP 设置 ProGuard?
【发布时间】: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*

行。有什么建议吗?

【问题讨论】:

标签: android amazon proguard in-app-purchase


【解决方案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/…)。
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2012-09-20
  • 2013-06-11
  • 2012-07-14
  • 2015-01-02
  • 1970-01-01
  • 2017-09-18
相关资源
最近更新 更多