Подтвердить что ты не робот

Что я могу сделать, чтобы уменьшить размер jar/classes?

Я разрабатываю Java-апплет, и сокращение размера двоичного кода сделает апплет открытым быстрее и улучшит работу пользователя.

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

Я знаю, что в параметрах компилятора мира С++ для, например, отключение символов отладки может иметь огромное значение, но я никогда не видел что-то подобное для Java.

4b9b3361

Ответ 1

Вы можете использовать

javac -g:none

чтобы удалить информацию об отладке - я не знаю, сколько разницы она может сделать, хотя.

Насколько вы убеждены в том, что время загрузки является узким местом? Насколько велик апплет? Если это не громоздко, я сомневаюсь, что размер будет иметь большое значение после его загрузки.

Ответ 2

ознакомьтесь с этой страницей для некоторых советов о том, как вы можете уменьшить размер ваших файлов jar. http://wiki.java.net/bin/view/Games/4KGamesDesign. Несмотря на то, что некоторые из них могут не применяться, поскольку вы не пытаетесь добиться абсолютной минимализации, есть несколько общих советов, которые вы можете применять без ущерба для качества кода.

но резюме здесь:

Сохраняйте код до одного класса. Каждый класс добавляет накладные расходы на запись в файле JAR, а также новый пул констант и список классов.

Держите свои методы как минимум. Каждый метод добавляет служебные данные в файл класса. Все, что вам нужно, это метод main() и методы для реализации подпрограмм клавиатуры и/или мыши.

Не используйте глобальные переменные. Глобальные переменные требуют специальных метаданных в классе для идентификации. Метод-локальные переменные, однако, представляют собой только записи стека и не требуют ничего лишнего.

Используйте хороший компрессор, например 7Zip или KZip, для создания файлов JAR. Утилита JAR в основном предназначена для правильности, а не для коэффициентов сжатия.

Используйте обфускатор, такой как ProGuard, JoGa или JShrink, чтобы оптимизировать размер вашего класса.

Используйте один символ для имени файла класса. Это уменьшает его размер внутри, уменьшает объем информации, хранящейся в программе Zip, и уменьшает размер манифеста.

Укажите как можно меньше классов. Каждый класс, на который вы ссылаетесь, добавляет полный пакет и имя класса, а также подпись метода, которую вы вызываете.

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

Методы, сделанные частными и окончательными, могут быть встроены оптимизатором класса.

Используйте метод String.valueOf() для преобразования примитивов в строки. Например, ""+number расширяется до: new StringBuffer?().append("").append(number).toString() тратит много места на новые ссылки на класс и метод.

Статические строки, поплавки и целые числа, используемые в исходном коде, сохраняются в пуле констант. В результате, чем больше вы можете повторно использовать статическое значение, меньший ваш класс будет.

Вы можете свободно использовать статические конечные переменные для констант. Это сделает ваш код более читаемым, и ProGuard оптимизирует его, поэтому никаких дополнительных накладных расходов нет.

Ответ 3

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

Отчеты о сайте proguard показывают примеры сокращения, варьирующиеся от 19 до 90%.

Ответ 4

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

Очевидно, что есть исключения из этого (классы, загруженные по имени и т.д.), и поэтому вы можете разместить их в конфиге. Скорее всего, вы должны протестировать свою банку "shaken down", чтобы определить, что релевантные зависимости остаются.

Ответ 5

Некоторые предложения по улучшению размера апплета:

  • Obfuscate - Proguard был лучшим для меня для всей производительности - более 25% сокращение для меня. Кроме того, он обеспечит достойное сжатие во время Jar.

  • Оптимизировать любые ресурсы - уменьшать прикрепленные изображения с помощью оптимизаторов изображений, при более низком качестве.

  • Изменения кода. Я вижу, что вы действительно не хотите этого делать, но стоит взглянуть на ваши файлы Jar и проверить, сколько классов создано. Самый тривиальный класс будет стоить около 500 байт. Если у вас много анонимных внутренних классов, это может стоить рефакторинг.

  • Загружать ресурсы по мере необходимости. Загрузите исходный апплет. Загрузите дополнительные ресурсы асинхронно после запуска.

Ответ 6

pack200 (и gzip) создает гораздо меньшие файлы, чем банки (фактически zip файлы).

Ответ 8

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

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

Ответ 9

Вы можете использовать инструмент для применения обфускации кода. Это часто сокращает имена переменных и методов и значительно уменьшает размеры классов. Это часто делается при развертывании кода на платформе J2ME.

Ответ 10

  • Отключить сжатие при упаковке файла JAR.
  • Используйте HTTP-сжатие для передачи JAR файла.

HTTP-сжатие обычно потребляет только 50% -80% полосы пропускания, чем сжатие JAR, особенно когда вы создали множество классов, например. a Scala.

Ответ 11

Если вы используете NetBeans, вы можете установить сборку script для создания сжатого файла JAR в конфигурации проекта (в разделе Build- > Packaging). Возможно, это не так эффективно, как другие решения, но это только флажок.: -)