混淆会影响性能吗?

9
混淆Java程序会影响其性能吗(排除重命名)?
5个回答

7
当然可以:除了在仅有标识符名称被混淆的最简单情况下,这只涉及到性能受到多少影响。有关更多详细信息,请参见此处,有关混淆技术的一般信息可在维基百科的混淆代码文章中查阅。

7
一般而言,通过将变量、方法和类名重命名为更无意义的名称以进行混淆不会影响性能。一些混淆软件的供应商甚至声称除了混淆之外,还可以获得多达30%的性能提升。虽然我从未测试过这些声明,从未见过它们被证明,因此很难相信它们。
但请记住,有些软件还启用流程混淆:向语句添加无意义的控制循环,使代码更难跟踪。这确实对性能产生负面影响,尽管很小。

有趣的观点(真的,这里没有玩笑),Razzie。我想知道的是,一旦涉及混淆,您会考虑您的代码处于敌对手中,他们可以使用代码分析工具来删除空方法和内联1调用的方法... - Riduidel
5
优秀的混淆器可以生成完全无法阅读的代码,使用goto和其他无用信息,从而产生极难反编译的代码。这种方式会对性能造成一定影响。不过,你可以参考http://www.excelsior-usa.com/articles/java-obfuscators.html#performance了解更多相关信息,非常有意思。 - Razzie

1

不,混淆只是将您的有意义的命名代码替换为难以阅读的代码。在某些情况下(例如使用ProGuard时),我们的代码甚至可以通过删除所有无用的代码块(例如if(false)和类似语句)进行“优化”。

编辑(澄清Magesh的想法)。

当使用混淆器(而不是手动混淆,这不是一个好主意)时,它会加载您的类并内联一些方法或代码块(如上述if),以简化获得大块代码的代码。因此,方法调用较少,需要的堆栈使用较少,从而加快应用程序速度。

混淆器通常还会将所有变量从mySmartVariable重命名为a$a$a,从而使反编译变得不可能(因为Java反编译器将$视为用于标识内部和匿名类而不是变量的符号)。


1
@James,不是一直如此,看看我的回答。有些软件会添加无意义的控制流程,使得代码更难阅读,比如流程混淆。尽管影响较小,但这确实会对性能产生一定影响。 - Razzie
@james 是的,我指的是流程混淆。 - user291290

0
如果您添加了永远不会被遍历的冗余代码,那么不会影响性能。但是,如果您添加了必须在代码正常执行期间遍历的逻辑,则会影响性能。这种影响程度取决于您尝试添加的令人困惑的非逻辑结构,以防止软件盗版者的攻击。

抱歉有些不好意思地提醒,但是在逆向工程中,一个没有被遍历的代码可以通过逐步执行很快被识别出来,因此我认为这不会被视为一种良好的混淆类型。 - JacopoStanchi

0
有时候是这样的。在Java ME(Java的“手机版本”)中,混淆作用于编译后的字节码,并且(除其他事项外)将名称替换为短的自动生成的名称。这使得字节码更短,至少使得通过网络下载应用程序更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接