gpt4 book ai didi

java - 在带有 Protocol Buffers 的项目中使用 Proguard 有哪些特点?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:29:39 26 4
gpt4 key购买 nike

我有一个使用 Google Protocol Buffers 的项目。一旦我尝试用 ProGuard 混淆它,protobuf 似乎会导致问题。

我将所有自己的类打包到 mybuildedclasses.jar 中。谷歌代码打包成protbuf.jar

mybuildedclasses.jar
protobuf.jar
other external jars

之后,我试图混淆 mybuildedclasses.jar。配置文件类似于这个one .最终所有的 jar 都被包装在另一个 fat 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.* {
}

最佳答案

看起来这可能只是包裹未对齐的问题。查看错误:

 Caused by: java.lang.RuntimeException: Generated message class 
"org.mypackage.Control$MessageControlHandCard$Builder"
missing method "getCardId".
...

这就是 org.mypackage.Control

现在查看您的 Proguard 配置:

-keep public class org.mypackage.messages.* {
}

那是使用 org.mypackage.messages,它不包括 org.mypackage.Control

现在大概这些不是您的真实包名称 - 但如果它们具有代表性,听起来您需要更改您的 .proto 文件以发出类包 org.mypackage.messages 而不是 org.mypackage。 (您可以改为更改您的 Proguard 配置,但这听起来会影响太多。)

或者,您可以只使用继承树。我自己不是 Proguard 用户,但根据 examples 判断,你可能想要:

-keep public class * extends com.google.protobuf.GeneratedMessage

我希望它能在你所有的 Protocol Buffer 类上工作,而不管包是什么。不过,您可能会发现 protobuf 在“顶级”类中还需要其他字段/方法。

编辑:进一步查看文档,您可能需要:

-keep public class * extends com.google.protobuf.GeneratedMessage { *; }

-keep public class * extends com.google.protobuf.GeneratedMessageLite { *; }

同时保留所有成员。除了 -keep,还有其他“keep”选项正在查看,例如 -keepnames

关于java - 在带有 Protocol Buffers 的项目中使用 Proguard 有哪些特点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14098225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com