From 357706b070c2e7d5290c022db7926d646fe90a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Greg=C3=B3rio?= <5866363+NASGregorio@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:18:51 +0100 Subject: [PATCH] feat: allow to include/exclude dependencies when saving with class filter (#1466)(PR #1467) * feat: Add option to include/exclude dependencies when saving * fix save skip for class depencencies Co-authored-by: Skylot --- jadx-core/src/main/java/jadx/api/JadxArgs.java | 14 ++++++++++++++ .../src/main/java/jadx/api/JadxDecompiler.java | 8 ++++++-- .../src/main/java/jadx/core/ProcessClass.java | 4 ++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JadxArgs.java b/jadx-core/src/main/java/jadx/api/JadxArgs.java index 1278681d3..a058a351a 100644 --- a/jadx-core/src/main/java/jadx/api/JadxArgs.java +++ b/jadx-core/src/main/java/jadx/api/JadxArgs.java @@ -55,6 +55,11 @@ public class JadxArgs { */ private Predicate classFilter = null; + /** + * Save dependencies for classes accepted by {@code classFilter} + */ + private boolean includeDependencies = false; + private boolean deobfuscationOn = false; private boolean useSourceNameAsClassAlias = false; private boolean parseKotlinMetadata = false; @@ -261,6 +266,14 @@ public class JadxArgs { this.skipSources = skipSources; } + public void setIncludeDependencies(boolean includeDependencies) { + this.includeDependencies = includeDependencies; + } + + public boolean isIncludeDependencies() { + return includeDependencies; + } + public Predicate getClassFilter() { return classFilter; } @@ -513,6 +526,7 @@ public class JadxArgs { + ", useImports=" + useImports + ", skipResources=" + skipResources + ", skipSources=" + skipSources + + ", includeDependencies=" + includeDependencies + ", deobfuscationOn=" + deobfuscationOn + ", deobfuscationMapFile=" + deobfuscationMapFile + ", deobfuscationMapFileMode=" + deobfuscationMapFileMode diff --git a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java index 8fb8a1003..688fcca1c 100644 --- a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java +++ b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java @@ -331,10 +331,14 @@ public final class JadxDecompiler implements Closeable { List classes = getClasses(); List processQueue = new ArrayList<>(classes.size()); for (JavaClass cls : classes) { - if (cls.getClassNode().contains(AFlag.DONT_GENERATE)) { + ClassNode clsNode = cls.getClassNode(); + if (clsNode.contains(AFlag.DONT_GENERATE)) { continue; } - if (classFilter != null && !classFilter.test(cls.getFullName())) { + if (classFilter != null && !classFilter.test(clsNode.getClassInfo().getFullName())) { + if (!args.isIncludeDependencies()) { + clsNode.add(AFlag.DONT_GENERATE); + } continue; } processQueue.add(cls); diff --git a/jadx-core/src/main/java/jadx/core/ProcessClass.java b/jadx-core/src/main/java/jadx/core/ProcessClass.java index f2fe8e386..762f19a76 100644 --- a/jadx-core/src/main/java/jadx/core/ProcessClass.java +++ b/jadx-core/src/main/java/jadx/core/ProcessClass.java @@ -99,6 +99,10 @@ public class ProcessClass { return generateCode(topParentClass); } try { + if (cls.contains(AFlag.DONT_GENERATE)) { + process(cls, false); + return ICodeInfo.EMPTY; + } for (ClassNode depCls : cls.getDependencies()) { process(depCls, false); }