我正在开发一个Java Applet,减少二进制代码的大小将使applet更快地打开并改善用户体验。
有什么办法可以减少类和/或jar文件的大小吗?我想确定我没有错过明显的技巧。
我知道在C ++世界编译器选项中,例如剥离调试符号可以产生巨大的差异,但我从来没有见过类似Java的东西。
答案 0 :(得分:11)
您可以使用
javac -g:none
删除调试信息 - 我不知道它可能会有多大差异。
您有多确信下载时间是瓶颈?小程序有多大?除非它是巨大的,否则我怀疑它在下载后会有很大的不同。
答案 1 :(得分:11)
查看此页面,了解有关如何使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将对此进行优化,因此不会产生额外开销。
答案 2 :(得分:6)
Proguard是一个免费的Java类文件收缩器,优化器,混淆器和预验证器。它检测并删除未使用的类,字段,方法和属性。它优化字节码并删除未使用的指令。
关于proguard网站的报告显示减少的例子,范围从19%到90%。
答案 3 :(得分:3)
Classdepandjar来减少jar文件大小(Jini附带了很多远程代码,因此这个要求)。它删除了在同一个jar中没有引用的类。
显然这有例外(按名称等加载的类),因此您可以在配置中容纳这些。您应该最有可能测试“摇晃”的jar,以确定相关的依赖性仍然存在。
答案 4 :(得分:3)
改善小程序大小的一些建议:
混淆 - Proguard对我来说是整体表现最好的 - 对我来说减少了25%以上。此外,它将在Jar期间提供适当的压缩。
优化所有资源 - 使用图片优化工具减少附加图片,如果合适,质量会降低。
代码更改 - 我发现您并不是真的想要这样做,但是值得查看您的Jar文件并检查生成的类数。最琐碎的类将花费大约500字节。如果您有许多匿名内部类,则可能值得重构。
根据需要加载资源 - 加载初始小程序。启动后异步加载其他资源。
答案 5 :(得分:2)
pack200(和gzip)生成的文件比jars(有效的zip文件)小得多。
答案 6 :(得分:1)
试试这个工具。 http://proguard.sourceforge.net/
答案 7 :(得分:1)
据我所知,你不能从Java类文件中删除符号,但可以缩短标识符。但是,这可能会使堆栈跟踪变得无用,所以我不提倡它。
但是,您可以通过使用AdvanceCOMP project中改进的deflate算法重新压缩您的.jar文件来无损地减小文件大小。(.jar档案只是里面的普通.zip文件)。
答案 8 :(得分:0)
您可以使用工具应用代码混淆。这通常会缩小变量和方法名称,并显着减少类大小。这通常在将代码部署到J2ME平台时完成。
答案 9 :(得分:0)
HTTP压缩通常仅比JAR压缩消耗50%-80%的带宽,尤其是当您创建了许多类时,例如Scala计划。
答案 10 :(得分:-1)
如果使用NetBeans,则可以设置构建脚本以在项目配置中生成压缩的JAR文件(在Build-> Packaging下)。可能没有其他解决方案那么有效,但它只是一个复选框。 : - )