Android编程之还原JD-GUI反编译后代码
2014-11-21 21:20
399 查看
jd-gui这款jar反编译软件,大家经常用到,它反编译后的代码可以重新生成java文件。但它反编译出的代码,在遇到部分java特定语句的时候就不容易被看懂了。
我这里就jd-gui反编译后代码的复原内容讲讲我的经验,与大家分享一下:
1、switch语句:
正常的switch语句:
[java]
view plaincopyprint?
public boolean onTouchEvent(MotionEvent event) {
final int y = (int) event.getY();
mBounceHack = false;
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
if (!isVerticalScrollBarEnabled()) {
setVerticalScrollBarEnabled(true);
}
if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
if ((mRefreshView.getBottom() >= mRefreshViewHeight || mRefreshView
.getTop() >= 0) && mRefreshState == RELEASE_TO_REFRESH) {
mRefreshState = REFRESHING
prepareForRefresh();
onRefresh();
} else if (mRefreshView.getBottom() < mRefreshViewHeight
|| mRefreshView.getTop() <= 0) {
resetHeader();
setSelection(1);
}
}
break;
case MotionEvent.ACTION_DOWN:
mLastMotionY = y;
break;
case MotionEvent.ACTION_MOVE:
applyHeaderPadding(event);
break; case MotionEvent.ACTION_CANCEL:
break;
}
return super.onTouchEvent(event);
}
经过JD-GUI反编译后:
[java]
view plaincopyprint?
public boolean onTouchEvent(MotionEvent paramMotionEvent) { int i = (int) paramMotionEvent.getY(); this.mBounceHack = 0; switch (paramMotionEvent.getAction()) { default: case 1: case 0: case 2: } while (true) { return super.onTouchEvent(paramMotionEvent); if (!isVerticalScrollBarEnabled()) setVerticalScrollBarEnabled(1); if ((getFirstVisiblePosition() != 0) || (this.mRefreshState == 4)) continue; int j = this.mRefreshView.getBottom(); int k = this.mRefreshViewHeight; if (((j >= k) || (this.mRefreshView.getTop() >= 0)) && (this.mRefreshState == 3)) { this.mRefreshState = 4; prepareForRefresh(); onRefresh(); continue; } int m = this.mRefreshView.getBottom(); int n = this.mRefreshViewHeight; if ((m >= n) && (this.mRefreshView.getTop() > 0)) continue; resetHeader(); setSelection(1); continue; this.mLastMotionY = i; continue; applyHeaderPadding(paramMotionEvent); } }
一、可以看到,反编译后的switch部分有了很大的变化,case部分都被打乱了。但这里还是有规律可循的,也就是说case部分的排列顺序是不会变的,如上例中case部分就是按照原来的保持不变。
二、接下来看while循环部分。这里面就包含了本该分别在case中的部分代码。首选将最开始的return取去,直接放到代码的最后面。然后看从return开始到第一个continue,这个就是第一个case中的代码部分,从第一个continue到第二个continue就是第二个case中的代码,以此类推。
注意:如果在这期间包含了if部分,里面的continue是不能作数的,要找最外层部分的continue。
上面的截图中可以看出,有的if部分中也会代有continue,但它是不能算做标识位的。关于if部分拆解,下面会有具体讲到。
2、if语句
我这里就jd-gui反编译后代码的复原内容讲讲我的经验,与大家分享一下:
1、switch语句:
正常的switch语句:
[java]
view plaincopyprint?
public boolean onTouchEvent(MotionEvent event) {
final int y = (int) event.getY();
mBounceHack = false;
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
if (!isVerticalScrollBarEnabled()) {
setVerticalScrollBarEnabled(true);
}
if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
if ((mRefreshView.getBottom() >= mRefreshViewHeight || mRefreshView
.getTop() >= 0) && mRefreshState == RELEASE_TO_REFRESH) {
mRefreshState = REFRESHING
prepareForRefresh();
onRefresh();
} else if (mRefreshView.getBottom() < mRefreshViewHeight
|| mRefreshView.getTop() <= 0) {
resetHeader();
setSelection(1);
}
}
break;
case MotionEvent.ACTION_DOWN:
mLastMotionY = y;
break;
case MotionEvent.ACTION_MOVE:
applyHeaderPadding(event);
break; case MotionEvent.ACTION_CANCEL:
break;
}
return super.onTouchEvent(event);
}
public boolean onTouchEvent(MotionEvent event) { final int y = (int) event.getY(); mBounceHack = false; switch (event.getAction()) { case MotionEvent.ACTION_UP: if (!isVerticalScrollBarEnabled()) { setVerticalScrollBarEnabled(true); } if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) { if ((mRefreshView.getBottom() >= mRefreshViewHeight || mRefreshView .getTop() >= 0) && mRefreshState == RELEASE_TO_REFRESH) { mRefreshState = REFRESHING prepareForRefresh(); onRefresh(); } else if (mRefreshView.getBottom() < mRefreshViewHeight || mRefreshView.getTop() <= 0) { resetHeader(); setSelection(1); } } break; case MotionEvent.ACTION_DOWN: mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: applyHeaderPadding(event); break; case MotionEvent.ACTION_CANCEL: break; } return super.onTouchEvent(event); }
经过JD-GUI反编译后:
[java]
view plaincopyprint?
public boolean onTouchEvent(MotionEvent paramMotionEvent) { int i = (int) paramMotionEvent.getY(); this.mBounceHack = 0; switch (paramMotionEvent.getAction()) { default: case 1: case 0: case 2: } while (true) { return super.onTouchEvent(paramMotionEvent); if (!isVerticalScrollBarEnabled()) setVerticalScrollBarEnabled(1); if ((getFirstVisiblePosition() != 0) || (this.mRefreshState == 4)) continue; int j = this.mRefreshView.getBottom(); int k = this.mRefreshViewHeight; if (((j >= k) || (this.mRefreshView.getTop() >= 0)) && (this.mRefreshState == 3)) { this.mRefreshState = 4; prepareForRefresh(); onRefresh(); continue; } int m = this.mRefreshView.getBottom(); int n = this.mRefreshViewHeight; if ((m >= n) && (this.mRefreshView.getTop() > 0)) continue; resetHeader(); setSelection(1); continue; this.mLastMotionY = i; continue; applyHeaderPadding(paramMotionEvent); } }
public boolean onTouchEvent(MotionEvent paramMotionEvent) { int i = (int) paramMotionEvent.getY(); this.mBounceHack = 0; switch (paramMotionEvent.getAction()) { default: case 1: case 0: case 2: } while (true) { return super.onTouchEvent(paramMotionEvent); if (!isVerticalScrollBarEnabled()) setVerticalScrollBarEnabled(1); if ((getFirstVisiblePosition() != 0) || (this.mRefreshState == 4)) continue; int j = this.mRefreshView.getBottom(); int k = this.mRefreshViewHeight; if (((j >= k) || (this.mRefreshView.getTop() >= 0)) && (this.mRefreshState == 3)) { this.mRefreshState = 4; prepareForRefresh(); onRefresh(); continue; } int m = this.mRefreshView.getBottom(); int n = this.mRefreshViewHeight; if ((m >= n) && (this.mRefreshView.getTop() > 0)) continue; resetHeader(); setSelection(1); continue; this.mLastMotionY = i; continue; applyHeaderPadding(paramMotionEvent); } }
一、可以看到,反编译后的switch部分有了很大的变化,case部分都被打乱了。但这里还是有规律可循的,也就是说case部分的排列顺序是不会变的,如上例中case部分就是按照原来的保持不变。
二、接下来看while循环部分。这里面就包含了本该分别在case中的部分代码。首选将最开始的return取去,直接放到代码的最后面。然后看从return开始到第一个continue,这个就是第一个case中的代码部分,从第一个continue到第二个continue就是第二个case中的代码,以此类推。
注意:如果在这期间包含了if部分,里面的continue是不能作数的,要找最外层部分的continue。
上面的截图中可以看出,有的if部分中也会代有continue,但它是不能算做标识位的。关于if部分拆解,下面会有具体讲到。
2、if语句
相关文章推荐
- Android编程之还原JD-GUI反编译后代码
- Android编程之还原JD-GUI反编译后代码
- Android编程之还原JD-GUI反编译后代码
- Android - 使用JD-GUI反编译Android代码
- Android - 使用JD-GUI反编译Android代码
- dex2jar与jd_gui反编译Android中JAVA代码
- Android编程之还原JD-GUI反编译后代码 switch
- Dex2jar 与 JD-GUI快速反编译Android apk文件
- 反编译Android的apk包得到源码(使用工具:dex2jar和jd-gui)
- Android反编译dex2jar+JD-GUI(附反编译工具zip)
- JD-GUI反编译后代码逻辑分析
- JD-GUI反编译后代码逻辑分析
- 关于android使用dexjar反编译后的classes.dex.dex2jar.jar为什么jd gui打不开?
- JD-GUI反编译后代码逻辑分析
- JD-GUI反编译后代码逻辑分析
- 利用dex2jar和jd-gui反编译和查看Android的apk源码
- JD-GUI反编译后代码逻辑分析
- JD-GUI反编译后代码逻辑分析
- jd-gui反编译java代码问题
- [Android]反编译工具:apktool、dex2jar、jd-gui使用简介