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
Kindly refer to the following link
The error suggests that there is a bug in ProGuard's optimization step. You should make sure you are using the latest version (ProGuard 4.5.1 or 4.6 beta3 at this time of writing). If the problem persists, you should file a bug report in the ProGuard bug tracker, with a small sample project that allows to reproduce the problem.