用主要方法混淆 Class 名称

Obfuscate Class Names With Main Methods

我正在使用 ProGuard to obfuscate executable .jar files. When I decompile the code using Procyon 具有主要方法的 classes 仍然具有它们的原始名称。这是由于

-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

在默认配置中。

如果我删除它,ProGuard 将不会处理。有没有办法用主要方法混淆 class 名称,或者有充分的理由反对它?

如果您使用 main 方法混淆 class 名称,您将无法再将 class 调用到 运行 jar。

理论上,您可以修改 jar 中的 MANIFEST.MF 以引用混淆的 class 名称,但我不确定这样做的好处,因为您很清楚在那个时候打电话。

此外,您可以 从不 混淆 main(String[]) 方法名称本身,或者 java 找不到并且 运行 您的应用程序位于全部。这是反对它的一个很好的理由:)

如果您想混淆 class 成员的 rest,但保留 classname 和 main 方法本身,您可以使用

-keep public class mypackage.MyMain {
    public static void main(java.lang.String[]);
}

根据 first example in proguard manual.

添加 allowobfuscation 以重命名您的 class 并添加 keepclassmembers 以保留 main 方法名称:

-keep,allowobfuscation public class * { public static void main(java.lang.String[]); }
-keepclassmembers public class * { public static void main(java.lang.String[]); }

并记得 -adaptresourcefilecontents 也使您的 JAR 可运行。