fix code style issues
This commit is contained in:
@@ -43,7 +43,7 @@ public class AnnotationGen {
|
||||
|
||||
public void addForParameter(CodeWriter code, MethodParameters paramsAnnotations, int n) {
|
||||
AnnotationsList aList = paramsAnnotations.getParamList().get(n);
|
||||
if (aList == null || aList.size() == 0) {
|
||||
if (aList == null || aList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (Annotation a : aList.getAll()) {
|
||||
@@ -54,7 +54,7 @@ public class AnnotationGen {
|
||||
|
||||
private void add(IAttributeNode node, CodeWriter code) {
|
||||
AnnotationsList aList = node.get(AType.ANNOTATION_LIST);
|
||||
if (aList == null || aList.size() == 0) {
|
||||
if (aList == null || aList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (Annotation a : aList.getAll()) {
|
||||
|
||||
@@ -148,7 +148,7 @@ public class ClassGen {
|
||||
clsCode.add(' ');
|
||||
}
|
||||
|
||||
if (cls.getInterfaces().size() > 0 && !af.isAnnotation()) {
|
||||
if (!cls.getInterfaces().isEmpty() && !af.isAnnotation()) {
|
||||
if (cls.getAccessFlags().isInterface()) {
|
||||
clsCode.add("extends ");
|
||||
} else {
|
||||
@@ -347,7 +347,7 @@ public class ClassGen {
|
||||
for (Iterator<EnumField> it = enumFields.getFields().iterator(); it.hasNext(); ) {
|
||||
EnumField f = it.next();
|
||||
code.startLine(f.getName());
|
||||
if (f.getArgs().size() != 0) {
|
||||
if (!f.getArgs().isEmpty()) {
|
||||
code.add('(');
|
||||
for (Iterator<InsnArg> aIt = f.getArgs().iterator(); aIt.hasNext(); ) {
|
||||
InsnArg arg = aIt.next();
|
||||
@@ -403,8 +403,8 @@ public class ClassGen {
|
||||
code.attachAnnotation(classNode);
|
||||
}
|
||||
String baseClass = useClassInternal(cls.getClassInfo(), classInfo);
|
||||
ArgType[] generics = classInfo.getType().getGenericTypes();
|
||||
code.add(baseClass);
|
||||
ArgType[] generics = classInfo.getType().getGenericTypes();
|
||||
if (generics != null) {
|
||||
code.add('<');
|
||||
int len = generics.length;
|
||||
@@ -451,7 +451,7 @@ public class ClassGen {
|
||||
if (classNode != null && !classNode.getAccessFlags().isPublic()) {
|
||||
return shortName;
|
||||
}
|
||||
if (searchCollision(cls.dex(), useCls, shortName)) {
|
||||
if (searchCollision(cls.dex(), useCls, classInfo)) {
|
||||
return fullName;
|
||||
}
|
||||
if (classInfo.getPackage().equals(useCls.getPackage())) {
|
||||
@@ -497,22 +497,24 @@ public class ClassGen {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean searchCollision(DexNode dex, ClassInfo useCls, String shortName) {
|
||||
private static boolean searchCollision(DexNode dex, ClassInfo useCls, ClassInfo searchCls) {
|
||||
if (useCls == null) {
|
||||
return false;
|
||||
}
|
||||
String shortName = searchCls.getShortName();
|
||||
if (useCls.getShortName().equals(shortName)) {
|
||||
return true;
|
||||
}
|
||||
ClassNode classNode = dex.resolveClass(useCls);
|
||||
if (classNode != null) {
|
||||
for (ClassNode inner : classNode.getInnerClasses()) {
|
||||
if (inner.getShortName().equals(shortName)) {
|
||||
if (inner.getShortName().equals(shortName)
|
||||
&& !inner.getClassInfo().equals(searchCls)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return searchCollision(dex, useCls.getParentClass(), shortName);
|
||||
return searchCollision(dex, useCls.getParentClass(), searchCls);
|
||||
}
|
||||
|
||||
private void insertSourceFileInfo(CodeWriter code, AttrNode node) {
|
||||
|
||||
@@ -47,6 +47,7 @@ import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -132,14 +133,13 @@ public class InsnGen {
|
||||
private void instanceField(CodeWriter code, FieldInfo field, InsnArg arg) throws CodegenException {
|
||||
ClassNode pCls = mth.getParentClass();
|
||||
FieldNode fieldNode = pCls.searchField(field);
|
||||
|
||||
while ((fieldNode == null)
|
||||
&& (pCls.getParentClass() != pCls) && (pCls.getParentClass() != null))
|
||||
{
|
||||
while (fieldNode == null
|
||||
&& pCls.getParentClass() != pCls
|
||||
&& pCls.getParentClass() != null) {
|
||||
pCls = pCls.getParentClass();
|
||||
fieldNode = pCls.searchField(field);
|
||||
}
|
||||
if (fieldNode != null) {
|
||||
if (fieldNode != null) {
|
||||
FieldReplaceAttr replace = fieldNode.get(AType.FIELD_REPLACE);
|
||||
if (replace != null) {
|
||||
FieldInfo info = replace.getFieldInfo();
|
||||
@@ -201,7 +201,7 @@ public class InsnGen {
|
||||
if (insn.getType() == InsnType.NOP) {
|
||||
return false;
|
||||
}
|
||||
EnumSet<Flags> state = EnumSet.noneOf(Flags.class);
|
||||
Set<Flags> state = EnumSet.noneOf(Flags.class);
|
||||
if (flag == Flags.BODY_ONLY || flag == Flags.BODY_ONLY_NOWRAP) {
|
||||
state.add(flag);
|
||||
makeInsnBody(code, insn, state);
|
||||
@@ -224,7 +224,7 @@ public class InsnGen {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void makeInsnBody(CodeWriter code, InsnNode insn, EnumSet<Flags> state) throws CodegenException {
|
||||
private void makeInsnBody(CodeWriter code, InsnNode insn, Set<Flags> state) throws CodegenException {
|
||||
switch (insn.getType()) {
|
||||
case CONST_STR:
|
||||
String str = ((ConstStringNode) insn).getString();
|
||||
@@ -748,7 +748,7 @@ public class InsnGen {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void makeTernary(TernaryInsn insn, CodeWriter code, EnumSet<Flags> state) throws CodegenException {
|
||||
private void makeTernary(TernaryInsn insn, CodeWriter code, Set<Flags> state) throws CodegenException {
|
||||
boolean wrap = state.contains(Flags.BODY_ONLY);
|
||||
if (wrap) {
|
||||
code.add('(');
|
||||
@@ -770,7 +770,7 @@ public class InsnGen {
|
||||
}
|
||||
}
|
||||
|
||||
private void makeArith(ArithNode insn, CodeWriter code, EnumSet<Flags> state) throws CodegenException {
|
||||
private void makeArith(ArithNode insn, CodeWriter code, Set<Flags> state) throws CodegenException {
|
||||
if (insn.contains(AFlag.ARITH_ONEARG)) {
|
||||
makeArithOneArg(insn, code);
|
||||
return;
|
||||
|
||||
@@ -206,13 +206,10 @@ public class MethodGen {
|
||||
if (insn == null) {
|
||||
continue;
|
||||
}
|
||||
if (addLabels) {
|
||||
if (insn.contains(AType.JUMP)
|
||||
|| insn.contains(AType.EXC_HANDLER)) {
|
||||
code.decIndent();
|
||||
code.startLine(getLabelName(insn.getOffset()) + ":");
|
||||
code.incIndent();
|
||||
}
|
||||
if (addLabels && (insn.contains(AType.JUMP) || insn.contains(AType.EXC_HANDLER))) {
|
||||
code.decIndent();
|
||||
code.startLine(getLabelName(insn.getOffset()) + ":");
|
||||
code.incIndent();
|
||||
}
|
||||
try {
|
||||
if (insnGen.makeInsn(insn, code)) {
|
||||
|
||||
@@ -8,6 +8,9 @@ import jadx.core.utils.exceptions.JadxRuntimeException;
|
||||
|
||||
public class TypeGen {
|
||||
|
||||
private TypeGen() {
|
||||
}
|
||||
|
||||
public static String signature(ArgType type) {
|
||||
PrimitiveType stype = type.getPrimitiveType();
|
||||
if (stype == PrimitiveType.OBJECT) {
|
||||
|
||||
@@ -32,6 +32,10 @@ public class AnnotationsList implements IAttribute {
|
||||
return map.size();
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return map.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AType<AnnotationsList> getType() {
|
||||
return AType.ANNOTATION_LIST;
|
||||
|
||||
@@ -12,8 +12,6 @@ import jadx.core.dex.nodes.InsnNode;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.utils.exceptions.DecodeException;
|
||||
|
||||
import java.io.EOFException;
|
||||
|
||||
import com.android.dex.Code;
|
||||
import com.android.dx.io.OpcodeInfo;
|
||||
import com.android.dx.io.Opcodes;
|
||||
|
||||
@@ -38,11 +38,11 @@ public final class LiteralArg extends InsnArg {
|
||||
|
||||
public boolean isInteger() {
|
||||
PrimitiveType type = this.type.getPrimitiveType();
|
||||
return (type == PrimitiveType.INT
|
||||
return type == PrimitiveType.INT
|
||||
|| type == PrimitiveType.BYTE
|
||||
|| type == PrimitiveType.CHAR
|
||||
|| type == PrimitiveType.SHORT
|
||||
|| type == PrimitiveType.LONG);
|
||||
|| type == PrimitiveType.LONG;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -29,7 +29,6 @@ public class SSAVar {
|
||||
if (assign != null) {
|
||||
assign.setSVar(this);
|
||||
}
|
||||
|
||||
startUseAddr = -1;
|
||||
endUseAddr = -1;
|
||||
}
|
||||
@@ -52,30 +51,23 @@ public class SSAVar {
|
||||
int start = Integer.MAX_VALUE;
|
||||
int end = Integer.MIN_VALUE;
|
||||
|
||||
if (assign != null) {
|
||||
if (assign.getParentInsn() != null) {
|
||||
int insnAddr = assign.getParentInsn().getOffset();
|
||||
|
||||
if (insnAddr >= 0) {
|
||||
start = Math.min(insnAddr, start);
|
||||
end = Math.max(insnAddr, end);
|
||||
}
|
||||
if (assign != null && assign.getParentInsn() != null) {
|
||||
int insnAddr = assign.getParentInsn().getOffset();
|
||||
if (insnAddr >= 0) {
|
||||
start = Math.min(insnAddr, start);
|
||||
end = Math.max(insnAddr, end);
|
||||
}
|
||||
}
|
||||
|
||||
for (RegisterArg arg : useList) {
|
||||
if (arg.getParentInsn() != null) {
|
||||
int insnAddr = arg.getParentInsn().getOffset();
|
||||
|
||||
if (insnAddr >= 0) {
|
||||
start = Math.min(insnAddr, start);
|
||||
end = Math.max(insnAddr, end);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((start != Integer.MAX_VALUE)
|
||||
&& (end != Integer.MIN_VALUE)) {
|
||||
if (start != Integer.MAX_VALUE && end != Integer.MIN_VALUE) {
|
||||
startUseAddr = start;
|
||||
endUseAddr = end;
|
||||
}
|
||||
|
||||
@@ -204,9 +204,8 @@ public class MethodNode extends LineAttrNode implements ILoadable {
|
||||
list.add(thisArg);
|
||||
list.addAll(argsList);
|
||||
return list;
|
||||
} else {
|
||||
return argsList;
|
||||
}
|
||||
return argsList;
|
||||
}
|
||||
|
||||
public RegisterArg removeFirstArgument() {
|
||||
@@ -277,7 +276,6 @@ public class MethodNode extends LineAttrNode implements ILoadable {
|
||||
for (TryCatchBlock ct : catches) {
|
||||
for (ExceptionHandler eh : ct.getHandlers()) {
|
||||
int addr = eh.getHandleOffset();
|
||||
// assert addrs.add(addr) : "Instruction already contains EXC_HANDLER attribute";
|
||||
ExcHandlerAttr ehAttr = new ExcHandlerAttr(ct, eh);
|
||||
insnByOffset[addr].addAttr(ehAttr);
|
||||
}
|
||||
@@ -313,18 +311,17 @@ public class MethodNode extends LineAttrNode implements ILoadable {
|
||||
continue;
|
||||
}
|
||||
switch (insn.getType()) {
|
||||
case SWITCH: {
|
||||
case SWITCH:
|
||||
SwitchNode sw = (SwitchNode) insn;
|
||||
for (int target : sw.getTargets()) {
|
||||
addJump(insnByOffset, offset, target);
|
||||
}
|
||||
// default case
|
||||
int next = InsnDecoder.getNextInsnOffset(insnByOffset, offset);
|
||||
if (next != -1) {
|
||||
addJump(insnByOffset, offset, next);
|
||||
int nextInsnOffset = InsnDecoder.getNextInsnOffset(insnByOffset, offset);
|
||||
if (nextInsnOffset != -1) {
|
||||
addJump(insnByOffset, offset, nextInsnOffset);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case IF:
|
||||
int next = InsnDecoder.getNextInsnOffset(insnByOffset, offset);
|
||||
@@ -499,25 +496,19 @@ public class MethodNode extends LineAttrNode implements ILoadable {
|
||||
|
||||
public boolean isDefaultConstructor() {
|
||||
boolean result = false;
|
||||
|
||||
if (accFlags.isConstructor() && mthInfo.isConstructor()) {
|
||||
int defaultArgCount = 0;
|
||||
|
||||
/** workaround for non-static inner class constructor, that has
|
||||
* synthetic argument */
|
||||
/** workaround for non-static inner class constructor, that has synthetic argument */
|
||||
if (parentClass.getClassInfo().isInner()
|
||||
&& !parentClass.getAccessFlags().isStatic()) {
|
||||
ClassNode outerCls = parentClass.getParentClass();
|
||||
if ((argsList != null) && (argsList.size() >= 1)) {
|
||||
if (argsList.get(0).getType().equals(outerCls.getClassInfo().getType())) {
|
||||
defaultArgCount = 1;
|
||||
}
|
||||
if (argsList != null && !argsList.isEmpty()
|
||||
&& argsList.get(0).getType().equals(outerCls.getClassInfo().getType())) {
|
||||
defaultArgCount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
result = (argsList == null) || (argsList.size() == defaultArgCount);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ public class DebugInfoParser {
|
||||
|
||||
for (LocalVar var : locals) {
|
||||
if (var != null && !var.isEnd()) {
|
||||
var.end(mth.getCodeSize()-1, line);
|
||||
var.end(mth.getCodeSize() - 1, line);
|
||||
setVar(var);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@ final class LocalVar {
|
||||
|
||||
public LocalVar(DexNode dex, int rn, int nameId, int typeId, int signId) {
|
||||
this.regNum = rn;
|
||||
String name = (nameId == DexNode.NO_INDEX ? null : dex.getString(nameId));
|
||||
ArgType type = (typeId == DexNode.NO_INDEX ? null : dex.getType(typeId));
|
||||
String sign = (signId == DexNode.NO_INDEX ? null : dex.getString(signId));
|
||||
String name = nameId == DexNode.NO_INDEX ? null : dex.getString(nameId);
|
||||
ArgType type = typeId == DexNode.NO_INDEX ? null : dex.getType(typeId);
|
||||
String sign = signId == DexNode.NO_INDEX ? null : dex.getString(signId);
|
||||
|
||||
init(name, type, sign);
|
||||
}
|
||||
@@ -56,10 +56,8 @@ final class LocalVar {
|
||||
LOG.warn("Generic type in debug info not equals: {} != {}", type, gType);
|
||||
}
|
||||
apply = true;
|
||||
} else if (el.isGenericType()) {
|
||||
apply = true;
|
||||
} else {
|
||||
apply = false;
|
||||
apply = el.isGenericType();
|
||||
}
|
||||
return apply;
|
||||
}
|
||||
@@ -71,6 +69,7 @@ final class LocalVar {
|
||||
|
||||
/**
|
||||
* Sets end address of local variable
|
||||
*
|
||||
* @param addr address
|
||||
* @param line source line
|
||||
* @return <b>true</b> if local variable was active, else <b>false</b>
|
||||
@@ -81,7 +80,6 @@ final class LocalVar {
|
||||
this.endAddr = addr;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ public final class IfInfo {
|
||||
}
|
||||
|
||||
private IfInfo(IfCondition condition, BlockNode thenBlock, BlockNode elseBlock,
|
||||
Set<BlockNode> mergedBlocks, Set<BlockNode> skipBlocks) {
|
||||
Set<BlockNode> mergedBlocks, Set<BlockNode> skipBlocks) {
|
||||
this.condition = condition;
|
||||
this.thenBlock = thenBlock;
|
||||
this.elseBlock = elseBlock;
|
||||
|
||||
@@ -126,7 +126,6 @@ public final class LoopRegion extends AbstractRegion {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public LoopType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ public class ClassModifier extends AbstractVisitor {
|
||||
List<InsnNode> insns = mth.getBasicBlocks().get(0).getInstructions();
|
||||
if (insns.size() == 1 && insns.get(0).getType() == InsnType.CONSTRUCTOR) {
|
||||
ConstructorInsn constr = (ConstructorInsn) insns.get(0);
|
||||
if (constr.isThis() && mth.getArguments(false).size() >= 1) {
|
||||
if (constr.isThis() && !mth.getArguments(false).isEmpty()) {
|
||||
mth.removeFirstArgument();
|
||||
mth.add(AFlag.DONT_GENERATE);
|
||||
}
|
||||
@@ -167,7 +167,7 @@ public class ClassModifier extends AbstractVisitor {
|
||||
|
||||
private static boolean allBlocksEmpty(List<BlockNode> blocks) {
|
||||
for (BlockNode block : blocks) {
|
||||
if (block.getInstructions().size() != 0) {
|
||||
if (!block.getInstructions().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public class CodeShrinker extends AbstractVisitor {
|
||||
}
|
||||
|
||||
public static List<RegisterArg> getArgs(InsnNode insn) {
|
||||
LinkedList<RegisterArg> args = new LinkedList<RegisterArg>();
|
||||
List<RegisterArg> args = new LinkedList<RegisterArg>();
|
||||
addArgs(insn, args);
|
||||
return args;
|
||||
}
|
||||
@@ -105,9 +105,9 @@ public class CodeShrinker extends AbstractVisitor {
|
||||
if (start > to) {
|
||||
throw new JadxRuntimeException("Invalid inline insn positions: " + start + " - " + to);
|
||||
}
|
||||
BitSet args = new BitSet();
|
||||
BitSet movedSet = new BitSet();
|
||||
for (RegisterArg arg : movedArgs) {
|
||||
args.set(arg.getRegNum());
|
||||
movedSet.set(arg.getRegNum());
|
||||
}
|
||||
for (int i = start; i < to; i++) {
|
||||
ArgsInfo argsInfo = argsList.get(i);
|
||||
@@ -115,7 +115,7 @@ public class CodeShrinker extends AbstractVisitor {
|
||||
continue;
|
||||
}
|
||||
InsnNode curInsn = argsInfo.insn;
|
||||
if (!curInsn.canReorder() || usedArgAssign(curInsn, args)) {
|
||||
if (!curInsn.canReorder() || usedArgAssign(curInsn, movedSet)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -187,7 +187,8 @@ public class CodeShrinker extends AbstractVisitor {
|
||||
List<WrapInfo> wrapList = new ArrayList<WrapInfo>();
|
||||
for (ArgsInfo argsInfo : argsList) {
|
||||
List<RegisterArg> args = argsInfo.getArgs();
|
||||
for (ListIterator<RegisterArg> it = args.listIterator(args.size()); it.hasPrevious(); ) {
|
||||
ListIterator<RegisterArg> it = args.listIterator(args.size());
|
||||
while (it.hasPrevious()) {
|
||||
RegisterArg arg = it.previous();
|
||||
// if (arg.getName() != null) {
|
||||
// continue;
|
||||
@@ -293,7 +294,7 @@ public class CodeShrinker extends AbstractVisitor {
|
||||
}
|
||||
}
|
||||
// remove method args
|
||||
if (list.size() != 0 && args.size() != 0) {
|
||||
if (!list.isEmpty() && !args.isEmpty()) {
|
||||
list.removeAll(args);
|
||||
}
|
||||
i++;
|
||||
|
||||
@@ -150,7 +150,7 @@ public class ConstInlinerVisitor extends AbstractVisitor {
|
||||
InvokeNode inv = (InvokeNode) insn;
|
||||
List<ArgType> types = inv.getCallMth().getArgumentsTypes();
|
||||
int count = insn.getArgsCount();
|
||||
int k = (types.size() == count ? 0 : -1);
|
||||
int k = types.size() == count ? 0 : -1;
|
||||
for (int i = 0; i < count; i++) {
|
||||
InsnArg arg = insn.getArg(i);
|
||||
if (!arg.getType().isTypeKnown()) {
|
||||
|
||||
@@ -114,21 +114,17 @@ public class EnumVisitor extends AbstractVisitor {
|
||||
for (InsnNode insn : insns) {
|
||||
if (insn.getType() == InsnType.CONSTRUCTOR) {
|
||||
ConstructorInsn co = (ConstructorInsn) insn;
|
||||
|
||||
if (insn.getArgsCount() < 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ClassInfo clsInfo = co.getClassType();
|
||||
ClassNode constrCls = cls.dex().resolveClass(clsInfo);
|
||||
if (constrCls == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!clsInfo.equals(cls.getClassInfo()) && !constrCls.getAccessFlags().isEnum()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RegisterArg nameArg = (RegisterArg) insn.getArg(0);
|
||||
// InsnArg pos = insn.getArg(1);
|
||||
// TODO add check: pos == j
|
||||
@@ -136,7 +132,6 @@ public class EnumVisitor extends AbstractVisitor {
|
||||
if (name == null) {
|
||||
throw new JadxException("Unknown enum field name: " + cls);
|
||||
}
|
||||
|
||||
EnumField field = new EnumField(name, insn.getArgsCount() - 2);
|
||||
attr.getFields().add(field);
|
||||
for (int i = 2; i < insn.getArgsCount(); i++) {
|
||||
|
||||
@@ -244,7 +244,7 @@ public class ModVisitor extends AbstractVisitor {
|
||||
InstructionRemover.remove(mth, excBlock, size - 1);
|
||||
|
||||
// move not removed instructions to 'finally' block
|
||||
if (insns.size() != 0) {
|
||||
if (!insns.isEmpty()) {
|
||||
// TODO: support instructions from several blocks
|
||||
// tryBlock.setFinalBlockFromInsns(mth, insns);
|
||||
// TODO: because of incomplete realization don't extract final block,
|
||||
@@ -255,14 +255,13 @@ public class ModVisitor extends AbstractVisitor {
|
||||
}
|
||||
|
||||
List<InsnNode> blockInsns = block.getInstructions();
|
||||
if (blockInsns.size() > 0) {
|
||||
if (!blockInsns.isEmpty()) {
|
||||
InsnNode insn = blockInsns.get(0);
|
||||
if (insn.getType() == InsnType.MOVE_EXCEPTION
|
||||
&& insn.getResult().getSVar().getUseCount() == 0) {
|
||||
InstructionRemover.remove(mth, block, 0);
|
||||
}
|
||||
}
|
||||
|
||||
int totalSize = 0;
|
||||
for (BlockNode excBlock : excHandler.getBlocks()) {
|
||||
totalSize += excBlock.getInstructions().size();
|
||||
|
||||
@@ -218,7 +218,7 @@ public class ReSugarCode extends AbstractVisitor {
|
||||
if (!(index instanceof FieldInfo)) {
|
||||
return null;
|
||||
}
|
||||
FieldNode enumMapField = mth.dex().resolveField(((FieldInfo) index));
|
||||
FieldNode enumMapField = mth.dex().resolveField((FieldInfo) index);
|
||||
if (enumMapField == null || !enumMapField.getAccessFlags().isSynthetic()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@ import jadx.core.dex.nodes.IBlock;
|
||||
import jadx.core.dex.nodes.IContainer;
|
||||
import jadx.core.dex.nodes.IRegion;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.dex.regions.Region;
|
||||
import jadx.core.dex.regions.conditions.IfCondition;
|
||||
import jadx.core.dex.regions.conditions.IfCondition.Mode;
|
||||
import jadx.core.dex.regions.conditions.IfRegion;
|
||||
import jadx.core.dex.regions.Region;
|
||||
import jadx.core.dex.visitors.AbstractVisitor;
|
||||
import jadx.core.utils.RegionUtils;
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ import jadx.core.dex.nodes.IContainer;
|
||||
import jadx.core.dex.nodes.IRegion;
|
||||
import jadx.core.dex.nodes.InsnNode;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.dex.regions.conditions.IfRegion;
|
||||
import jadx.core.dex.regions.SwitchRegion;
|
||||
import jadx.core.dex.regions.conditions.IfRegion;
|
||||
import jadx.core.dex.visitors.AbstractVisitor;
|
||||
import jadx.core.utils.RegionUtils;
|
||||
import jadx.core.utils.exceptions.JadxException;
|
||||
|
||||
@@ -4,9 +4,9 @@ import jadx.core.dex.nodes.IContainer;
|
||||
import jadx.core.dex.nodes.IRegion;
|
||||
import jadx.core.dex.nodes.InsnNode;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.dex.regions.loops.LoopRegion;
|
||||
import jadx.core.dex.regions.Region;
|
||||
import jadx.core.dex.regions.SynchronizedRegion;
|
||||
import jadx.core.dex.regions.loops.LoopRegion;
|
||||
import jadx.core.dex.visitors.AbstractVisitor;
|
||||
import jadx.core.utils.InstructionRemover;
|
||||
import jadx.core.utils.exceptions.JadxException;
|
||||
|
||||
@@ -8,9 +8,9 @@ import jadx.core.dex.nodes.IContainer;
|
||||
import jadx.core.dex.nodes.IRegion;
|
||||
import jadx.core.dex.nodes.InsnNode;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.dex.regions.SwitchRegion;
|
||||
import jadx.core.dex.regions.conditions.IfRegion;
|
||||
import jadx.core.dex.regions.loops.LoopRegion;
|
||||
import jadx.core.dex.regions.SwitchRegion;
|
||||
import jadx.core.dex.visitors.AbstractVisitor;
|
||||
import jadx.core.utils.exceptions.JadxException;
|
||||
import jadx.core.utils.exceptions.JadxRuntimeException;
|
||||
|
||||
@@ -12,8 +12,8 @@ import jadx.core.dex.nodes.BlockNode;
|
||||
import jadx.core.dex.nodes.IContainer;
|
||||
import jadx.core.dex.nodes.InsnNode;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
import jadx.core.dex.regions.conditions.IfRegion;
|
||||
import jadx.core.dex.regions.Region;
|
||||
import jadx.core.dex.regions.conditions.IfRegion;
|
||||
import jadx.core.dex.visitors.CodeShrinker;
|
||||
import jadx.core.utils.InsnList;
|
||||
|
||||
|
||||
+4
-10
@@ -16,6 +16,9 @@ import java.util.List;
|
||||
|
||||
public class PostTypeInference {
|
||||
|
||||
private PostTypeInference() {
|
||||
}
|
||||
|
||||
public static boolean process(MethodNode mth, InsnNode insn) {
|
||||
switch (insn.getType()) {
|
||||
case CONST:
|
||||
@@ -25,7 +28,7 @@ public class PostTypeInference {
|
||||
long lit = litArg.getLiteral();
|
||||
if (lit != 0) {
|
||||
// incorrect literal value for object
|
||||
ArgType type = (lit == 1 ? ArgType.BOOLEAN : ArgType.INT);
|
||||
ArgType type = lit == 1 ? ArgType.BOOLEAN : ArgType.INT;
|
||||
// can't merge with object -> force it
|
||||
litArg.setType(type);
|
||||
res.getSVar().setType(type);
|
||||
@@ -115,15 +118,6 @@ public class PostTypeInference {
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
static void setType(InsnArg arg, ArgType type) {
|
||||
if (arg.isRegister()) {
|
||||
((RegisterArg) arg).getSVar().setType(type);
|
||||
} else {
|
||||
arg.setType(type);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean fixArrayTypes(InsnArg array, InsnArg elem) {
|
||||
|
||||
@@ -6,6 +6,9 @@ import jadx.core.dex.nodes.InsnNode;
|
||||
|
||||
public class SelectTypeVisitor {
|
||||
|
||||
private SelectTypeVisitor() {
|
||||
}
|
||||
|
||||
public static void visit(InsnNode insn) {
|
||||
InsnArg res = insn.getResult();
|
||||
if (res != null && !res.getType().isTypeKnown()) {
|
||||
|
||||
@@ -47,12 +47,7 @@ public class TypeInference extends AbstractVisitor {
|
||||
if (assign != null && (useList.isEmpty() || var.isTypeImmutable())) {
|
||||
return assign.getType();
|
||||
}
|
||||
ArgType type;
|
||||
if (assign != null) {
|
||||
type = assign.getType();
|
||||
} else {
|
||||
type = ArgType.UNKNOWN;
|
||||
}
|
||||
ArgType type = assign != null ? assign.getType() : ArgType.UNKNOWN;
|
||||
for (RegisterArg arg : useList) {
|
||||
ArgType useType = arg.getType();
|
||||
ArgType newType = ArgType.merge(type, useType);
|
||||
|
||||
@@ -66,6 +66,7 @@ public class ErrorsCounter {
|
||||
mth.dex().root().getErrorsCounter().addError(mth, msg, e);
|
||||
return msg;
|
||||
}
|
||||
|
||||
public static String methodError(MethodNode mth, String errorMsg) {
|
||||
return methodError(mth, errorMsg, null);
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class RegionUtils {
|
||||
public static boolean hasExitEdge(IContainer container) {
|
||||
if (container instanceof BlockNode) {
|
||||
BlockNode block = (BlockNode) container;
|
||||
return block.getSuccessors().size() != 0
|
||||
return !block.getSuccessors().isEmpty()
|
||||
&& !block.contains(AFlag.RETURN);
|
||||
} else if (container instanceof IRegion) {
|
||||
IRegion region = (IRegion) container;
|
||||
@@ -109,7 +109,7 @@ public class RegionUtils {
|
||||
|
||||
public static boolean notEmpty(IContainer container) {
|
||||
if (container instanceof BlockNode) {
|
||||
return ((BlockNode) container).getInstructions().size() != 0;
|
||||
return !((BlockNode) container).getInstructions().isEmpty();
|
||||
} else if (container instanceof IRegion) {
|
||||
IRegion region = (IRegion) container;
|
||||
for (IContainer block : region.getSubBlocks()) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
package jadx.tests
|
||||
|
||||
import jadx.api.IJadxArgs
|
||||
import jadx.api.JadxDecompiler
|
||||
import jadx.core.utils.exceptions.JadxException
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package jadx.tests.integration.enums;
|
||||
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.IntegrationTest;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static jadx.tests.api.utils.JadxMatchers.containsOne;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class TestEnums3 extends IntegrationTest {
|
||||
|
||||
public static class TestCls {
|
||||
|
||||
private static int three = 3;
|
||||
|
||||
public enum Numbers {
|
||||
ONE(1), TWO(2), THREE(three), FOUR(three + 1);
|
||||
|
||||
private final int num;
|
||||
|
||||
private Numbers(int n) {
|
||||
this.num = n;
|
||||
}
|
||||
|
||||
public int getNum() {
|
||||
return num;
|
||||
}
|
||||
}
|
||||
|
||||
public void check() {
|
||||
assertTrue(Numbers.ONE.getNum() == 1);
|
||||
assertTrue(Numbers.THREE.getNum() == 3);
|
||||
assertTrue(Numbers.FOUR.getNum() == 4);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
ClassNode cls = getClassNode(TestCls.class);
|
||||
String code = cls.getCode().toString();
|
||||
|
||||
assertThat(code, containsOne("ONE(1)"));
|
||||
// assertThat(code, containsOne("THREE(three)"));
|
||||
// assertThat(code, containsOne("assertTrue(Numbers.ONE.getNum() == 1);"));
|
||||
assertThat(code, containsOne("private Numbers(int n) {"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package jadx.tests.integration.inner;
|
||||
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.IntegrationTest;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static jadx.tests.api.utils.JadxMatchers.countString;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
public class TestRFieldAccess extends IntegrationTest {
|
||||
|
||||
public static class R {
|
||||
public static final class id {
|
||||
public static final int Button01 = 2131230730;
|
||||
}
|
||||
}
|
||||
|
||||
public static class TestR {
|
||||
public int test() {
|
||||
return R.id.Button01;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
ClassNode cls = getClassNode(TestRFieldAccess.class);
|
||||
String code = cls.getCode().toString();
|
||||
assertThat(code, countString(2, "return R.id.Button01;"));
|
||||
}
|
||||
}
|
||||
+14
-12
@@ -16,30 +16,32 @@ public class TestOverloadedMethodInvoke extends IntegrationTest {
|
||||
public static class TestCls {
|
||||
int c;
|
||||
|
||||
public void method(Throwable th) {
|
||||
public void method(Throwable th, int a) {
|
||||
c++;
|
||||
if (th != null) {
|
||||
c += 100;
|
||||
}
|
||||
c += a;
|
||||
}
|
||||
|
||||
public void method(Exception e) {
|
||||
public void method(Exception e, int a) {
|
||||
c += 1000;
|
||||
if (e != null) {
|
||||
c += 10000;
|
||||
}
|
||||
c += a;
|
||||
}
|
||||
|
||||
public void test(Throwable th, Exception e) {
|
||||
method(e);
|
||||
method(th);
|
||||
method((Throwable) e);
|
||||
method((Exception) th);
|
||||
method(e, 10);
|
||||
method(th, 100);
|
||||
method((Throwable) e, 1000);
|
||||
method((Exception) th, 10000);
|
||||
}
|
||||
|
||||
public void check() {
|
||||
test(null, new Exception());
|
||||
assertEquals(12102, c);
|
||||
assertEquals(23212, c);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,11 +50,11 @@ public class TestOverloadedMethodInvoke extends IntegrationTest {
|
||||
ClassNode cls = getClassNode(TestCls.class);
|
||||
String code = cls.getCode().toString();
|
||||
|
||||
assertThat(code, containsString("public void test(Throwable th, Exception e) {"));
|
||||
assertThat(code, containsOne("method(e);"));
|
||||
assertThat(code, containsOne("method(th);"));
|
||||
assertThat(code, containsOne("method((Throwable) e);"));
|
||||
assertThat(code, containsOne("method((Exception) th);"));
|
||||
assertThat(code, containsOne("public void test(Throwable th, Exception e) {"));
|
||||
assertThat(code, containsOne("method(e, 10);"));
|
||||
assertThat(code, containsOne("method(th, 100);"));
|
||||
assertThat(code, containsOne("method((Throwable) e, 1000);"));
|
||||
assertThat(code, containsOne("method((Exception) th, 10000);"));
|
||||
assertThat(code, not(containsString("(Exception) e")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package jadx.tests.integration.invoke;
|
||||
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.IntegrationTest;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static jadx.tests.api.utils.JadxMatchers.countString;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
public class TestSuperInvoke extends IntegrationTest {
|
||||
|
||||
public class A {
|
||||
public int a() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public class B extends A {
|
||||
@Override
|
||||
public int a() {
|
||||
return super.a() + 2;
|
||||
}
|
||||
|
||||
public int test() {
|
||||
return a();
|
||||
}
|
||||
}
|
||||
|
||||
public void check() {
|
||||
assertEquals(3, new B().test());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
noDebugInfo();
|
||||
ClassNode cls = getClassNode(TestSuperInvoke.class);
|
||||
String code = cls.getCode().toString();
|
||||
|
||||
assertThat(code, countString(2, "return super.a() + 2;"));
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package jadx.tests.smali;
|
||||
|
||||
import jadx.tests.api.SmaliTest;
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.SmaliTest;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package jadx.gui.update;
|
||||
import jadx.api.JadxDecompiler;
|
||||
import jadx.gui.update.data.Release;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.lang.reflect.Type;
|
||||
@@ -29,7 +30,8 @@ public class JadxUpdate {
|
||||
|
||||
private static final Gson GSON = new Gson();
|
||||
|
||||
private static final Type RELEASES_LIST_TYPE = new TypeToken<List<Release>>() {}.getType();
|
||||
private static final Type RELEASES_LIST_TYPE = new TypeToken<List<Release>>() {
|
||||
}.getType();
|
||||
|
||||
private static final Comparator<Release> RELEASE_COMPARATOR = new Comparator<Release>() {
|
||||
@Override
|
||||
@@ -38,12 +40,15 @@ public class JadxUpdate {
|
||||
}
|
||||
};
|
||||
|
||||
public static interface IUpdateCallback {
|
||||
public interface IUpdateCallback {
|
||||
void onUpdate(Release r);
|
||||
}
|
||||
|
||||
private JadxUpdate() {
|
||||
}
|
||||
|
||||
public static void check(final IUpdateCallback callback) {
|
||||
Runnable run = new Runnable() {
|
||||
Runnable run = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
@@ -62,7 +67,7 @@ public class JadxUpdate {
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private static Release checkForNewRelease() throws Exception {
|
||||
private static Release checkForNewRelease() throws IOException {
|
||||
String version = JadxDecompiler.getVersion();
|
||||
if (version.contains("dev")) {
|
||||
LOG.debug("Ignore check for update: development version");
|
||||
@@ -92,7 +97,7 @@ public class JadxUpdate {
|
||||
return latest;
|
||||
}
|
||||
|
||||
private static <T> T get(String url, Type type) throws Exception {
|
||||
private static <T> T get(String url, Type type) throws IOException {
|
||||
URL obj = new URL(url);
|
||||
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
|
||||
con.setRequestMethod("GET");
|
||||
|
||||
@@ -2,6 +2,9 @@ package jadx.gui.update;
|
||||
|
||||
public class VersionComparator {
|
||||
|
||||
private VersionComparator() {
|
||||
}
|
||||
|
||||
public static int checkAndCompare(String str1, String str2) {
|
||||
try {
|
||||
return compare(clean(str1), clean(str2));
|
||||
|
||||
@@ -4,98 +4,79 @@ import java.util.prefs.Preferences;
|
||||
|
||||
public class JadxPreferences {
|
||||
|
||||
private static final String KEY_LAST_OPEN_FILE_PATH = "lastOpenFilePath";
|
||||
private static final String KEY_LAST_SAVE_FILE_PATH = "lastSaveFilePath";
|
||||
private static final String KEY_FLATTEN_PACKAGE = "flattenPackage";
|
||||
|
||||
private static Preferences prefs = null;
|
||||
|
||||
public static String getLastOpenFilePath() {
|
||||
String result = "";
|
||||
|
||||
try {
|
||||
result = getPreferences().get(KEY_LAST_OPEN_FILE_PATH, "");
|
||||
|
||||
if (result.isEmpty())
|
||||
{
|
||||
if (result.isEmpty()) {
|
||||
result = System.getProperty("user.home");
|
||||
}
|
||||
}
|
||||
catch (Exception anyEx) {
|
||||
} catch (Exception anyEx) {
|
||||
/* do nothing, no preferences */
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void putLastOpenFilePath(String path) {
|
||||
try {
|
||||
Preferences prefs = getPreferences();
|
||||
|
||||
prefs.put(KEY_LAST_OPEN_FILE_PATH, path);
|
||||
prefs.sync();
|
||||
}
|
||||
catch (Exception anyEx) {
|
||||
} catch (Exception anyEx) {
|
||||
/* do nothing, no preferences */
|
||||
}
|
||||
}
|
||||
|
||||
public static String getLastSaveFilePath() {
|
||||
String result = "";
|
||||
|
||||
try {
|
||||
result = getPreferences().get(KEY_LAST_SAVE_FILE_PATH, "");
|
||||
if (result.isEmpty())
|
||||
{
|
||||
if (result.isEmpty()) {
|
||||
result = getLastOpenFilePath();
|
||||
}
|
||||
}
|
||||
catch (Exception anyEx) {
|
||||
} catch (Exception anyEx) {
|
||||
/* do nothing, no preferences */
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void putLastSaveFilePath(String path) {
|
||||
try {
|
||||
Preferences prefs = getPreferences();
|
||||
|
||||
prefs.put(KEY_LAST_SAVE_FILE_PATH, path);
|
||||
prefs.sync();
|
||||
}
|
||||
catch (Exception anyEx) {
|
||||
} catch (Exception anyEx) {
|
||||
/* do nothing, no preferences */
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean getFlattenPackage() {
|
||||
boolean result = false;
|
||||
|
||||
try {
|
||||
Preferences prefs = getPreferences();
|
||||
|
||||
result = prefs.getBoolean(KEY_FLATTEN_PACKAGE, false);
|
||||
}
|
||||
catch (Exception anyEx) {
|
||||
} catch (Exception anyEx) {
|
||||
/* do nothing, no preferences */
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void putFlattenPackage(boolean value) {
|
||||
try {
|
||||
Preferences prefs = getPreferences();
|
||||
|
||||
prefs.putBoolean(KEY_FLATTEN_PACKAGE, value);
|
||||
prefs.sync();
|
||||
}
|
||||
catch (Exception anyEx) {
|
||||
} catch (Exception anyEx) {
|
||||
/* do nothing, no preferences */
|
||||
}
|
||||
}
|
||||
|
||||
private static final String KEY_LAST_OPEN_FILE_PATH = "lastOpenFilePath";
|
||||
private static final String KEY_LAST_SAVE_FILE_PATH = "lastSaveFilePath";
|
||||
private static final String KEY_FLATTEN_PACKAGE = "flattenPackage";
|
||||
|
||||
private static Preferences prefs = null;
|
||||
|
||||
private static Preferences getPreferences() {
|
||||
if (prefs == null) {
|
||||
prefs = Preferences.userRoot();
|
||||
|
||||
@@ -12,9 +12,14 @@ import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static java.awt.Desktop.Action;
|
||||
|
||||
public class Link extends JLabel implements MouseListener {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(JLabel.class);
|
||||
|
||||
private String url;
|
||||
|
||||
public Link(String text, String url) {
|
||||
@@ -42,10 +47,12 @@ public class Link extends JLabel implements MouseListener {
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent arg0) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent arg0) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
private void browse() {
|
||||
@@ -56,9 +63,9 @@ public class Link extends JLabel implements MouseListener {
|
||||
desktop.browse(new java.net.URI(url));
|
||||
return;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
LOG.debug("Open url error", e);
|
||||
} catch (URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
LOG.debug("Open url error", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,13 +85,13 @@ public class Link extends JLabel implements MouseListener {
|
||||
return;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
LOG.debug("Open url error", e);
|
||||
}
|
||||
showUrlDialog();
|
||||
}
|
||||
|
||||
private void showUrlDialog() {
|
||||
JTextArea urlArea = new JTextArea("Can't open browser. Please browse to:\n"+url);
|
||||
JTextArea urlArea = new JTextArea("Can't open browser. Please browse to:\n" + url);
|
||||
JOptionPane.showMessageDialog(null, urlArea);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package jadx.gui.treemodel;
|
||||
|
||||
import jadx.api.JadxDecompiler;
|
||||
import jadx.api.Factory;
|
||||
import jadx.api.IJadxArgs;
|
||||
import jadx.api.JadxDecompiler;
|
||||
import jadx.api.JavaClass;
|
||||
import jadx.api.JavaPackage;
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
|
||||
Reference in New Issue
Block a user