Использование ProGuard для обфускации кода

Я выбрал ProGuard, и вот параметры, с которыми я его настроил:

Уменьшение

Параметры:

  • Сокращать

Сохранить:

  • Приложения
  • Апплеты

Также сохраните:

  • Перечисления
  • Драйверы базы данных
  • Swing UI L&F

Обфускация

Параметры:

  • Затемнить (да!: P)
  • Агрессивно перегрузить
  • Используйте уникальные имена членов класса
  • Используйте имена классов со смешанным регистром
  • Сглаживание иерархии пакетов
  • Переупаковка классов

Сохранить имена:

  • имена собственных методов
  • имена методов .class

Оптимизация

Параметры:

  • Оптимизировать
  • Агрессивное слияние интерфейсов

Удалить:

  • [Все флажки отмечены]

Информация

Предварительная проверка и таргетинг:

  • Предварительная проверка

Последовательность и правильность:

  • Обратите внимание на возможные ошибки в конфигурации
  • Предупредить о возможном ошибочном вводе
  • Пропускать членов класса непубличной библиотеки

и когда я беру банку и ставлю ее так:

При запуске я получаю эту ошибку апплета:

    java.lang.RuntimeException: java.lang.NoClassDefFoundError: b
        at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.NoClassDefFoundError: b
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
        at java.lang.Class.getConstructor0(Unknown Source)
        at java.lang.Class.newInstance0(Unknown Source)
        at java.lang.Class.newInstance(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: b
        at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 14 more
    Caused by: java.io.IOException: open HTTP connection failed:http://mystikrpg.com/b.class
        at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
        at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
        at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        ... 17 more
    Exception: java.lang.RuntimeException: java.lang.NoClassDefFoundError: b

Вот что находится ВНУТРИ файла jar ДО запутывания clientOffline.jar:

line_tile/
META-INF/

и вот что представляет собой этот jar-файл ПОСЛЕ обфускации newOne.jar:

line_tile/
META-INF/
weapon/
me.gif
a.class
b.class

Надеюсь, этого достаточно, чтобы помочь мне решить эту проблему. Что я делаю неправильно?


person test    schedule 22.09.2010    source источник


Ответы (1)


Я предполагаю, что b.class создается из внутреннего класса GamePanel. Так что может быть проблема с внутренними классами. Здесь в Stackoverflow Том упомянул, что он не может правильно запутать внутренние классы. Предложение здесь также применимо: попробуйте запутать с помощью verbose=true (или с помощью java -jar proguard.jar @ myconfig.pro -verbose).

Я также предлагаю использовать параметр -keepnames (см. руководство) для GamePanel и / или tileOffline, поскольку он оставит эти классы неизменными из-за обфускации (по крайней мере, для поиска основной причины проблемы).

Примечание: попробуйте использовать имена классов CamelCase при программировании на Java.

person rics    schedule 22.09.2010
comment
Хм, у меня есть опция "Сохранить имена". Но это было бы java -jar proguard.jar @myconfig.pro -verbose -keepnames правильно? - person test; 22.09.2010
comment
-keepnames спецификация_класса - это правильный формат, в котором спецификация класса может быть class tileOffline в этом случае - person rics; 23.09.2010