原文标题:JShrink: In-Depth Investigation into Debloating Modern Java Applications
原文作者:Bobby R. Bruce, Tianyi Zhang, Jaspreet Arora, Guoqing Harry Xu, Miryung Kim
原文链接:https://dl.acm.org/doi/pdf/10.1145/3368089.3409738
发表期刊:FSE/ESEC'20
笔记作者:[email protected]
笔记小编:[email protected]
软件开发不可避免的会引入或写入一些不必要、未使用的代码,这就是软件臃肿(bloated software)。这种称为软件膨胀的现象会导致软件消耗比原本需要的资源更多的资源。如何有效自动地对软件进行去膨胀是软件工程中长期存在的问题。自 1990 年代后期以来,已经提出了各种去肿胀技术。然而,其中许多技术都是建立在纯静态分析的基础上的,并且尚未在动态语言功能普遍存在的现代 Java 应用程序的上下文中进行扩展和评估,需要引入一定的动态分析技术。
该图来源于论文 PPT 讲解视频(原论文并未提供框架图),由图可以清楚的看到整个论文的研究思路和主要模块:
Extend Call Graph Analysis:
该模块主要包括静态可达分析、动态可达分析、类型依赖分析。
Bytecode Transformation:
主要是去臃肿的过程,主要包含如下过程:去除未使用的方法、去除未使用的字段、方法内联处理、处理类层次结构崩溃、检查。
实验主要与 Jax[1],JRed[2],ProGuard[3] 进行对比,另外 TamiFlex 为另一种动态路径分析工具,主要与本文的 JMtrace 对比,Jshrink-C 代表开启检查机制。
其中 MR、FR、CC、MI 分别代表 Method Removal、Field Removal、Class hierarchy Collapsing 和 Method Inline。
由图 2 中可以看到,Jshrink 平均缩小比例为 14.2%,相比其他可能效果不算很高,但是代码去臃肿更重要的要保持语义。
由图 2 中可以看到,Jshrink 的效果达到 98.5% 的正确性,对比41.6%(JRed),37.3%(Jax),和 91%(Proguard)均有很大提升,并且开启检查机制的 Jshrink 可以达到 100% 的语义保留。
当仅使用 main 作为调用图切入点(对比分析软件 TamiFlex)时,软件体积更新,但必然会导致出现大量的语义错误;当使用所有可达路径时,语义正确有保障,但是软件去臃肿的体积会比前者大。
由图 2 中可以看到,当面对新测试用例时,jshrink 在 26 个中只有 4 个出错,效果对比其他有着明显提升。
[1]: Tip F, Laffra C, Sweeney P F, et al. Practical experience with an application extractor for Java[C]//Proceedings of the 14th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. 1999: 292-305.
[2]: Jiang Y, Wu D, Liu P. Jred: Program customization and bloatware mitigation based on static analysis[C]//2016 IEEE 40th annual computer software and applications conference (COMPSAC). IEEE, 2016, 1: 12-21.
[3]: [n.d.]. ProGuard: Java and Android Apps Optimizer. https://www.guardsquare.com/en/products/proguard. Accessed: 2019-12-13.
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com