From ab593e3cd9c91a4fc36aa28580b6adc1988f3968 Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 3 Jan 2014 22:54:31 +0400 Subject: [PATCH] refactor some classes --- .../core/dex/attributes/AttributesList.java | 3 +- .../java/jadx/core/dex/nodes/ClassNode.java | 91 +++++++++++-------- .../jadx/core/dex/nodes/InsnContainer.java | 2 +- .../dex/nodes/parser/StaticValuesParser.java | 9 +- .../dex/visitors/BlockProcessingHelper.java | 4 - .../main/java/jadx/core/utils/BlockUtils.java | 6 +- .../src/main/java/jadx/gui/MainWindow.java | 6 +- .../main/java/jadx/gui/treemodel/JClass.java | 2 +- .../java/jadx/gui/treemodel/JPackage.java | 4 +- 9 files changed, 69 insertions(+), 58 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java index 096bd8acf..ec4893094 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.EnumMap; import java.util.EnumSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -30,7 +31,7 @@ public final class AttributesList { public AttributesList() { flags = EnumSet.noneOf(AttributeFlag.class); uniqAttr = new EnumMap(AttributeType.class); - attributes = new ArrayList(0); + attributes = new LinkedList(); attrCount = new int[AttributeType.getNotUniqCount()]; } 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 263b5d41c..42f183358 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 @@ -22,7 +22,7 @@ import jadx.core.utils.exceptions.DecodeException; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -39,49 +39,56 @@ public class ClassNode extends LineAttrNode implements ILoadable { private final DexNode dex; private final ClassInfo clsInfo; + private final AccessInfo accessFlags; private ClassInfo superClass; private List interfaces; private Map> genericMap; - private final List methods = new ArrayList(); - private final List fields = new ArrayList(); - - private final AccessInfo accessFlags; + private final List methods; + private final List fields; + private Map constFields = Collections.emptyMap(); private List innerClasses = Collections.emptyList(); - private final Map constFields = new HashMap(); - private CodeWriter code; // generated code public ClassNode(DexNode dex, ClassDef cls) throws DecodeException { this.dex = dex; this.clsInfo = ClassInfo.fromDex(dex, cls.getTypeIndex()); try { - this.superClass = cls.getSupertypeIndex() == DexNode.NO_INDEX - ? null - : ClassInfo.fromDex(dex, cls.getSupertypeIndex()); - + if (cls.getSupertypeIndex() == DexNode.NO_INDEX) { + this.superClass = null; + } else { + this.superClass = ClassInfo.fromDex(dex, cls.getSupertypeIndex()); + } this.interfaces = new ArrayList(cls.getInterfaces().length); for (short interfaceIdx : cls.getInterfaces()) { this.interfaces.add(ClassInfo.fromDex(dex, interfaceIdx)); } - if (cls.getClassDataOffset() != 0) { ClassData clsData = dex.readClassData(cls); + int mthsCount = clsData.getDirectMethods().length + clsData.getVirtualMethods().length; + int fieldsCount = clsData.getStaticFields().length + clsData.getInstanceFields().length; - for (Method mth : clsData.getDirectMethods()) + methods = new ArrayList(mthsCount); + fields = new ArrayList(fieldsCount); + + for (Method mth : clsData.getDirectMethods()) { methods.add(new MethodNode(this, mth)); - - for (Method mth : clsData.getVirtualMethods()) + } + for (Method mth : clsData.getVirtualMethods()) { methods.add(new MethodNode(this, mth)); + } - for (Field f : clsData.getStaticFields()) + for (Field f : clsData.getStaticFields()) { fields.add(new FieldNode(this, f)); - + } loadStaticValues(cls, fields); - - for (Field f : clsData.getInstanceFields()) + for (Field f : clsData.getInstanceFields()) { fields.add(new FieldNode(this, f)); + } + } else { + methods = Collections.emptyList(); + fields = Collections.emptyList(); } loadAnnotations(cls); @@ -98,13 +105,14 @@ public class ClassNode extends LineAttrNode implements ILoadable { } } + // restore original access flags from dalvik annotation if present int accFlagsValue; Annotation a = getAttributes().getAnnotation(Consts.DALVIK_INNER_CLASS); - if (a != null) + if (a != null) { accFlagsValue = (Integer) a.getValues().get("accessFlags"); - else + } else { accFlagsValue = cls.getAccessFlags(); - + } this.accessFlags = new AccessInfo(accFlagsValue, AFType.CLASS); } catch (Exception e) { @@ -134,8 +142,8 @@ public class ClassNode extends LineAttrNode implements ILoadable { int offset = cls.getStaticValuesOffset(); if (offset != 0) { StaticValuesParser parser = new StaticValuesParser(dex, dex.openSection(offset)); - parser.processFields(staticFields); - + int count = parser.processFields(staticFields); + constFields = new LinkedHashMap(count); for (FieldNode f : staticFields) { AccessInfo accFlags = f.getAccessFlags(); if (accFlags.isStatic() && accFlags.isFinal()) { @@ -154,9 +162,9 @@ public class ClassNode extends LineAttrNode implements ILoadable { @SuppressWarnings("unchecked") private void parseClassSignature() { Annotation a = this.getAttributes().getAnnotation(Consts.DALVIK_SIGNATURE); - if (a == null) + if (a == null) { return; - + } String sign = Utils.mergeSignature((List) a.getDefaultValue()); // parse generic map int end = Utils.getGenericEnd(sign); @@ -188,13 +196,13 @@ public class ClassNode extends LineAttrNode implements ILoadable { private void setFieldsTypesFromSignature() { for (FieldNode field : fields) { Annotation a = field.getAttributes().getAnnotation(Consts.DALVIK_SIGNATURE); - if (a == null) - continue; - - String sign = Utils.mergeSignature((List) a.getDefaultValue()); - ArgType gType = ArgType.parseSignature(sign); - if (gType != null) - field.setType(gType); + if (a != null) { + String sign = Utils.mergeSignature((List) a.getDefaultValue()); + ArgType gType = ArgType.parseSignature(sign); + if (gType != null) { + field.setType(gType); + } + } } } @@ -288,8 +296,9 @@ public class ClassNode extends LineAttrNode implements ILoadable { public FieldNode searchFieldById(int id) { String name = FieldInfo.getNameById(dex, id); for (FieldNode f : fields) { - if (f.getName().equals(name)) + if (f.getName().equals(name)) { return f; + } } return null; } @@ -300,24 +309,27 @@ public class ClassNode extends LineAttrNode implements ILoadable { public FieldNode searchFieldByName(String name) { for (FieldNode f : fields) { - if (f.getName().equals(name)) + if (f.getName().equals(name)) { return f; + } } return null; } public MethodNode searchMethod(MethodInfo mth) { for (MethodNode m : methods) { - if (m.getMethodInfo().equals(mth)) + if (m.getMethodInfo().equals(mth)) { return m; + } } return null; } public MethodNode searchMethodByName(String shortId) { for (MethodNode m : methods) { - if (m.getMethodInfo().getShortId().equals(shortId)) + if (m.getMethodInfo().getShortId().equals(shortId)) { return m; + } } return null; } @@ -331,8 +343,9 @@ public class ClassNode extends LineAttrNode implements ILoadable { } public void addInnerClass(ClassNode cls) { - if (innerClasses.isEmpty()) + if (innerClasses.isEmpty()) { innerClasses = new ArrayList(3); + } innerClasses.add(cls); } @@ -351,7 +364,7 @@ public class ClassNode extends LineAttrNode implements ILoadable { if (mth.getAccessFlags().isConstructor() && mth.getMethodInfo().isConstructor() && (mth.getMethodInfo().getArgsCount() == 0 - || (mth.getArguments(false) != null && mth.getArguments(false).isEmpty()))) { + || (mth.getArguments(false) != null && mth.getArguments(false).isEmpty()))) { return mth; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/InsnContainer.java b/jadx-core/src/main/java/jadx/core/dex/nodes/InsnContainer.java index f0b1af416..b5b78e809 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/InsnContainer.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/InsnContainer.java @@ -6,7 +6,7 @@ import java.util.List; public class InsnContainer extends AttrNode implements IBlock { - private List insns; + private final List insns; public InsnContainer(List insns) { this.insns = insns; diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/StaticValuesParser.java b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/StaticValuesParser.java index b01c75022..cad258caf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/StaticValuesParser.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/StaticValuesParser.java @@ -15,13 +15,12 @@ public class StaticValuesParser extends EncValueParser { super(dex, in); } - public void processFields(List fields) throws DecodeException { - int size = Leb128Utils.readUnsignedLeb128(in); - visitArray(size); - - for (int i = 0; i < size; i++) { + public int processFields(List fields) throws DecodeException { + int count = Leb128Utils.readUnsignedLeb128(in); + for (int i = 0; i < count; i++) { Object value = parseValue(); fields.get(i).getAttributes().add(new FieldValueAttr(value)); } + return count; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/BlockProcessingHelper.java b/jadx-core/src/main/java/jadx/core/dex/visitors/BlockProcessingHelper.java index 361a9c411..5d2790fd9 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/BlockProcessingHelper.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/BlockProcessingHelper.java @@ -24,7 +24,6 @@ public class BlockProcessingHelper { if (mth.isNoCode()) { return; } - for (BlockNode block : mth.getBasicBlocks()) { markExceptionHandlers(block); } @@ -78,7 +77,6 @@ public class BlockProcessingHelper { for (BlockNode node : BlockUtils.collectBlocksDominatedBy(block, block)) { excHandler.addBlock(node); } - for (BlockNode excBlock : excHandler.getBlocks()) { // remove 'monitor-exit' from exception handler blocks InstructionRemover remover = new InstructionRemover(excBlock.getInstructions()); @@ -86,7 +84,6 @@ public class BlockProcessingHelper { if (insn.getType() == InsnType.MONITOR_ENTER) { break; } - if (insn.getType() == InsnType.MONITOR_EXIT) { remover.add(insn); } @@ -119,7 +116,6 @@ public class BlockProcessingHelper { if (catchAttr == null) { continue; } - if (commonCatchAttr == null) { commonCatchAttr = catchAttr; } else if (commonCatchAttr != catchAttr) { diff --git a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java index 1e8e15856..84b124f38 100644 --- a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java @@ -17,10 +17,11 @@ public class BlockUtils { public static BlockNode getBlockByOffset(int offset, Iterable casesBlocks) { for (BlockNode block : casesBlocks) { - if (block.getStartOffset() == offset) + if (block.getStartOffset() == offset) { return block; + } } - throw new JadxRuntimeException("Can'r find block by offset: " + throw new JadxRuntimeException("Can't find block by offset: " + InsnUtils.formatOffset(offset) + " in list " + casesBlocks); } @@ -30,7 +31,6 @@ public class BlockUtils { if (list.size() > 2) { list = cleanBlockList(list); } - assert list.size() == 2 : "too many nodes for selectOther: " + node + " in " + list; BlockNode first = list.get(0); if (first != node) diff --git a/jadx-gui/src/main/java/jadx/gui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/MainWindow.java index e518afad0..03b081eb2 100644 --- a/jadx-gui/src/main/java/jadx/gui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/MainWindow.java @@ -81,10 +81,12 @@ public class MainWindow extends JFrame { private final JadxWrapper wrapper; private JPanel mainPanel; + private JTree tree; - private final JTabbedPane tabbedPane = new JTabbedPane(); private DefaultTreeModel treeModel; - private Map openTabs = new HashMap(); + + private final JTabbedPane tabbedPane = new JTabbedPane(); + private final Map openTabs = new HashMap(); public MainWindow(JadxWrapper wrapper) { this.wrapper = wrapper; 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 98e25a519..5d8e15e3f 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java @@ -50,7 +50,7 @@ public class JClass extends JNode { } @Override - public void updateChilds() { + public synchronized void updateChilds() { removeAllChildren(); if (!loaded) { add(new TextNode(NLS.str("tree.loading"))); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java index 561ddb8f3..7cbff15e2 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java @@ -15,8 +15,8 @@ public class JPackage extends JNode implements Comparable { private static final ImageIcon PACKAGE_ICON = Utils.openIcon("package_obj"); private String name; - private List classes; - private List innerPackages = new ArrayList(1); + private final List classes; + private final List innerPackages = new ArrayList(1); public JPackage(JavaPackage pkg) { this.name = pkg.getName();