已发布制品的二进制死代码消除可行性及依赖影响问询
二进制制品裁剪与依赖解析疑问
我当前使用自研的artifact,仅用到其约25%的功能,剩余75%包含大量代码与预分配内存。该库包含用作默认状态的static final实例(用于内存优化)等组件,这些组件会被其他项目大量使用。
库的部分类结构为索引/分类组件,示例代码如下:
class Utils { static class OfArrays {} static class OfCollections {} }
还有基于继承关系的结构,示例:
class Parent { static class ClassToBeUsedInArtifact extends Parent {} static class IgnoredClass extends Parent {} }
由于我使用的组件至关重要,我想知道能否将未使用部分从待发布的二进制制品中裁剪掉。若可通过javac配置或其他构建工具实现,我有以下核心顾虑:若从发布的二进制制品中裁剪依赖,当下游分支再次用到被裁剪的依赖时,下游依赖解析是否仍可行?
举个依赖结构的示例:
//Gradle keyword = `implementation` on all artifacts built. SomeProject ├──(implementation) ArtifactC (built with pruned ArtifactA and B) │ ├ (implementation)─ ArtifactB:1.0.0 │ └ (implementation)─ ArtifactA:1.0.0 ├──(implementation) ArtifactB:1.0.0 (built with pruned ArtifactA) │ └ (implementation)─ ArtifactA:1.0.1 └──(implementation) ArtifactA:1.0.2 (full artifact)
若使用专门的二进制死代码裁剪构建工具,我想明确以下问题:
- 编译器(标准或非标准)能否对所有ArtifactA实例执行依赖解析,使三者使用同一版本?(我推测会选择最新的ArtifactA:1.0.2)
- SomeProject的编译器能否推断ArtifactC应使用外部ArtifactB,而非其内部的裁剪版本?
- 我认为无需同时引入ArtifactC和ArtifactB即可使用ArtifactC,该观点是否正确?
另外,若使用更专业的强制内联与重排工具,是否会阻碍SomeProject的编译器跨制品执行依赖解析?
内容的提问来源于stack exchange,提问作者Delark
相关产品推荐
相关产品推荐

