Proguard 不处理 FXML 中的 onAction 调用

Proguard does not process onAction calls in FXML

我的很多 GUI 都在 FXML 文件中描述,对于按钮和其他元素,有一个选项可以直接从 FXML 设置事件处理程序,绑定到控制器中的方法,在同一个 FXML 文件中设置。 所以如果有一个 class view.Controller 并且有一个方法 public void foo(),那么它看起来像这样:

<StackPane fx:controller="view.Controller" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Button onAction="#foo" />
   </children>
</StackPane>

但是用ProGuard混淆后变成了这样:

<StackPane fx:controller="b.D" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Button onAction="#foo" />
   </children>
</StackPane>

view.Controller 中的 foo() 被混淆了,但 onAction 中的方法调用没有。我为此使用 -adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF,**.xml,**.css,**.fxml 参数。有一个类似的错误,其中 ProGuard 不会混淆自定义控件,这可以通过删除 FXML 中的导入并编写完全限定路径来解决。我认为这种解决方法不能用于这种情况。除了将所有 onAction 从 FXML 移动到 Java 中的 button.setOnAction()(这很麻烦并且需要大量工作)之外,还能做些什么?

我正在使用 ProGuard 6.0

所以最后我写了一个小工具来从ProGuard解压jar,根据提供的映射重命名所有onAction调用并重新打包回jar。 This 是万一有人需要它的工具(尽管它主要结合了 SO 和一些正则表达式的答案,没什么特别的)。