2016-07-06 2 views
1

Учитывая регулярный проект градиента java, у нас есть некоторый основной метод ввода, который определяется в манифесте jar и связке зависимостей.Создание компактной банки без зависимостей

Теперь, как правило, когда мы создаем распределение мы можем использовать плагин приложений и иметь определенную структуру, как это как выход

/bin (some splatform specific scripts that point to our jar) 
/lib (our jar + all dependencies with their dependencies etc...) 

Проблема заключается в том, что даже если бы мы использовали только несколько классов от наших прямых зависимостей, они и все транзитивные зависимости окажутся в распределении. Например, из 100M распределения только 1M на самом деле является кодом, который может работать и может иметь какое-либо отношение к нашему приложению ...

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

Наша цель - создать эту банку 1M, которая имеет только код, который она фактически будет использовать, принимая во внимание, что является основным методом в манифесте ...

Я искал много, но не смог найти решение к этому, proguard был очень близок, но я не могу найти никакого способа сделать его только заботой о конкретном потоке кода не ко всем.

Есть ли инструменты, которые могут это сделать?

+0

Только примечание стороны: имейте в виду, что есть a) отражение ... очень сложно определить, какие классы действительно необходимы, а затем b) проблему остановки, которая переводит: для произвольных программ и ввод, вы можете ** не ** определить, используется ли какая-либо функция (aka class) или нет. Итак, что я говорю: может быть, есть прагматические ответы на вашу проблему, но большая теория против вас. – GhostCat

+0

Отключить тему для SO. – ManoDestra

+0

@ Jägermeister обычно, если библиотека зависит от отражения, вы понимаете это и конкретно говорите proguard, чтобы не удалить тот или иной класс ... в моем случае я вообще не использую его ... относительно b), как это? если proguard уже делает это, он идет через байт-код, и если он обнаруживает мертвый код, он избавится от него или от каких-либо неиспользуемых классов ... поэтому proguard делает то, что я хочу, просто он не заботится о точке входа ... – vach

ответ

1

Ваше описание того, что делает ProGuard неправильно:

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

То, что вы описали, как unused code это именно то, что делает ProGuard в сокращающегося шаг. Начиная с семени (в вашем случае метод main), он будет искать любой класс/метод, который используется и удаляет все остальное.

Если слишком много классов сохранены, это, скорее всего, связано с некоторыми правилами -keep. Вам придётся при необходимости отрегулировать их. Если, например, сторонние библиотеки не используют рефлексию, не нужно сохранять содержимое.

ProGuard можно также удалить dead code в оптимизации шага: все инструкции внутри метода, который никогда не будет выполняться в соответствии с потоком анализа будут сняты. Этот метод работает на уровне инструкций, а сокращение - на уровне класса.

+0

Но я не вижу, где я могу дать ему мой основной метод? это то, что я делаю – vach

+0

injars "$ buildDir/libs/$ {project.name} .jar", injars configurations.compile.all, outjars 'build/libs/proguard-gradle-example.out.jar' – vach

+0

i хотите, чтобы он принимал все банки, включая зависимости, и выдавал только одну банку ... где я могу сказать proguard, что этот конкретный X.Jar - мое приложение для приложения? – vach

Смежные вопросы