Hi,
The problem with Optimization option and Amazon SDK.
When compile Amazon IAP with proguard,
proguard showing below error if have ANY optimization option.
And also the funny thing is that the Amazon officially request/telling
that 'turn off optimization option' prevent below error. really insane...
So,
would you please check that the problem with the Amazon SDK urgently?
Access : https://developer.amazon.com/public/resources/development-tools/sdk
to get the SDK
and find and compile the sample 'Apps-SDK_20140504\Android\InAppPurchasing\samples\SampleIAPSubscriptionsApp'(this should be enough to check)
and put proguard option as
'\Apps-SDK_20140504\Android\InAppPurchasing\samples\Obfuscation' sample. which is official
and additionally add
'-dontoptimize' as Amazon prefer from
'https://developer.amazon.com/public/apis/earn/in-app-purchasing/docs/code-obfuscation'
I hope that fix this ASAP.
Thank you every time.
P.S:below error occured when use two lines of options as
'-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/,!class/merging/,!class/unboxing/enum
-optimizationpasses 5'
if change this two line to '-dontoptimize',
no more error occured.(must remove ANY optimization flags at once)
Unexpected error while performing partial evaluation:
Class = [com/amazon/inapp/purchasing/KiwiResponseHandler$PurchaseResponseHandlerRunnable]
Method = [run()V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/amazon/inapp/purchasing/KiwiPurchaseResponseCommandTask] (with 1 known super classes) and [java/lang/String] (with 4 known super classes))
java.lang.IllegalArgumentException: Can't find common super class of [com/amazon/inapp/purchasing/KiwiPurchaseResponseCommandTask] (with 1 known super classes) and [java/lang/String] (with 4 known super classes)
at proguard.evaluation.value.TypedReferenceValue.generalize(TypedReferenceValue.java:341)
at proguard.evaluation.value.TypedReferenceValue.generalize(TypedReferenceValue.java:201)
at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:298)
at proguard.evaluation.Variables.generalize(Variables.java:136)
at proguard.evaluation.TracedVariables.generalize(TracedVariables.java:118)
at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:682)
at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:602)
at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:560)
at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:264)
at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:181)
at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101)
at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79)
at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95)
at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91)
at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71)
at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:504)
at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47)
at proguard.classfile.visitor.ClassAccessFilter.visitProgramClass(ClassAccessFilter.java:67)
at proguard.classfile.ProgramClass.accept(ProgramClass.java:346)
at proguard.classfile.ClassPool.classesAccept(ClassPool.java:124)
at proguard.optimize.Optimizer.execute(Optimizer.java:435)
at proguard.ProGuard.optimize(ProGuard.java:306)
at proguard.ProGuard.execute(ProGuard.java:115)
at proguard.ProGuard.main(ProGuard.java:483)
Proguard returned with error code 1. See console
Unexpected error while performing partial evaluation:
Class = [com/amazon/inapp/purchasing/KiwiResponseHandler$PurchaseResponseHandlerRunnable]
Method = [run()V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/amazon/inapp/purchasing/KiwiPurchaseResponseCommandTask] (with 1 known super classes) and [java/lang/String] (with 4 known super classes))
java.lang.IllegalArgumentException: Can't find common super class of [com/amazon/inapp/purchasing/KiwiPurchaseResponseCommandTask] (with 1 known super classes) and [java/lang/String] (with 4 known super classes)
at proguard.evaluation.value.TypedReferenceValue.generalize(TypedReferenceValue.java:341)
at proguard.evaluation.value.TypedReferenceValue.generalize(TypedReferenceValue.java:201)
at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:298)
at proguard.evaluation.Variables.generalize(Variables.java:136)
at proguard.evaluation.TracedVariables.generalize(TracedVariables.java:118)
at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:682)
at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:602)
at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:560)
at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:264)
at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:181)
at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101)
at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79)
at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95)
at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91)
at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71)
at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:504)
at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47)
at proguard.classfile.visitor.ClassAccessFilter.visitProgramClass(ClassAccessFilter.java:67)
at proguard.classfile.ProgramClass.accept(ProgramClass.java:346)
at proguard.classfile.ClassPool.classesAccept(ClassPool.java:124)
at proguard.optimize.Optimizer.execute(Optimizer.java:435)
at proguard.ProGuard.optimize(ProGuard.java:306)
at proguard.ProGuard.execute(ProGuard.java:115)
at proguard.ProGuard.main(ProGuard.java:483)
Don't forget to add the jar into build path that 'in-app-purchasing-1.0.3.jar'
And also consider that once the flag '-dontoptimize' used
then ignore the option -optimization !xxx/aaaaa....' if possible.
the error started occur from '-optimizationpasses 2'
-optimizationpasses 1 seem that okay so far from my tests.
Last edit: user091023097709 2014-05-20
Use MUST put below flags for safe compiling.
---------------------------------------------------------
-libraryjars xxxxxxxxxxxxxx\Apps-SDK_20140504\Android\DeviceMessaging\lib\amazon-device-messaging-1.0.1.jar
-dontwarn com.amazon.
-keep class com.amazon. {;}
-keepattributes Annotation*
-keep public class * extends com.amazon.device.messaging.ADMMessageReceiver
-keep public class * extends com.amazon.device.messaging.ADMMessageHandlerBase
-keepclassmembers public class * extends com.amazon.device.messaging.ADMMessageReceiver {
*;
}
-keepclassmembers public class * extends com.amazon.device.messaging.ADMMessageHandlerBase {
*;
}
---------------------------------------------------------
Last edit: user091023097709 2014-05-20
Amazon's IAP library jar provides the classes
and
but not their super class
ProGuard can't analyze such an incomplete class hierarchy. It conservatively stops processing with an exception. You can work around the problem by creating stubs for the missing classes. This requires some effort.
Note that the Amazon store injects the super class and other missing classes when an app is uploaded, thus making sure everything works at runtime.
I can confirm that -optimizationpasses 1 solves the problem and is a better solution than the proposed one in the docs where they say turn off optimization. This is a really bad idea as most people use this to remove logging statements - which then wont get removed.
Is there a way to trick proguard to ignore the com.amazon.android.framework.task.command.AbstractCommandTask
and thus have higher number of passes ?