2011-02-12 196 views
2

嘗試製作我的Android應用程序的Proguard版本時出現奇怪的錯誤。錯誤是:使用方法簽名的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 

我最終擺脫錯誤的,通過改變方法如下:

錯誤消失。雖然這讓我過去了,但我不明白第一個方法簽名有什麼問題。我的proguard.cfg有優化通過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的目的,不是嗎?

-Kevin

回答

3

錯誤表明存在的ProGuard的優化步驟的錯誤。您應確保您使用的是最新版本(本文撰寫時爲ProGuard 4.5.1或4.6 beta3)。如果問題仍然存在,您應該在ProGuard錯誤跟蹤器中提交錯誤報告,並附帶一個小樣本項目,以便重現問題。

0
+0

我已經有dontskipnonpubliclibraryclasses,並添加了dontskipnonpubliclibraryclassmembers,但它沒有區別。我只在發佈模式下崩潰,我的應用程序的編程版本。 *嘆息* – ktambascio 2011-02-13 03:51:10

+0

添加了上述更新與更多發現。 – ktambascio 2011-02-13 04:39:54