我有一個使用Google Protocol Buffers的項目。一旦我嘗試用ProGuard對其進行混淆,似乎protobuf會導致問題。在Protocol Buffers項目中使用Proguard有什麼特點?
所有我自己的類我包裝成mybuildedclasses.jar
。谷歌代碼打包成protbuf.jar
mybuildedclasses.jar
protobuf.jar
other external jars
之後,我試圖混淆mybuildedclasses.jar
。配置文件與此類似one。最終所有的罐子都被包裝在另一個罐子裏。
我運行該程序,並且一旦消息被試圖發送打印這種例外的。
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.* {
}
您是否設法解決這個問題?如果是,請分享你的發現?我很長一段時間都陷入了同樣的問題。 – Atul