diff --git a/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java index 2a1dc75dd..977728ac6 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java @@ -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()) { diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index 8b63b946e..9d3b36610 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -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 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 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) { diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index 4efa6750a..bd43ba626 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -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 state = EnumSet.noneOf(Flags.class); + Set 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 state) throws CodegenException { + private void makeInsnBody(CodeWriter code, InsnNode insn, Set 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 state) throws CodegenException { + private void makeTernary(TernaryInsn insn, CodeWriter code, Set 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 state) throws CodegenException { + private void makeArith(ArithNode insn, CodeWriter code, Set state) throws CodegenException { if (insn.contains(AFlag.ARITH_ONEARG)) { makeArithOneArg(insn, code); return; diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index 3e34b23f5..caca7aa28 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -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)) { diff --git a/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java b/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java index cb1cf34b2..6c6b448b2 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java @@ -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) { diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java index 13eb2dd9b..0a5c3a7ae 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java @@ -32,6 +32,10 @@ public class AnnotationsList implements IAttribute { return map.size(); } + public boolean isEmpty() { + return map.isEmpty(); + } + @Override public AType getType() { return AType.ANNOTATION_LIST; diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java index f745014d1..a0eccdcf7 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java @@ -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; diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java index 791107a34..13651c9a0 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java @@ -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 diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java index 42d59127a..3c8d50098 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java @@ -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; } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index 03bb78a00..540f92cbd 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -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; } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java index 64eae94d2..47383c50f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java @@ -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); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java index 59068804b..d9be53818 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java @@ -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 true if local variable was active, else false @@ -81,7 +80,6 @@ final class LocalVar { this.endAddr = addr; return true; } - return false; } diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfInfo.java b/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfInfo.java index e0a18cf2b..d448f0634 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/conditions/IfInfo.java @@ -28,7 +28,7 @@ public final class IfInfo { } private IfInfo(IfCondition condition, BlockNode thenBlock, BlockNode elseBlock, - Set mergedBlocks, Set skipBlocks) { + Set mergedBlocks, Set skipBlocks) { this.condition = condition; this.thenBlock = thenBlock; this.elseBlock = elseBlock; diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java b/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java index d0c07d037..3cd3fed14 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java @@ -126,7 +126,6 @@ public final class LoopRegion extends AbstractRegion { } } - public LoopType getType() { return type; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java index f03fd1a5c..50c9dca65 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java @@ -125,7 +125,7 @@ public class ClassModifier extends AbstractVisitor { List 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 blocks) { for (BlockNode block : blocks) { - if (block.getInstructions().size() != 0) { + if (!block.getInstructions().isEmpty()) { return false; } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java index 84d6ff98e..931b4eedf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java @@ -55,7 +55,7 @@ public class CodeShrinker extends AbstractVisitor { } public static List getArgs(InsnNode insn) { - LinkedList args = new LinkedList(); + List args = new LinkedList(); 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 wrapList = new ArrayList(); for (ArgsInfo argsInfo : argsList) { List args = argsInfo.getArgs(); - for (ListIterator it = args.listIterator(args.size()); it.hasPrevious(); ) { + ListIterator 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++; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java index bbf4b6a99..acdd7d76c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java @@ -150,7 +150,7 @@ public class ConstInlinerVisitor extends AbstractVisitor { InvokeNode inv = (InvokeNode) insn; List 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()) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java index 1f6db45f9..92f9d1993 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java @@ -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++) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java index e6ed2a8d4..e539490cf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java @@ -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 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(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ReSugarCode.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ReSugarCode.java index 7d86b32db..b670cf746 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ReSugarCode.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ReSugarCode.java @@ -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; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java index a6a50da70..752c8dfa2 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java @@ -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; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java index 4c6db199a..8321763b4 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java @@ -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; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java index 322dc194e..ed11de8f6 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java @@ -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; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ReturnVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ReturnVisitor.java index 6664e9c95..0aa63ad78 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ReturnVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ReturnVisitor.java @@ -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; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java index 26d7fbd4d..a1af402b9 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/TernaryMod.java @@ -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; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java index 9276a4d68..4e026df38 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java @@ -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) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/SelectTypeVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/SelectTypeVisitor.java index c78c6b5ef..b7379dbf9 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/SelectTypeVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/SelectTypeVisitor.java @@ -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()) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInference.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInference.java index a7883948f..a9313974a 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInference.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInference.java @@ -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); diff --git a/jadx-core/src/main/java/jadx/core/utils/ErrorsCounter.java b/jadx-core/src/main/java/jadx/core/utils/ErrorsCounter.java index 882d88668..e4c2d3c52 100644 --- a/jadx-core/src/main/java/jadx/core/utils/ErrorsCounter.java +++ b/jadx-core/src/main/java/jadx/core/utils/ErrorsCounter.java @@ -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); } diff --git a/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java b/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java index 26264de16..77b9206be 100644 --- a/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/RegionUtils.java @@ -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()) { diff --git a/jadx-core/src/test/groovy/jadx/tests/TestAPI.groovy b/jadx-core/src/test/groovy/jadx/tests/TestAPI.groovy index 48c4d042d..8e4208355 100644 --- a/jadx-core/src/test/groovy/jadx/tests/TestAPI.groovy +++ b/jadx-core/src/test/groovy/jadx/tests/TestAPI.groovy @@ -1,4 +1,5 @@ package jadx.tests + import jadx.api.IJadxArgs import jadx.api.JadxDecompiler import jadx.core.utils.exceptions.JadxException diff --git a/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java new file mode 100644 index 000000000..45c04075f --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums3.java @@ -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) {")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java new file mode 100644 index 000000000..3e55fa636 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestRFieldAccess.java @@ -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;")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java index 7d9ec516e..725adda22 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestOverloadedMethodInvoke.java @@ -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"))); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java new file mode 100644 index 000000000..9fb73847e --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvoke.java @@ -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;")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java b/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java index cb8a0e2b7..3a586a504 100644 --- a/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java +++ b/jadx-core/src/test/java/jadx/tests/smali/TestConstructor.java @@ -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; diff --git a/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.java b/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.java index 8952747c7..906c6951c 100644 --- a/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.java +++ b/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.java @@ -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>() {}.getType(); + private static final Type RELEASES_LIST_TYPE = new TypeToken>() { + }.getType(); private static final Comparator RELEASE_COMPARATOR = new Comparator() { @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 get(String url, Type type) throws Exception { + private static T get(String url, Type type) throws IOException { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); diff --git a/jadx-gui/src/main/java/jadx/gui/update/VersionComparator.java b/jadx-gui/src/main/java/jadx/gui/update/VersionComparator.java index 7a717bd2e..a6dc209ea 100644 --- a/jadx-gui/src/main/java/jadx/gui/update/VersionComparator.java +++ b/jadx-gui/src/main/java/jadx/gui/update/VersionComparator.java @@ -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)); diff --git a/jadx-gui/src/main/java/jadx/gui/utils/JadxPreferences.java b/jadx-gui/src/main/java/jadx/gui/utils/JadxPreferences.java index beb47c24c..1d84c4cc2 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/JadxPreferences.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/JadxPreferences.java @@ -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(); diff --git a/jadx-gui/src/main/java/jadx/gui/utils/Link.java b/jadx-gui/src/main/java/jadx/gui/utils/Link.java index a7f83653a..033b59e93 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/Link.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/Link.java @@ -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); } } diff --git a/jadx-gui/src/test/java/jadx/gui/treemodel/JRootTest.java b/jadx-gui/src/test/java/jadx/gui/treemodel/JRootTest.java index c3142097c..7e82957c4 100644 --- a/jadx-gui/src/test/java/jadx/gui/treemodel/JRootTest.java +++ b/jadx-gui/src/test/java/jadx/gui/treemodel/JRootTest.java @@ -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;