Class DecompilerExporter

java.lang.Object
com.pnfsoftware.jeb.core.units.code.DecompilerExporter
Direct Known Subclasses:
DexDecompilerExporter, NativeDecompilerExporter

public abstract class DecompilerExporter extends Object
Helper class used to decompile and export to source files all or a subset of classes or methods of a code unit.

Example: export all top-level items to an output folder:

 IDecompilerUnit decomp = ...; // retrieved from the current IRuntimeProject
 File outdir = ...;
 DecompilerExporter exp = decomp.getExporter();
 exp.setOutputFolder(outdir, false);
 exp.setMethodTimeout(60_000L);  // safety
 exp.setTotalTimeout(15 * 60_000L);  // safety
 exp.setCallback(new ProgressCallbackAdapter() {
     @Override
     public void message(String msg) {
         System.out.println(msg);
     }
 });
 boolean success = exp.process();
 System.out.println("Errors: " + exp.getErrors());
 
  • Field Details

    • logger

      protected static final ILogger logger
    • decomp

      protected IDecompilerUnit decomp
    • outputFolder

      protected File outputFolder
    • headerString

      protected String headerString
    • pattern

      protected Pattern pattern
    • methodTimeoutMs

      protected long methodTimeoutMs
    • totalTimeoutMs

      protected long totalTimeoutMs
    • callback

      protected IProgressCallback callback
    • discardDecompiledItemsAfterProcessing

      protected boolean discardDecompiledItemsAfterProcessing
    • usesCustomDecompWriter

      protected boolean usesCustomDecompWriter
    • writeCount

      protected AtomicInteger writeCount
    • writeErrorCount

      protected AtomicInteger writeErrorCount
    • errormap

      protected Map<String,String> errormap
  • Constructor Details

    • DecompilerExporter

      public DecompilerExporter(IDecompilerUnit decompiler)
      Create an exporter with default settings.
      Parameters:
      decompiler - a decompiler
  • Method Details

    • reset

      protected void reset()
    • getDecompiler

      public IDecompilerUnit getDecompiler()
    • setOutputFolder

      public void setOutputFolder(File folder) throws IOException
      Throws:
      IOException
    • setOutputFolder

      public void setOutputFolder(File folder, Boolean discardDecompiledItemsAfterProcessing) throws IOException
      Set an optional output folder. If the folder exists and contents is already present, it will NOT be removed.
      Parameters:
      folder -
      discardDecompiledItemsAfterProcessing - optional; if non-null, also update setDiscardDecompiledItemsAfterProcessing(boolean)
      Throws:
      IOException - if some error occurred when creating the output folder
    • getOutputFolder

      public File getOutputFolder()
    • setHeaderString

      public void setHeaderString(String s)
      Set an optional single-line header string, prepended to all decompiled classes. The default header string is: Decompiled by JEB v[VERSION]
      Parameters:
      s -
    • getHeaderString

      public String getHeaderString()
    • setSignaturePattern

      public void setSignaturePattern(Pattern pattern)
      Set an optional matcher for classes or methods to be decompiled.
      Parameters:
      pattern - a regex pattern
    • getSignaturePattern

      public Pattern getSignaturePattern()
    • setMethodTimeout

      public void setMethodTimeout(long methodTimeoutMs)
      Set an optional timeout for method decompilation.
      Parameters:
      methodTimeoutMs -
    • getMethodTimeout

      public long getMethodTimeout()
    • setTotalTimeout

      public void setTotalTimeout(long totalTimeoutMs)
      Set an optional timeout for the entire decompilation process.
      Parameters:
      totalTimeoutMs -
    • getTotalTimeout

      public long getTotalTimeout()
    • setCallback

      public void setCallback(IProgressCallback callback)
      Set an optional callback to receive progress information on the decompilation.
      Parameters:
      callback -
    • getCallback

      public IProgressCallback getCallback()
    • setDiscardDecompiledItemsAfterProcessing

      public void setDiscardDecompiledItemsAfterProcessing(boolean discardDecompiledItemsAfterProcessing)
      Specify whether decompiled items should be kept or discarded after the decompilation process is complete. Unless you are planning to examine decompiled items later, it is recommended to discard them.
      Parameters:
      discardDecompiledItemsAfterProcessing -
    • isKeepDecompiledItemsAfterProcessing

      public boolean isKeepDecompiledItemsAfterProcessing()
    • export

      public final boolean export()
      A synonym for process().
    • process

      public abstract boolean process()
      Decompile and export all meaningful elements. This is the recommended method to call. Top-level classes and their constituents will be exported; orphaned methods and other items will be exported as well.

      If an output folder was specified, the resulting source files will be stored in a folder hierarchy that matches their namespace or package name.

      Returns:
      true if no error occurred; false if some errors occurred
    • customizeOptions

      protected void customizeOptions(boolean decompilingClasses, DecompilationOptions.Builder optbld)
      Optional method used to customize the options of the decompilation context. The custom implementation may modify or set new options. The default implementation does nothing.
      Parameters:
      decompilingClasses - true if the exporter will decompile classes; false if it will decompile methods
      optbld - the current option builder
    • processTopLevelClasses

      public boolean processTopLevelClasses()
      Decompile and export all top-level classes (i.e., non member classes).

      If an output folder was specified, the resulting source files will be stored in a folder hierarchy that matches their namespace or package name.

      Returns:
      true if no error occurred; false if some errors occurred
    • processMethods

      public boolean processMethods()
      Decompile and export all internal methods. Refer to processTopLevelClasses() to export classes hierarchically.

      If an output folder was specified, the resulting source files will be stored in that folder. No folder hierarchy is created. File names are uniquely derived from method signatures.

      Returns:
      true if no error occurred; false if some errors occurred
    • generateMethodFileName

      protected String generateMethodFileName(String address)
    • writeMethodDecompilation

      protected void writeMethodDecompilation(String addr)
    • generateClassFileName

      protected String generateClassFileName(String address)
    • writeClassDecompilation

      protected void writeClassDecompilation(String addr)
    • getGeneratedFileCount

      public Integer getGeneratedFileCount()
      Retrieve the number of generated source files.
      Returns:
    • getErrors

      public Map<String,String> getErrors()
      Retrieve a map "address -> error string" for all methods that failed the decompilation. Call after process().
      Returns: