18

我正在尝试设置一个集成了 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*

行。任何建议出了什么问题?

4

3 回答 3

16

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

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

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

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

对于 2)您可以尝试:

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

-optimizations !code/allocation/variable

这为我解决了这个问题。

于 2014-09-30T09:17:51.630 回答
15

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

防止混淆应用内购买 API

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

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

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

-dontoptimize

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

于 2013-04-09T14:39:21.100 回答
0

此外,您还需要将优化传递次数降低到 1,或者跳过 proguard 的优化步骤。

-优化通过 1

或者

-不要优化

于 2012-06-20T05:32:27.757 回答