Proguard不处理FXML中的onAction调用

时间:2018-02-14 11:21:16

标签: javafx proguard fxml

我的很多GUI都在FXML文件中描述,对于Buttons和其他元素,可以选择直接从FXML设置事件处理程序,绑定到控制器中的方法,设置在同一个FXML文件中。 因此,如果有一个类dataSource: MatTableDataSource<any>; displayedColumns = ['col1', 'col2', ... ]; @ViewChild('scheduledOrdersPaginator') paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; ngOnInit(): void { // Load data this.dataSource = new MatTableDataSource(somearray); this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; } 并且有一个方法view.Controller,那么它看起来像这样:

public void foo()

然而,在使用ProGuard进行模糊处理后,它变成了这样:

<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>

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

我正在使用ProGuard 6.0

1 个答案:

答案 0 :(得分:0)

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