fix(smali-input): use synced list for threaded processing, improve inner classes handling
This commit is contained in:
@@ -435,7 +435,7 @@ public final class JadxDecompiler implements Closeable {
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<JavaClass> getClasses() {
|
||||
public synchronized List<JavaClass> getClasses() {
|
||||
if (root == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
@@ -443,10 +443,7 @@ public final class JadxDecompiler implements Closeable {
|
||||
List<ClassNode> classNodeList = root.getClasses();
|
||||
List<JavaClass> clsList = new ArrayList<>(classNodeList.size());
|
||||
for (ClassNode classNode : classNodeList) {
|
||||
if (classNode.contains(AFlag.DONT_GENERATE)) {
|
||||
continue;
|
||||
}
|
||||
if (!classNode.getClassInfo().isInner()) {
|
||||
if (!classNode.contains(AFlag.DONT_GENERATE) && !classNode.isInner()) {
|
||||
clsList.add(convertClassNode(classNode));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -612,17 +612,9 @@ public class ClassNode extends NotificationAttrNode
|
||||
return parentClass;
|
||||
}
|
||||
|
||||
public void updateParentClass() {
|
||||
if (clsInfo.isInner()) {
|
||||
ClassNode parent = root.resolveClass(clsInfo.getParentClass());
|
||||
if (parent != null) {
|
||||
parentClass = parent;
|
||||
return;
|
||||
}
|
||||
// undo inner mark in class info
|
||||
clsInfo.notInner(root);
|
||||
}
|
||||
parentClass = this;
|
||||
public void notInner() {
|
||||
this.clsInfo.notInner(root);
|
||||
this.parentClass = this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -159,7 +159,7 @@ public class RootNode {
|
||||
LOG.info("Loaded classes: {}, methods: {}, instructions: {}", classes.size(), mthCount, insnsCount);
|
||||
|
||||
// sort classes by name, expect top classes before inner
|
||||
classes.sort(Comparator.comparing(ClassNode::getFullName));
|
||||
classes.sort(Comparator.comparing(ClassNode::getRawName));
|
||||
|
||||
if (args.isMoveInnerClasses()) {
|
||||
// detect and move inner classes
|
||||
@@ -309,10 +309,8 @@ public class RootNode {
|
||||
ClassInfo clsInfo = cls.getClassInfo();
|
||||
ClassNode parent = resolveParentClass(clsInfo);
|
||||
if (parent == null) {
|
||||
clsMap.remove(clsInfo);
|
||||
clsInfo.notInner(this);
|
||||
clsMap.put(clsInfo, cls);
|
||||
updated.add(cls);
|
||||
cls.notInner();
|
||||
} else {
|
||||
parent.addInnerClass(cls);
|
||||
}
|
||||
@@ -323,7 +321,6 @@ public class RootNode {
|
||||
innerCls.getClassInfo().updateNames(this);
|
||||
}
|
||||
}
|
||||
classes.forEach(ClassNode::updateParentClass);
|
||||
for (PackageNode pkg : packages) {
|
||||
pkg.getClasses().removeIf(cls -> cls.getClassInfo().isInner());
|
||||
}
|
||||
|
||||
@@ -221,8 +221,7 @@ public abstract class IntegrationTest extends TestUtils {
|
||||
} else {
|
||||
LOG.info("Convert back to top level: {}", cls);
|
||||
cls.getTopParentClass().decompile(); // keep correct process order
|
||||
cls.getClassInfo().notInner(root);
|
||||
cls.updateParentClass();
|
||||
cls.notInner();
|
||||
}
|
||||
decompileAndCheck(cls);
|
||||
return cls;
|
||||
|
||||
Reference in New Issue
Block a user