Skip to content

Commit bb6db25

Browse files
committed
fix(gui): apply log level as early as possible
1 parent d0c4968 commit bb6db25

File tree

9 files changed

+77
-59
lines changed

9 files changed

+77
-59
lines changed

jadx-cli/src/main/java/jadx/cli/JCommanderWrapper.java

+26-19
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import jadx.core.utils.Utils;
2828
import jadx.plugins.tools.JadxExternalPluginsLoader;
2929

30-
public class JCommanderWrapper<T> {
30+
public class JCommanderWrapper {
3131
private final JCommander jc;
3232
private final JadxCLIArgs argsObj;
3333

@@ -42,6 +42,7 @@ public JCommanderWrapper(JadxCLIArgs argsObj) {
4242
public boolean parse(String[] args) {
4343
try {
4444
jc.parse(args);
45+
applyFiles(argsObj);
4546
return true;
4647
} catch (ParameterException e) {
4748
System.err.println("Arguments parse error: " + e.getMessage());
@@ -50,6 +51,15 @@ public boolean parse(String[] args) {
5051
}
5152
}
5253

54+
public void overrideProvided(JadxCLIArgs obj) {
55+
applyFiles(obj);
56+
for (ParameterDescription parameter : jc.getParameters()) {
57+
if (parameter.isAssigned()) {
58+
overrideProperty(obj, parameter);
59+
}
60+
}
61+
}
62+
5363
public boolean processCommands() {
5464
String parsedCommand = jc.getParsedCommand();
5565
if (parsedCommand == null) {
@@ -58,20 +68,21 @@ public boolean processCommands() {
5868
return JadxCLICommands.process(this, jc, parsedCommand);
5969
}
6070

61-
public void overrideProvided(JadxCLIArgs obj) {
62-
List<ParameterDescription> fieldsParams = jc.getParameters();
63-
List<ParameterDescription> parameters = new ArrayList<>(1 + fieldsParams.size());
64-
parameters.add(jc.getMainParameterValue());
65-
parameters.addAll(fieldsParams);
66-
for (ParameterDescription parameter : parameters) {
67-
if (parameter.isAssigned()) {
68-
// copy assigned field value to obj
69-
Parameterized parameterized = parameter.getParameterized();
70-
Object providedValue = parameterized.get(parameter.getObject());
71-
Object newValue = mergeValues(parameterized.getType(), providedValue, () -> parameterized.get(obj));
72-
parameterized.set(obj, newValue);
73-
}
74-
}
71+
/**
72+
* The main parameter parsing doesn't work if accepting unknown options
73+
*/
74+
private void applyFiles(JadxCLIArgs argsObj) {
75+
argsObj.setFiles(jc.getUnknownOptions());
76+
}
77+
78+
/**
79+
* Override assigned field value to obj
80+
*/
81+
private static void overrideProperty(JadxCLIArgs obj, ParameterDescription parameter) {
82+
Parameterized parameterized = parameter.getParameterized();
83+
Object providedValue = parameterized.get(parameter.getObject());
84+
Object newValue = mergeValues(parameterized.getType(), providedValue, () -> parameterized.get(obj));
85+
parameterized.set(obj, newValue);
7586
}
7687

7788
@SuppressWarnings({ "rawtypes", "unchecked" })
@@ -85,10 +96,6 @@ private static Object mergeValues(Class<?> type, Object value, Supplier<Object>
8596
return value;
8697
}
8798

88-
public List<String> getUnknownOptions() {
89-
return jc.getUnknownOptions();
90-
}
91-
9299
public void printUsage() {
93100
LogHelper.setLogLevel(LogHelper.LogLevelEnum.ERROR); // mute logger while printing help
94101

jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java

+7-22
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package jadx.cli;
22

33
import java.nio.file.Path;
4-
import java.util.ArrayList;
54
import java.util.Arrays;
65
import java.util.EnumSet;
76
import java.util.HashMap;
@@ -36,7 +35,7 @@
3635
public class JadxCLIArgs {
3736

3837
@Parameter(description = "<input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab, .xapk, .apkm, .jadx.kts)")
39-
protected List<String> files = new ArrayList<>(1);
38+
protected List<String> files;
4039

4140
@Parameter(names = { "-d", "--output-dir" }, description = "output directory")
4241
protected String outDir;
@@ -283,29 +282,11 @@ public class JadxCLIArgs {
283282
protected Map<String, String> pluginOptions = new HashMap<>();
284283

285284
public boolean processArgs(String[] args) {
286-
JCommanderWrapper<JadxCLIArgs> jcw = new JCommanderWrapper<>(this);
285+
JCommanderWrapper jcw = new JCommanderWrapper(this);
287286
return jcw.parse(args) && process(jcw);
288287
}
289288

290-
/**
291-
* Set values only for options provided in cmd.
292-
* Used to merge saved options and options passed in command line.
293-
*/
294-
public boolean overrideProvided(String[] args) {
295-
JCommanderWrapper<JadxCLIArgs> jcw = new JCommanderWrapper<>(newInstance());
296-
if (!jcw.parse(args)) {
297-
return false;
298-
}
299-
jcw.overrideProvided(this);
300-
return process(jcw);
301-
}
302-
303-
protected JadxCLIArgs newInstance() {
304-
return new JadxCLIArgs();
305-
}
306-
307-
private boolean process(JCommanderWrapper<JadxCLIArgs> jcw) {
308-
files.addAll(jcw.getUnknownOptions());
289+
public boolean process(JCommanderWrapper jcw) {
309290
if (jcw.processCommands()) {
310291
return false;
311292
}
@@ -388,6 +369,10 @@ public List<String> getFiles() {
388369
return files;
389370
}
390371

372+
public void setFiles(List<String> files) {
373+
this.files = files;
374+
}
375+
391376
public String getOutDir() {
392377
return outDir;
393378
}

jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void append(JCommander.Builder builder) {
2424
COMMANDS_MAP.forEach(builder::addCommand);
2525
}
2626

27-
public static boolean process(JCommanderWrapper<?> jcw, JCommander jc, String parsedCommand) {
27+
public static boolean process(JCommanderWrapper jcw, JCommander jc, String parsedCommand) {
2828
ICommand command = COMMANDS_MAP.get(parsedCommand);
2929
if (command == null) {
3030
throw new JadxArgsValidateException("Unknown command: " + parsedCommand

jadx-cli/src/main/java/jadx/cli/commands/CommandPlugins.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public String name() {
6565

6666
@SuppressWarnings("UnnecessaryReturnStatement")
6767
@Override
68-
public void process(JCommanderWrapper<?> jcw, JCommander subCommander) {
68+
public void process(JCommanderWrapper jcw, JCommander subCommander) {
6969
if (printHelp) {
7070
jcw.printUsage(subCommander);
7171
return;

jadx-cli/src/main/java/jadx/cli/commands/ICommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
public interface ICommand {
88
String name();
99

10-
void process(JCommanderWrapper<?> jcw, JCommander subCommander);
10+
void process(JCommanderWrapper jcw, JCommander subCommander);
1111
}

jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,16 @@ private JadxCLIArgs parse(JadxCLIArgs jadxArgs, String... args) {
9393
}
9494

9595
private JadxCLIArgs override(JadxCLIArgs jadxArgs, String... args) {
96-
return check(jadxArgs, jadxArgs.overrideProvided(args));
96+
return check(jadxArgs, overrideProvided(jadxArgs, args));
97+
}
98+
99+
private static boolean overrideProvided(JadxCLIArgs jadxArgs, String[] args) {
100+
JCommanderWrapper jcw = new JCommanderWrapper(new JadxCLIArgs());
101+
if (!jcw.parse(args)) {
102+
return false;
103+
}
104+
jcw.overrideProvided(jadxArgs);
105+
return jadxArgs.process(jcw);
97106
}
98107

99108
private static JadxCLIArgs check(JadxCLIArgs jadxArgs, boolean res) {

jadx-commons/jadx-app-commons/src/main/java/jadx/commons/app/JadxCommonFiles.java

+17-3
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import java.util.function.Function;
77

88
import org.jetbrains.annotations.Nullable;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
911

1012
import dev.dirs.ProjectDirectories;
1113
import dev.dirs.impl.Windows;
1214
import dev.dirs.impl.WindowsPowerShell;
1315
import dev.dirs.jni.WindowsJni;
1416

1517
public class JadxCommonFiles {
18+
private static final Logger LOG = LoggerFactory.getLogger(JadxCommonFiles.class);
1619

1720
private static final Path CONFIG_DIR;
1821
private static final Path CACHE_DIR;
@@ -60,10 +63,21 @@ private Path loadEnvDir(String envVar, Function<ProjectDirectories, String> dirF
6063
}
6164

6265
private synchronized ProjectDirectories loadDirs() {
63-
if (dirs == null) {
64-
dirs = ProjectDirectories.from("io.github", "skylot", "jadx", DirsLoader::getWinDirs);
66+
ProjectDirectories currentDirs = dirs;
67+
if (currentDirs != null) {
68+
return currentDirs;
6569
}
66-
return dirs;
70+
LOG.debug("Loading system dirs ...");
71+
long start = System.currentTimeMillis();
72+
73+
ProjectDirectories loadedDirs = ProjectDirectories.from("io.github", "skylot", "jadx", DirsLoader::getWinDirs);
74+
75+
if (LOG.isDebugEnabled()) {
76+
LOG.debug("Loaded system dirs ({}ms): config: {}, cache: {}",
77+
System.currentTimeMillis() - start, loadedDirs.configDir, loadedDirs.cacheDir);
78+
}
79+
dirs = loadedDirs;
80+
return loadedDirs;
6781
}
6882

6983
/**

jadx-gui/src/main/java/jadx/gui/JadxGUI.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
99

10+
import jadx.cli.JCommanderWrapper;
1011
import jadx.cli.LogHelper;
1112
import jadx.core.utils.files.FileUtils;
1213
import jadx.gui.logs.LogCollector;
@@ -23,17 +24,20 @@ public class JadxGUI {
2324

2425
public static void main(String[] args) {
2526
try {
26-
LogCollector.register();
27-
JadxSettings settings = JadxSettingsAdapter.load();
28-
settings.setLogLevel(LogHelper.LogLevelEnum.INFO);
29-
// overwrite loaded settings by command line arguments
30-
if (!settings.overrideProvided(args)) {
27+
JadxSettings cliArgs = new JadxSettings();
28+
JCommanderWrapper jcw = new JCommanderWrapper(cliArgs);
29+
if (!jcw.parse(args) || !cliArgs.process(jcw)) {
3130
return;
3231
}
33-
LogHelper.initLogLevel(settings);
32+
LogHelper.initLogLevel(cliArgs);
3433
LogHelper.setLogLevelsForDecompileStage();
34+
LogCollector.register();
3535
printSystemInfo();
3636

37+
JadxSettings settings = JadxSettingsAdapter.load();
38+
// overwrite loaded settings by command line arguments
39+
jcw.overrideProvided(settings);
40+
3741
LafManager.init(settings);
3842
NLS.setLocale(settings.getLangLocale());
3943
ExceptionDialog.registerUncaughtExceptionHandler();

jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ public static JadxSettings makeDefault() {
154154
return jadxSettings;
155155
}
156156

157+
public JadxSettings() {
158+
this.logLevel = LogHelper.LogLevelEnum.INFO;
159+
}
160+
157161
public void sync() {
158162
JadxSettingsAdapter.store(this);
159163
}
@@ -868,9 +872,4 @@ private void migrateUseSourceNameAsClassNameAlias() {
868872
useSourceNameAsClassNameAlias = UseSourceNameAsClassNameAlias.create(deobfuscationUseSourceNameAsAlias);
869873
}
870874
}
871-
872-
@Override
873-
protected JadxCLIArgs newInstance() {
874-
return new JadxSettings();
875-
}
876875
}

0 commit comments

Comments
 (0)