我正在学习如何在Android中使用ProGuard以及我在反编译调试APK(使用ProGuard构建)后注意到的是ProGuard删除了未使用的指令并评估了数学表达式,例如: 如果我在使用ProGuard之前使用这行代码:
Integer JunkCode6666 = new Integer(Integer.MIN_VALUE+Integer.MAX_VALUE+1);
使用ProGuard之后会变成这样:
num = new Integer(0);
我想知道是否有办法保持原始方式,这是为了混淆目的。如果有办法阻止ProGuard删除未使用的指令。谢谢。
答案 0 :(得分:1)
我刚刚通过编译此类而没有 proguard
进行检查id
,编译构造函数是
public class Foo {
final Integer bar = new Integer(Integer.MIN_VALUE+Integer.MAX_VALUE+1);
}
因此,除了Java编译器之外,它不是程序员,因为 public <init>()V
L0
LINENUMBER 1 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
L1
LINENUMBER 3 L1
ALOAD 0
NEW java/lang/Integer
DUP
ICONST_0 // <--- evaluated expression result
INVOKESPECIAL java/lang/Integer.<init> (I)V
PUTFIELD Foo.bar : Ljava/lang/Integer;
RETURN
L2
LOCALVARIABLE this LFoo; L0 L2 0
MAXSTACK = 4
MAXLOCALS = 1
的构造函数中的值是constant expression并且在编译时进行评估以进行优化。 / p>
例如,您可以检查是否编译了该类的其他版本
Integer
将导致不同的构造函数
public class Foo {
final Integer bar = new Integer(getA()+getB()+1);
private int getA(){
return Integer.MIN_VALUE;
}
private int getB(){
return Integer.MAX_VALUE;
}
}
正如您所看到的,在第二个版本中,实际执行了2次添加,因为这些值是从方法调用中获取的,因此不再是常量。