From bb0fad28349a655b4806c903413192cb6b39b719 Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 17 Jan 2020 16:30:40 +0300 Subject: [PATCH] fix: resolve multi-threaded unloading --- jadx-core/src/main/java/jadx/api/JavaClass.java | 2 +- .../src/main/java/jadx/core/dex/nodes/ClassNode.java | 10 +++++++++- jadx-gui/src/main/java/jadx/gui/ui/RenameDialog.java | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index 8227771da..84470e89d 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -59,7 +59,7 @@ public final class JavaClass implements JavaNode { public synchronized void refresh() { listsLoaded = false; - cls.reloadCode(); + cls.reRunDecompile(); } public synchronized String getSmali() { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index ab81f0cfd..51e6cc486 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -279,13 +279,21 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { return decompile(true); } + public synchronized ICodeInfo reRunDecompile() { + return decompile(false); + } + public synchronized ICodeInfo reloadCode() { unload(); deepUnload(); return decompile(false); } - private void deepUnload() { + public void deepUnload() { + if (cls == null) { + // manually added class + return; + } clearAttributes(); root().getConstValues().removeForClass(this); initialLoad(); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/RenameDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/RenameDialog.java index c1703bed1..b6d169ac6 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/RenameDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/RenameDialog.java @@ -222,6 +222,10 @@ public class RenameDialog extends JDialog { refreshTabs(mainWindow.getTabbedPane(), updatedClasses); if (updatedClasses.size() > 0) { + for (JavaClass updatedClass : updatedClasses) { + updatedClass.unload(); + updatedClass.getClassNode().deepUnload(); + } setRefreshTask(updatedClasses); }