用反编译的java代码理解

时间:2014-01-28 11:34:32

标签: java android decompiler

这是我第一次将apk反编译为java代码。以下代码是本地TVApp启动器,它是基于android的。令我惊讶的是,我发现反编译器没有完全转换为源代码。因此,它会弄乱一两件事。我试图解决我的问题,并用标签制作功能。虽然我得到了它的工作,但我想我错过了一些事情..

有人可以指导我如何使其正常工作吗?我是否必须手动重构代码,或者是否有可用的工具?

public void run()
    {
      EN_INPUT_SOURCE_TYPE localEN_INPUT_SOURCE_TYPE;
      int i;
      ITvServiceServer localITvServiceServer;
      for (;;)
      {
        if (LauncherActivity.this.bExitThread.booleanValue()) {
          return;
        }
        synchronized (LauncherActivity.this.bSync)
        {
          localEN_INPUT_SOURCE_TYPE = LauncherActivity.this.toChangeInputSource;
          LauncherActivity.this.toChangeInputSource = EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_NONE;
          i = LauncherActivity.this.fullScale;
          LauncherActivity.this.fullScale = 0;
          if (localEN_INPUT_SOURCE_TYPE != EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_NONE)
          {
            localITvServiceServer = ITvServiceServer.Stub.asInterface(ServiceManager.checkService("tv_services"));
            if (localITvServiceServer == null) {
              Log.w("LauncherActivity", "Unable to find ITvService interface.");
            }
          }
          else
          {
            if (i != 2) {
              break label345;
            }
            LauncherActivity.this.setPipscale();
            try
            {
              label104:
              Thread.sleep(100L);
            }
            catch (InterruptedException localInterruptedException)
            {
              localInterruptedException.printStackTrace();
            }
          }
        }
      }
      for (;;)
      {
        for (;;)
        {
          ITvServiceServerCommon localITvServiceServerCommon;
          try
          {
            localITvServiceServerCommon = localITvServiceServer.getCommonManager();
            if (localEN_INPUT_SOURCE_TYPE != EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_ATV) {
              break label324;
            }
            if (!localITvServiceServerCommon.GetCurrentInputSource().equals(EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_STORAGE)) {
              break;
            }
            if (LauncherActivity.this.minidatabase != null) {
              break label275;
            }
            j = 0;
            if ((j < 0) || (j > EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_NONE.ordinal())) {
              break;
            }
            localITvServiceServerCommon.SetInputSource(EN_INPUT_SOURCE_TYPE.values()[j]);
            if (EN_INPUT_SOURCE_TYPE.values()[j] != EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_ATV) {
              break label290;
            }
            k = localITvServiceServer.getChannelManager().getCurrentChannelNumber();
            if ((k < 0) || (k > 255)) {
              break label361;
            }
            localITvServiceServer.getChannelManager().programSel(k, EN_MEMBER_SERVICE_TYPE.E_SERVICETYPE_ATV);
          }
          catch (RemoteException localRemoteException1)
          {
            localRemoteException1.printStackTrace();
          }
          break;
          label275:
          int j = LauncherActivity.this.minidatabase.queryCurInputSrc();
          continue;
          label290:
          if (EN_INPUT_SOURCE_TYPE.values()[j] != EN_INPUT_SOURCE_TYPE.E_INPUT_SOURCE_DTV) {
            break;
          }
          localITvServiceServer.getChannelManager().changeToFirstService(EN_FIRST_SERVICE_INPUT_TYPE.E_FIRST_SERVICE_DTV, EN_FIRST_SERVICE_TYPE.E_DEFAULT);
          break;
          try
          {
            label324:
            localITvServiceServerCommon.SetInputSource(localEN_INPUT_SOURCE_TYPE);
          }
          catch (RemoteException localRemoteException2)
          {
            localRemoteException2.printStackTrace();
          }
        }
        break;
        label345:
        if (i != 1) {
          break label104;
        }
        LauncherActivity.this.setFullscale();
        break label104;
        label361:
        int k = 0;
      }
    }

2 个答案:

答案 0 :(得分:2)

我是否必须手动重构代码? 即可。
您可以做的唯一事情(在Eclipse中)是在选定的标签上按ALT + R并更改它的所有出现次数。

答案 1 :(得分:2)

由于流程的工作原理,反编译不是100%完整/准确,我建议您阅读:http://en.wikipedia.org/wiki/Decompiler以了解有关流程的更多信息。

虽然在Java等虚拟机上这是相当准确的,因为它的字节码包含大量的元数据。这就是为什么你得到一个“好”的结果。

无论如何,你将不得不进行大量的手动重构。

请记住您正在做的事情的合法性,检查许可和版权。