android反编译语句实例分析

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;
    }
  }
可以看出枚举数值存储在一数组中。






你可能感兴趣的:(android,反编译)