阻止ProGuard评估数学表达式并删除Android中未使用的指令

时间:2018-03-25 18:25:38

标签: android android-proguard

我正在学习如何在Android中使用ProGuard以及我在反编译调试APK(使用ProGuard构建)后注意到的是ProGuard删除了未使用的指令并评估了数学表达式,例如: 如果我在使用ProGuard之前使用这行代码:

Integer JunkCode6666 = new Integer(Integer.MIN_VALUE+Integer.MAX_VALUE+1);

使用ProGuard之后会变成这样:

num = new Integer(0);

我想知道是否有办法保持原始方式,这是为了混淆目的。如果有办法阻止ProGuard删除未使用的指令。谢谢。

1 个答案:

答案 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次添加,因为这些值是从方法调用中获取的,因此不再是常量。