From 4732fa36a602d064ac3f543f2fd09aee43450c25 Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 7 May 2021 14:45:23 +0300 Subject: [PATCH] fix(gui): improve code area performance and line numbers repaint (#1167) --- jadx-core/src/main/java/jadx/api/JavaClass.java | 5 ----- jadx-gui/src/main/java/jadx/gui/JadxWrapper.java | 2 -- .../src/main/java/jadx/gui/treemodel/JClass.java | 12 +++++------- .../main/java/jadx/gui/ui/codearea/CodePanel.java | 3 --- .../main/java/jadx/gui/ui/codearea/LineNumbers.java | 10 +++++----- 5 files changed, 10 insertions(+), 22 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index caa786006..bcea6283f 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -66,11 +66,6 @@ public final class JavaClass implements JavaNode { return cls.getSmali(); } - public synchronized void unload() { - cls.unload(); - listsLoaded = false; - } - /** * Internal API. Not Stable! */ diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index 66216339f..cb21c3b72 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -68,8 +68,6 @@ public class JadxWrapper { decompiler.getArgs().setRootDir(dir); decompiler.save(500, (done, total) -> progressMonitor.setProgress((int) (done * 100.0 / total))); progressMonitor.close(); - LOG.info("decompilation complete, freeing memory ..."); - decompiler.getClasses().forEach(JavaClass::unload); LOG.info("done"); }; new Thread(save).start(); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java index 441358a99..e591c5451 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java @@ -57,11 +57,11 @@ public class JClass extends JLoadableNode { } public synchronized void load() { - if (!loaded) { - cls.decompile(); - cls.unload(); - loaded = true; + if (loaded) { + return; } + cls.decompile(); + loaded = true; update(); } @@ -69,7 +69,6 @@ public class JClass extends JLoadableNode { cls.reload(); loaded = true; update(); - cls.unload(); } public synchronized void update() { @@ -93,8 +92,7 @@ public class JClass extends JLoadableNode { @Override public @Nullable ICodeInfo getCodeInfo() { - load(); - return cls.getClassNode().getCode(); + return cls.getCodeInfo(); } @Override diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java index 684737e1b..bb8a78ac4 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java @@ -120,9 +120,6 @@ public class CodePanel extends JPanel { if (codeArea instanceof SmaliArea) { return; } - LineNumbers numbers = new LineNumbers(codeArea); - numbers.setUseSourceLines(isUseSourceLines()); - codeScrollPane.setRowHeaderView(numbers); initLineNumbers(isUseSourceLines()); } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/LineNumbers.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/LineNumbers.java index cd8effa84..4fcaa7b53 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/LineNumbers.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/LineNumbers.java @@ -42,7 +42,8 @@ public class LineNumbers extends JPanel implements CaretListener { private static final int NUM_HEIGHT = Integer.MAX_VALUE - 1000000; private static final Map DESKTOP_HINTS = (Map) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"); - private final AbstractCodeArea codeArea; + private final transient AbstractCodeArea codeArea; + private final transient ICodeInfo codeInfo; private boolean useSourceLines = true; private transient int lastDigits; @@ -55,10 +56,11 @@ public class LineNumbers extends JPanel implements CaretListener { private transient Insets textAreaInsets; private transient Rectangle visibleRect = new Rectangle(); - private transient ICodeInfo codeInfo; public LineNumbers(AbstractCodeArea codeArea) { this.codeArea = codeArea; + this.codeInfo = codeArea.getNode().getCodeInfo(); + setFont(codeArea.getFont()); SyntaxScheme syntaxScheme = codeArea.getSyntaxScheme(); numberColor = syntaxScheme.getStyle(Token.LITERAL_NUMBER_DECIMAL_INT).foreground; @@ -110,8 +112,6 @@ public class LineNumbers extends JPanel implements CaretListener { @SuppressWarnings("deprecation") @Override public void paintComponent(Graphics g) { - codeInfo = codeArea.getNode().getCodeInfo(); - visibleRect = g.getClipBounds(visibleRect); if (visibleRect == null) { visibleRect = getVisibleRect(); @@ -127,7 +127,7 @@ public class LineNumbers extends JPanel implements CaretListener { Dimension size = getSize(); g.setColor(codeArea.getBackground()); - g.fillRect(0, 0, size.width, size.height); + g.fillRect(0, visibleRect.y, size.width, visibleRect.height); FontMetrics fontMetrics = codeArea.getFontMetrics(font); Insets insets = getInsets();