我正在尝试设置集成了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*
线条。有什么建议出了什么问题吗?
答案 0 :(得分:14)
每Amazon's SDK Docs,以下是您应该包含的行:
防止对应用内购买API进行模糊处理
将应用内购买API合并到库中时,您需要指定要“保留”而不是混淆的类。在proguard.cfg文件中的任何位置添加以下行。
-dontwarn com.amazon.**
-keep class com.amazon.** {*;}
-keepattributes *Annotation*
此外,您还需要跳过Proguard的优化步骤。
-dontoptimize
注意:请务必删除任何其他处理优化的标记或任何可能与上述设置冲突的标记。
答案 1 :(得分:14)
亚马逊的推荐配置中有一些可疑的东西。
1)-dontwarn
隐藏了一个更深层次的基础问题,其中一些亚马逊特定的库不存在,但是被引用以便proguard将尝试一些可能导致上述堆栈跟踪的有线优化。
2)-dontoptimize
正在禁用所有优化,这是绝对错误的,因为它很可能只是导致此问题的一个特定优化,并且proguards优化正在从您的应用程序中删除很多死的和未使用的代码它的库,所以它缩小了总的dex大小。
我认为修复1)是真正的解决方案。这最终可以通过从设备中提取Amazons系统库并在构建时使它们(作为提供的lib)存在来实现 该应用程序。
2)你可以尝试:
-dontwarn com.amazon.**
-keep class com.amazon.** {
*;
}
-optimizations !code/allocation/variable
为我解决了这个问题。
答案 2 :(得分:0)
此外,您还需要将优化次数减少到1,或者跳过proguard的优化步骤。
-optimizationpasses 1
或
<强> -dontoptimize 强>