Любой Java-аналог для `/usr/bin/strip`?
Есть ли инструмент, который может удалить отладочную информацию из файлов Java.class, так же, как /usr/bin/strip
может из C/C++ объектные файлы в Linux?
РЕДАКТИРОВАТЬ: Мне понравились ответы и Тило и Питера Ммм: Питер был коротким и, в частности, разоблачая мое незнание того, что поставляется с JDK; Предложение Thilo ProGuard - это то, что я в любом случае обязательно проверю на наличие всех дополнительных функций, которые он предоставляет. Спасибо Тило и Питер!
1 ответ
ProGuard (который входит в комплект Android SDK, например, для уменьшения размера кода) может выполнять любые манипуляции для сжатия файлов JAR:
- Оценить постоянные выражения.
- Удалите ненужные обращения к полям и вызовы методов.
- Удалите ненужные ветки.
- Удалите ненужные сравнения и экземпляры тестов.
- Удалить неиспользуемые блоки кода.
- Объединить идентичные блоки кода.
- Уменьшите распределение переменных.
- Удалите поля только для записи и неиспользуемые параметры метода.
- Встроенные постоянные поля, параметры метода и возвращаемые значения.
- Встроенные методы, которые являются короткими или вызываются только один раз.
- Упростите вызовы хвостовой рекурсии.
- Слияние классов и интерфейсов.
- Сделайте методы приватными, статическими и финальными, когда это возможно.
- Сделайте классы статичными и окончательными, когда это возможно.
- Замените интерфейсы, которые имеют отдельные реализации.
- Выполните более 200 оптимизаций глазка, например, заменив...*2 на...<<1.
- При желании удалить код регистрации.
Они не упоминают удаление отладочной информации в этом списке, но я думаю, что они также могут это сделать.
Обновление: Да, действительно:
По умолчанию скомпилированный байт-код по-прежнему содержит много отладочной информации: имена исходных файлов, номера строк, имена полей, имена методов, имена аргументов, имена переменных и т. Д. Эта информация упрощает декомпиляцию байт-кода и обратный инжиниринг целых программ. Иногда это не желательно. Обфускаторы, такие как ProGuard, могут удалять отладочную информацию и заменять все имена бессмысленными символьными последовательностями, что значительно усложняет обратную разработку кода. Это дополнительно сжимает код в качестве бонуса. Программа остается функционально эквивалентной, за исключением имен классов, имен методов и номеров строк, указанных в трассировках стека исключений.