Как мне убрать пух из сторонней библиотеки?

StackOverflow https://stackoverflow.com/questions/38305

  •  09-06-2019
  •  | 
  •  

Вопрос

Возможно, это не лучшая практика, но есть способы удаления неподдерживаемых классов из jar-файлов сторонних производителей. Что-то, что смотрит на то, как мои классы используют библиотеку, и выполняет какой-то анализ покрытия, затем выплевывает еще одну банку с удалением всех нетронутых классов.

Очевидно, есть проблемы с этим. В частности, сценарий использования, который я описал, может использовать не все классы постоянно.

Но если пренебречь этими проблемами, можно ли это сделать в принципе?

Это было полезно?

Решение

Есть способ.

Проект JarJar делает это AFAIR. Первая цель проекта JarJar - позволить встраивать сторонние библиотеки в свой собственный jar, при необходимости изменяя структуру пакета. Это может убрать ненужные классы.

Проверить это можно на http://code.google.com/p/jarjar/.

Вот ссылка о сокращении банок: http://sixlegs.com/blog/ Java / jarjar-keep.html

Другие советы

В Ant есть инструмент, называемый набором классов. Вы указываете список корневых классов, который, как вам известно, вам нужен, а затем набор классов файлов рекурсивно анализирует их код, чтобы найти все зависимости.

Кроме того, вы можете разработать хороший набор тестов, который будет выполнять все необходимые функции, а затем запустить ваши тесты с помощью инструмента покрытия тестов. Инструмент скажет вам, какие классы (и операторы в них) были фактически использованы. Это может дать вам еще меньший набор кода, чем при статическом анализе.

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

На предыдущей работе я использовал обфускатор Java, который, так же как и запутывание кода, также удалял классы и методы, которые не использовались. Если вы делали " Class.byName " или любой другой тип рефлексии, вам нужно было сообщить обфускатору, потому что он не мог определить, проверяя код, какие классы или методы вызваны с помощью рефлексии.

Проблема, конечно, заключается в том, что вы не знаете, отражают ли другие части сторонней библиотеки какие-либо отражения, и поэтому удаляете " неиспользуемый " класс может привести к поломке вещей в неясном случае, который вы еще не тестировали.

jar - это просто zip-файл, так что я думаю, вы можете. Если бы вы могли добраться до источника, он чище. Может быть, попытаться разобрать класс?

Если добавить к этому вопросу, это может улучшить производительность? Поскольку не используемые классы не будут JIT-скомпилированными, что улучшит время запуска, или java автоматически обнаружит это при компиляции в байт-код и даже не будет иметь дело с кодом, который не используется?

Это был бы интересный проект (кто-нибудь уже делал это?)

Полагаю, вы дадите инструменту свои банки в качестве отправной точки и библиотечную банку для очистки. Он может использовать рефлексию, чтобы определить, на какие классы ссылаются ваши jar-файлы, а какие косвенно используются в дереве вызовов (это совсем не тривиально, а выполнимо). Если он встречает какой-либо код отражения в любом из двух мест, он должен дать очень громкое предупреждение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top