gui: add definitions search window
This commit is contained in:
+6
-6
@@ -44,8 +44,8 @@ import org.slf4j.LoggerFactory;
|
||||
* }
|
||||
* </code></pre>
|
||||
*/
|
||||
public final class Decompiler {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Decompiler.class);
|
||||
public final class JadxDecompiler {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(JadxDecompiler.class);
|
||||
|
||||
private final IJadxArgs args;
|
||||
private final List<InputFile> inputFiles = new ArrayList<InputFile>();
|
||||
@@ -56,12 +56,12 @@ public final class Decompiler {
|
||||
private List<IDexTreeVisitor> passes;
|
||||
private List<JavaClass> classes;
|
||||
|
||||
public Decompiler() {
|
||||
public JadxDecompiler() {
|
||||
this.args = new DefaultJadxArgs();
|
||||
init();
|
||||
}
|
||||
|
||||
public Decompiler(IJadxArgs jadxArgs) {
|
||||
public JadxDecompiler(IJadxArgs jadxArgs) {
|
||||
this.args = jadxArgs;
|
||||
init();
|
||||
}
|
||||
@@ -143,7 +143,7 @@ public final class Decompiler {
|
||||
List<ClassNode> classNodeList = root.getClasses(false);
|
||||
List<JavaClass> clsList = new ArrayList<JavaClass>(classNodeList.size());
|
||||
for (ClassNode classNode : classNodeList) {
|
||||
clsList.add(new JavaClass(this, classNode));
|
||||
clsList.add(new JavaClass(classNode, this));
|
||||
}
|
||||
classes = Collections.unmodifiableList(clsList);
|
||||
}
|
||||
@@ -174,7 +174,7 @@ public final class Decompiler {
|
||||
Collections.sort(pkg.getClasses(), new Comparator<JavaClass>() {
|
||||
@Override
|
||||
public int compare(JavaClass o1, JavaClass o2) {
|
||||
return o1.getShortName().compareTo(o2.getShortName());
|
||||
return o1.getName().compareTo(o2.getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -7,7 +7,6 @@ import jadx.core.dex.info.AccessInfo;
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.core.dex.nodes.FieldNode;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.utils.exceptions.JadxRuntimeException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -15,18 +14,29 @@ import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public final class JavaClass {
|
||||
public final class JavaClass implements JavaNode {
|
||||
|
||||
private final Decompiler decompiler;
|
||||
private final JadxDecompiler decompiler;
|
||||
private final ClassNode cls;
|
||||
private final JavaClass parent;
|
||||
|
||||
private List<JavaClass> innerClasses = Collections.emptyList();
|
||||
private List<JavaField> fields = Collections.emptyList();
|
||||
private List<JavaMethod> methods = Collections.emptyList();
|
||||
|
||||
JavaClass(Decompiler decompiler, ClassNode classNode) {
|
||||
JavaClass(ClassNode classNode, JadxDecompiler decompiler) {
|
||||
this.decompiler = decompiler;
|
||||
this.cls = classNode;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inner classes constructor
|
||||
*/
|
||||
JavaClass(ClassNode classNode, JavaClass parent) {
|
||||
this.decompiler = null;
|
||||
this.cls = classNode;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
@@ -43,7 +53,7 @@ public final class JavaClass {
|
||||
|
||||
public void decompile() {
|
||||
if (decompiler == null) {
|
||||
throw new JadxRuntimeException("Can't decompile inner class");
|
||||
return;
|
||||
}
|
||||
if (cls.getCode() == null) {
|
||||
decompiler.processClass(cls);
|
||||
@@ -61,7 +71,7 @@ public final class JavaClass {
|
||||
List<JavaClass> list = new ArrayList<JavaClass>(inClsCount);
|
||||
for (ClassNode inner : cls.getInnerClasses()) {
|
||||
if (!inner.contains(AFlag.DONT_GENERATE)) {
|
||||
JavaClass javaClass = new JavaClass(null, inner);
|
||||
JavaClass javaClass = new JavaClass(inner, this);
|
||||
javaClass.load();
|
||||
list.add(javaClass);
|
||||
}
|
||||
@@ -74,7 +84,7 @@ public final class JavaClass {
|
||||
List<JavaField> flds = new ArrayList<JavaField>(fieldsCount);
|
||||
for (FieldNode f : cls.getFields()) {
|
||||
if (!f.contains(AFlag.DONT_GENERATE)) {
|
||||
flds.add(new JavaField(f));
|
||||
flds.add(new JavaField(f, this));
|
||||
}
|
||||
}
|
||||
this.fields = Collections.unmodifiableList(flds);
|
||||
@@ -135,31 +145,41 @@ public final class JavaClass {
|
||||
return cls.getCode().getLineMapping().get(decompiledLine);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return cls.getShortName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFullName() {
|
||||
return cls.getFullName();
|
||||
}
|
||||
|
||||
public String getShortName() {
|
||||
return cls.getShortName();
|
||||
}
|
||||
|
||||
public String getPackage() {
|
||||
return cls.getPackage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaClass getDeclaringClass() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public AccessInfo getAccessInfo() {
|
||||
return cls.getAccessFlags();
|
||||
}
|
||||
|
||||
public List<JavaClass> getInnerClasses() {
|
||||
decompile();
|
||||
return innerClasses;
|
||||
}
|
||||
|
||||
public List<JavaField> getFields() {
|
||||
decompile();
|
||||
return fields;
|
||||
}
|
||||
|
||||
public List<JavaMethod> getMethods() {
|
||||
decompile();
|
||||
return methods;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,18 +4,31 @@ import jadx.core.dex.info.AccessInfo;
|
||||
import jadx.core.dex.instructions.args.ArgType;
|
||||
import jadx.core.dex.nodes.FieldNode;
|
||||
|
||||
public final class JavaField {
|
||||
public final class JavaField implements JavaNode {
|
||||
|
||||
private final FieldNode field;
|
||||
private final JavaClass parent;
|
||||
|
||||
public JavaField(FieldNode f) {
|
||||
JavaField(FieldNode f, JavaClass cls) {
|
||||
this.field = f;
|
||||
this.parent = cls;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return field.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFullName() {
|
||||
return parent.getFullName() + "." + field.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaClass getDeclaringClass() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public AccessInfo getAccessFlags() {
|
||||
return field.getAccessFlags();
|
||||
}
|
||||
|
||||
@@ -6,19 +6,26 @@ import jadx.core.dex.nodes.MethodNode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public final class JavaMethod {
|
||||
public final class JavaMethod implements JavaNode {
|
||||
private final MethodNode mth;
|
||||
private final JavaClass parent;
|
||||
|
||||
public JavaMethod(JavaClass cls, MethodNode m) {
|
||||
JavaMethod(JavaClass cls, MethodNode m) {
|
||||
this.parent = cls;
|
||||
this.mth = m;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return mth.getMethodInfo().getName();
|
||||
return mth.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFullName() {
|
||||
return mth.getMethodInfo().getFullName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaClass getDeclaringClass() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package jadx.api;
|
||||
|
||||
public interface JavaNode {
|
||||
|
||||
String getName();
|
||||
|
||||
String getFullName();
|
||||
|
||||
JavaClass getDeclaringClass();
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package jadx.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public final class JavaPackage implements Comparable<JavaPackage> {
|
||||
public final class JavaPackage implements JavaNode, Comparable<JavaPackage> {
|
||||
private final String name;
|
||||
private final List<JavaClass> classes;
|
||||
|
||||
@@ -11,14 +11,26 @@ public final class JavaPackage implements Comparable<JavaPackage> {
|
||||
this.classes = classes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFullName() {
|
||||
// TODO: store full package name
|
||||
return name;
|
||||
}
|
||||
|
||||
public List<JavaClass> getClasses() {
|
||||
return classes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaClass getDeclaringClass() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(JavaPackage o) {
|
||||
return name.compareTo(o.name);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package jadx.tests
|
||||
|
||||
import jadx.api.Decompiler
|
||||
import jadx.api.JadxDecompiler
|
||||
import jadx.api.IJadxArgs
|
||||
import jadx.core.dex.nodes.MethodNode
|
||||
import jadx.core.utils.ErrorsCounter
|
||||
@@ -12,7 +12,7 @@ class TestAPI extends Specification {
|
||||
|
||||
def "no loaded files"() {
|
||||
setup:
|
||||
def d = new Decompiler()
|
||||
def d = new JadxDecompiler()
|
||||
when:
|
||||
def classes = d.getClasses()
|
||||
def packages = d.getPackages()
|
||||
@@ -24,7 +24,7 @@ class TestAPI extends Specification {
|
||||
|
||||
def "save with no loaded files"() {
|
||||
when:
|
||||
new Decompiler().save()
|
||||
new JadxDecompiler().save()
|
||||
then:
|
||||
def e = thrown(JadxRuntimeException)
|
||||
e.message == "No loaded files"
|
||||
@@ -32,7 +32,7 @@ class TestAPI extends Specification {
|
||||
|
||||
def "load empty files list"() {
|
||||
when:
|
||||
new Decompiler().loadFiles(Collections.emptyList())
|
||||
new JadxDecompiler().loadFiles(Collections.emptyList())
|
||||
then:
|
||||
def e = thrown(JadxException)
|
||||
e.message == "Empty file list"
|
||||
@@ -40,14 +40,14 @@ class TestAPI extends Specification {
|
||||
|
||||
def "load null"() {
|
||||
when:
|
||||
new Decompiler().loadFile(null)
|
||||
new JadxDecompiler().loadFile(null)
|
||||
then:
|
||||
thrown(NullPointerException)
|
||||
}
|
||||
|
||||
def "load missing file"() {
|
||||
when:
|
||||
new Decompiler().loadFile(new File("_.dex"))
|
||||
new JadxDecompiler().loadFile(new File("_.dex"))
|
||||
then:
|
||||
def e = thrown(JadxException)
|
||||
e.message == "Error load file: _.dex"
|
||||
@@ -58,29 +58,29 @@ class TestAPI extends Specification {
|
||||
setup:
|
||||
def args = Mock(IJadxArgs)
|
||||
when:
|
||||
new Decompiler(args)
|
||||
new JadxDecompiler(args)
|
||||
then:
|
||||
noExceptionThrown()
|
||||
}
|
||||
|
||||
def "get errors count for new decompiler"() {
|
||||
expect:
|
||||
new Decompiler().getErrorsCount() == 0
|
||||
new JadxDecompiler().getErrorsCount() == 0
|
||||
}
|
||||
|
||||
def "get errors count after one more init"() {
|
||||
setup:
|
||||
new Decompiler()
|
||||
new JadxDecompiler()
|
||||
def mth = Mock(MethodNode)
|
||||
when:
|
||||
ErrorsCounter.methodError(mth, "")
|
||||
def d = new Decompiler()
|
||||
def d = new JadxDecompiler()
|
||||
then:
|
||||
d.getErrorsCount() == 0
|
||||
}
|
||||
|
||||
def "decompiler toString()"() {
|
||||
expect:
|
||||
new Decompiler().toString() == "jadx decompiler"
|
||||
new JadxDecompiler().toString() == "jadx decompiler"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public abstract class InternalJadxTest extends TestUtils {
|
||||
protected String outDir = "test-out-tmp";
|
||||
|
||||
public ClassNode getClassNode(Class<?> clazz) {
|
||||
Decompiler d = new Decompiler();
|
||||
JadxDecompiler d = new JadxDecompiler();
|
||||
try {
|
||||
d.loadFile(getJarForClass(clazz));
|
||||
} catch (Exception e) {
|
||||
|
||||
Reference in New Issue
Block a user