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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам