android反编译语句实例分析

来源:互联网 发布:大数据盈利模式 编辑:程序博客网 时间:2024/06/04 23:35

1.if语句

   先看实例对比:

 private boolean isSimExist()  {   if ((mTelephonyManager.getSimState() == 1) || (mTelephonyManager.getSimState() == 0))   return true;   else return false;  }
反编译后:

  private boolean isSimExist()  {    int i = 1;    if ((this.mTelephonyManager.getSimState() != i) && (this.mTelephonyManager.getSimState() != 0))      i = 0;    return i;  }
反编译中会把if的中的条件取反,先处理else部分,如没有else部分,后面会直接跟一个return语句;

有时会还会跟一个break语句:

   if (this.power < 100)        break label857;      str9 = getResources().getString(2130968578);
label1857的部分:

       label857: String str8 = getResources().getString(2130968577) + "(%d%%)";        Object[] arrayOfObject = new Object[1];        arrayOfObject[0] = Integer.valueOf(this.power);        str9 = String.format(str8, arrayOfObject);
源代码是:

 if (this.power >= 100)        {        str9=getResources().getString(R.string.chargingHint2);        }        else        {        String str8 = getResources().getString(R.string.chargingHint1) + "(%d%%)";        Object[] arrayOfObject = new Object[1];        arrayOfObject[0] = Integer.valueOf(this.power);        str6 = String.format(str7, arrayOfObject);        }
以上的分析都是基于if语句在反编译后逻辑发生了改变的,但很多时候反编译过来的if语句逻辑是正常的就用不着以上的分析了。

2.for语句:

先看实例对比:

    for(int k=0;k<tubiao.length;k++)       {       if (k % 2 == 0)       {            tubiao[k] = (x_unlockbg + tubiao[k] * imgunlockBg.getWidth() / 320);       }        else        {              tubiao[k] = (y + tubiao[k] * imgunlockBg.getWidth() / 320);        }      }
反编译后:

    if (i1 >= this.tubiao.length)    {      }    else    {      if (i1 % 2 == 0)        this.tubiao[i1] = (i + this.tubiao[i1] * this.imgunlockBg.getWidth() / 320);      while (true)      {        ++i1;        break label439:        this.tubiao[i1] = (j + this.tubiao[i1] * this.imgunlockBg.getWidth() / 320);      }    }
反编译后咋一看确认很难看出有for语句的迹象,但细分析还是可以看出一些眉目,

外面有if判断,里面有while(true),++语句。与for语句的逻辑还是有些像的。

3.switch语句,这个已有前人总结了,这里附上链接

   http://blog.csdn.net/xyz_fly/article/details/8014455

4.枚举类型

  先看实例对比:

  private static enum lockstate  {  PHONE,  CAMERA,  LOCK,  NONE  }
反编译后:

  private static enum lockstate  {    static    {      CAMERA = new lockstate("CAMERA", 1);      LOCK = new lockstate("LOCK", 2);      NONE = new lockstate("NONE", 3);      lockstate[] arrayOflockstate = new lockstate[4];      arrayOflockstate[0] = PHONE;      arrayOflockstate[1] = CAMERA;      arrayOflockstate[2] = LOCK;      arrayOflockstate[3] = NONE;      ENUM$VALUES = arrayOflockstate;    }  }
可以看出枚举数值存储在一数组中。