2016-07-06 47 views
1

紧凑的罐子,我们这是在JAR清单中定义一些入门的主要方法,和一堆依赖。创建没有给出一个普通的Java项目的Gradle依赖

现在通常当我们创建一个分布,我们可以使用应用程序的插件,并且有一定的结构类似这样的输出

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

问题是,即使我们使用了只有几类,从我们的直接依赖关系,他们和所有的传递依赖将最终分布。例如,从100M的发行版中,只有1M是实际可能运行的代码,可能与我们的应用程序有任何关系...

像proguard这样的工具可以将代码收缩到特定的jar中进行各种优化,但不会在意if该代码未被使用。通过未使用我的意思是主要方法是jar的入口点,并根据主要的代码它可能永远不会使用实际应用程序jar中的大部分代码和更多的库罐中...

我们的目标是创建一个具有唯一的代码,它实际上会使用这个1M罐子,考虑到是什么在JAR清单的主要方法...

我搜索了很多,但找不到任何解决方案对此,proguard非常接近,但我找不到任何方式使它只关心代码的特定流程而不是所有的代码。

是否有可以做这件事的任何工具?

+0

只是一个侧面说明:请记住,有一个)反射......使得它很难确定哪些类是真的* *需要...然后b)在转换为停机问题:对于任意程序和输入,您可以**不**确定是否曾经使用某个函数(又名类)。所以,我说的是:也许你的问题有实用的答案,但是大的理论是不利于你的。 – GhostCat

+0

SO关闭主题。 – ManoDestra

+0

@Jägermeister通常,如果一个图书馆依赖于反思,你会发现它并明确告诉proguard不要删除这个或那个类......在我的情况下,我根本不使用它...关于b)这是怎么回事?如果proguard已经这样做了,它会通过字节码,并且如果它检测到死代码,它将删除它或任何未使用的类...所以proguard做我想要的它只是它不关心入口点... – vach

回答

1

你对什么样的ProGuard确实描述是错误的:

的工具,像proguard的可收缩的代码与各种 优化特定的罐子,但如果代码是不使用也不会在意。未使用的i 表示主要方法是jar的入口点,并且取决于 主代码可能永远不会使用实际应用程序jar中的大部分代码以及更多库jar中的代码...

你描述为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希望它包含所有包括依赖项的jar包,并且只发布一个jar ...我在哪里告诉proguard这个特定的X.Jar是我真正的应用程序? – vach

相关问题