java – 为什么proguard不会混淆方法体?
我正在使用ProGuard来混淆我的.jar程序.一切正常,但ProGuard不会在方法体中混淆局部变量.这是一个例子:
生的: 混淆: 以黄色突出显示的变量名称应该被混淆,但它们不是.我怎样才能对它们进行模糊处理(将它们重命名为a,b,c等?) 这是我的ProGuard配置:http://pastebin.com/sb3DMRcC(上述方法不是来自其中一个排除的类). 解决方法
因为它不能. 对于已编译的代码,有两种方法可以在本地存储数据(即在方法中): >在操作数堆栈上 操作数堆栈实际上只是一个堆栈. 这个问题的重要之处在于如何引用堆栈上的内容,这与任何其他堆栈类似: 现在,对于所谓的“局部变量”: 将它们视为ArrayList而不是Java中的变量. 最大堆栈大小和局部变量数都是有限的,必须在每个方法的Code属性的标题中给出,如Section 4.7.3(max_stack和max_locals)中所定义. 然而,局部变量的有趣之处在于它们兼作方法参数,这意味着局部变量的数量永远不会低于方法参数的数量. 话虽这么说,让我们来看看一些代码吧! 例: class Test { public static void main(String[] myArgs) throws NumberFormatException { String myString = "42"; int myInt = Integer.parseInt(myString); double myDouble = (double)myInt * 42.0d; System.out.println(myDouble); } } 这里我们有三个局部变量myString,myInt和myDouble,加上一个参数myArgs. > java.lang.String [] – 类 还有一些导出:Test和main,以及编译器为我们生成的默认构造函数. 所有常量,引用和导出都将导出到Constant Pool – 局部变量和参数名称不会. 编译和反汇编类(使用javap -c Test)产生: Compiled from "Test.java" class Test { Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]) throws java.lang.NumberFormatException; Code: 0: ldc #2 // String 42 2: astore_1 3: aload_1 4: invokestatic #3 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I 7: istore_2 8: iload_2 9: i2d 10: ldc2_w #4 // double 42.0d 13: dmul 14: dstore_3 15: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream; 18: dload_3 19: invokevirtual #7 // Method java/io/PrintStream.println:(D)V 22: return } 除了默认构造函数,我们可以逐步看到我们的主要方法. 如果你传递-v标志,javap也会显示常量池,但它并没有真正为输出添加任何值,因为常量池中的所有相关信息都会显示在注释中. 但现在,让我们来看看反编译器产生的内容! JD-GUI 0.3.5(JD-Core 0.6.2): import java.io.PrintStream; class Test { public static void main(String[] paramArrayOfString) throws NumberFormatException { String str = "42"; int i = Integer.parseInt(str); double d = i * 42.0D; System.out.println(d); } } Procyon 0.5.28: class Test { public static void main(final String[] array) throws NumberFormatException { System.out.println(Integer.parseInt("42") * 42.0); } } 请注意导出到常量池的所有内容是如何保留的,而JD-GUI只是为局部变量选择一些名称,而Procyon完全优化它们. 我不知道反编译代码中的“真实”名称来自哪里,但我相当确定它们不包含在jar文件中.IDE的功能可能吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |