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