Skip to content

Commit

Permalink
feat(cli): add decompilation progress
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Mar 29, 2021
1 parent a5b2b04 commit c95d649
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 20 deletions.
9 changes: 8 additions & 1 deletion jadx-cli/src/main/java/jadx/cli/JadxCLI.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,14 @@ private static int processAndSave(JadxArgs jadxArgs) {
jadxArgs.setCodeWriterProvider(SimpleCodeWriter::new);
try (JadxDecompiler jadx = new JadxDecompiler(jadxArgs)) {
jadx.load();
jadx.save();
if (LogHelper.getLogLevel() == LogHelper.LogLevelEnum.QUIET) {
jadx.save();
} else {
jadx.save(500, (done, total) -> {
int progress = (int) (done * 100.0 / total);
System.out.printf("INFO - progress: %d of %d (%d%%)\r", done, total, progress);
});
}
int errorsCount = jadx.getErrorsCount();
if (errorsCount != 0) {
jadx.printErrorsReport();
Expand Down
10 changes: 10 additions & 0 deletions jadx-cli/src/main/java/jadx/cli/LogHelper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package jadx.cli;

import org.jetbrains.annotations.Nullable;
import org.slf4j.LoggerFactory;

import com.beust.jcommander.IStringConverter;
Expand Down Expand Up @@ -31,6 +32,8 @@ public Level getLevel() {
}
}

private static LogLevelEnum logLevelValue;

public static void setLogLevelFromArgs(JadxCLIArgs args) {
if (isCustomLogConfig()) {
return;
Expand All @@ -46,6 +49,8 @@ public static void setLogLevelFromArgs(JadxCLIArgs args) {
}

public static void applyLogLevel(LogLevelEnum logLevel) {
logLevelValue = logLevel;

Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(logLevel.getLevel());

Expand All @@ -56,6 +61,11 @@ public static void applyLogLevel(LogLevelEnum logLevel) {
}
}

@Nullable
public static LogLevelEnum getLogLevel() {
return logLevelValue;
}

private static void setLevelForClass(Class<?> cls, Level level) {
((Logger) LoggerFactory.getLogger(cls)).setLevel(level);
}
Expand Down
22 changes: 22 additions & 0 deletions jadx-core/src/main/java/jadx/api/JadxDecompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -162,6 +163,27 @@ public void save() {
save(!args.isSkipSources(), !args.isSkipResources());
}

public interface ProgressListener {
void progress(long done, long total);
}

@SuppressWarnings("BusyWait")
public void save(int intervalInMillis, ProgressListener listener) {
ThreadPoolExecutor ex = (ThreadPoolExecutor) getSaveExecutor();
ex.shutdown();
try {
long total = ex.getTaskCount();
while (ex.isTerminating()) {
long done = ex.getCompletedTaskCount();
listener.progress(done, total);
Thread.sleep(intervalInMillis);
}
} catch (InterruptedException e) {
LOG.error("Save interrupted", e);
Thread.currentThread().interrupt();
}
}

public void saveSources() {
save(true, false);
}
Expand Down
25 changes: 6 additions & 19 deletions jadx-gui/src/main/java/jadx/gui/JadxWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors;

import javax.swing.ProgressMonitor;
Expand Down Expand Up @@ -66,24 +65,12 @@ public void close() {

public void saveAll(File dir, ProgressMonitor progressMonitor) {
Runnable save = () -> {
try {
decompiler.getArgs().setRootDir(dir);
ThreadPoolExecutor ex = (ThreadPoolExecutor) decompiler.getSaveExecutor();
ex.shutdown();
while (ex.isTerminating()) {
long total = ex.getTaskCount();
long done = ex.getCompletedTaskCount();
progressMonitor.setProgress((int) (done * 100.0 / total));
Thread.sleep(500);
}
progressMonitor.close();
LOG.info("decompilation complete, freeing memory ...");
decompiler.getClasses().forEach(JavaClass::unload);
LOG.info("done");
} catch (InterruptedException e) {
LOG.error("Save interrupted", e);
Thread.currentThread().interrupt();
}
decompiler.getArgs().setRootDir(dir);
decompiler.save(500, (done, total) -> progressMonitor.setProgress((int) (done * 100.0 / total)));
progressMonitor.close();
LOG.info("decompilation complete, freeing memory ...");
decompiler.getClasses().forEach(JavaClass::unload);
LOG.info("done");
};
new Thread(save).start();
}
Expand Down

0 comments on commit c95d649

Please sign in to comment.