在尝试制作我的 Android 应用程序的 Proguard 版本时,我遇到了一个奇怪的错误。错误是:
[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...
方法“setGpsLocation”具有以下签名:
public void setGpsLocation(double longitude, double latitude, double altitude, long gpsTime) throws IOException
我最终摆脱了错误,通过将方法更改为:
public void setGpsLocation(Location location)
并且错误消失了。虽然这让我过去了,但我不明白第一个方法签名有什么问题。我的 proguard.cfg 有 -optimizationpasses 2。如果我将此值增加到 3 或更多,我开始在其他代码区域看到类似的错误。如果我使用 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/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)
我开始阅读更多的 Proguard 手册,发现通过添加 -dontoptimize,构建时错误和运行时崩溃消失了。有点违背了使用 Proguard 的目的,不是吗?
-凯文