Любой аналог Java для `/usr/bin/strip`?

Есть ли какой-либо инструмент, который может удалить информацию об отладке из файлов Java .class, как /usr/bin/strip может удалить объектные файлы C/C++ в Linux?

РЕДАКТИРОВАТЬ: Мне понравились ответы Тило и Питера Ммм: ответ Питера был краток и по существу раскрывал мое незнание того, что поставляется с JDK; Предложение Thilo ProGuard — это то, что я обязательно проверю в любом случае на предмет всех тех дополнительных функций, которые оно предоставляет. Спасибо, Тило и Питер!


person Harry    schedule 10.03.2011    source источник
comment
javac -g:none вообще отключает отладочную информацию во время компиляции. И первое, что попадает в Google, это blogs.sun.com/ahe/entry/how_to_strip_debug_information.   -  person PeterMmm    schedule 10.03.2011
comment
Блог, на который ссылается Питер, указывает на pack200 -r -G debug.jar. Pack200 поставляется с JDK.   -  person Thilo    schedule 10.03.2011
comment
Strip не удаляет отладочную информацию — он удаляет ненужные записи из таблицы символов. Если вы удалите все символы из файла jar, это не сработает.   -  person symcbean    schedule 10.03.2011


Ответы (1)


ProGuard (который, например, поставляется с Android SDK для уменьшения размера кода), может выполнять все виды манипуляций для сжатия файлов JAR:

  • Вычислить константные выражения.
  • Удалите ненужные обращения к полям и вызовы методов.
  • Удалите ненужные ветки.
  • Удалите ненужные сравнения и проверки instanceof.
  • Удалите неиспользуемые блоки кода.
  • Объединяйте одинаковые блоки кода.
  • Уменьшите выделение переменных.
  • Удалите поля только для записи и неиспользуемые параметры метода.
  • Встроенные константные поля, параметры метода и возвращаемые значения.
  • Встроенные методы, которые являются короткими или вызываются только один раз.
  • Упростите вызовы хвостовой рекурсии.
  • Слияние классов и интерфейсов.
  • По возможности делайте методы закрытыми, статическими и окончательными.
  • По возможности делайте классы статическими и окончательными.
  • Замените интерфейсы, которые имеют одну реализацию.
  • Выполните более 200 оптимизаций глазка, например, замените ...*2 на ...‹‹1.
  • При желании удалите код регистрации.

Они не упоминают об удалении отладочной информации в этом списке, но я думаю, что они также могут это сделать.

Обновление: Да, действительно:

По умолчанию скомпилированный байт-код по-прежнему содержит много отладочной информации: имена исходных файлов, номера строк, имена полей, имена методов, имена аргументов, имена переменных и т. д. Эта информация упрощает декомпиляцию байт-кода и обратное проектирование целых программ. Иногда это нежелательно. Обфускаторы, такие как ProGuard, могут удалять отладочную информацию и заменять все имена бессмысленными последовательностями символов, что значительно усложняет реинжиниринг кода. Это дополнительно сжимает код в качестве бонуса. Программа остается функционально эквивалентной, за исключением имен классов, имен методов и номеров строк, указанных в трассировках стека исключений.

person Thilo    schedule 10.03.2011
comment
Эй, это было довольно круто. Проверим, спасибо! (Вот +1 сразу). Между тем, помимо того, что входит в состав Oracle JDK по умолчанию, существует ли исчерпывающий список всех инструментов системного уровня для javac и java (JVM) для таких вещей, как... тестирование и настройка скорости/памяти, мониторинг, статический/динамический анализ кода и т. д. По сути, я даже не знаю, что вообще возможно с Java (кроме обычного высокоуровневого программирования) и какие всевозможные инструменты есть в моем распоряжении, чтобы делать все это! ! - person Harry; 10.03.2011
comment
Есть официальные документы: download.oracle.com/javase/ 6/docs/technotes/tools/index.html - person Thilo; 10.03.2011
comment
Кроме того, существует множество сторонних инструментов. Самый простой способ, который я нашел до сих пор, чтобы найти их, — это спросить на SO… - person Donal Fellows; 10.03.2011