Google Protocol Buffers が使用されているプロジェクトがあります。ProGuard で難読化しようとすると、protobuf が問題を引き起こしているようです。
にパッケージ化するすべての独自のクラスmybuildedclasses.jar
。Googleコードはにパッケージ化されていますprotbuf.jar
mybuildedclasses.jar
protobuf.jar
other external jars
その後、難読化しようとしていますmybuildedclasses.jar
。構成ファイルはこれに似ています。最終的に、すべての jar は別の太い jar 内にパッケージ化されます。
プログラムを実行し、メッセージを送信しようとすると、この種の例外が出力されます。
Caused by: java.lang.RuntimeException: Generated message class "org.mypackage.messages.Control$MessageControlHandCard$Builder" missing method "getCardId".
at com.google.protobuf.GeneratedMessage.getMethodOrDie(GeneratedMessage.
java:1366)
at com.google.protobuf.GeneratedMessage.access$1(GeneratedMessage.java:1
361)
at com.google.protobuf.GeneratedMessage$FieldAccessorTable$SingularField
Accessor.<init>(GeneratedMessage.java:1502)
at com.google.protobuf.GeneratedMessage$FieldAccessorTable.<init>(Genera
tedMessage.java:1441)
at org.mypackage.Control$1.assignDescriptors(SourceFile:32
20)
at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGenerated
FileFrom(Descriptors.java:300)
at org.evogame.common.messages.Control.<clinit>(SourceFile:3278)
... 60 more
Caused by: java.lang.NoSuchMethodException: org.evogame.common.messages.Control$
MessageControlHandCard$Builder.getCardId()
at java.lang.Class.getMethod(Class.java:1622)
at com.google.protobuf.GeneratedMessage.getMethodOrDie(GeneratedMessage.
java:1364)
と
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError
at org.mypackage.messages.Control$MessageControlGameRequest.interna
lGetFieldAccessorTable(SourceFile:527)
at com.google.protobuf.GeneratedMessage.getAllFieldsMutable(GeneratedMes
sage.java:105)
at com.google.protobuf.GeneratedMessage.getAllFields(GeneratedMessage.ja
va:153)
at com.google.protobuf.TextFormat$Printer.print(TextFormat.java:229)
at com.google.protobuf.TextFormat$Printer.access$2(TextFormat.java:226)
at com.google.protobuf.TextFormat.print(TextFormat.java:69)
at com.google.protobuf.TextFormat.printToString(TextFormat.java:116)
at com.google.protobuf.AbstractMessage.toString(AbstractMessage.java:87)
難読化しないと、すべてが完全に機能します。では、Google Protocol Buffers 関連のコードのオプションを具体的にどのように設定すればよいのでしょうか?-keep
生成されたメッセージ ファイルを試してみましたが、同じ例外が発生します。
-keep public class org.mypackage.messages.* {
}