我能做些什么来使罐子/类更小?
我正在开发一个Java小程序,减小二进制代码的大小将使小程序打开得更快,并将改善用户体验。
我能做些什么来减少类和/或jar文件的大小?我想确保我没有错过明显的技巧。
我知道在C++世界中,例如剥离调试符号的编译器选项可以产生巨大的差异,但我从未见过Java这样的东西。
我正在开发一个Java小程序,减小二进制代码的大小将使小程序打开得更快,并将改善用户体验。
我能做些什么来减少类和/或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
删除调试信息 - 我不知道它可能会产生多大的差异。
您有多确信下载时间是瓶颈?小程序有多大?除非它是巨大的,否则我怀疑下载后的大小会有很大的不同。