Любой Java-аналог для `/ usr / bin / strip`? - PullRequest
4 голосов
/ 10 марта 2011

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

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

1 Ответ

3 голосов
/ 10 марта 2011

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

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

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

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

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

...