Android编程之还原JD-GUI反编译后代码

来源:互联网 发布:mac 电源设置 编辑:程序博客网 时间:2024/03/29 16:41

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

jd-gui这款jar反编译软件,大家经常用到,它反编译后的代码可以重新生成java文件。但它反编译出的代码,在遇到部分java特定语句的时候就不容易被看懂了。

我这里就jd-gui反编译后代码的复原内容讲讲我的经验,与大家分享一下:

1、switch语句:

正常的switch语句:

 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反编译后:

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部分拆解,下面会有具体讲到。

 

原创粉丝点击