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 和一些正则表达式的答案,没什么特别的)。
我的很多 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 和一些正则表达式的答案,没什么特别的)。