diff --git a/jadx-cli/src/main/java/jadx/cli/JCommanderWrapper.java b/jadx-cli/src/main/java/jadx/cli/JCommanderWrapper.java index 04114f5d1..58c50d093 100644 --- a/jadx-cli/src/main/java/jadx/cli/JCommanderWrapper.java +++ b/jadx-cli/src/main/java/jadx/cli/JCommanderWrapper.java @@ -27,7 +27,7 @@ import jadx.core.plugins.PluginContext; import jadx.core.utils.Utils; import jadx.plugins.tools.JadxExternalPluginsLoader; -public class JCommanderWrapper { +public class JCommanderWrapper { private final JCommander jc; private final JadxCLIArgs argsObj; @@ -42,6 +42,7 @@ public class JCommanderWrapper { public boolean parse(String[] args) { try { jc.parse(args); + applyFiles(argsObj); return true; } catch (ParameterException e) { System.err.println("Arguments parse error: " + e.getMessage()); @@ -50,6 +51,15 @@ public class JCommanderWrapper { } } + public void overrideProvided(JadxCLIArgs obj) { + applyFiles(obj); + for (ParameterDescription parameter : jc.getParameters()) { + if (parameter.isAssigned()) { + overrideProperty(obj, parameter); + } + } + } + public boolean processCommands() { String parsedCommand = jc.getParsedCommand(); if (parsedCommand == null) { @@ -58,20 +68,21 @@ public class JCommanderWrapper { return JadxCLICommands.process(this, jc, parsedCommand); } - public void overrideProvided(JadxCLIArgs obj) { - List fieldsParams = jc.getParameters(); - List parameters = new ArrayList<>(1 + fieldsParams.size()); - parameters.add(jc.getMainParameterValue()); - parameters.addAll(fieldsParams); - for (ParameterDescription parameter : parameters) { - if (parameter.isAssigned()) { - // copy assigned field value to obj - Parameterized parameterized = parameter.getParameterized(); - Object providedValue = parameterized.get(parameter.getObject()); - Object newValue = mergeValues(parameterized.getType(), providedValue, () -> parameterized.get(obj)); - parameterized.set(obj, newValue); - } - } + /** + * The main parameter parsing doesn't work if accepting unknown options + */ + private void applyFiles(JadxCLIArgs argsObj) { + argsObj.setFiles(jc.getUnknownOptions()); + } + + /** + * Override assigned field value to obj + */ + private static void overrideProperty(JadxCLIArgs obj, ParameterDescription parameter) { + Parameterized parameterized = parameter.getParameterized(); + Object providedValue = parameterized.get(parameter.getObject()); + Object newValue = mergeValues(parameterized.getType(), providedValue, () -> parameterized.get(obj)); + parameterized.set(obj, newValue); } @SuppressWarnings({ "rawtypes", "unchecked" }) @@ -85,10 +96,6 @@ public class JCommanderWrapper { return value; } - public List getUnknownOptions() { - return jc.getUnknownOptions(); - } - public void printUsage() { LogHelper.setLogLevel(LogHelper.LogLevelEnum.ERROR); // mute logger while printing help diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java index b08e1f71b..e1bc03a1e 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java @@ -1,7 +1,6 @@ package jadx.cli; import java.nio.file.Path; -import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; import java.util.HashMap; @@ -36,7 +35,7 @@ import jadx.core.utils.files.FileUtils; public class JadxCLIArgs { @Parameter(description = " (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab, .xapk, .apkm, .jadx.kts)") - protected List files = new ArrayList<>(1); + protected List files; @Parameter(names = { "-d", "--output-dir" }, description = "output directory") protected String outDir; @@ -283,29 +282,11 @@ public class JadxCLIArgs { protected Map pluginOptions = new HashMap<>(); public boolean processArgs(String[] args) { - JCommanderWrapper jcw = new JCommanderWrapper<>(this); + JCommanderWrapper jcw = new JCommanderWrapper(this); return jcw.parse(args) && process(jcw); } - /** - * Set values only for options provided in cmd. - * Used to merge saved options and options passed in command line. - */ - public boolean overrideProvided(String[] args) { - JCommanderWrapper jcw = new JCommanderWrapper<>(newInstance()); - if (!jcw.parse(args)) { - return false; - } - jcw.overrideProvided(this); - return process(jcw); - } - - protected JadxCLIArgs newInstance() { - return new JadxCLIArgs(); - } - - private boolean process(JCommanderWrapper jcw) { - files.addAll(jcw.getUnknownOptions()); + public boolean process(JCommanderWrapper jcw) { if (jcw.processCommands()) { return false; } @@ -388,6 +369,10 @@ public class JadxCLIArgs { return files; } + public void setFiles(List files) { + this.files = files; + } + public String getOutDir() { return outDir; } diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java b/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java index fface7016..210fd8bc8 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java @@ -24,7 +24,7 @@ public class JadxCLICommands { COMMANDS_MAP.forEach(builder::addCommand); } - public static boolean process(JCommanderWrapper jcw, JCommander jc, String parsedCommand) { + public static boolean process(JCommanderWrapper jcw, JCommander jc, String parsedCommand) { ICommand command = COMMANDS_MAP.get(parsedCommand); if (command == null) { throw new JadxArgsValidateException("Unknown command: " + parsedCommand diff --git a/jadx-cli/src/main/java/jadx/cli/commands/CommandPlugins.java b/jadx-cli/src/main/java/jadx/cli/commands/CommandPlugins.java index f388579c8..33d7d37d0 100644 --- a/jadx-cli/src/main/java/jadx/cli/commands/CommandPlugins.java +++ b/jadx-cli/src/main/java/jadx/cli/commands/CommandPlugins.java @@ -65,7 +65,7 @@ public class CommandPlugins implements ICommand { @SuppressWarnings("UnnecessaryReturnStatement") @Override - public void process(JCommanderWrapper jcw, JCommander subCommander) { + public void process(JCommanderWrapper jcw, JCommander subCommander) { if (printHelp) { jcw.printUsage(subCommander); return; diff --git a/jadx-cli/src/main/java/jadx/cli/commands/ICommand.java b/jadx-cli/src/main/java/jadx/cli/commands/ICommand.java index 3cfd0f273..0c8a3392c 100644 --- a/jadx-cli/src/main/java/jadx/cli/commands/ICommand.java +++ b/jadx-cli/src/main/java/jadx/cli/commands/ICommand.java @@ -7,5 +7,5 @@ import jadx.cli.JCommanderWrapper; public interface ICommand { String name(); - void process(JCommanderWrapper jcw, JCommander subCommander); + void process(JCommanderWrapper jcw, JCommander subCommander); } diff --git a/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java b/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java index 8de22c50d..120947790 100644 --- a/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java +++ b/jadx-cli/src/test/java/jadx/cli/JadxCLIArgsTest.java @@ -93,7 +93,16 @@ public class JadxCLIArgsTest { } private JadxCLIArgs override(JadxCLIArgs jadxArgs, String... args) { - return check(jadxArgs, jadxArgs.overrideProvided(args)); + return check(jadxArgs, overrideProvided(jadxArgs, args)); + } + + private static boolean overrideProvided(JadxCLIArgs jadxArgs, String[] args) { + JCommanderWrapper jcw = new JCommanderWrapper(new JadxCLIArgs()); + if (!jcw.parse(args)) { + return false; + } + jcw.overrideProvided(jadxArgs); + return jadxArgs.process(jcw); } private static JadxCLIArgs check(JadxCLIArgs jadxArgs, boolean res) { diff --git a/jadx-commons/jadx-app-commons/src/main/java/jadx/commons/app/JadxCommonFiles.java b/jadx-commons/jadx-app-commons/src/main/java/jadx/commons/app/JadxCommonFiles.java index 6ef21d44e..d49c37c5a 100644 --- a/jadx-commons/jadx-app-commons/src/main/java/jadx/commons/app/JadxCommonFiles.java +++ b/jadx-commons/jadx-app-commons/src/main/java/jadx/commons/app/JadxCommonFiles.java @@ -6,6 +6,8 @@ import java.nio.file.Path; import java.util.function.Function; import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import dev.dirs.ProjectDirectories; import dev.dirs.impl.Windows; @@ -13,6 +15,7 @@ import dev.dirs.impl.WindowsPowerShell; import dev.dirs.jni.WindowsJni; public class JadxCommonFiles { + private static final Logger LOG = LoggerFactory.getLogger(JadxCommonFiles.class); private static final Path CONFIG_DIR; private static final Path CACHE_DIR; @@ -60,10 +63,21 @@ public class JadxCommonFiles { } private synchronized ProjectDirectories loadDirs() { - if (dirs == null) { - dirs = ProjectDirectories.from("io.github", "skylot", "jadx", DirsLoader::getWinDirs); + ProjectDirectories currentDirs = dirs; + if (currentDirs != null) { + return currentDirs; } - return dirs; + LOG.debug("Loading system dirs ..."); + long start = System.currentTimeMillis(); + + ProjectDirectories loadedDirs = ProjectDirectories.from("io.github", "skylot", "jadx", DirsLoader::getWinDirs); + + if (LOG.isDebugEnabled()) { + LOG.debug("Loaded system dirs ({}ms): config: {}, cache: {}", + System.currentTimeMillis() - start, loadedDirs.configDir, loadedDirs.cacheDir); + } + dirs = loadedDirs; + return loadedDirs; } /** diff --git a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java index bb702cd63..421fe605f 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java @@ -7,6 +7,7 @@ import javax.swing.SwingUtilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jadx.cli.JCommanderWrapper; import jadx.cli.LogHelper; import jadx.core.utils.files.FileUtils; import jadx.gui.logs.LogCollector; @@ -23,17 +24,20 @@ public class JadxGUI { public static void main(String[] args) { try { - LogCollector.register(); - JadxSettings settings = JadxSettingsAdapter.load(); - settings.setLogLevel(LogHelper.LogLevelEnum.INFO); - // overwrite loaded settings by command line arguments - if (!settings.overrideProvided(args)) { + JadxSettings cliArgs = new JadxSettings(); + JCommanderWrapper jcw = new JCommanderWrapper(cliArgs); + if (!jcw.parse(args) || !cliArgs.process(jcw)) { return; } - LogHelper.initLogLevel(settings); + LogHelper.initLogLevel(cliArgs); LogHelper.setLogLevelsForDecompileStage(); + LogCollector.register(); printSystemInfo(); + JadxSettings settings = JadxSettingsAdapter.load(); + // overwrite loaded settings by command line arguments + jcw.overrideProvided(settings); + LafManager.init(settings); NLS.setLocale(settings.getLangLocale()); ExceptionDialog.registerUncaughtExceptionHandler(); diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java index 414bd0d4d..f16465f0a 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java @@ -154,6 +154,10 @@ public class JadxSettings extends JadxCLIArgs { return jadxSettings; } + public JadxSettings() { + this.logLevel = LogHelper.LogLevelEnum.INFO; + } + public void sync() { JadxSettingsAdapter.store(this); } @@ -868,9 +872,4 @@ public class JadxSettings extends JadxCLIArgs { useSourceNameAsClassNameAlias = UseSourceNameAsClassNameAlias.create(deobfuscationUseSourceNameAsAlias); } } - - @Override - protected JadxCLIArgs newInstance() { - return new JadxSettings(); - } }