2

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 を使用する目的に反するようなものですね。

-ケビン

4

2 に答える 2

3

このエラーは、ProGuard の最適化ステップにバグがあることを示しています。最新バージョン (執筆時点では ProGuard 4.5.1 または 4.6 beta3) を使用していることを確認してください。問題が解決しない場合は、問題を再現できる小さなサンプル プロジェクトを使用して、ProGuard バグ トラッカーにバグ レポートを提出する必要があります。

于 2011-02-13T12:12:23.007 に答える
0

以下のリンクを参照してください。

于 2011-02-12T19:47:16.423 に答える