I'm getting a strange error while trying to make a Proguard version of my Android app. The error is:
[proguard] Optimizing... [proguard] Unexpected error while evaluating instruction: [proguard] Class = [net/domain/packagename/service/ExifEditor] [proguard] Method = [setGpsLocation(DDDJ)V] [proguard] Instruction = [294] aload_3 v3 [proguard] Exception = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownDoubleValue]) [proguard] Unexpected error while performing partial evaluation: [proguard] Class = [net/domain/packagename/service/ExifEditor] [proguard] Method = [setGpsLocation(DDDJ)V] [proguard] Exception = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownDoubleValue]) BUILD FAILED D:\sdk\google\android-sdk-windows\tools\ant\main_rules.xml:430: java.lang.IllegalArgumentException: Value is not a reference value [proguard.evaluation.value.UnknownDoubleValue] at proguard.evaluation.value.Value.referenceValue(Value.java:97) at proguard.evaluation.Variables.aload(Variables.java:264) at proguard.evaluation.Processor.visitVariableInstruction(Processor.java:677) at proguard.classfile.instruction.VariableInstruction.accept(VariableInstruction.java:306) at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:729) at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:560) at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:533) ...and so on... The method "setGpsLocation" has this signature:
public void setGpsLocation(double longitude, double latitude, double altitude, long gpsTime) throws IOException I ended up getting rid of the error, by changing the method to this:
public void setGpsLocation(Location location) and the error goes away. While this gets me past it, I don't understand what was wrong with the first method signature. My proguard.cfg has -optimizationpasses 2. If I increase this value to 3 or more, I start seeing similar errors with other areas of code. Here's what happens if I use 3:
[proguard] Optimizing... [proguard] Unexpected error while evaluating instruction: [proguard] Class = [org/apache/commons/fileupload/util/Streams] [proguard] Method = [copy(Ljava/io/InputStream;Ljava/io/OutputStream;Z[B)J] [proguard] Instruction = [75] aload_2 v2 [proguard] Exception = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue]) [proguard] Unexpected error while performing partial evaluation: [proguard] Class = [org/apache/commons/fileupload/util/Streams] [proguard] Method = [copy(Ljava/io/InputStream;Ljava/io/OutputStream;Z[B)J] [proguard] Exception = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue]) I'm having a hard time finding information about what this error can mean.
Has anyone else seen something similar?
Update
While changing the signature appeared to solve the issue, I was getting a runtime crash:
I/dalvikvm(30523): Could not find method a.b.a.b.d.b, referenced from method a.b.a.b.d.a W/dalvikvm(30523): VFY: unable to resolve direct method 440: La/b/a/b/d;.b (Ljava/lang/String;[BII)La/b/a/b/a; D/dalvikvm(30523): VFY: replacing opcode 0x70 at 0x0039 D/dalvikvm(30523): VFY: dead code 0x003c-0041 in La/b/a/b/d;.a (Ljava/lang/String;[BII)[La/b/a/b/a; W/dalvikvm(30523): VFY: 'this' arg 'Ljava/lang/Object;' not instance of 'Ljava/io/InputStream;' W/dalvikvm(30523): VFY: rejecting opcode 0x6e at 0x0045 W/dalvikvm(30523): VFY: rejected La/b/a/a/a/b;.a (La/b/a/b/a/a;La/b/a/a;)La/b/a/a/a/c; W/dalvikvm(30523): Verifier rejected class La/b/a/a/a/b; W/dalvikvm(30523): threadid=10: thread exiting with uncaught exception (group=0x400259f8) I started reading more of the Proguard manual, and found by adding -dontoptimize, the build-time errors and runtime crashes go away. Sort of defeats the purpose of using Proguard, doesn't it?
-Kevin