Запутывание веб-приложения GWT с ProGuard - PullRequest
0 голосов
/ 01 февраля 2011

Я пытаюсь скрыть свое приложение GWT (Vaadin) с помощью Proguard. Я никогда не запутывал 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 в моем файле конфигурации? Я перечислил все банки, которые я использую в своем приложении. Что-то еще я делаю не так?

Ниже приведен фрагмент последних 20 строк строки командной строки.

Заранее спасибо

С.

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

1 Ответ

2 голосов
/ 01 февраля 2011

GWT генерирует код из двух частей.

  1. Код на стороне клиента. Это то, что работает в вашем браузере и состоит из пользовательского интерфейса плюс любые асинхронные вызовы на сервер. Пока вы пишете исходный код Java, он преобразуется из исходного кода прямо в Javascript. то есть компилятор GWT даже не смотрит на файлы классов. Чтобы запутать сгенерированный JS, используйте флаги компилятора GWT (см. Ниже)
  2. Код серверной стороны. Код сервера будет конечными точками вызовов вашего клиентского приложения. например Вы могли бы вызывать вызовы GWT RPC и иметь сервлеты GWT в качестве конечной точки. Запутайте свое веб-приложение, как и любое другое - методом проб и ошибок через Proguard или подобное. Начните с простой конфигурации, которая слегка запутывает, а затем переходите оттуда.

Поскольку клиентская часть GWT генерируется из исходного кода Java, простого способа обфускации перед передачей в GWT не существует. Я полагаю, вы могли бы каким-то образом запутать Proguard, а затем декомпилировать это и передать его компилятору GWT. Это кажется излишним, но это возможно.

Обычный способ запутать это указать -style OBF компилятору GWT. Это полностью запутает ваш код. Возможно, вы могли бы пойти дальше и запустить его через другой обфускатор JS, хотя действует закон убывающих возвратов, ошибок и т. Д.

Я предлагаю вам понять, что генерируется, когда вы предоставляете OBF в качестве стиля. Это, вероятно, вполне достаточно для ваших целей. Очевидно, что чем больше ресурсов вы размещаете на стороне сервера (например, безопасность, проверка cookie и т. Д.), Тем меньше имеет значение, какой код находится на клиенте.

...