繁体   English   中英

理解反编译的Java代码

[英]understanding with decompiled java code

这是我第一次将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;
      }
    }

我需要手动重构代码吗? 是的
您唯一可以做的(在Eclipse中)是在所选标签上按ALT + R,然后更改所有出现的标签。

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

尽管在某些虚拟机(如Java)上,它的准确性很高,因为其字节码包含大量的元数据。 这就是为什么您获得“不错”的结果的原因。

无论如何,您将不得不做很多手动重构。

并记住您所做操作的合法性,请检查许可证和版权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM