我正在开发一个Java Applet,减少二进制代码的大小将使小程序打开更快,并会改善用户体验。
我能做些什么来减少类和/或 jar 文件的大小吗?我想确保我没有遗漏明显的技巧。
我知道在 C++ 世界中,例如剥离调试符号的编译器选项会产生巨大的影响,但我从未见过类似 Java 的情况。
我正在开发一个Java Applet,减少二进制代码的大小将使小程序打开更快,并会改善用户体验。
我能做些什么来减少类和/或 jar 文件的大小吗?我想确保我没有遗漏明显的技巧。
我知道在 C++ 世界中,例如剥离调试符号的编译器选项会产生巨大的影响,但我从未见过类似 Java 的情况。
查看此页面以获取有关如何使 jar 文件更小的提示 - http://wiki.java.net/bin/view/Games/4KGamesDesign。尽管有些可能不适用,因为您没有尝试绝对最小化,但您可以应用一些通用技巧,而不会影响代码质量。
但这里有一个总结:
将您的代码减少到一类。每个类都增加了 JAR 文件中一个条目的开销,以及一个全新的常量池和类列表。
尽量减少你的方法。每个方法都会在类文件中增加开销。您只需要一个main()
方法,以及实现键盘和/或鼠标例程的方法。
不要使用全局变量。全局变量需要类中的特殊元数据来识别。然而,方法局部变量只是堆栈条目,使用起来没有额外成本。
使用像 7Zip 或 KZip 这样好的压缩器来创建您的 JAR 文件。JAR 实用程序主要设计用于正确性,而不是压缩率。
使用 ProGuard、JoGa 或 JShrink 之类的混淆器来优化类的大小。
使用单个字符作为类文件名。这会在内部减小其大小,减少 Zip 程序存储的信息量,并减小清单的大小。
尽可能少地引用类。您引用的每个类都添加了完整的包和类名,以及您正在调用的方法签名。
冗余(例如对所有方法、类和字段使用相同的名称)提高了压缩率。
私有和最终的方法可以由类优化器内联。
使用该String.valueOf()
方法将原语转换为字符串。例如,""+number
扩展为:new StringBuffer?().append("").append(number).toString()
在新的类和方法引用中浪费大量空间。
源代码中使用的静态字符串、浮点数和整数存储在常量池中。因此,您可以重用静态值的次数越多,您的类就会越小。
您可以自由地使用静态最终变量作为常量。这将使您的代码更具可读性,ProGuard 将优化它,因此没有额外的开销。
您可以使用
javac -g:none
删除调试信息 - 我不知道它可能会产生多大的差异。
您对下载时间是瓶颈的确信程度如何?小程序有多大?除非它很大,否则我怀疑下载后大小会产生很大差异。
Proguard是一个免费的 Java 类文件收缩器、优化器、混淆器和预验证器。它检测并删除未使用的类、字段、方法和属性。它优化字节码并删除未使用的指令。
proguard 网站上的报告显示了减少的示例,范围从 19% 到 90%。
在 Jini 世界中使用Classdepandjar来减少 jar 文件的大小(Jini 附带了很多远程代码,因此有这个要求)。它会删除同一个 jar 中未引用的类。
显然这有例外(按名称加载的类等),因此您可以在配置中容纳这些。您很可能应该针对“动摇”的 jar 进行测试,以确定相关的依赖关系仍然存在。
一些改进小程序大小的建议:
混淆- Proguard对我来说是整体性能最好的 - 对我来说减少了 25% 以上。此外,它将在 Jar 期间提供不错的压缩。
优化任何资源- 使用图像优化器减少附加图像,适当时降低质量。
代码更改- 我看到您并不想这样做,但值得查看您的 Jar 文件并检查生成了多少类。最简单的类将花费大约 500 字节。如果您有很多匿名内部类,则可能值得重构。
根据需要加载资源- 加载初始小程序。启动后异步加载其他资源。
pack200(和 gzip)生成的文件比 jars(实际上是 zip 文件)小得多。
据我所知,您不能从 Java 类文件中去除符号,但可以缩短标识符。但是,这可能会使堆栈跟踪无用,所以我不提倡它。
但是,您可以通过使用AdvanceCOMP 项目中改进的 deflate 算法重新压缩.jar 文件来无损减小文件大小(.jar 档案只是其中的普通 .zip 文件)。
您可以使用工具来应用代码混淆。这通常会缩小变量和方法名称并显着减小类大小。这通常在将代码部署到 J2ME 平台时完成。
HTTP 压缩通常只消耗比 JAR 压缩 50%-80% 的带宽,尤其是当您创建大量类时,例如 Scala 程序。
如果您使用 NetBeans,您可以在项目配置中(在 Build->Packaging 下)设置构建脚本以生成压缩的 JAR 文件。也许不如其他解决方案有效,但它只是一个复选框。:-)