GWT是否在编译期间删除未使用的类?

时间:2017-11-16 21:52:16

标签: java gwt gwt-compiler

假设我的项目结构大致如下:

{module-package}.webapp  
    module.gwt.xml
{module-package}.webapp.client
    Client.java
    UsedByClient.java
    NotUsedByClient.java

module.gwt.xml文件包含:

<source path='client'/>
<entry-point class='{module-package}.webapp.client.Client'/>

当我使用GWT编译这个项目时,有多少Java代码将编译成Javascript?

  • 是否包含NotUsedByClient.java,即使入口点没有引用它?
  • 是否UsedByClient.java全部或部分包括在内?例如。如果方法m()没有被Client调用,那么m是否会被编译?

不幸的是,我不得不使用遗留代码库,该代码库将服务器端代码与客户端代码一起存储在同一个程序包中,将它们分开是一些工作。客户端不使用服务器端代码,但我担心GWT可能会将其编译为Javascript,有人可能会注意到它并尝试对其进行反向工程。

2 个答案:

答案 0 :(得分:5)

以上所有内容都会发生:

  • 删除未引用的类
  • 未删除的方法和字段已删除
  • 常量可以内联
  • 对常量的各种操作(如!,==,+,&amp;&amp;等)可以简化(基于某些字段始终为null或true,等等)
  • 未被覆盖的方法可能是最终的......
  • ...并且在某些情况下最终方法可能会变为静态(导致较小的callite,并且没有&#34;这个&#34;该方法内的引用)......
  • 和小的,经常被称为静态方法的内容可能是内联的

这个过程重复了,我跳过了更多的优化,以进一步帮助删除大小代码。最后,所有类,方法,字段和局部变量都以某种方式重命名,以进一步减小输出大小,包括在输出中重新排序方法,以便按长度排序,让gzip更有效地压缩您的内容。客户。

因此,虽然您的代码的某些方面可以进行逆向工程(就像任何机器代码都可以进行逆向工程),但是没有引用的代码将无法使用,而且代码可能甚至不是可读的。

答案 1 :(得分:0)

我不知怎的设法偶然发现一位GWT工程师对编译器的“深度潜水”视频演示,其中有一个解释:https://youtu.be/n-P4RWbXAT8?t=865

关键点:

  • 其中一个编译器优化称为Pruner,它将“从入口点遍历所有可访问的代码,删除其他所有代码(使用ControlFlowAnalyzer)”
  • 这实际上是一项重要的优化,因为如果没有它,所有GWT应用都需要完整地包含gwt-user.jar,这会大大增加应用程序的大小。

所以似乎GWT编译器确实删除了未使用的代码。