【发布时间】:2016-07-06 13:21:01
【问题描述】:
给定一个常规的 java gradle 项目,我们有一些在 jar 清单中定义的入口 main 方法,以及一堆依赖项。
现在通常当我们创建一个发行版时,我们可能会使用应用程序插件并具有类似这样的结构作为输出
/bin (some splatform specific scripts that point to our jar)
/lib (our jar + all dependencies with their dependencies etc...)
问题是,即使我们只使用了直接依赖项中的几个类,它们和所有传递依赖项最终都会在分发中。例如,从 100M 的分布中,只有 1M 实际上是可以运行的代码,并且可能与我们的应用程序有任何关系......
像 proguard 这样的工具可以通过各种优化缩小特定 jar 中的代码,但它不会关心代码是否未使用。未使用的意思是 main 方法是 jar 的入口点,根据 main 中的代码,它可能永远不会使用实际应用程序 jar 中的大部分代码以及库 jar 中的更多代码......
我们的目标是创建这个仅包含实际将使用的代码的 1M jar,同时考虑到 jar 清单中的主要方法是什么...
我已经搜索了很多但找不到任何解决方案,proguard 非常接近,但我找不到任何方法让它只关心代码的特定流程而不是所有代码。
是否有任何工具可以做到这一点?
【问题讨论】:
-
附注:请记住,有 a) 反射...很难确定哪些类是真正需要的...然后 b)停机问题转化为:对于任意程序和输入,您可以不确定是否曾经使用过某个函数(又名类)。所以,我要说的是:也许对你的问题有务实的答案,但大理论对你不利。
-
@Jägermeister 通常如果一个库依赖于反射,你会弄清楚并明确告诉proguard不要删除这个或那个类......在我的情况下,我根本不使用它......关于b ) 那个怎么样?如果proguard已经这样做了,它会通过字节码,如果它检测到死代码,它将摆脱它,或者任何未使用的类......所以proguard做我想要的它只是它不关心入口点......
-
stackoverflow how-to-find-unused-dead-code-in-java-projects 的可能副本,它关心源代码。问题是关于编译的代码。无论如何,答案可能会有所帮助。
-
绝对不是重复,这是关于使用特定于应用程序的 main 方法进行收缩,而不仅仅是消除死代码...
-
我想我会让问题更具体到proguard,因为据我所知,我唯一的选择是如果我可以让它摆脱特定代码流未使用的任何东西......
标签: java optimization gradle proguard