0

我正在尝试使用 Proguard 混淆我的 GWT (Vaadin) 应用程序。我以前从未混淆过 java 代码,这是我第一次尝试使用 Proguard。

我的配置文件设置如下:

-libraryjars JAVA_HOME\rt.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\appfoundation.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\blackboard-2.1.1.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\cssinject-0.9.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\eclipselink.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\eclipselink-jpa-modelgen_2.0.2.v20100323-r6872.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\gwt-visualization.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\iText-5.0.4.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\javax.persistence_1.0.0.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\javax.persistence_2.0.0.v201002051058.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\vaadin-6.4.4.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\vaadin-calendar-0.5.1.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\vaadin-chameleon-theme-1.0.1.jar
-libraryjars MYPATH\test\WebContent\WEB-INF\lib\VisualizationsForVaadin.jar
-libraryjars "C:\Program Files\eclipse\configuration\com.vaadin.integration.eclipse\download\gwt-dev\2.0.3\gwt-dev.jar"
-libraryjars "C:\Program Files\eclipse\configuration\com.vaadin.integration.eclipse\download\gwt-user\2.0.3\gwt-user.jar"
-injars   test.war
-outjar   test_after.war
-printseeds
-ignorewarnings
-keep public class TestApplication extends com.vaadin.Application {
public void init();
} 

然后我使用 proguard 命令执行:

java -jar proguard.jar @test.pro

我没有收到配置文件的任何错误,但确实收到了很多警告。输出文件已创建,但我担心警告。我需要在我的配置文件中指定更多的 jar 文件吗?我已经列出了我在我的应用程序中使用的所有 jar。还有什么我做错了吗?

下面是命令行输出的最后 20~ 行的截图

提前致谢

S。

      Maybe this is library method 'sun.jdbc.odbc.JdbcOdbcStatement { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.CommonDataSource { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.ConnectionPoolDataSource {java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.DataSource { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.jdbc.odbc.ee.PooledConnection { java.sql.Connection getConnection(); }'
      Maybe this is library method 'sun.rmi.transport.StreamRemoteCall { sun.rmi.transport.Connection getConnection(); }'
Note: org.eclipse.persistence.sdo.helper.DynamicClassWriter accesses a declared method 'writeReplace()' dynamically
      Maybe this is program method 'org.eclipse.persistence.sdo.SDODataObject {java.lang.Object writeReplace(); }'
      Maybe this is program method 'org.eclipse.persistence.sdo.helper.ListWrapper { java.lang.Object writeReplace(); }'
      Maybe this is library method 'com.sun.corba.se.impl.presentation.rmi.InvocationHandlerFactoryImpl$CustomCompositeInvocationHandlerImpl { 
Note: there were 4 unresolved dynamic references to classes or interfaces.
      You should check if you need to specify additional program jars.
Note: there were 10 accesses to class members by means of introspection.
      You should consider explicitly keeping the mentioned class members
      (using '-keep' or '-keepclassmembers').
Warning: there were 3649 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars').

Warning: there were 173 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile them and try again.
         Alternatively, you may have to specify the option
         '-dontskipnonpubliclibraryclassmembers'.
4

1 回答 1

2

GWT 分两部分生成代码。

  1. 客户端代码。这是在您的浏览器中运行的内容,包括用户界面以及对服务器的任何异步调用。当您编写 Java 源代码时,它会从源代码直接转换为 Javascript。即GWT 编译器甚至不查看类文件。要混淆生成的 JS,请使用 GWT 编译器标志(见下文)
  2. 服务器端代码。服务器代码将是您的客户端应用程序调用的端点。例如,您可能会调用 GWT RPC 调用并将 GWT servlet 作为端点。像对任何其他应用程序一样混淆您的 Web 应用程序 - 通过 Proguard 或类似的试验和错误。从一个轻微混淆的简单配置开始,然后从那里继续。

由于 GWT 客户端是从 Java 源代码生成的,因此在提供给 GWT 之前没有简单的方法进行混淆。我想您可以通过 Proguard 以某种方式进行混淆,然后对其进行反编译并将其提供给 GWT 编译器。这似乎有点矫枉过正,但有可能。

混淆的通常方法是指定-style OBF给 GWT 编译器。这将彻底混淆您的代码。尽管收益递减规律、错误等适用,但您可能更进一步并通过另一个 JS 混淆器运行它。

我建议您了解当您提供 OBF 作为样式时会生成什么。对于您的目的,这可能已经足够了。显然,您在服务器端放置的东西越多(例如安全性、cookie 验证等),客户端中的代码就越不重要。

于 2011-02-01T14:05:15.977 回答