如何为Amazon IAP设置ProGuard?

Tam*_*mas 17 android amazon proguard in-app-purchase

我正在尝试建立一个集成了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)
...
Run Code Online (Sandbox Code Playgroud)

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

 -dontwarn com.amazon.**
 -keep class com.amazon.** {*;}
 -keepattributes *Annotation*
Run Code Online (Sandbox Code Playgroud)

它的线条.有什么建议出了什么问题?

joe*_*cks 15

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

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

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

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

对于2)你可以尝试:

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

-optimizations !code/allocation/variable
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.

  • 好吧,我自己花了一些时间,所以这是我能做的最少的事情,以恢复世界"花在愚蠢掩盖上的时间"的平衡. (2认同)
  • 我现在正和亚马逊讨论一些事情.这将在我的下一封电子邮件中引起关注. (2认同)

Jam*_*ken 14

根据亚马逊的SDK文档,以下是您应该包含的行:

防止对应用内购买API进行模糊处理

将应用内购买API合并到库中时,您需要指定要"保留"而不是混淆的类.在proguard.cfg文件中的任何位置添加以下行.

-dontwarn com.amazon.**
-keep class com.amazon.** {*;}
-keepattributes *Annotation*
Run Code Online (Sandbox Code Playgroud)

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

-dontoptimize
Run Code Online (Sandbox Code Playgroud)

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


小智 0

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

-优化1次

或者

-不优化

  • ProGuard 基本上做两件事(混淆和优化)。您的解决方案是禁用其中之一。我不确定这对于那些一开始就努力启用 ProGuard 的人来说是否可以接受。 (3认同)