提交 c95d6490 编写于 作者: S Skylot

feat(cli): add decompilation progress

上级 a5b2b043
...@@ -42,7 +42,14 @@ public class JadxCLI { ...@@ -42,7 +42,14 @@ public class JadxCLI {
jadxArgs.setCodeWriterProvider(SimpleCodeWriter::new); jadxArgs.setCodeWriterProvider(SimpleCodeWriter::new);
try (JadxDecompiler jadx = new JadxDecompiler(jadxArgs)) { try (JadxDecompiler jadx = new JadxDecompiler(jadxArgs)) {
jadx.load(); jadx.load();
if (LogHelper.getLogLevel() == LogHelper.LogLevelEnum.QUIET) {
jadx.save(); 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(); int errorsCount = jadx.getErrorsCount();
if (errorsCount != 0) { if (errorsCount != 0) {
jadx.printErrorsReport(); jadx.printErrorsReport();
......
package jadx.cli; package jadx.cli;
import org.jetbrains.annotations.Nullable;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.beust.jcommander.IStringConverter; import com.beust.jcommander.IStringConverter;
...@@ -31,6 +32,8 @@ public class LogHelper { ...@@ -31,6 +32,8 @@ public class LogHelper {
} }
} }
private static LogLevelEnum logLevelValue;
public static void setLogLevelFromArgs(JadxCLIArgs args) { public static void setLogLevelFromArgs(JadxCLIArgs args) {
if (isCustomLogConfig()) { if (isCustomLogConfig()) {
return; return;
...@@ -46,6 +49,8 @@ public class LogHelper { ...@@ -46,6 +49,8 @@ public class LogHelper {
} }
public static void applyLogLevel(LogLevelEnum logLevel) { public static void applyLogLevel(LogLevelEnum logLevel) {
logLevelValue = logLevel;
Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(logLevel.getLevel()); rootLogger.setLevel(logLevel.getLevel());
...@@ -56,6 +61,11 @@ public class LogHelper { ...@@ -56,6 +61,11 @@ public class LogHelper {
} }
} }
@Nullable
public static LogLevelEnum getLogLevel() {
return logLevelValue;
}
private static void setLevelForClass(Class<?> cls, Level level) { private static void setLevelForClass(Class<?> cls, Level level) {
((Logger) LoggerFactory.getLogger(cls)).setLevel(level); ((Logger) LoggerFactory.getLogger(cls)).setLevel(level);
} }
......
...@@ -15,6 +15,7 @@ import java.util.Set; ...@@ -15,6 +15,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -162,6 +163,27 @@ public final class JadxDecompiler implements Closeable { ...@@ -162,6 +163,27 @@ public final class JadxDecompiler implements Closeable {
save(!args.isSkipSources(), !args.isSkipResources()); 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() { public void saveSources() {
save(true, false); save(true, false);
} }
......
...@@ -6,7 +6,6 @@ import java.util.ArrayList; ...@@ -6,7 +6,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.swing.ProgressMonitor; import javax.swing.ProgressMonitor;
...@@ -66,24 +65,12 @@ public class JadxWrapper { ...@@ -66,24 +65,12 @@ public class JadxWrapper {
public void saveAll(File dir, ProgressMonitor progressMonitor) { public void saveAll(File dir, ProgressMonitor progressMonitor) {
Runnable save = () -> { Runnable save = () -> {
try {
decompiler.getArgs().setRootDir(dir); decompiler.getArgs().setRootDir(dir);
ThreadPoolExecutor ex = (ThreadPoolExecutor) decompiler.getSaveExecutor(); decompiler.save(500, (done, total) -> progressMonitor.setProgress((int) (done * 100.0 / total)));
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(); progressMonitor.close();
LOG.info("decompilation complete, freeing memory ..."); LOG.info("decompilation complete, freeing memory ...");
decompiler.getClasses().forEach(JavaClass::unload); decompiler.getClasses().forEach(JavaClass::unload);
LOG.info("done"); LOG.info("done");
} catch (InterruptedException e) {
LOG.error("Save interrupted", e);
Thread.currentThread().interrupt();
}
}; };
new Thread(save).start(); new Thread(save).start();
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册