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

来源:互联网 发布:c语言常用输入函数有 编辑:程序博客网 时间:2024/03/28 21:03

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

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


1、switch语句:

正常的switch语句:

[java] view plaincopy
  1. public boolean onTouchEvent(MotionEvent event) {  
  2.  final int y = (int) event.getY();  
  3.  mBounceHack = false;  
  4.  switch (event.getAction()) {  
  5.  case MotionEvent.ACTION_UP:  
  6.   if (!isVerticalScrollBarEnabled()) {  
  7.    setVerticalScrollBarEnabled(true);  
  8.   }  
  9.   if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {  
  10.    if ((mRefreshView.getBottom() >= mRefreshViewHeight || mRefreshView  
  11.      .getTop() >= 0) && mRefreshState == RELEASE_TO_REFRESH) {  
  12.     mRefreshState = REFRESHING  
  13.     prepareForRefresh();  
  14.     onRefresh();  
  15.    } else if (mRefreshView.getBottom() < mRefreshViewHeight  
  16.      || mRefreshView.getTop() <= 0) {  
  17.     resetHeader();  
  18.     setSelection(1);  
  19.    }  
  20.   }  
  21.   break;  
  22.  case MotionEvent.ACTION_DOWN:  
  23.   mLastMotionY = y;  
  24.   break;  
  25.  case MotionEvent.ACTION_MOVE:  
  26.   applyHeaderPadding(event);  
  27.   break;  case MotionEvent.ACTION_CANCEL:  
  28.   break;  
  29.  }  
  30.  return super.onTouchEvent(event);  
  31. }  


经过JD-GUI反编译后:
[java] view plaincopy
  1. public boolean onTouchEvent(MotionEvent paramMotionEvent) {  
  2.         int i = (int) paramMotionEvent.getY();  
  3.         this.mBounceHack = 0;  
  4.         switch (paramMotionEvent.getAction()) {  
  5.         default:  
  6.         case 1:  
  7.         case 0:  
  8.         case 2:  
  9.         }  
  10.         while (true) {  
  11.             return super.onTouchEvent(paramMotionEvent);  
  12.             if (!isVerticalScrollBarEnabled())  
  13.                 setVerticalScrollBarEnabled(1);  
  14.             if ((getFirstVisiblePosition() != 0) || (this.mRefreshState == 4))  
  15.                 continue;  
  16.             int j = this.mRefreshView.getBottom();  
  17.             int k = this.mRefreshViewHeight;  
  18.             if (((j >= k) || (this.mRefreshView.getTop() >= 0))  
  19.                     && (this.mRefreshState == 3)) {  
  20.                 this.mRefreshState = 4;  
  21.                 prepareForRefresh();  
  22.                 onRefresh();  
  23.                 continue;  
  24.             }  
  25.             int m = this.mRefreshView.getBottom();  
  26.             int n = this.mRefreshViewHeight;  
  27.             if ((m >= n) && (this.mRefreshView.getTop() > 0))  
  28.                 continue;  
  29.             resetHeader();  
  30.             setSelection(1);  
  31.             continue;  
  32.             this.mLastMotionY = i;  
  33.             continue;  
  34.             applyHeaderPadding(paramMotionEvent);  
  35.         }  
  36.     }  

一、可以看到,反编译后的switch部分有了很大的变化,case部分都被打乱了。但这里还是有规律可循的,也就是说case部分的排列顺序是不会变的,如上例中case部分就是按照原来的保持不变。

二、接下来看while循环部分。这里面就包含了本该分别在case中的部分代码。首选将最开始的return取去,直接放到代码的最后面。然后看从return开始到第一个continue,这个就是第一个case中的代码部分,从第一个continue到第二个continue就是第二个case中的代码,以此类推。


注意:如果在这期间包含了if部分,里面的continue是不能作数的,要找最外层部分的continue。

上面的截图中可以看出,有的if部分中也会代有continue,但它是不能算做标识位的。关于if部分拆解,下面会有具体讲到。


2、if语句

0 0
原创粉丝点击