├── .editorconfig ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── NOTICE ├── README.md ├── SECURITY.md ├── assets ├── 0.png ├── 1.png ├── 2.png └── 3.png ├── build.gradle ├── buildSrc ├── build.gradle └── src │ └── main │ └── groovy │ └── jadx-library.gradle ├── config ├── checkstyle │ └── checkstyle.xml ├── code-formatter │ ├── eclipse.importorder │ └── eclipse.xml └── jflex │ ├── .gitignore │ ├── README.md │ ├── SmaliTokenMaker.flex │ └── skeleton.default ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── jadx-cli ├── build.gradle └── src │ ├── main │ ├── java │ │ └── jadx │ │ │ └── cli │ │ │ ├── JCommanderWrapper.java │ │ │ ├── JadxCLI.java │ │ │ ├── JadxCLIArgs.java │ │ │ ├── LogHelper.java │ │ │ ├── SingleClassMode.java │ │ │ ├── clst │ │ │ └── ConvertToClsSet.java │ │ │ └── tools │ │ │ └── ConvertArscFile.java │ └── resources │ │ └── logback.xml │ └── test │ ├── java │ └── jadx │ │ └── cli │ │ ├── JadxCLIArgsTest.java │ │ ├── RenameConverterTest.java │ │ └── TestInput.java │ └── resources │ └── samples │ ├── HelloWorld.class │ ├── HelloWorld.smali │ ├── hello.dex │ └── resources-only.apk ├── jadx-core ├── build.gradle └── src │ ├── main │ ├── java │ │ └── jadx │ │ │ ├── api │ │ │ ├── CommentsLevel.java │ │ │ ├── DecompilationMode.java │ │ │ ├── ICodeCache.java │ │ │ ├── ICodeInfo.java │ │ │ ├── ICodeWriter.java │ │ │ ├── IDecompileScheduler.java │ │ │ ├── JadxArgs.java │ │ │ ├── JadxArgsValidator.java │ │ │ ├── JadxDecompiler.java │ │ │ ├── JavaClass.java │ │ │ ├── JavaField.java │ │ │ ├── JavaMethod.java │ │ │ ├── JavaNode.java │ │ │ ├── JavaPackage.java │ │ │ ├── JavaVariable.java │ │ │ ├── ResourceFile.java │ │ │ ├── ResourceFileContent.java │ │ │ ├── ResourceType.java │ │ │ ├── ResourcesLoader.java │ │ │ ├── args │ │ │ │ ├── DeobfuscationMapFileMode.java │ │ │ │ └── ResourceNameSource.java │ │ │ ├── data │ │ │ │ ├── CodeRefType.java │ │ │ │ ├── ICodeComment.java │ │ │ │ ├── ICodeData.java │ │ │ │ ├── ICodeRename.java │ │ │ │ ├── IJavaCodeRef.java │ │ │ │ ├── IJavaNodeRef.java │ │ │ │ └── impl │ │ │ │ │ ├── JadxCodeComment.java │ │ │ │ │ ├── JadxCodeData.java │ │ │ │ │ ├── JadxCodeRef.java │ │ │ │ │ ├── JadxCodeRename.java │ │ │ │ │ └── JadxNodeRef.java │ │ │ ├── impl │ │ │ │ ├── AnnotatedCodeInfo.java │ │ │ │ ├── AnnotatedCodeWriter.java │ │ │ │ ├── DelegateCodeCache.java │ │ │ │ ├── InMemoryCodeCache.java │ │ │ │ ├── NoOpCodeCache.java │ │ │ │ ├── SimpleCodeInfo.java │ │ │ │ └── SimpleCodeWriter.java │ │ │ ├── metadata │ │ │ │ ├── ICodeAnnotation.java │ │ │ │ ├── ICodeMetadata.java │ │ │ │ ├── ICodeNodeRef.java │ │ │ │ ├── annotations │ │ │ │ │ ├── InsnCodeOffset.java │ │ │ │ │ ├── NodeDeclareRef.java │ │ │ │ │ ├── NodeEnd.java │ │ │ │ │ ├── VarNode.java │ │ │ │ │ └── VarRef.java │ │ │ │ └── impl │ │ │ │ │ └── CodeMetadataStorage.java │ │ │ └── utils │ │ │ │ └── CodeUtils.java │ │ │ └── core │ │ │ ├── Consts.java │ │ │ ├── Jadx.java │ │ │ ├── ProcessClass.java │ │ │ ├── clsp │ │ │ ├── ClsSet.java │ │ │ ├── ClspClass.java │ │ │ ├── ClspGraph.java │ │ │ ├── ClspMethod.java │ │ │ └── SimpleMethodDetails.java │ │ │ ├── codegen │ │ │ ├── AnnotationGen.java │ │ │ ├── ClassGen.java │ │ │ ├── CodeGen.java │ │ │ ├── ConditionGen.java │ │ │ ├── InsnGen.java │ │ │ ├── MethodGen.java │ │ │ ├── NameGen.java │ │ │ ├── RegionGen.java │ │ │ ├── SimpleModeHelper.java │ │ │ ├── TypeGen.java │ │ │ └── json │ │ │ │ ├── JsonCodeGen.java │ │ │ │ ├── JsonMappingGen.java │ │ │ │ ├── cls │ │ │ │ ├── JsonClass.java │ │ │ │ ├── JsonCodeLine.java │ │ │ │ ├── JsonField.java │ │ │ │ ├── JsonMethod.java │ │ │ │ └── JsonNode.java │ │ │ │ └── mapping │ │ │ │ ├── JsonClsMapping.java │ │ │ │ ├── JsonFieldMapping.java │ │ │ │ ├── JsonMapping.java │ │ │ │ └── JsonMthMapping.java │ │ │ ├── deobf │ │ │ ├── ClsAliasPair.java │ │ │ ├── DeobfClsInfo.java │ │ │ ├── DeobfPresets.java │ │ │ ├── Deobfuscator.java │ │ │ ├── NameMapper.java │ │ │ ├── PackageNode.java │ │ │ └── TldHelper.java │ │ │ ├── dex │ │ │ ├── attributes │ │ │ │ ├── AFlag.java │ │ │ │ ├── AType.java │ │ │ │ ├── AttrList.java │ │ │ │ ├── AttrNode.java │ │ │ │ ├── AttributeStorage.java │ │ │ │ ├── EmptyAttrStorage.java │ │ │ │ ├── FieldInitInsnAttr.java │ │ │ │ ├── IAttributeNode.java │ │ │ │ ├── ILineAttributeNode.java │ │ │ │ └── nodes │ │ │ │ │ ├── AnonymousClassAttr.java │ │ │ │ │ ├── ClassTypeVarsAttr.java │ │ │ │ │ ├── DeclareVariablesAttr.java │ │ │ │ │ ├── EdgeInsnAttr.java │ │ │ │ │ ├── EnumClassAttr.java │ │ │ │ │ ├── EnumMapAttr.java │ │ │ │ │ ├── FieldReplaceAttr.java │ │ │ │ │ ├── ForceReturnAttr.java │ │ │ │ │ ├── GenericInfoAttr.java │ │ │ │ │ ├── InlinedAttr.java │ │ │ │ │ ├── JadxCommentsAttr.java │ │ │ │ │ ├── JadxError.java │ │ │ │ │ ├── JumpInfo.java │ │ │ │ │ ├── LineAttrNode.java │ │ │ │ │ ├── LocalVarsDebugInfoAttr.java │ │ │ │ │ ├── LoopInfo.java │ │ │ │ │ ├── LoopLabelAttr.java │ │ │ │ │ ├── MethodBridgeAttr.java │ │ │ │ │ ├── MethodInlineAttr.java │ │ │ │ │ ├── MethodOverrideAttr.java │ │ │ │ │ ├── MethodReplaceAttr.java │ │ │ │ │ ├── MethodTypeVarsAttr.java │ │ │ │ │ ├── NotificationAttrNode.java │ │ │ │ │ ├── PhiListAttr.java │ │ │ │ │ ├── RegDebugInfoAttr.java │ │ │ │ │ ├── RenameReasonAttr.java │ │ │ │ │ ├── SkipMethodArgsAttr.java │ │ │ │ │ ├── SpecialEdgeAttr.java │ │ │ │ │ └── TmpEdgeAttr.java │ │ │ ├── info │ │ │ │ ├── AccessInfo.java │ │ │ │ ├── ClassAliasInfo.java │ │ │ │ ├── ClassInfo.java │ │ │ │ ├── ConstStorage.java │ │ │ │ ├── FieldInfo.java │ │ │ │ ├── InfoStorage.java │ │ │ │ └── MethodInfo.java │ │ │ ├── instructions │ │ │ │ ├── ArithNode.java │ │ │ │ ├── ArithOp.java │ │ │ │ ├── BaseInvokeNode.java │ │ │ │ ├── ConstClassNode.java │ │ │ │ ├── ConstStringNode.java │ │ │ │ ├── FillArrayData.java │ │ │ │ ├── FillArrayInsn.java │ │ │ │ ├── FilledNewArrayNode.java │ │ │ │ ├── GotoNode.java │ │ │ │ ├── IfNode.java │ │ │ │ ├── IfOp.java │ │ │ │ ├── IndexInsnNode.java │ │ │ │ ├── InsnDecoder.java │ │ │ │ ├── InsnType.java │ │ │ │ ├── InvokeCustomBuilder.java │ │ │ │ ├── InvokeCustomNode.java │ │ │ │ ├── InvokeNode.java │ │ │ │ ├── InvokePolymorphicNode.java │ │ │ │ ├── InvokeType.java │ │ │ │ ├── NewArrayNode.java │ │ │ │ ├── PhiInsn.java │ │ │ │ ├── SwitchData.java │ │ │ │ ├── SwitchInsn.java │ │ │ │ ├── TargetInsnNode.java │ │ │ │ ├── args │ │ │ │ │ ├── ArgType.java │ │ │ │ │ ├── CodeVar.java │ │ │ │ │ ├── InsnArg.java │ │ │ │ │ ├── InsnWrapArg.java │ │ │ │ │ ├── LiteralArg.java │ │ │ │ │ ├── Named.java │ │ │ │ │ ├── NamedArg.java │ │ │ │ │ ├── PrimitiveType.java │ │ │ │ │ ├── RegisterArg.java │ │ │ │ │ ├── SSAVar.java │ │ │ │ │ ├── Typed.java │ │ │ │ │ └── VarName.java │ │ │ │ ├── invokedynamic │ │ │ │ │ ├── CustomLambdaCall.java │ │ │ │ │ └── CustomStringConcat.java │ │ │ │ └── mods │ │ │ │ │ ├── ConstructorInsn.java │ │ │ │ │ └── TernaryInsn.java │ │ │ ├── nodes │ │ │ │ ├── BlockNode.java │ │ │ │ ├── ClassNode.java │ │ │ │ ├── Edge.java │ │ │ │ ├── FieldNode.java │ │ │ │ ├── IBlock.java │ │ │ │ ├── IBranchRegion.java │ │ │ │ ├── ICodeDataUpdateListener.java │ │ │ │ ├── ICodeNode.java │ │ │ │ ├── IConditionRegion.java │ │ │ │ ├── IContainer.java │ │ │ │ ├── IDexNode.java │ │ │ │ ├── ILoadable.java │ │ │ │ ├── IMethodDetails.java │ │ │ │ ├── IRegion.java │ │ │ │ ├── IUsageInfoNode.java │ │ │ │ ├── InsnContainer.java │ │ │ │ ├── InsnNode.java │ │ │ │ ├── LoadStage.java │ │ │ │ ├── MethodNode.java │ │ │ │ ├── ProcessState.java │ │ │ │ ├── RootNode.java │ │ │ │ ├── parser │ │ │ │ │ └── SignatureParser.java │ │ │ │ └── utils │ │ │ │ │ ├── MethodUtils.java │ │ │ │ │ └── TypeUtils.java │ │ │ ├── regions │ │ │ │ ├── AbstractRegion.java │ │ │ │ ├── Region.java │ │ │ │ ├── SwitchRegion.java │ │ │ │ ├── SynchronizedRegion.java │ │ │ │ ├── TryCatchRegion.java │ │ │ │ ├── conditions │ │ │ │ │ ├── Compare.java │ │ │ │ │ ├── ConditionRegion.java │ │ │ │ │ ├── IfCondition.java │ │ │ │ │ ├── IfInfo.java │ │ │ │ │ └── IfRegion.java │ │ │ │ └── loops │ │ │ │ │ ├── ForEachLoop.java │ │ │ │ │ ├── ForLoop.java │ │ │ │ │ ├── LoopRegion.java │ │ │ │ │ └── LoopType.java │ │ │ ├── trycatch │ │ │ │ ├── CatchAttr.java │ │ │ │ ├── ExcHandlerAttr.java │ │ │ │ ├── ExceptionHandler.java │ │ │ │ └── TryCatchBlockAttr.java │ │ │ └── visitors │ │ │ │ ├── AbstractVisitor.java │ │ │ │ ├── AnonymousClassVisitor.java │ │ │ │ ├── AttachCommentsVisitor.java │ │ │ │ ├── AttachMethodDetails.java │ │ │ │ ├── AttachTryCatchVisitor.java │ │ │ │ ├── CheckCode.java │ │ │ │ ├── ClassModifier.java │ │ │ │ ├── ConstInlineVisitor.java │ │ │ │ ├── ConstructorVisitor.java │ │ │ │ ├── DeboxingVisitor.java │ │ │ │ ├── DepthTraversal.java │ │ │ │ ├── DotGraphVisitor.java │ │ │ │ ├── EnumVisitor.java │ │ │ │ ├── ExtractFieldInit.java │ │ │ │ ├── FallbackModeVisitor.java │ │ │ │ ├── FixAccessModifiers.java │ │ │ │ ├── GenericTypesVisitor.java │ │ │ │ ├── IDexTreeVisitor.java │ │ │ │ ├── InitCodeVariables.java │ │ │ │ ├── InlineMethods.java │ │ │ │ ├── JadxVisitor.java │ │ │ │ ├── MarkMethodsForInline.java │ │ │ │ ├── MethodInvokeVisitor.java │ │ │ │ ├── MethodVisitor.java │ │ │ │ ├── ModVisitor.java │ │ │ │ ├── MoveInlineVisitor.java │ │ │ │ ├── OverrideMethodVisitor.java │ │ │ │ ├── PrepareForCodeGen.java │ │ │ │ ├── ProcessAnonymous.java │ │ │ │ ├── ProcessInstructionsVisitor.java │ │ │ │ ├── ProcessMethodsForInline.java │ │ │ │ ├── ReSugarCode.java │ │ │ │ ├── SaveCode.java │ │ │ │ ├── ShadowFieldVisitor.java │ │ │ │ ├── SignatureProcessor.java │ │ │ │ ├── SimplifyVisitor.java │ │ │ │ ├── blocks │ │ │ │ ├── BlockExceptionHandler.java │ │ │ │ ├── BlockProcessor.java │ │ │ │ ├── BlockSplitter.java │ │ │ │ ├── DominatorTree.java │ │ │ │ └── FixMultiEntryLoops.java │ │ │ │ ├── debuginfo │ │ │ │ ├── DebugInfoApplyVisitor.java │ │ │ │ └── DebugInfoAttachVisitor.java │ │ │ │ ├── finaly │ │ │ │ ├── FinallyExtractInfo.java │ │ │ │ ├── InsnsSlice.java │ │ │ │ └── MarkFinallyVisitor.java │ │ │ │ ├── kotlin │ │ │ │ └── ProcessKotlinInternals.java │ │ │ │ ├── methods │ │ │ │ └── MutableMethodDetails.java │ │ │ │ ├── regions │ │ │ │ ├── AbstractRegionVisitor.java │ │ │ │ ├── CheckRegions.java │ │ │ │ ├── CleanRegions.java │ │ │ │ ├── DepthRegionTraversal.java │ │ │ │ ├── IRegionIterativeVisitor.java │ │ │ │ ├── IRegionVisitor.java │ │ │ │ ├── IfMakerHelper.java │ │ │ │ ├── IfRegionVisitor.java │ │ │ │ ├── LoopRegionVisitor.java │ │ │ │ ├── ProcessTryCatchRegions.java │ │ │ │ ├── RegionMaker.java │ │ │ │ ├── RegionMakerVisitor.java │ │ │ │ ├── RegionStack.java │ │ │ │ ├── ReturnVisitor.java │ │ │ │ ├── TernaryMod.java │ │ │ │ ├── TracedRegionVisitor.java │ │ │ │ └── variables │ │ │ │ │ ├── CollectUsageRegionVisitor.java │ │ │ │ │ ├── ProcessVariables.java │ │ │ │ │ ├── UsePlace.java │ │ │ │ │ └── VarUsage.java │ │ │ │ ├── rename │ │ │ │ ├── CodeRenameVisitor.java │ │ │ │ ├── RenameVisitor.java │ │ │ │ └── UserRenames.java │ │ │ │ ├── shrink │ │ │ │ ├── ArgsInfo.java │ │ │ │ ├── CodeShrinkVisitor.java │ │ │ │ └── WrapInfo.java │ │ │ │ ├── ssa │ │ │ │ ├── LiveVarAnalysis.java │ │ │ │ ├── RenameState.java │ │ │ │ └── SSATransform.java │ │ │ │ ├── typeinference │ │ │ │ ├── AbstractTypeConstraint.java │ │ │ │ ├── BoundEnum.java │ │ │ │ ├── FinishTypeInference.java │ │ │ │ ├── ITypeBound.java │ │ │ │ ├── ITypeBoundDynamic.java │ │ │ │ ├── ITypeConstraint.java │ │ │ │ ├── ITypeListener.java │ │ │ │ ├── TypeBoundCheckCastAssign.java │ │ │ │ ├── TypeBoundConst.java │ │ │ │ ├── TypeBoundFieldGetAssign.java │ │ │ │ ├── TypeBoundInvokeAssign.java │ │ │ │ ├── TypeBoundInvokeUse.java │ │ │ │ ├── TypeCompare.java │ │ │ │ ├── TypeCompareEnum.java │ │ │ │ ├── TypeInferenceVisitor.java │ │ │ │ ├── TypeInfo.java │ │ │ │ ├── TypeSearch.java │ │ │ │ ├── TypeSearchState.java │ │ │ │ ├── TypeSearchVarInfo.java │ │ │ │ ├── TypeUpdate.java │ │ │ │ ├── TypeUpdateEntry.java │ │ │ │ ├── TypeUpdateFlags.java │ │ │ │ ├── TypeUpdateInfo.java │ │ │ │ ├── TypeUpdateRegistry.java │ │ │ │ └── TypeUpdateResult.java │ │ │ │ └── usage │ │ │ │ ├── UsageInfo.java │ │ │ │ ├── UsageInfoVisitor.java │ │ │ │ └── UseSet.java │ │ │ ├── export │ │ │ ├── ApplicationParams.java │ │ │ ├── ExportGradleProject.java │ │ │ └── TemplateFile.java │ │ │ ├── utils │ │ │ ├── BetterName.java │ │ │ ├── BlockInsnPair.java │ │ │ ├── BlockUtils.java │ │ │ ├── CacheStorage.java │ │ │ ├── CodeGenUtils.java │ │ │ ├── DebugChecks.java │ │ │ ├── DebugUtils.java │ │ │ ├── DecompilerScheduler.java │ │ │ ├── EmptyBitSet.java │ │ │ ├── EncodedValueUtils.java │ │ │ ├── ErrorsCounter.java │ │ │ ├── GsonUtils.java │ │ │ ├── ImmutableList.java │ │ │ ├── InsnList.java │ │ │ ├── InsnRemover.java │ │ │ ├── InsnUtils.java │ │ │ ├── ListUtils.java │ │ │ ├── RegionUtils.java │ │ │ ├── StringUtils.java │ │ │ ├── Utils.java │ │ │ ├── android │ │ │ │ ├── AndroidResourcesUtils.java │ │ │ │ ├── DataInputDelegate.java │ │ │ │ ├── ExtDataInput.java │ │ │ │ ├── Res9patchStreamDecoder.java │ │ │ │ └── TextResMapFile.java │ │ │ ├── exceptions │ │ │ │ ├── CodegenException.java │ │ │ │ ├── DecodeException.java │ │ │ │ ├── JadxArgsValidateException.java │ │ │ │ ├── JadxException.java │ │ │ │ ├── JadxOverflowException.java │ │ │ │ └── JadxRuntimeException.java │ │ │ ├── files │ │ │ │ └── FileUtils.java │ │ │ ├── input │ │ │ │ └── InsnDataUtils.java │ │ │ ├── kotlin │ │ │ │ └── KotlinMetadataUtils.java │ │ │ └── log │ │ │ │ └── LogUtils.java │ │ │ └── xmlgen │ │ │ ├── BinaryXMLParser.java │ │ │ ├── CommonBinaryParser.java │ │ │ ├── IResParser.java │ │ │ ├── ManifestAttributes.java │ │ │ ├── ParserConstants.java │ │ │ ├── ParserStream.java │ │ │ ├── ProtoXMLParser.java │ │ │ ├── ResContainer.java │ │ │ ├── ResDecoder.java │ │ │ ├── ResProtoParser.java │ │ │ ├── ResTableParser.java │ │ │ ├── ResXmlGen.java │ │ │ ├── ResourceStorage.java │ │ │ ├── ResourcesSaver.java │ │ │ ├── XMLChar.java │ │ │ ├── XmlDeobf.java │ │ │ ├── XmlGenUtils.java │ │ │ ├── XmlSecurity.java │ │ │ └── entry │ │ │ ├── EntryConfig.java │ │ │ ├── ProtoValue.java │ │ │ ├── RawNamedValue.java │ │ │ ├── RawValue.java │ │ │ ├── ResourceEntry.java │ │ │ └── ValuesParser.java │ └── resources │ │ ├── android │ │ ├── attrs.xml │ │ ├── attrs_manifest.xml │ │ └── res-map.txt │ │ ├── clst │ │ └── core.jcst │ │ ├── export │ │ ├── app.build.gradle.tmpl │ │ ├── build.gradle.tmpl │ │ └── settings.gradle.tmpl │ │ └── jadx │ │ └── core │ │ └── deobf │ │ └── tld_3.txt │ └── test │ ├── java │ └── jadx │ │ ├── NotYetImplemented.java │ │ ├── NotYetImplementedExtension.java │ │ ├── api │ │ ├── JadxArgsValidatorOutDirsTest.java │ │ ├── JadxDecompilerTest.java │ │ ├── JadxDecompilerTestUtils.java │ │ └── JadxInternalAccess.java │ │ ├── core │ │ ├── deobf │ │ │ └── NameMapperTest.java │ │ ├── dex │ │ │ ├── info │ │ │ │ └── AccessInfoTest.java │ │ │ ├── instructions │ │ │ │ └── args │ │ │ │ │ └── ArgTypeTest.java │ │ │ ├── nodes │ │ │ │ └── utils │ │ │ │ │ └── TypeUtilsTest.java │ │ │ └── visitors │ │ │ │ └── typeinference │ │ │ │ └── TypeCompareTest.java │ │ ├── utils │ │ │ ├── TestBetterName.java │ │ │ ├── TypeUtilsTest.java │ │ │ └── log │ │ │ │ └── LogUtilsTest.java │ │ └── xmlgen │ │ │ └── entry │ │ │ └── ValuesParserTest.java │ │ └── tests │ │ ├── api │ │ ├── ExportGradleTest.java │ │ ├── IntegrationTest.java │ │ ├── RaungTest.java │ │ ├── SmaliTest.java │ │ ├── compiler │ │ │ ├── ClassFileManager.java │ │ │ ├── CompilerOptions.java │ │ │ ├── DynamicClassLoader.java │ │ │ ├── EclipseCompilerUtils.java │ │ │ ├── JavaClassObject.java │ │ │ ├── JavaUtils.java │ │ │ ├── StringJavaFileObject.java │ │ │ └── TestCompiler.java │ │ ├── extensions │ │ │ └── profiles │ │ │ │ ├── JadxTestProfilesExtension.java │ │ │ │ ├── TestProfile.java │ │ │ │ └── TestWithProfiles.java │ │ └── utils │ │ │ ├── CountString.java │ │ │ ├── JadxMatchers.java │ │ │ ├── TestUtils.java │ │ │ └── assertj │ │ │ ├── JadxAssertions.java │ │ │ ├── JadxClassNodeAssertions.java │ │ │ ├── JadxCodeAssertions.java │ │ │ └── JadxCodeInfoAssertions.java │ │ ├── export │ │ └── OptionalTargetSdkVersion.java │ │ ├── external │ │ └── BaseExternalTest.java │ │ ├── functional │ │ ├── AttributeStorageTest.java │ │ ├── JadxClasspathTest.java │ │ ├── JadxVisitorsOrderTest.java │ │ ├── NameMapperTest.java │ │ ├── SignatureParserTest.java │ │ ├── StringUtilsTest.java │ │ ├── TemplateFileTest.java │ │ └── TestIfCondition.java │ │ └── integration │ │ ├── android │ │ ├── TestRFieldAccess.java │ │ ├── TestRFieldRestore.java │ │ ├── TestRFieldRestore2.java │ │ └── TestRFieldRestore3.java │ │ ├── annotations │ │ ├── TestAnnotations.java │ │ ├── TestAnnotations2.java │ │ ├── TestAnnotationsMix.java │ │ ├── TestAnnotationsRename.java │ │ ├── TestAnnotationsRenameDef.java │ │ └── TestParamAnnotations.java │ │ ├── arith │ │ ├── TestArith.java │ │ ├── TestArith2.java │ │ ├── TestArith3.java │ │ ├── TestArith4.java │ │ ├── TestArithConst.java │ │ ├── TestArithNot.java │ │ ├── TestFieldIncrement.java │ │ ├── TestFieldIncrement2.java │ │ ├── TestFieldIncrement3.java │ │ ├── TestPrimitivesNegate.java │ │ ├── TestSpecialValues.java │ │ ├── TestSpecialValues2.java │ │ └── TestXor.java │ │ ├── arrays │ │ ├── TestArrayFill.java │ │ ├── TestArrayFill2.java │ │ ├── TestArrayFill3.java │ │ ├── TestArrayFill4.java │ │ ├── TestArrayFillConstReplace.java │ │ ├── TestArrayFillWithMove.java │ │ ├── TestArrayInit.java │ │ ├── TestArrayInitField.java │ │ ├── TestArrays.java │ │ ├── TestArrays2.java │ │ ├── TestArrays3.java │ │ ├── TestArrays4.java │ │ ├── TestFillArrayData.java │ │ ├── TestMultiDimArrayFill.java │ │ └── TestRedundantType.java │ │ ├── conditions │ │ ├── TestBitwiseAnd.java │ │ ├── TestBitwiseOr.java │ │ ├── TestBooleanToByte.java │ │ ├── TestBooleanToChar.java │ │ ├── TestBooleanToDouble.java │ │ ├── TestBooleanToFloat.java │ │ ├── TestBooleanToInt.java │ │ ├── TestBooleanToInt2.java │ │ ├── TestBooleanToLong.java │ │ ├── TestBooleanToShort.java │ │ ├── TestCast.java │ │ ├── TestCmpOp.java │ │ ├── TestCmpOp2.java │ │ ├── TestComplexIf.java │ │ ├── TestComplexIf2.java │ │ ├── TestConditionInLoop.java │ │ ├── TestConditions.java │ │ ├── TestConditions10.java │ │ ├── TestConditions11.java │ │ ├── TestConditions12.java │ │ ├── TestConditions13.java │ │ ├── TestConditions14.java │ │ ├── TestConditions15.java │ │ ├── TestConditions16.java │ │ ├── TestConditions17.java │ │ ├── TestConditions18.java │ │ ├── TestConditions2.java │ │ ├── TestConditions21.java │ │ ├── TestConditions3.java │ │ ├── TestConditions4.java │ │ ├── TestConditions5.java │ │ ├── TestConditions6.java │ │ ├── TestConditions7.java │ │ ├── TestConditions8.java │ │ ├── TestConditions9.java │ │ ├── TestElseIf.java │ │ ├── TestElseIfCodeStyle.java │ │ ├── TestIfCodeStyle.java │ │ ├── TestInnerAssign.java │ │ ├── TestInnerAssign2.java │ │ ├── TestInnerAssign3.java │ │ ├── TestNestedIf.java │ │ ├── TestNestedIf2.java │ │ ├── TestSimpleConditions.java │ │ ├── TestTernary.java │ │ ├── TestTernary2.java │ │ ├── TestTernary3.java │ │ ├── TestTernary4.java │ │ ├── TestTernaryInIf.java │ │ ├── TestTernaryInIf2.java │ │ ├── TestTernaryOneBranchInConstructor.java │ │ └── TestTernaryOneBranchInConstructor2.java │ │ ├── debuginfo │ │ ├── TestLineNumbers.java │ │ ├── TestLineNumbers2.java │ │ ├── TestLineNumbers3.java │ │ ├── TestReturnSourceLine.java │ │ └── TestVariablesNames.java │ │ ├── deobf │ │ ├── TestDontRenameClspOverriddenMethod.java │ │ ├── TestFieldFromInnerClass.java │ │ ├── TestInheritedMethodRename.java │ │ ├── TestKotlinMetadata.java │ │ ├── TestMthRename.java │ │ ├── TestRenameOverriddenMethod.java │ │ ├── TestRenameOverriddenMethod2.java │ │ └── a │ │ │ └── TestNegativeRenameCondition.java │ │ ├── enums │ │ ├── TestEnumObfuscated.java │ │ ├── TestEnumWithConstInlining.java │ │ ├── TestEnumWithFields.java │ │ ├── TestEnums.java │ │ ├── TestEnums10.java │ │ ├── TestEnums2.java │ │ ├── TestEnums2a.java │ │ ├── TestEnums3.java │ │ ├── TestEnums4.java │ │ ├── TestEnums5.java │ │ ├── TestEnums6.java │ │ ├── TestEnums7.java │ │ ├── TestEnums8.java │ │ ├── TestEnums9.java │ │ ├── TestEnumsInterface.java │ │ ├── TestEnumsWithAssert.java │ │ ├── TestEnumsWithConsts.java │ │ ├── TestEnumsWithCustomInit.java │ │ ├── TestEnumsWithStaticFields.java │ │ ├── TestEnumsWithTernary.java │ │ ├── TestInnerEnums.java │ │ ├── TestSwitchOverEnum.java │ │ └── TestSwitchOverEnum2.java │ │ ├── fallback │ │ ├── TestFallbackManyNops.java │ │ └── TestFallbackMode.java │ │ ├── generics │ │ ├── MissingGenericsTypesTest.java │ │ ├── TestClassSignature.java │ │ ├── TestConstructorGenerics.java │ │ ├── TestGeneric8.java │ │ ├── TestGenericFields.java │ │ ├── TestGenerics.java │ │ ├── TestGenerics2.java │ │ ├── TestGenerics3.java │ │ ├── TestGenerics4.java │ │ ├── TestGenerics6.java │ │ ├── TestGenerics7.java │ │ ├── TestGenerics8.java │ │ ├── TestGenericsInArgs.java │ │ ├── TestGenericsMthOverride.java │ │ ├── TestImportGenericMap.java │ │ ├── TestMethodOverride.java │ │ ├── TestOuterGeneric.java │ │ ├── TestSyntheticOverride.java │ │ ├── TestTypeVarsFromOuterClass.java │ │ └── TestTypeVarsFromSuperClass.java │ │ ├── inline │ │ ├── TestConstInline.java │ │ ├── TestGetterInlineNegative.java │ │ ├── TestInline.java │ │ ├── TestInline2.java │ │ ├── TestInline3.java │ │ ├── TestInline6.java │ │ ├── TestInline7.java │ │ ├── TestIssue86.java │ │ ├── TestMethodInline.java │ │ ├── TestOverlapSyntheticMethods.java │ │ ├── TestOverrideBridgeMerge.java │ │ ├── TestSyntheticBridgeRename.java │ │ ├── TestSyntheticInline.java │ │ ├── TestSyntheticInline2.java │ │ ├── TestSyntheticInline3.java │ │ └── TestTernaryCast.java │ │ ├── inner │ │ ├── TestAnonymousClass.java │ │ ├── TestAnonymousClass10.java │ │ ├── TestAnonymousClass11.java │ │ ├── TestAnonymousClass12.java │ │ ├── TestAnonymousClass13.java │ │ ├── TestAnonymousClass14.java │ │ ├── TestAnonymousClass15.java │ │ ├── TestAnonymousClass16.java │ │ ├── TestAnonymousClass17.java │ │ ├── TestAnonymousClass18.java │ │ ├── TestAnonymousClass19.java │ │ ├── TestAnonymousClass2.java │ │ ├── TestAnonymousClass20.java │ │ ├── TestAnonymousClass3.java │ │ ├── TestAnonymousClass3a.java │ │ ├── TestAnonymousClass4.java │ │ ├── TestAnonymousClass5.java │ │ ├── TestAnonymousClass6.java │ │ ├── TestAnonymousClass7.java │ │ ├── TestAnonymousClass8.java │ │ ├── TestAnonymousClass9.java │ │ ├── TestIncorrectAnonymousClass.java │ │ ├── TestInner2Samples.java │ │ ├── TestInnerClass.java │ │ ├── TestInnerClass2.java │ │ ├── TestInnerClass3.java │ │ ├── TestInnerClass4.java │ │ ├── TestInnerClass5.java │ │ ├── TestInnerClassFakeSyntheticConstructor.java │ │ ├── TestInnerClassSyntheticConstructor.java │ │ ├── TestInnerClassSyntheticRename.java │ │ ├── TestNestedAnonymousClass.java │ │ ├── TestOuterConstructorCall.java │ │ ├── TestReplaceConstsInAnnotations.java │ │ ├── TestReplaceConstsInAnnotations2.java │ │ └── TestSyntheticMthRename.java │ │ ├── invoke │ │ ├── TestCastInOverloadedAccessor.java │ │ ├── TestCastInOverloadedInvoke.java │ │ ├── TestCastInOverloadedInvoke2.java │ │ ├── TestCastInOverloadedInvoke3.java │ │ ├── TestCastInOverloadedInvoke4.java │ │ ├── TestConstructorWithMoves.java │ │ ├── TestHierarchyOverloadedInvoke.java │ │ ├── TestInheritedStaticInvoke.java │ │ ├── TestInvoke1.java │ │ ├── TestInvokeInCatch.java │ │ ├── TestInvokeWithWideVars.java │ │ ├── TestOverloadedInvoke.java │ │ ├── TestOverloadedMethodInvoke.java │ │ ├── TestPolymorphicInvoke.java │ │ ├── TestPolymorphicRangeInvoke.java │ │ ├── TestSuperInvoke.java │ │ ├── TestSuperInvoke2.java │ │ ├── TestSuperInvokeUnknown.java │ │ ├── TestSuperInvokeWithGenerics.java │ │ ├── TestVarArg.java │ │ └── TestVarArg2.java │ │ ├── java8 │ │ ├── TestLambdaConstructor.java │ │ ├── TestLambdaExtVar.java │ │ ├── TestLambdaInArray.java │ │ ├── TestLambdaInstance.java │ │ ├── TestLambdaResugar.java │ │ └── TestLambdaStatic.java │ │ ├── loops │ │ ├── TestArrayForEach.java │ │ ├── TestArrayForEach2.java │ │ ├── TestArrayForEach3.java │ │ ├── TestArrayForEachNegative.java │ │ ├── TestBreakInComplexIf.java │ │ ├── TestBreakInComplexIf2.java │ │ ├── TestBreakInLoop.java │ │ ├── TestBreakInLoop2.java │ │ ├── TestBreakInLoop3.java │ │ ├── TestBreakWithLabel.java │ │ ├── TestComplexWhileLoop.java │ │ ├── TestContinueInLoop.java │ │ ├── TestDoWhileBreak.java │ │ ├── TestDoWhileBreak2.java │ │ ├── TestDoWhileBreak3.java │ │ ├── TestEndlessLoop.java │ │ ├── TestEndlessLoop2.java │ │ ├── TestIfInLoop2.java │ │ ├── TestIfInLoop3.java │ │ ├── TestIndexForLoop.java │ │ ├── TestIndexedLoop.java │ │ ├── TestIterableForEach.java │ │ ├── TestIterableForEach2.java │ │ ├── TestIterableForEach3.java │ │ ├── TestLoopCondition.java │ │ ├── TestLoopCondition2.java │ │ ├── TestLoopCondition3.java │ │ ├── TestLoopCondition4.java │ │ ├── TestLoopCondition5.java │ │ ├── TestLoopConditionInvoke.java │ │ ├── TestLoopDetection.java │ │ ├── TestLoopDetection2.java │ │ ├── TestLoopDetection3.java │ │ ├── TestLoopDetection4.java │ │ ├── TestLoopDetection5.java │ │ ├── TestLoopRestore.java │ │ ├── TestMultiEntryLoop.java │ │ ├── TestNestedLoops.java │ │ ├── TestNestedLoops2.java │ │ ├── TestNestedLoops3.java │ │ ├── TestNestedLoops4.java │ │ ├── TestNestedLoops5.java │ │ ├── TestNotIndexedLoop.java │ │ ├── TestSequentialLoops.java │ │ ├── TestSequentialLoops2.java │ │ ├── TestSynchronizedInEndlessLoop.java │ │ ├── TestTryCatchInLoop.java │ │ └── TestTryCatchInLoop2.java │ │ ├── names │ │ ├── TestCaseSensitiveChecks.java │ │ ├── TestClassNameWithInvalidChar.java │ │ ├── TestClassNamesCollision.java │ │ ├── TestClassNamesCollision2.java │ │ ├── TestCollisionWithJavaLangClasses.java │ │ ├── TestConstructorArgNames.java │ │ ├── TestDuplicateVarNames.java │ │ ├── TestDuplicatedNames.java │ │ ├── TestFieldCollideWithPackage.java │ │ ├── TestLocalVarCollideWithPackage.java │ │ ├── TestNameAssign2.java │ │ ├── TestReservedClassNames.java │ │ ├── TestReservedNames.java │ │ ├── TestReservedPackageNames.java │ │ ├── TestSameMethodsNames.java │ │ ├── pkg │ │ │ ├── a.java │ │ │ └── b.java │ │ └── pkg2 │ │ │ ├── System.java │ │ │ └── TestCls.java │ │ ├── others │ │ ├── TestAllNops.java │ │ ├── TestArgInline.java │ │ ├── TestBadMethodAccessModifiers.java │ │ ├── TestCastOfNull.java │ │ ├── TestClassGen.java │ │ ├── TestClassReGen.java │ │ ├── TestCodeComments.java │ │ ├── TestCodeComments2.java │ │ ├── TestCodeComments2a.java │ │ ├── TestCodeCommentsMultiline.java │ │ ├── TestCodeCommentsOverride.java │ │ ├── TestCodeMetadata.java │ │ ├── TestCodeMetadata2.java │ │ ├── TestConstReplace.java │ │ ├── TestConstStringConcat.java │ │ ├── TestConstructor.java │ │ ├── TestConstructorBranched.java │ │ ├── TestDeadBlockReferencesStart.java │ │ ├── TestDeboxing.java │ │ ├── TestDeboxing2.java │ │ ├── TestDeboxing3.java │ │ ├── TestDeboxing4.java │ │ ├── TestDefConstructorNotRemoved.java │ │ ├── TestDuplicateCast.java │ │ ├── TestExplicitOverride.java │ │ ├── TestFieldInit2.java │ │ ├── TestFieldInit3.java │ │ ├── TestFieldInitInTryCatch.java │ │ ├── TestFieldInitNegative.java │ │ ├── TestFieldInitOrder.java │ │ ├── TestFieldInitOrder2.java │ │ ├── TestFieldInitOrderStatic.java │ │ ├── TestFixClassAccessModifiers.java │ │ ├── TestFloatValue.java │ │ ├── TestIfInTry.java │ │ ├── TestIfTryInCatch.java │ │ ├── TestIncorrectMethodSignature.java │ │ ├── TestInlineVarArg.java │ │ ├── TestInsnsBeforeSuper.java │ │ ├── TestInsnsBeforeSuper2.java │ │ ├── TestInsnsBeforeThis.java │ │ ├── TestInterfaceDefaultMethod.java │ │ ├── TestIssue13a.java │ │ ├── TestIssue13b.java │ │ ├── TestJavaDupInsn.java │ │ ├── TestJavaSwap.java │ │ ├── TestJsonOutput.java │ │ ├── TestLoopInTry.java │ │ ├── TestMethodParametersAttribute.java │ │ ├── TestMoveInline.java │ │ ├── TestMultipleNOPs.java │ │ ├── TestN21.java │ │ ├── TestOverridePackagePrivateMethod.java │ │ ├── TestOverridePrivateMethod.java │ │ ├── TestOverrideStaticMethod.java │ │ ├── TestOverrideWithSameName.java │ │ ├── TestOverrideWithTwoBases.java │ │ ├── TestOverrideWithTwoBases2.java │ │ ├── TestPrimitiveCasts.java │ │ ├── TestRedundantBrackets.java │ │ ├── TestRedundantReturn.java │ │ ├── TestReturnWrapping.java │ │ ├── TestShadowingSuperMember.java │ │ ├── TestStaticFieldsInit.java │ │ ├── TestStaticMethod.java │ │ ├── TestStringBuilderElimination.java │ │ ├── TestStringBuilderElimination2.java │ │ ├── TestStringBuilderElimination3.java │ │ ├── TestStringBuilderElimination4Neg.java │ │ ├── TestStringConcatJava11.java │ │ ├── TestStringConcatWithoutResult.java │ │ ├── TestStringConstructor.java │ │ ├── TestSyntheticConstructor.java │ │ ├── TestWrongCode.java │ │ └── TestWrongCode2.java │ │ ├── rename │ │ ├── TestAnonymousInline.java │ │ ├── TestConstReplace.java │ │ ├── TestFieldWithGenericRename.java │ │ ├── TestRenameEnum.java │ │ └── TestUserRenames.java │ │ ├── switches │ │ ├── TestSwitch.java │ │ ├── TestSwitch2.java │ │ ├── TestSwitch3.java │ │ ├── TestSwitchBreak.java │ │ ├── TestSwitchContinue.java │ │ ├── TestSwitchFallThrough.java │ │ ├── TestSwitchInLoop.java │ │ ├── TestSwitchInLoop2.java │ │ ├── TestSwitchLabels.java │ │ ├── TestSwitchNoDefault.java │ │ ├── TestSwitchReturnFromCase.java │ │ ├── TestSwitchReturnFromCase2.java │ │ ├── TestSwitchSimple.java │ │ ├── TestSwitchWithFallThroughCase.java │ │ ├── TestSwitchWithFallThroughCase2.java │ │ ├── TestSwitchWithThrow.java │ │ └── TestSwitchWithTryCatch.java │ │ ├── synchronize │ │ ├── TestNestedSynchronize.java │ │ ├── TestSynchronized.java │ │ ├── TestSynchronized2.java │ │ ├── TestSynchronized3.java │ │ ├── TestSynchronized4.java │ │ ├── TestSynchronized5.java │ │ └── TestSynchronized6.java │ │ ├── trycatch │ │ ├── TestEmptyCatch.java │ │ ├── TestEmptyFinally.java │ │ ├── TestFinally.java │ │ ├── TestFinally2.java │ │ ├── TestFinally3.java │ │ ├── TestFinallyExtract.java │ │ ├── TestInlineInCatch.java │ │ ├── TestLoopInTryCatch.java │ │ ├── TestMultiExceptionCatch.java │ │ ├── TestMultiExceptionCatch2.java │ │ ├── TestMultiExceptionCatchSameJump.java │ │ ├── TestNestedTryCatch.java │ │ ├── TestNestedTryCatch2.java │ │ ├── TestNestedTryCatch3.java │ │ ├── TestNestedTryCatch4.java │ │ ├── TestTryAfterDeclaration.java │ │ ├── TestTryCatch.java │ │ ├── TestTryCatch2.java │ │ ├── TestTryCatch6.java │ │ ├── TestTryCatch7.java │ │ ├── TestTryCatch8.java │ │ ├── TestTryCatch9.java │ │ ├── TestTryCatchFinally.java │ │ ├── TestTryCatchFinally10.java │ │ ├── TestTryCatchFinally11.java │ │ ├── TestTryCatchFinally12.java │ │ ├── TestTryCatchFinally13.java │ │ ├── TestTryCatchFinally14.java │ │ ├── TestTryCatchFinally15.java │ │ ├── TestTryCatchFinally2.java │ │ ├── TestTryCatchFinally3.java │ │ ├── TestTryCatchFinally4.java │ │ ├── TestTryCatchFinally5.java │ │ ├── TestTryCatchFinally6.java │ │ ├── TestTryCatchFinally7.java │ │ ├── TestTryCatchFinally8.java │ │ ├── TestTryCatchFinally9.java │ │ ├── TestTryCatchInIf.java │ │ ├── TestTryCatchLastInsn.java │ │ ├── TestTryCatchMultiException.java │ │ ├── TestTryCatchMultiException2.java │ │ ├── TestTryCatchNoMoveExc.java │ │ ├── TestTryCatchNoMoveExc2.java │ │ ├── TestTryCatchStartOnMove.java │ │ ├── TestTryWithEmptyCatch.java │ │ ├── TestTryWithEmptyCatchTriple.java │ │ └── TestTryWithResources.java │ │ ├── types │ │ ├── TestArrayTypes.java │ │ ├── TestConstInline.java │ │ ├── TestConstTypeInference.java │ │ ├── TestFieldAccess.java │ │ ├── TestFieldCast.java │ │ ├── TestGenerics.java │ │ ├── TestGenerics2.java │ │ ├── TestGenerics3.java │ │ ├── TestGenerics4.java │ │ ├── TestGenerics5.java │ │ ├── TestGenerics6.java │ │ ├── TestGenerics7.java │ │ ├── TestGenericsInFullInnerCls.java │ │ ├── TestPrimitiveConversion.java │ │ ├── TestPrimitiveConversion2.java │ │ ├── TestPrimitivesInIf.java │ │ ├── TestTypeInheritance.java │ │ ├── TestTypeResolver.java │ │ ├── TestTypeResolver10.java │ │ ├── TestTypeResolver11.java │ │ ├── TestTypeResolver12.java │ │ ├── TestTypeResolver13.java │ │ ├── TestTypeResolver14.java │ │ ├── TestTypeResolver15.java │ │ ├── TestTypeResolver16.java │ │ ├── TestTypeResolver17.java │ │ ├── TestTypeResolver18.java │ │ ├── TestTypeResolver19.java │ │ ├── TestTypeResolver2.java │ │ ├── TestTypeResolver20.java │ │ ├── TestTypeResolver21.java │ │ ├── TestTypeResolver22.java │ │ ├── TestTypeResolver23.java │ │ ├── TestTypeResolver3.java │ │ ├── TestTypeResolver4.java │ │ ├── TestTypeResolver5.java │ │ ├── TestTypeResolver6.java │ │ ├── TestTypeResolver6a.java │ │ ├── TestTypeResolver7.java │ │ ├── TestTypeResolver8.java │ │ └── TestTypeResolver9.java │ │ ├── usethis │ │ ├── TestDontInlineThis.java │ │ ├── TestInlineThis.java │ │ ├── TestInlineThis2.java │ │ └── TestRedundantThis.java │ │ └── variables │ │ ├── TestVariables2.java │ │ ├── TestVariables3.java │ │ ├── TestVariables4.java │ │ ├── TestVariables5.java │ │ ├── TestVariables6.java │ │ ├── TestVariablesDeclAnnotation.java │ │ ├── TestVariablesDefinitions.java │ │ ├── TestVariablesDefinitions2.java │ │ ├── TestVariablesGeneric.java │ │ ├── TestVariablesIfElseChain.java │ │ ├── TestVariablesInInlinedAssign.java │ │ ├── TestVariablesInLoop.java │ │ └── TestVariablesUsageWithLoops.java │ ├── manifest │ ├── OptionalTargetSdkVersion.xml │ └── strings.xml │ ├── raung │ └── others │ │ ├── TestJavaSwap.raung │ │ └── TestStringConcatJava11.raung │ ├── resources │ ├── logback.xml │ ├── mockito-extensions │ │ └── org.mockito.plugins.MockMaker │ └── test-samples │ │ ├── app-with-fake-dex.apk │ │ └── hello.dex │ └── smali │ ├── arith │ ├── TestArithConst.smali │ ├── TestArithNot.smali │ └── TestXor.smali │ ├── arrays │ ├── TestArrayFillWithMove │ │ └── TestCls.smali │ └── TestFillArrayData │ │ └── TestCls.smali │ ├── conditions │ ├── TestBooleanToByte.smali │ ├── TestBooleanToChar.smali │ ├── TestBooleanToDouble.smali │ ├── TestBooleanToFloat.smali │ ├── TestBooleanToInt.smali │ ├── TestBooleanToInt2.smali │ ├── TestBooleanToLong.smali │ ├── TestBooleanToShort.smali │ ├── TestComplexIf.smali │ ├── TestComplexIf2.smali │ ├── TestConditions18.smali │ ├── TestConditions21.smali │ ├── TestIfCodeStyle.smali │ ├── TestInnerAssign3.smali │ ├── TestTernary4.smali │ ├── TestTernaryInIf2.smali │ └── TestTernaryOneBranchInConstructor2.smali │ ├── debuginfo │ └── TestVariablesNames.smali │ ├── deobf │ └── TestKotlinMetadata.smali │ ├── enums │ ├── TestEnumObfuscated.smali │ ├── TestEnumWithFields.smali │ ├── TestEnums10.smali │ ├── TestEnums5.smali │ ├── TestEnums8.smali │ └── TestEnumsWithStaticFields.smali │ ├── fallback │ └── TestFallbackManyNops.smali │ ├── generics │ ├── MissingGenericsTypesTest.smali │ ├── TestClassSignature.smali │ ├── TestMethodOverride.smali │ └── TestSyntheticOverride │ │ ├── KotlinFunction1.smali │ │ └── TestSyntheticOverride.smali │ ├── inline │ ├── TestGetterInlineNegative.smali │ ├── TestInline7.smali │ ├── TestMethodInline │ │ ├── A.smali │ │ ├── B.smali │ │ └── C.smali │ ├── TestOverlapSyntheticMethods.smali │ ├── TestOverrideBridgeMerge.smali │ └── TestSyntheticInline3 │ │ ├── KotlinFunction1.smali │ │ ├── TestSyntheticInline3$onCreate$1.smali │ │ └── TestSyntheticInline3.smali │ ├── inner │ ├── TestAnonymousClass14 │ │ ├── OuterCls$1.smali │ │ ├── OuterCls$TestCls.smali │ │ └── OuterCls.smali │ ├── TestAnonymousClass19 │ │ ├── ATestCls.smali │ │ └── Lambda$TestCls$1.smali │ ├── TestIncorrectAnonymousClass │ │ ├── TestCls$1.smali │ │ └── TestCls.smali │ ├── TestInnerClassFakeSyntheticConstructor.smali │ ├── TestInnerClassSyntheticRename.smali │ ├── TestNestedAnonymousClass │ │ ├── A.smali │ │ ├── B.smali │ │ └── C.smali │ └── TestSyntheticMthRename │ │ ├── TestCls$A.smali │ │ ├── TestCls$I.smali │ │ └── TestCls.smali │ ├── invoke │ ├── TestCastInOverloadedInvoke2.smali │ ├── TestConstructorWithMoves.smali │ └── TestPolymorphicInvoke.smali │ ├── loops │ ├── TestEndlessLoop2.smali │ ├── TestLoopCondition5.smali │ ├── TestLoopRestore.smali │ └── TestMultiEntryLoop.smali │ ├── names │ ├── TestCaseSensitiveChecks │ │ ├── 1.smali │ │ └── 2.smali │ ├── TestClassNameWithInvalidChar │ │ ├── a.smali │ │ └── b.smali │ ├── TestDuplicatedNames.smali │ ├── TestFieldCollideWithPackage │ │ ├── 1.smali │ │ └── 2.smali │ ├── TestLocalVarCollideWithPackage │ │ ├── 1.smali │ │ ├── 2.smali │ │ └── 3.smali │ ├── TestReservedClassNames.smali │ ├── TestReservedNames.smali │ └── TestReservedPackageNames │ │ └── a.smali │ ├── others │ ├── TestAllNops.smali │ ├── TestBadMethodAccessModifiers │ │ ├── TestCls$A.smali │ │ ├── TestCls$B.smali │ │ └── TestCls.smali │ ├── TestConstructor.smali │ ├── TestConstructorBranched.smali │ ├── TestDeadBlockReferencesStart.smali │ ├── TestExplicitOverride.smali │ ├── TestFieldInitOrder2.smali │ ├── TestFixClassAccessModifiers │ │ ├── Cls.smali │ │ ├── InnerCls.smali │ │ └── TestCls.smali │ ├── TestIncorrectMethodSignature.smali │ ├── TestInlineVarArg.smali │ ├── TestInsnsBeforeSuper │ │ ├── A.smali │ │ └── B.smali │ ├── TestInsnsBeforeSuper2.smali │ ├── TestInsnsBeforeThis.smali │ ├── TestMoveInline.smali │ ├── TestMultipleNOPs │ │ └── test.smali │ ├── TestN21.smali │ ├── TestOverridePackagePrivateMethod │ │ ├── A.smali │ │ ├── B.smali │ │ └── C.smali │ ├── TestOverrideWithSameName │ │ ├── A.smali │ │ ├── B.smali │ │ └── C.smali │ └── TestSyntheticConstructor │ │ ├── BuggyConstructor.smali │ │ └── Test.smali │ ├── synchronize │ ├── TestNestedSynchronize.smali │ ├── TestSynchronized4.smali │ ├── TestSynchronized5.smali │ └── TestSynchronized6.smali │ ├── trycatch │ ├── TestEmptyCatch.smali │ ├── TestFinally3.smali │ ├── TestLoopInTryCatch.smali │ ├── TestMultiExceptionCatchSameJump.smali │ ├── TestNestedTryCatch4.smali │ ├── TestTryCatchFinally10.smali │ ├── TestTryCatchFinally15.smali │ ├── TestTryCatchLastInsn.smali │ ├── TestTryCatchMultiException2.smali │ ├── TestTryCatchNoMoveExc.smali │ ├── TestTryCatchNoMoveExc2.smali │ ├── TestTryCatchStartOnMove.smali │ └── TestTryWithEmptyCatchTriple.smali │ ├── types │ ├── TestConstInline.smali │ ├── TestGenerics2.smali │ ├── TestGenericsInFullInnerCls │ │ ├── FieldCls.smali │ │ ├── ba.smali │ │ ├── bb.smali │ │ ├── bc.smali │ │ └── n.smali │ ├── TestPrimitiveConversion.smali │ ├── TestPrimitiveConversion2.smali │ ├── TestTypeResolver10.smali │ ├── TestTypeResolver14.smali │ ├── TestTypeResolver15.smali │ ├── TestTypeResolver16.smali │ ├── TestTypeResolver17.smali │ ├── TestTypeResolver20 │ │ ├── Sequence.smali │ │ └── TestTypeResolver20.smali │ ├── TestTypeResolver21.smali │ ├── TestTypeResolver5.smali │ └── TestTypeResolver8 │ │ ├── A.smali │ │ ├── B.smali │ │ └── TestCls.smali │ └── variables │ ├── TestVariables6.smali │ ├── TestVariablesGeneric.smali │ └── TestVariablesInLoop.smali ├── jadx-gui ├── build.gradle ├── libs │ ├── jfontchooser-1.0.5.jar │ └── mapping-io-0.4.0-SNAPSHOT.jar └── src │ ├── main │ ├── java │ │ └── jadx │ │ │ └── gui │ │ │ ├── JadxGUI.java │ │ │ ├── JadxWrapper.java │ │ │ ├── device │ │ │ ├── debugger │ │ │ │ ├── ArtAdapter.java │ │ │ │ ├── BreakpointManager.java │ │ │ │ ├── DbgUtils.java │ │ │ │ ├── DebugController.java │ │ │ │ ├── EventListenerAdapter.java │ │ │ │ ├── LogcatController.java │ │ │ │ ├── RegisterObserver.java │ │ │ │ ├── RuntimeType.java │ │ │ │ ├── SmaliDebugger.java │ │ │ │ ├── SmaliDebuggerException.java │ │ │ │ ├── SuspendInfo.java │ │ │ │ └── smali │ │ │ │ │ ├── RegisterInfo.java │ │ │ │ │ ├── Smali.java │ │ │ │ │ ├── SmaliMethodNode.java │ │ │ │ │ ├── SmaliRegister.java │ │ │ │ │ └── SmaliWriter.java │ │ │ └── protocol │ │ │ │ ├── ADB.java │ │ │ │ ├── ADBDevice.java │ │ │ │ └── ADBDeviceInfo.java │ │ │ ├── jobs │ │ │ ├── BackgroundExecutor.java │ │ │ ├── Cancelable.java │ │ │ ├── CancelableBackgroundTask.java │ │ │ ├── DecompileTask.java │ │ │ ├── ExportTask.java │ │ │ ├── IBackgroundTask.java │ │ │ ├── ITaskInfo.java │ │ │ ├── ITaskProgress.java │ │ │ ├── ProcessResult.java │ │ │ ├── SimpleTask.java │ │ │ ├── TaskProgress.java │ │ │ └── TaskStatus.java │ │ │ ├── plugins │ │ │ ├── mappings │ │ │ │ └── MappingExporter.java │ │ │ └── quark │ │ │ │ ├── QuarkDialog.java │ │ │ │ ├── QuarkManager.java │ │ │ │ ├── QuarkReportData.java │ │ │ │ ├── QuarkReportNode.java │ │ │ │ └── QuarkReportPanel.java │ │ │ ├── search │ │ │ ├── ISearchMethod.java │ │ │ ├── ISearchProvider.java │ │ │ ├── SearchJob.java │ │ │ ├── SearchSettings.java │ │ │ ├── SearchTask.java │ │ │ └── providers │ │ │ │ ├── BaseSearchProvider.java │ │ │ │ ├── ClassSearchProvider.java │ │ │ │ ├── CodeSearchProvider.java │ │ │ │ ├── CommentSearchProvider.java │ │ │ │ ├── FieldSearchProvider.java │ │ │ │ ├── MergedSearchProvider.java │ │ │ │ ├── MethodSearchProvider.java │ │ │ │ └── ResourceSearchProvider.java │ │ │ ├── settings │ │ │ ├── JadxProject.java │ │ │ ├── JadxSettings.java │ │ │ ├── JadxSettingsAdapter.java │ │ │ ├── JadxSettingsWindow.java │ │ │ ├── LineNumbersMode.java │ │ │ ├── TabStateViewAdapter.java │ │ │ ├── WindowLocation.java │ │ │ └── data │ │ │ │ ├── ProjectData.java │ │ │ │ ├── TabViewState.java │ │ │ │ └── ViewPoint.java │ │ │ ├── treemodel │ │ │ ├── ApkSignature.java │ │ │ ├── CodeNode.java │ │ │ ├── JClass.java │ │ │ ├── JField.java │ │ │ ├── JLoadableNode.java │ │ │ ├── JMethod.java │ │ │ ├── JNode.java │ │ │ ├── JPackage.java │ │ │ ├── JResSearchNode.java │ │ │ ├── JResource.java │ │ │ ├── JRoot.java │ │ │ ├── JSources.java │ │ │ ├── JVariable.java │ │ │ └── TextNode.java │ │ │ ├── ui │ │ │ ├── ExceptionDialog.java │ │ │ ├── HeapUsageBar.java │ │ │ ├── MainDropTarget.java │ │ │ ├── MainWindow.java │ │ │ ├── TabComponent.java │ │ │ ├── TabbedPane.java │ │ │ ├── codearea │ │ │ │ ├── AbstractCodeArea.java │ │ │ │ ├── AbstractCodeContentPanel.java │ │ │ │ ├── AppdbgAction.java │ │ │ │ ├── AppdbgWindow.java │ │ │ │ ├── ClassCodeContentPanel.java │ │ │ │ ├── CodeArea.java │ │ │ │ ├── CodeContentPanel.java │ │ │ │ ├── CodeLinkGenerator.java │ │ │ │ ├── CodePanel.java │ │ │ │ ├── CommentAction.java │ │ │ │ ├── CommentSearchAction.java │ │ │ │ ├── EditorTheme.java │ │ │ │ ├── EditorViewState.java │ │ │ │ ├── FindUsageAction.java │ │ │ │ ├── FridaAction.java │ │ │ │ ├── GoToDeclarationAction.java │ │ │ │ ├── JNodeAction.java │ │ │ │ ├── JNodePopupBuilder.java │ │ │ │ ├── JNodePopupListener.java │ │ │ │ ├── JadxTokenMaker.java │ │ │ │ ├── LineNumbers.java │ │ │ │ ├── MouseHoverHighlighter.java │ │ │ │ ├── RenameAction.java │ │ │ │ ├── SearchBar.java │ │ │ │ ├── SmaliArea.java │ │ │ │ ├── SmaliTokenMaker.java │ │ │ │ ├── XposedAction.java │ │ │ │ └── mode │ │ │ │ │ └── JCodeMode.java │ │ │ ├── dialog │ │ │ │ ├── ADBDialog.java │ │ │ │ ├── AboutDialog.java │ │ │ │ ├── CommentDialog.java │ │ │ │ ├── CommonSearchDialog.java │ │ │ │ ├── ExcludePkgDialog.java │ │ │ │ ├── LogViewerDialog.java │ │ │ │ ├── RenameDialog.java │ │ │ │ ├── SearchDialog.java │ │ │ │ ├── SetValueDialog.java │ │ │ │ └── UsageDialog.java │ │ │ ├── filedialog │ │ │ │ ├── CustomFileChooser.java │ │ │ │ ├── CustomFileDialog.java │ │ │ │ ├── FileDialogWrapper.java │ │ │ │ └── FileOpenMode.java │ │ │ ├── panel │ │ │ │ ├── ContentPanel.java │ │ │ │ ├── HtmlPanel.java │ │ │ │ ├── IDebugController.java │ │ │ │ ├── IViewStateSupport.java │ │ │ │ ├── ImagePanel.java │ │ │ │ ├── IssuesPanel.java │ │ │ │ ├── JDebuggerPanel.java │ │ │ │ ├── LogcatPanel.java │ │ │ │ ├── ProgressPanel.java │ │ │ │ └── StartPagePanel.java │ │ │ ├── popupmenu │ │ │ │ ├── JPackagePopupMenu.java │ │ │ │ └── VarTreePopupMenu.java │ │ │ └── treenodes │ │ │ │ ├── StartPageNode.java │ │ │ │ └── SummaryNode.java │ │ │ ├── update │ │ │ ├── JadxUpdate.java │ │ │ ├── VersionComparator.java │ │ │ └── data │ │ │ │ ├── Asset.java │ │ │ │ └── Release.java │ │ │ └── utils │ │ │ ├── CacheObject.java │ │ │ ├── CaretPositionFix.java │ │ │ ├── CertificateManager.java │ │ │ ├── DefaultPopupMenuListener.java │ │ │ ├── FontUtils.java │ │ │ ├── ILoadListener.java │ │ │ ├── IOUtils.java │ │ │ ├── Icons.java │ │ │ ├── JNodeCache.java │ │ │ ├── JumpManager.java │ │ │ ├── JumpPosition.java │ │ │ ├── LafManager.java │ │ │ ├── LangLocale.java │ │ │ ├── Link.java │ │ │ ├── NLS.java │ │ │ ├── ObjectPool.java │ │ │ ├── OverlayIcon.java │ │ │ ├── PathTypeAdapter.java │ │ │ ├── RectangleTypeAdapter.java │ │ │ ├── RelativePathTypeAdapter.java │ │ │ ├── SystemInfo.java │ │ │ ├── TextStandardActions.java │ │ │ ├── UiUtils.java │ │ │ ├── codecache │ │ │ ├── CodeCacheMode.java │ │ │ ├── CodeStringCache.java │ │ │ ├── FixedCodeCache.java │ │ │ └── disk │ │ │ │ ├── BufferCodeCache.java │ │ │ │ ├── CodeMetadataAdapter.java │ │ │ │ ├── DiskCodeCache.java │ │ │ │ └── adapters │ │ │ │ ├── ArgTypeAdapter.java │ │ │ │ ├── ClassNodeAdapter.java │ │ │ │ ├── CodeAnnotationAdapter.java │ │ │ │ ├── DataAdapter.java │ │ │ │ ├── DataAdapterHelper.java │ │ │ │ ├── FieldNodeAdapter.java │ │ │ │ ├── InsnCodeOffsetAdapter.java │ │ │ │ ├── MethodNodeAdapter.java │ │ │ │ ├── NodeDeclareRefAdapter.java │ │ │ │ ├── NodeEndAdapter.java │ │ │ │ ├── VarNodeAdapter.java │ │ │ │ └── VarRefAdapter.java │ │ │ ├── fileswatcher │ │ │ ├── FilesWatcher.java │ │ │ └── LiveReloadWorker.java │ │ │ ├── layout │ │ │ └── WrapLayout.java │ │ │ ├── logs │ │ │ ├── ILogIssuesListener.java │ │ │ ├── ILogListener.java │ │ │ ├── LimitedQueue.java │ │ │ ├── LogCollector.java │ │ │ └── LogEvent.java │ │ │ ├── res │ │ │ └── ResTableHelper.java │ │ │ ├── rx │ │ │ ├── CustomDisposable.java │ │ │ └── RxUtils.java │ │ │ ├── tools │ │ │ └── NLSAddNewLines.java │ │ │ └── ui │ │ │ ├── ActionHandler.java │ │ │ ├── DocumentUpdateListener.java │ │ │ ├── NodeLabel.java │ │ │ └── ZoomActions.java │ └── resources │ │ ├── fonts │ │ └── Hack-Regular.ttf │ │ ├── i18n │ │ ├── Messages_de_DE.properties │ │ ├── Messages_en_US.properties │ │ ├── Messages_es_ES.properties │ │ ├── Messages_ko_KR.properties │ │ ├── Messages_pt_BR.properties │ │ ├── Messages_ru_RU.properties │ │ ├── Messages_zh_CN.properties │ │ └── Messages_zh_TW.properties │ │ ├── icons │ │ ├── adb │ │ │ ├── addToWatch.svg │ │ │ └── androidDevice.svg │ │ ├── debugger │ │ │ ├── db_disabled_breakpoint.svg │ │ │ ├── db_set_breakpoint.svg │ │ │ ├── execute.svg │ │ │ ├── rerun.svg │ │ │ ├── stepOut.svg │ │ │ ├── suspend.svg │ │ │ ├── suspendGray.svg │ │ │ ├── threadFrozen.svg │ │ │ ├── traceInto.svg │ │ │ ├── traceOver.svg │ │ │ └── trash.svg │ │ ├── nodes │ │ │ ├── ImagesFileType.svg │ │ │ ├── abstractClass.svg │ │ │ ├── abstractMethod.svg │ │ │ ├── annotationtype.svg │ │ │ ├── binaryFile.svg │ │ │ ├── class.svg │ │ │ ├── constructorMethod.svg │ │ │ ├── detailView.svg │ │ │ ├── enum.svg │ │ │ ├── field.svg │ │ │ ├── file_any_type.svg │ │ │ ├── finalMark.svg │ │ │ ├── folder.svg │ │ │ ├── interface.svg │ │ │ ├── java.svg │ │ │ ├── manifest.svg │ │ │ ├── method.svg │ │ │ ├── methodReference.svg │ │ │ ├── newWindow.svg │ │ │ ├── package.svg │ │ │ ├── packageClasses.svg │ │ │ ├── privateClass.svg │ │ │ ├── privateField.svg │ │ │ ├── privateMethod.svg │ │ │ ├── protectedClass.svg │ │ │ ├── protectedField.svg │ │ │ ├── protectedMethod.svg │ │ │ ├── publicClass.svg │ │ │ ├── publicField.svg │ │ │ ├── publicMethod.svg │ │ │ ├── resourceBundle.svg │ │ │ ├── resourcesRoot.svg │ │ │ ├── rootPackageFolder.svg │ │ │ ├── staticMark.svg │ │ │ ├── styleKeyPack.svg │ │ │ ├── unknown.svg │ │ │ └── xml.svg │ │ ├── search │ │ │ ├── mark.svg │ │ │ ├── matchCaseHovered.svg │ │ │ ├── matchCaseSelected.svg │ │ │ ├── previewSelected.svg │ │ │ ├── regexHovered.svg │ │ │ ├── regexSelected.svg │ │ │ ├── wordsHovered.svg │ │ │ └── wordsSelected.svg │ │ └── ui │ │ │ ├── Module.svg │ │ │ ├── addFile.svg │ │ │ ├── bottom.svg │ │ │ ├── close.svg │ │ │ ├── closeHovered.svg │ │ │ ├── ejbFinderMethod.svg │ │ │ ├── error.svg │ │ │ ├── exit.svg │ │ │ ├── export.svg │ │ │ ├── find.svg │ │ │ ├── helmChartLock.svg │ │ │ ├── left.svg │ │ │ ├── logVerbose.svg │ │ │ ├── menu-saveall.svg │ │ │ ├── moduleGroup.svg │ │ │ ├── newFolder.svg │ │ │ ├── openDisk.svg │ │ │ ├── pagination.svg │ │ │ ├── projectDirectory.svg │ │ │ ├── quark.svg │ │ │ ├── refresh.svg │ │ │ ├── right.svg │ │ │ ├── settings.svg │ │ │ ├── showInfos.svg │ │ │ ├── startDebugger.svg │ │ │ ├── top.svg │ │ │ ├── usagesFinder.svg │ │ │ └── warning.svg │ │ └── logos │ │ ├── jadx-logo-16px.png │ │ ├── jadx-logo-32px.png │ │ ├── jadx-logo-48px.png │ │ ├── jadx-logo.ico │ │ ├── jadx-logo.png │ │ └── jadx-logo.svg │ └── test │ ├── java │ └── jadx │ │ ├── api │ │ └── Factory.java │ │ └── gui │ │ ├── TestI18n.java │ │ ├── device │ │ └── debugger │ │ │ └── smali │ │ │ └── DbgSmaliTest.java │ │ ├── treemodel │ │ └── JSourcesTest.java │ │ ├── update │ │ └── VersionComparatorTest.java │ │ └── utils │ │ ├── CertificateManagerTest.java │ │ ├── JumpManagerTest.java │ │ └── codecache │ │ ├── DiskCodeCacheTest.java │ │ └── disk │ │ └── adapters │ │ └── DataAdapterHelperTest.java │ ├── resources │ ├── certificate-test │ │ ├── CERT.DSA │ │ ├── CERT.RSA │ │ └── EMPTY.txt │ └── logback-test.xml │ └── smali │ ├── params.smali │ └── switch.smali ├── jadx-plugins ├── jadx-dex-input │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── jadx │ │ │ │ └── plugins │ │ │ │ └── input │ │ │ │ └── dex │ │ │ │ ├── DexException.java │ │ │ │ ├── DexFileLoader.java │ │ │ │ ├── DexInputOptions.java │ │ │ │ ├── DexInputPlugin.java │ │ │ │ ├── DexLoadResult.java │ │ │ │ ├── DexReader.java │ │ │ │ ├── insns │ │ │ │ ├── DexInsnData.java │ │ │ │ ├── DexInsnFormat.java │ │ │ │ ├── DexInsnInfo.java │ │ │ │ ├── DexInsnMnemonics.java │ │ │ │ ├── DexOpcodes.java │ │ │ │ └── payloads │ │ │ │ │ └── DexArrayPayload.java │ │ │ │ ├── sections │ │ │ │ ├── DexAnnotationsConvert.java │ │ │ │ ├── DexClassData.java │ │ │ │ ├── DexCodeReader.java │ │ │ │ ├── DexConsts.java │ │ │ │ ├── DexFieldData.java │ │ │ │ ├── DexHeader.java │ │ │ │ ├── DexMethodData.java │ │ │ │ ├── DexMethodProto.java │ │ │ │ ├── DexMethodRef.java │ │ │ │ ├── SectionReader.java │ │ │ │ ├── annotations │ │ │ │ │ ├── AnnotationsParser.java │ │ │ │ │ ├── AnnotationsUtils.java │ │ │ │ │ └── EncodedValueParser.java │ │ │ │ └── debuginfo │ │ │ │ │ ├── DebugInfoParser.java │ │ │ │ │ └── DexLocalVar.java │ │ │ │ ├── smali │ │ │ │ ├── InsnFormatter.java │ │ │ │ ├── InsnFormatterInfo.java │ │ │ │ ├── SmaliCodeWriter.java │ │ │ │ ├── SmaliInsnFormat.java │ │ │ │ └── SmaliPrinter.java │ │ │ │ └── utils │ │ │ │ ├── DexCheckSum.java │ │ │ │ ├── Leb128.java │ │ │ │ ├── MUtf8.java │ │ │ │ └── SmaliUtils.java │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ └── jadx.api.plugins.JadxPlugin │ │ └── test │ │ ├── java │ │ └── jadx │ │ │ └── plugins │ │ │ └── input │ │ │ └── dex │ │ │ ├── DexInputPluginTest.java │ │ │ └── utils │ │ │ └── SmaliTestUtils.java │ │ └── resources │ │ └── samples │ │ ├── app-with-fake-dex.apk │ │ ├── hello.dex │ │ └── test.smali ├── jadx-java-convert │ ├── build.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── jadx │ │ │ └── plugins │ │ │ └── input │ │ │ └── javaconvert │ │ │ ├── AsmUtils.java │ │ │ ├── ConvertResult.java │ │ │ ├── D8Converter.java │ │ │ ├── DxConverter.java │ │ │ ├── JavaConvertLoader.java │ │ │ ├── JavaConvertOptions.java │ │ │ └── JavaConvertPlugin.java │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── jadx.api.plugins.JadxPlugin ├── jadx-java-input │ ├── build.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── jadx │ │ │ │ └── plugins │ │ │ │ └── input │ │ │ │ └── java │ │ │ │ ├── JavaClassReader.java │ │ │ │ ├── JavaFileLoader.java │ │ │ │ ├── JavaInputPlugin.java │ │ │ │ ├── JavaLoadResult.java │ │ │ │ ├── data │ │ │ │ ├── ClassOffsets.java │ │ │ │ ├── ConstPoolReader.java │ │ │ │ ├── ConstantType.java │ │ │ │ ├── DataReader.java │ │ │ │ ├── JavaClassData.java │ │ │ │ ├── JavaFieldData.java │ │ │ │ ├── JavaMethodData.java │ │ │ │ ├── JavaMethodProto.java │ │ │ │ ├── JavaMethodRef.java │ │ │ │ ├── attributes │ │ │ │ │ ├── AttributesReader.java │ │ │ │ │ ├── EncodedValueReader.java │ │ │ │ │ ├── IJavaAttribute.java │ │ │ │ │ ├── IJavaAttributeReader.java │ │ │ │ │ ├── JavaAttrStorage.java │ │ │ │ │ ├── JavaAttrType.java │ │ │ │ │ ├── debuginfo │ │ │ │ │ │ ├── JavaLocalVar.java │ │ │ │ │ │ ├── LineNumberTableAttr.java │ │ │ │ │ │ ├── LocalVarTypesAttr.java │ │ │ │ │ │ └── LocalVarsAttr.java │ │ │ │ │ └── types │ │ │ │ │ │ ├── CodeAttr.java │ │ │ │ │ │ ├── ConstValueAttr.java │ │ │ │ │ │ ├── IgnoredAttr.java │ │ │ │ │ │ ├── JavaAnnotationDefaultAttr.java │ │ │ │ │ │ ├── JavaAnnotationsAttr.java │ │ │ │ │ │ ├── JavaBootstrapMethodsAttr.java │ │ │ │ │ │ ├── JavaExceptionsAttr.java │ │ │ │ │ │ ├── JavaInnerClsAttr.java │ │ │ │ │ │ ├── JavaMethodParametersAttr.java │ │ │ │ │ │ ├── JavaParamAnnsAttr.java │ │ │ │ │ │ ├── JavaSignatureAttr.java │ │ │ │ │ │ ├── JavaSourceFileAttr.java │ │ │ │ │ │ └── data │ │ │ │ │ │ └── RawBootstrapMethod.java │ │ │ │ └── code │ │ │ │ │ ├── ArrayType.java │ │ │ │ │ ├── CodeDecodeState.java │ │ │ │ │ ├── JavaCodeReader.java │ │ │ │ │ ├── JavaInsnData.java │ │ │ │ │ ├── JavaInsnInfo.java │ │ │ │ │ ├── JavaInsnsRegister.java │ │ │ │ │ ├── StackState.java │ │ │ │ │ ├── decoders │ │ │ │ │ ├── IJavaInsnDecoder.java │ │ │ │ │ ├── InvokeDecoder.java │ │ │ │ │ ├── LoadConstDecoder.java │ │ │ │ │ ├── LookupSwitchDecoder.java │ │ │ │ │ ├── TableSwitchDecoder.java │ │ │ │ │ └── WideDecoder.java │ │ │ │ │ └── trycatch │ │ │ │ │ ├── JavaSingleCatch.java │ │ │ │ │ └── JavaTryData.java │ │ │ │ └── utils │ │ │ │ ├── DescriptorParser.java │ │ │ │ ├── DisasmUtils.java │ │ │ │ └── JavaClassParseException.java │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ └── jadx.api.plugins.JadxPlugin │ │ └── test │ │ └── java │ │ └── jadx │ │ └── plugins │ │ └── input │ │ └── java │ │ └── utils │ │ └── DescriptorParserTest.java ├── jadx-plugins-api │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ └── jadx │ │ └── api │ │ └── plugins │ │ ├── JadxPlugin.java │ │ ├── JadxPluginInfo.java │ │ ├── JadxPluginManager.java │ │ ├── input │ │ ├── JadxInputPlugin.java │ │ ├── data │ │ │ ├── AccessFlags.java │ │ │ ├── AccessFlagsScope.java │ │ │ ├── ICallSite.java │ │ │ ├── ICatch.java │ │ │ ├── IClassData.java │ │ │ ├── ICodeReader.java │ │ │ ├── IDebugInfo.java │ │ │ ├── IFieldData.java │ │ │ ├── IFieldRef.java │ │ │ ├── ILoadResult.java │ │ │ ├── ILocalVar.java │ │ │ ├── IMethodData.java │ │ │ ├── IMethodHandle.java │ │ │ ├── IMethodProto.java │ │ │ ├── IMethodRef.java │ │ │ ├── IResourceData.java │ │ │ ├── ISeqConsumer.java │ │ │ ├── ITry.java │ │ │ ├── MethodHandleType.java │ │ │ ├── annotations │ │ │ │ ├── AnnotationVisibility.java │ │ │ │ ├── EncodedType.java │ │ │ │ ├── EncodedValue.java │ │ │ │ ├── IAnnotation.java │ │ │ │ └── JadxAnnotation.java │ │ │ ├── attributes │ │ │ │ ├── IJadxAttrType.java │ │ │ │ ├── IJadxAttribute.java │ │ │ │ ├── JadxAttrType.java │ │ │ │ ├── PinnedAttribute.java │ │ │ │ └── types │ │ │ │ │ ├── AnnotationDefaultAttr.java │ │ │ │ │ ├── AnnotationDefaultClassAttr.java │ │ │ │ │ ├── AnnotationMethodParamsAttr.java │ │ │ │ │ ├── AnnotationsAttr.java │ │ │ │ │ ├── ExceptionsAttr.java │ │ │ │ │ ├── InnerClassesAttr.java │ │ │ │ │ ├── InnerClsInfo.java │ │ │ │ │ ├── MethodParametersAttr.java │ │ │ │ │ ├── SignatureAttr.java │ │ │ │ │ └── SourceFileAttr.java │ │ │ └── impl │ │ │ │ ├── CallSite.java │ │ │ │ ├── CatchData.java │ │ │ │ ├── DebugInfo.java │ │ │ │ ├── EmptyLoadResult.java │ │ │ │ ├── FieldRefHandle.java │ │ │ │ ├── JadxFieldRef.java │ │ │ │ ├── ListConsumer.java │ │ │ │ ├── MethodRefHandle.java │ │ │ │ └── TryData.java │ │ └── insns │ │ │ ├── InsnData.java │ │ │ ├── InsnIndexType.java │ │ │ ├── Opcode.java │ │ │ └── custom │ │ │ ├── IArrayPayload.java │ │ │ ├── ICustomPayload.java │ │ │ ├── ISwitchPayload.java │ │ │ └── impl │ │ │ └── SwitchPayload.java │ │ ├── options │ │ ├── JadxPluginOptions.java │ │ ├── OptionDescription.java │ │ └── impl │ │ │ ├── BaseOptionsParser.java │ │ │ └── JadxOptionDescription.java │ │ └── utils │ │ ├── CommonFileUtils.java │ │ ├── LimitedInputStream.java │ │ ├── Utils.java │ │ └── ZipSecurity.java ├── jadx-raung-input │ ├── build.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── jadx │ │ │ └── plugins │ │ │ └── input │ │ │ └── raung │ │ │ ├── RaungConvert.java │ │ │ └── RaungInputPlugin.java │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── jadx.api.plugins.JadxPlugin └── jadx-smali-input │ ├── build.gradle │ └── src │ └── main │ ├── java │ └── jadx │ │ └── plugins │ │ └── input │ │ └── smali │ │ ├── SmaliConvert.java │ │ └── SmaliInputPlugin.java │ └── resources │ └── META-INF │ └── services │ └── jadx.api.plugins.JadxPlugin ├── lgtm.yml └── settings.gradle /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | root = true 3 | 4 | [*] 5 | end_of_line = lf 6 | insert_final_newline = true 7 | 8 | indent_style = tab 9 | tab_width = 4 10 | continuation_indent_size = 8 #IntelliJ Idea specific workaround 11 | 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | 15 | [*.yml] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [*.bat] 20 | end_of_line = crlf 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Eclipse files 2 | .classpath 3 | .project 4 | .settings/ 5 | 6 | # IntelliJ Idea files 7 | .idea/ 8 | .run/ 9 | out/ 10 | *.iml 11 | *.ipr 12 | *.iws 13 | .attach_pid* 14 | *.hprof 15 | 16 | **/.DS_Store 17 | 18 | bin/ 19 | target/ 20 | build/ 21 | classes/ 22 | idea/ 23 | .gradle/ 24 | node_modules/ 25 | 26 | jadx-output/ 27 | *-tmp/ 28 | **/tmp/ 29 | *.jobf 30 | 31 | *.class 32 | *.dump 33 | *.log 34 | *.cfg 35 | *.orig 36 | quark.json 37 | 38 | cliff.toml 39 | jadx-gui/src/main/resources/logback.xml 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## AndroidRunnableJADX 2 | ### based on [jadx](https://github.com/skylot/jadx), commit id 540c0a81000ad7bca5e3c5a3409f230be76e9718 3 | ### powered by [appdbg](https://github.com/asmjmp0/appdbg) 4 | download url: https://pan.baidu.com/s/19POEeOuBnZPOPJ3Bmmb7Zg?pwd=ldew 5 | 6 | 1. use the JDK from [appdbg-JDK](https://github.com/asmjmp0/appdbg-JDK). 7 | 2. set JAVA_HOME in **jadx-gui** or **jadx-gui.bat**![](assets/3.png) 8 | 3. click R key,or click right mouse button on a method node.![](assets/0.png) 9 | 4. click init button.![](assets/1.png) 10 | 5. click run button.![](assets/2.png) 11 | --------------------------------------- 12 | *Licensed under the Apache 2.0 License* 13 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | To report a security issue, please email `skylot@gmail.com` with a description of the issue, the steps you took to create the issue, affected versions, and, if known, mitigations for the issue. 6 | We will check and respond within 3 working days. If the issue is confirmed as a vulnerability, we will apply required mitigations at the next release. 7 | This project follows a 90 day disclosure timeline. 8 | -------------------------------------------------------------------------------- /assets/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/assets/0.png -------------------------------------------------------------------------------- /assets/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/assets/1.png -------------------------------------------------------------------------------- /assets/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/assets/2.png -------------------------------------------------------------------------------- /assets/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/assets/3.png -------------------------------------------------------------------------------- /buildSrc/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'groovy-gradle-plugin' 3 | } 4 | -------------------------------------------------------------------------------- /config/code-formatter/eclipse.importorder: -------------------------------------------------------------------------------- 1 | #Import Order 2 | 0=java 3 | 1=javax 4 | 2=org 5 | 3=com 6 | 4= 7 | 5=jadx 8 | 6=\# 9 | -------------------------------------------------------------------------------- /config/jflex/.gitignore: -------------------------------------------------------------------------------- 1 | SmaliTokenMaker.java 2 | -------------------------------------------------------------------------------- /config/jflex/README.md: -------------------------------------------------------------------------------- 1 | Refer to the following instructions to modify and use to generate SmaliTokenMarker 2 | 3 | ```shell 4 | jflex SmaliTokenMaker.flex --skel skeleton.default 5 | ``` 6 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.warning.mode=all 2 | org.gradle.parallel=true 3 | #org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home 4 | 5 | # Flags for google-java-format (optimize imports by spotless) for Java >= 16. 6 | # Java < 9 will ignore unsupported flags (thanks to -XX:+IgnoreUnrecognizedVMOptions) 7 | org.gradle.jvmargs=-XX:+IgnoreUnrecognizedVMOptions \ 8 | --add-exports='jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED' \ 9 | --add-exports='jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED' \ 10 | --add-exports='jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED' \ 11 | --add-exports='jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED' \ 12 | --add-exports='jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED' 13 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionSha256Sum=7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /jadx-cli/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %-5level - %msg%n 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /jadx-cli/src/test/resources/samples/HelloWorld.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-cli/src/test/resources/samples/HelloWorld.class -------------------------------------------------------------------------------- /jadx-cli/src/test/resources/samples/HelloWorld.smali: -------------------------------------------------------------------------------- 1 | .class Lsmali/HelloWorld; 2 | .super Ljava/lang/Object; 3 | .source "HelloWorld.java" 4 | 5 | .method constructor ()V 6 | .registers 1 7 | 8 | .line 1 9 | invoke-direct {p0}, Ljava/lang/Object;->()V 10 | 11 | return-void 12 | .end method 13 | 14 | .method public static main([Ljava/lang/String;)V 15 | .registers 2 16 | 17 | .line 3 18 | sget-object p0, Ljava/lang/System;->out:Ljava/io/PrintStream; 19 | 20 | const-string v0, "Hello, World" 21 | 22 | invoke-virtual {p0, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 23 | 24 | .line 4 25 | return-void 26 | .end method 27 | -------------------------------------------------------------------------------- /jadx-cli/src/test/resources/samples/hello.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-cli/src/test/resources/samples/hello.dex -------------------------------------------------------------------------------- /jadx-cli/src/test/resources/samples/resources-only.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-cli/src/test/resources/samples/resources-only.apk -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/CommentsLevel.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | public enum CommentsLevel { 4 | NONE, 5 | USER_ONLY, 6 | ERROR, 7 | WARN, 8 | INFO, 9 | DEBUG; 10 | 11 | public boolean filter(CommentsLevel limit) { 12 | return this.ordinal() <= limit.ordinal(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/DecompilationMode.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | public enum DecompilationMode { 4 | /** 5 | * Trying best options (default) 6 | */ 7 | AUTO, 8 | 9 | /** 10 | * Restore code structure (normal java code) 11 | */ 12 | RESTRUCTURE, 13 | 14 | /** 15 | * Simplified instructions (linear with goto's) 16 | */ 17 | SIMPLE, 18 | 19 | /** 20 | * Raw instructions without modifications 21 | */ 22 | FALLBACK 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/ICodeCache.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import java.io.Closeable; 4 | 5 | import org.jetbrains.annotations.NotNull; 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | public interface ICodeCache extends Closeable { 9 | 10 | void add(String clsFullName, ICodeInfo codeInfo); 11 | 12 | void remove(String clsFullName); 13 | 14 | @NotNull 15 | ICodeInfo get(String clsFullName); 16 | 17 | @Nullable 18 | String getCode(String clsFullName); 19 | 20 | boolean contains(String clsFullName); 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/ICodeInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import jadx.api.impl.SimpleCodeInfo; 4 | import jadx.api.metadata.ICodeMetadata; 5 | 6 | public interface ICodeInfo { 7 | 8 | ICodeInfo EMPTY = new SimpleCodeInfo(""); 9 | 10 | String getCodeStr(); 11 | 12 | ICodeMetadata getCodeMetadata(); 13 | 14 | boolean hasMetadata(); 15 | } 16 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/IDecompileScheduler.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import java.util.List; 4 | 5 | public interface IDecompileScheduler { 6 | List> buildBatches(List classes); 7 | } 8 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/JavaNode.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import java.util.List; 4 | 5 | import jadx.api.metadata.ICodeAnnotation; 6 | 7 | public interface JavaNode { 8 | 9 | String getName(); 10 | 11 | String getFullName(); 12 | 13 | JavaClass getDeclaringClass(); 14 | 15 | JavaClass getTopParentClass(); 16 | 17 | int getDefPos(); 18 | 19 | List getUseIn(); 20 | 21 | default void removeAlias() { 22 | } 23 | 24 | boolean isOwnCodeAnnotation(ICodeAnnotation ann); 25 | } 26 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/ResourceFileContent.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import jadx.core.xmlgen.ResContainer; 4 | 5 | public class ResourceFileContent extends ResourceFile { 6 | private final ICodeInfo content; 7 | 8 | public ResourceFileContent(String name, ResourceType type, ICodeInfo content) { 9 | super(null, name, type); 10 | this.content = content; 11 | } 12 | 13 | @Override 14 | public ResContainer loadContent() { 15 | return ResContainer.textResource(getDeobfName(), content); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/args/DeobfuscationMapFileMode.java: -------------------------------------------------------------------------------- 1 | package jadx.api.args; 2 | 3 | public enum DeobfuscationMapFileMode { 4 | 5 | /** 6 | * Load if found, don't save (default) 7 | */ 8 | READ, 9 | 10 | /** 11 | * Load if found, save only if new (don't overwrite) 12 | */ 13 | READ_OR_SAVE, 14 | 15 | /** 16 | * Don't load, always save 17 | */ 18 | OVERWRITE, 19 | 20 | /** 21 | * Don't load and don't save 22 | */ 23 | IGNORE; 24 | 25 | public boolean shouldRead() { 26 | return this == READ || this == READ_OR_SAVE; 27 | } 28 | 29 | public boolean shouldWrite() { 30 | return this == READ_OR_SAVE || this == OVERWRITE; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/args/ResourceNameSource.java: -------------------------------------------------------------------------------- 1 | package jadx.api.args; 2 | 3 | /** 4 | * Resources original name source (for deobfuscation) 5 | */ 6 | public enum ResourceNameSource { 7 | 8 | /** 9 | * Automatically select best name (default) 10 | */ 11 | AUTO, 12 | 13 | /** 14 | * Force use resources provided names 15 | */ 16 | RESOURCES, 17 | 18 | /** 19 | * Force use resources names from R class 20 | */ 21 | CODE, 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/data/CodeRefType.java: -------------------------------------------------------------------------------- 1 | package jadx.api.data; 2 | 3 | public enum CodeRefType { 4 | MTH_ARG, 5 | VAR, 6 | CATCH, 7 | INSN, 8 | } 9 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/data/ICodeComment.java: -------------------------------------------------------------------------------- 1 | package jadx.api.data; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | public interface ICodeComment extends Comparable { 6 | 7 | IJavaNodeRef getNodeRef(); 8 | 9 | @Nullable 10 | IJavaCodeRef getCodeRef(); 11 | 12 | String getComment(); 13 | } 14 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/data/ICodeData.java: -------------------------------------------------------------------------------- 1 | package jadx.api.data; 2 | 3 | import java.util.List; 4 | 5 | public interface ICodeData { 6 | 7 | List getComments(); 8 | 9 | List getRenames(); 10 | } 11 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/data/ICodeRename.java: -------------------------------------------------------------------------------- 1 | package jadx.api.data; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | public interface ICodeRename extends Comparable { 6 | 7 | IJavaNodeRef getNodeRef(); 8 | 9 | @Nullable 10 | IJavaCodeRef getCodeRef(); 11 | 12 | String getNewName(); 13 | } 14 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/data/IJavaCodeRef.java: -------------------------------------------------------------------------------- 1 | package jadx.api.data; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | public interface IJavaCodeRef extends Comparable { 6 | 7 | CodeRefType getAttachType(); 8 | 9 | int getIndex(); 10 | 11 | @Override 12 | default int compareTo(@NotNull IJavaCodeRef o) { 13 | return Integer.compare(getIndex(), o.getIndex()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/data/IJavaNodeRef.java: -------------------------------------------------------------------------------- 1 | package jadx.api.data; 2 | 3 | public interface IJavaNodeRef extends Comparable { 4 | 5 | enum RefType { 6 | CLASS, FIELD, METHOD, PKG 7 | } 8 | 9 | RefType getType(); 10 | 11 | String getDeclaringClass(); 12 | 13 | String getShortId(); 14 | } 15 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/impl/SimpleCodeInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.api.impl; 2 | 3 | import jadx.api.ICodeInfo; 4 | import jadx.api.metadata.ICodeMetadata; 5 | 6 | public class SimpleCodeInfo implements ICodeInfo { 7 | 8 | private final String code; 9 | 10 | public SimpleCodeInfo(String code) { 11 | this.code = code; 12 | } 13 | 14 | @Override 15 | public String getCodeStr() { 16 | return code; 17 | } 18 | 19 | @Override 20 | public ICodeMetadata getCodeMetadata() { 21 | return ICodeMetadata.EMPTY; 22 | } 23 | 24 | @Override 25 | public boolean hasMetadata() { 26 | return false; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return code; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/metadata/ICodeAnnotation.java: -------------------------------------------------------------------------------- 1 | package jadx.api.metadata; 2 | 3 | public interface ICodeAnnotation { 4 | 5 | enum AnnType { 6 | CLASS, 7 | FIELD, 8 | METHOD, 9 | VAR, 10 | VAR_REF, 11 | DECLARATION, 12 | OFFSET, 13 | END // class or method body end 14 | } 15 | 16 | AnnType getAnnType(); 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/metadata/ICodeNodeRef.java: -------------------------------------------------------------------------------- 1 | package jadx.api.metadata; 2 | 3 | public interface ICodeNodeRef extends ICodeAnnotation { 4 | int getDefPosition(); 5 | 6 | void setDefPosition(int pos); 7 | } 8 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/api/metadata/annotations/NodeEnd.java: -------------------------------------------------------------------------------- 1 | package jadx.api.metadata.annotations; 2 | 3 | import jadx.api.metadata.ICodeAnnotation; 4 | 5 | public class NodeEnd implements ICodeAnnotation { 6 | 7 | public static final NodeEnd VALUE = new NodeEnd(); 8 | 9 | private NodeEnd() { 10 | } 11 | 12 | @Override 13 | public AnnType getAnnType() { 14 | return AnnType.END; 15 | } 16 | 17 | @Override 18 | public String toString() { 19 | return "END"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/codegen/json/cls/JsonCodeLine.java: -------------------------------------------------------------------------------- 1 | package jadx.core.codegen.json.cls; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | public class JsonCodeLine { 6 | private String code; 7 | private String offset; 8 | private Integer sourceLine; 9 | 10 | public String getCode() { 11 | return code; 12 | } 13 | 14 | public void setCode(String code) { 15 | this.code = code; 16 | } 17 | 18 | public String getOffset() { 19 | return offset; 20 | } 21 | 22 | public void setOffset(String offset) { 23 | this.offset = offset; 24 | } 25 | 26 | public Integer getSourceLine() { 27 | return sourceLine; 28 | } 29 | 30 | public void setSourceLine(@Nullable Integer sourceLine) { 31 | this.sourceLine = sourceLine; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/codegen/json/cls/JsonField.java: -------------------------------------------------------------------------------- 1 | package jadx.core.codegen.json.cls; 2 | 3 | public class JsonField extends JsonNode { 4 | String type; 5 | } 6 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/codegen/json/mapping/JsonFieldMapping.java: -------------------------------------------------------------------------------- 1 | package jadx.core.codegen.json.mapping; 2 | 3 | public class JsonFieldMapping { 4 | private String name; 5 | private String alias; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | 11 | public void setName(String name) { 12 | this.name = name; 13 | } 14 | 15 | public String getAlias() { 16 | return alias; 17 | } 18 | 19 | public void setAlias(String alias) { 20 | this.alias = alias; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/codegen/json/mapping/JsonMapping.java: -------------------------------------------------------------------------------- 1 | package jadx.core.codegen.json.mapping; 2 | 3 | import java.util.List; 4 | 5 | public class JsonMapping { 6 | private List classes; 7 | 8 | public List getClasses() { 9 | return classes; 10 | } 11 | 12 | public void setClasses(List classes) { 13 | this.classes = classes; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/deobf/ClsAliasPair.java: -------------------------------------------------------------------------------- 1 | package jadx.core.deobf; 2 | 3 | public class ClsAliasPair { 4 | private final String pkg; 5 | private final String name; 6 | 7 | public ClsAliasPair(String pkg, String name) { 8 | this.pkg = pkg; 9 | this.name = name; 10 | } 11 | 12 | public String getPkg() { 13 | return pkg; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return pkg + '.' + name; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/attributes/ILineAttributeNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.attributes; 2 | 3 | public interface ILineAttributeNode { 4 | int getSourceLine(); 5 | 6 | void setSourceLine(int sourceLine); 7 | 8 | int getDefPosition(); 9 | 10 | void setDefPosition(int pos); 11 | } 12 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/attributes/nodes/LoopLabelAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.attributes.nodes; 2 | 3 | import jadx.api.plugins.input.data.attributes.IJadxAttribute; 4 | import jadx.core.dex.attributes.AType; 5 | 6 | public class LoopLabelAttr implements IJadxAttribute { 7 | 8 | private final LoopInfo loop; 9 | 10 | public LoopLabelAttr(LoopInfo loop) { 11 | this.loop = loop; 12 | } 13 | 14 | public LoopInfo getLoop() { 15 | return loop; 16 | } 17 | 18 | @Override 19 | public AType getAttrType() { 20 | return AType.LOOP_LABEL; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return "LOOP_LABEL: " + loop; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/attributes/nodes/MethodBridgeAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.attributes.nodes; 2 | 3 | import jadx.api.plugins.input.data.attributes.PinnedAttribute; 4 | import jadx.core.dex.attributes.AType; 5 | import jadx.core.dex.nodes.MethodNode; 6 | 7 | public class MethodBridgeAttr extends PinnedAttribute { 8 | 9 | private final MethodNode bridgeMth; 10 | 11 | public MethodBridgeAttr(MethodNode bridgeMth) { 12 | this.bridgeMth = bridgeMth; 13 | } 14 | 15 | public MethodNode getBridgeMth() { 16 | return bridgeMth; 17 | } 18 | 19 | @Override 20 | public AType getAttrType() { 21 | return AType.BRIDGED_BY; 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return "BRIDGED_BY: " + bridgeMth; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/attributes/nodes/TmpEdgeAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.attributes.nodes; 2 | 3 | import jadx.api.plugins.input.data.attributes.IJadxAttrType; 4 | import jadx.api.plugins.input.data.attributes.IJadxAttribute; 5 | import jadx.core.dex.attributes.AType; 6 | import jadx.core.dex.nodes.BlockNode; 7 | 8 | public class TmpEdgeAttr implements IJadxAttribute { 9 | 10 | private final BlockNode block; 11 | 12 | public TmpEdgeAttr(BlockNode block) { 13 | this.block = block; 14 | } 15 | 16 | public BlockNode getBlock() { 17 | return block; 18 | } 19 | 20 | @Override 21 | public IJadxAttrType getAttrType() { 22 | return AType.TMP_EDGE; 23 | } 24 | 25 | @Override 26 | public String toString() { 27 | return "TMP_EDGE: " + block; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions; 2 | 3 | public enum ArithOp { 4 | ADD("+"), 5 | SUB("-"), 6 | MUL("*"), 7 | DIV("/"), 8 | REM("%"), 9 | 10 | AND("&"), 11 | OR("|"), 12 | XOR("^"), 13 | 14 | SHL("<<"), 15 | SHR(">>"), 16 | USHR(">>>"); 17 | 18 | private final String symbol; 19 | 20 | ArithOp(String symbol) { 21 | this.symbol = symbol; 22 | } 23 | 24 | public String getSymbol() { 25 | return this.symbol; 26 | } 27 | 28 | public boolean isBitOp() { 29 | switch (this) { 30 | case AND: 31 | case OR: 32 | case XOR: 33 | return true; 34 | default: 35 | return false; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/BaseInvokeNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | import jadx.core.dex.info.MethodInfo; 6 | import jadx.core.dex.instructions.args.InsnArg; 7 | import jadx.core.dex.nodes.InsnNode; 8 | 9 | public abstract class BaseInvokeNode extends InsnNode { 10 | public BaseInvokeNode(InsnType type, int argsCount) { 11 | super(type, argsCount); 12 | } 13 | 14 | public abstract MethodInfo getCallMth(); 15 | 16 | @Nullable 17 | public abstract InsnArg getInstanceArg(); 18 | 19 | public abstract boolean isStaticCall(); 20 | 21 | /** 22 | * Return offset to match method args from {@link #getCallMth()} 23 | */ 24 | public abstract int getFirstArgOffset(); 25 | } 26 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/GotoNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions; 2 | 3 | import jadx.core.dex.nodes.InsnNode; 4 | import jadx.core.utils.InsnUtils; 5 | 6 | public class GotoNode extends TargetInsnNode { 7 | 8 | protected final int target; 9 | 10 | public GotoNode(int target) { 11 | this(InsnType.GOTO, target, 0); 12 | } 13 | 14 | protected GotoNode(InsnType type, int target, int argsCount) { 15 | super(type, argsCount); 16 | this.target = target; 17 | } 18 | 19 | public int getTarget() { 20 | return target; 21 | } 22 | 23 | @Override 24 | public InsnNode copy() { 25 | return copyCommonParams(new GotoNode(target)); 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return super.toString() + "-> " + InsnUtils.formatOffset(target); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/InvokeType.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions; 2 | 3 | public enum InvokeType { 4 | STATIC, 5 | DIRECT, 6 | VIRTUAL, 7 | INTERFACE, 8 | SUPER, 9 | POLYMORPHIC, 10 | CUSTOM, 11 | } 12 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/TargetInsnNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions; 2 | 3 | import jadx.core.dex.nodes.BlockNode; 4 | import jadx.core.dex.nodes.InsnNode; 5 | 6 | public abstract class TargetInsnNode extends InsnNode { 7 | 8 | public TargetInsnNode(InsnType type, int argsCount) { 9 | super(type, argsCount); 10 | } 11 | 12 | public void initBlocks(BlockNode curBlock) { 13 | } 14 | 15 | public boolean replaceTargetBlock(BlockNode origin, BlockNode replace) { 16 | return false; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/args/Named.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions.args; 2 | 3 | public interface Named { 4 | 5 | String getName(); 6 | 7 | void setName(String name); 8 | } 9 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/args/Typed.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions.args; 2 | 3 | import jadx.core.dex.attributes.AttrNode; 4 | 5 | public abstract class Typed extends AttrNode { 6 | 7 | protected ArgType type; 8 | 9 | public ArgType getType() { 10 | return type; 11 | } 12 | 13 | public void setType(ArgType type) { 14 | this.type = type; 15 | } 16 | 17 | public boolean isTypeImmutable() { 18 | return false; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/instructions/args/VarName.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.instructions.args; 2 | 3 | public class VarName { 4 | private String name; 5 | 6 | public String getName() { 7 | return name; 8 | } 9 | 10 | public void setName(String name) { 11 | this.name = name; 12 | } 13 | 14 | @Override 15 | public String toString() { 16 | return name; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IBlock.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import java.util.List; 4 | 5 | import jadx.api.ICodeWriter; 6 | import jadx.core.codegen.RegionGen; 7 | import jadx.core.utils.exceptions.CodegenException; 8 | 9 | public interface IBlock extends IContainer { 10 | 11 | List getInstructions(); 12 | 13 | @Override 14 | default void generate(RegionGen regionGen, ICodeWriter code) throws CodegenException { 15 | regionGen.makeSimpleBlock(this, code); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IBranchRegion.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import java.util.List; 4 | 5 | public interface IBranchRegion extends IRegion { 6 | 7 | /** 8 | * Return list of branches in this region. 9 | * NOTE: Contains 'null' elements for indicate empty branches. 10 | */ 11 | List getBranches(); 12 | } 13 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/ICodeDataUpdateListener.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import jadx.api.data.ICodeData; 4 | 5 | public interface ICodeDataUpdateListener { 6 | 7 | void updated(ICodeData codeData); 8 | } 9 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/ICodeNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import jadx.api.metadata.ICodeNodeRef; 4 | import jadx.core.dex.attributes.IAttributeNode; 5 | import jadx.core.dex.info.AccessInfo; 6 | 7 | public interface ICodeNode extends IDexNode, IAttributeNode, IUsageInfoNode, ICodeNodeRef { 8 | AccessInfo getAccessFlags(); 9 | 10 | void setAccessFlags(AccessInfo newAccessFlags); 11 | } 12 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IConditionRegion.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import java.util.List; 4 | 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import jadx.core.dex.regions.conditions.IfCondition; 8 | 9 | public interface IConditionRegion extends IRegion { 10 | 11 | @Nullable 12 | IfCondition getCondition(); 13 | 14 | /** 15 | * Blocks merged into condition 16 | * Needed for backtracking 17 | * TODO: merge into condition object ??? 18 | */ 19 | List getConditionBlocks(); 20 | 21 | void invertCondition(); 22 | 23 | boolean simplifyCondition(); 24 | 25 | int getConditionSourceLine(); 26 | } 27 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IContainer.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import jadx.api.ICodeWriter; 4 | import jadx.core.codegen.RegionGen; 5 | import jadx.core.dex.attributes.IAttributeNode; 6 | import jadx.core.utils.exceptions.CodegenException; 7 | 8 | public interface IContainer extends IAttributeNode { 9 | 10 | /** 11 | * Unique id for use in 'toString()' method 12 | */ 13 | String baseString(); 14 | 15 | /** 16 | * Dispatch to needed generate method in RegionGen 17 | */ 18 | default void generate(RegionGen regionGen, ICodeWriter code) throws CodegenException { 19 | throw new CodegenException("Code generate not implemented for container: " + getClass().getSimpleName()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IDexNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | public interface IDexNode { 4 | 5 | String typeName(); 6 | 7 | RootNode root(); 8 | 9 | String getInputFileName(); 10 | } 11 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/ILoadable.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import jadx.core.utils.exceptions.DecodeException; 4 | 5 | public interface ILoadable { 6 | 7 | /** 8 | * On demand loading 9 | */ 10 | void load() throws DecodeException; 11 | 12 | /** 13 | * Free resources 14 | */ 15 | void unload(); 16 | } 17 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IRegion.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import java.util.List; 4 | 5 | public interface IRegion extends IContainer { 6 | 7 | IRegion getParent(); 8 | 9 | void setParent(IRegion parent); 10 | 11 | List getSubBlocks(); 12 | 13 | boolean replaceSubBlock(IContainer oldBlock, IContainer newBlock); 14 | } 15 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/IUsageInfoNode.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | import java.util.List; 4 | 5 | public interface IUsageInfoNode { 6 | List getUseIn(); 7 | } 8 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/LoadStage.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | public enum LoadStage { 4 | NONE, 5 | PROCESS_STAGE, // dependencies not yet loaded 6 | CODEGEN_STAGE, // all dependencies loaded 7 | } 8 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/nodes/ProcessState.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.nodes; 2 | 3 | public enum ProcessState { 4 | NOT_LOADED, 5 | LOADED, 6 | PROCESS_STARTED, 7 | PROCESS_COMPLETE, 8 | GENERATED_AND_UNLOADED; 9 | 10 | public boolean isProcessComplete() { 11 | return this == PROCESS_COMPLETE || this == GENERATED_AND_UNLOADED; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/regions/loops/ForLoop.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.regions.loops; 2 | 3 | import jadx.core.dex.nodes.InsnNode; 4 | 5 | public final class ForLoop extends LoopType { 6 | 7 | private final InsnNode initInsn; 8 | private final InsnNode incrInsn; 9 | 10 | public ForLoop(InsnNode initInsn, InsnNode incrInsn) { 11 | this.initInsn = initInsn; 12 | this.incrInsn = incrInsn; 13 | } 14 | 15 | public InsnNode getInitInsn() { 16 | return initInsn; 17 | } 18 | 19 | public InsnNode getIncrInsn() { 20 | return incrInsn; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopType.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.regions.loops; 2 | 3 | public abstract class LoopType { 4 | } 5 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/trycatch/ExcHandlerAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.trycatch; 2 | 3 | import jadx.api.plugins.input.data.attributes.IJadxAttribute; 4 | import jadx.core.dex.attributes.AType; 5 | 6 | public class ExcHandlerAttr implements IJadxAttribute { 7 | 8 | private final ExceptionHandler handler; 9 | 10 | public ExcHandlerAttr(ExceptionHandler handler) { 11 | this.handler = handler; 12 | } 13 | 14 | @Override 15 | public AType getAttrType() { 16 | return AType.EXC_HANDLER; 17 | } 18 | 19 | public TryCatchBlockAttr getTryBlock() { 20 | return handler.getTryBlock(); 21 | } 22 | 23 | public ExceptionHandler getHandler() { 24 | return handler; 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | return "ExcHandler: " + handler; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/AbstractVisitor.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors; 2 | 3 | import jadx.core.dex.nodes.ClassNode; 4 | import jadx.core.dex.nodes.MethodNode; 5 | import jadx.core.dex.nodes.RootNode; 6 | import jadx.core.utils.exceptions.JadxException; 7 | 8 | public abstract class AbstractVisitor implements IDexTreeVisitor { 9 | 10 | @Override 11 | public void init(RootNode root) throws JadxException { 12 | // no op implementation 13 | } 14 | 15 | @Override 16 | public boolean visit(ClassNode cls) throws JadxException { 17 | // no op implementation 18 | return true; 19 | } 20 | 21 | @Override 22 | public void visit(MethodNode mth) throws JadxException { 23 | // no op implementation 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/regions/AbstractRegionVisitor.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.regions; 2 | 3 | import jadx.core.dex.nodes.IBlock; 4 | import jadx.core.dex.nodes.IRegion; 5 | import jadx.core.dex.nodes.MethodNode; 6 | 7 | public abstract class AbstractRegionVisitor implements IRegionVisitor { 8 | 9 | @Override 10 | public boolean enterRegion(MethodNode mth, IRegion region) { 11 | return true; 12 | } 13 | 14 | @Override 15 | public void processBlock(MethodNode mth, IBlock container) { 16 | } 17 | 18 | @Override 19 | public void leaveRegion(MethodNode mth, IRegion region) { 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/regions/IRegionIterativeVisitor.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.regions; 2 | 3 | import jadx.core.dex.nodes.IRegion; 4 | import jadx.core.dex.nodes.MethodNode; 5 | 6 | public interface IRegionIterativeVisitor { 7 | 8 | /** 9 | * If return 'true' traversal will be restarted. 10 | */ 11 | boolean visitRegion(MethodNode mth, IRegion region); 12 | } 13 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/regions/IRegionVisitor.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.regions; 2 | 3 | import jadx.core.dex.nodes.IBlock; 4 | import jadx.core.dex.nodes.IRegion; 5 | import jadx.core.dex.nodes.MethodNode; 6 | 7 | public interface IRegionVisitor { 8 | 9 | void processBlock(MethodNode mth, IBlock container); 10 | 11 | /** 12 | * @return true for traverse sub-blocks, false otherwise. 13 | */ 14 | boolean enterRegion(MethodNode mth, IRegion region); 15 | 16 | void leaveRegion(MethodNode mth, IRegion region); 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/shrink/WrapInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.shrink; 2 | 3 | import jadx.core.dex.instructions.args.RegisterArg; 4 | import jadx.core.dex.nodes.InsnNode; 5 | 6 | final class WrapInfo { 7 | private final InsnNode insn; 8 | private final RegisterArg arg; 9 | 10 | WrapInfo(InsnNode assignInsn, RegisterArg arg) { 11 | this.insn = assignInsn; 12 | this.arg = arg; 13 | } 14 | 15 | InsnNode getInsn() { 16 | return insn; 17 | } 18 | 19 | RegisterArg getArg() { 20 | return arg; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return "WrapInfo: " + arg + " -> " + insn; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/BoundEnum.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | public enum BoundEnum { 4 | ASSIGN, 5 | USE 6 | } 7 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBound.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | import jadx.core.dex.instructions.args.ArgType; 6 | import jadx.core.dex.instructions.args.RegisterArg; 7 | 8 | /** 9 | * Information to restrict types by applying constraints (or boundaries) 10 | */ 11 | public interface ITypeBound { 12 | 13 | BoundEnum getBound(); 14 | 15 | ArgType getType(); 16 | 17 | @Nullable 18 | RegisterArg getArg(); 19 | } 20 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBoundDynamic.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | import jadx.core.dex.instructions.args.ArgType; 4 | 5 | /** 6 | * 'Dynamic' type bound allows to use requested and not yet applied types 7 | * from {@link TypeUpdateInfo} for more precise restrictions 8 | */ 9 | public interface ITypeBoundDynamic extends ITypeBound { 10 | 11 | /** 12 | * This method will be executed instead of {@link ITypeBound#getType()} 13 | * if {@link TypeUpdateInfo} is available. 14 | */ 15 | ArgType getType(TypeUpdateInfo updateInfo); 16 | } 17 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeConstraint.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | import java.util.List; 4 | 5 | import jadx.core.dex.instructions.args.SSAVar; 6 | 7 | public interface ITypeConstraint { 8 | 9 | List getRelatedVars(); 10 | 11 | boolean check(TypeSearchState state); 12 | } 13 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeListener.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import jadx.core.dex.instructions.args.ArgType; 6 | import jadx.core.dex.instructions.args.InsnArg; 7 | import jadx.core.dex.nodes.InsnNode; 8 | 9 | @FunctionalInterface 10 | public interface ITypeListener { 11 | 12 | /** 13 | * Listener function - triggered on type update 14 | * 15 | * @param updateInfo store all allowed type updates 16 | * @param arg apply suggested type for this arg 17 | * @param candidateType suggest new type 18 | */ 19 | TypeUpdateResult update(TypeUpdateInfo updateInfo, InsnNode insn, InsnArg arg, @NotNull ArgType candidateType); 20 | } 21 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | import java.util.LinkedHashSet; 4 | import java.util.Set; 5 | 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import jadx.core.dex.instructions.args.ArgType; 9 | 10 | public class TypeInfo { 11 | private ArgType type = ArgType.UNKNOWN; 12 | 13 | private final Set bounds = new LinkedHashSet<>(); 14 | 15 | @NotNull 16 | public ArgType getType() { 17 | return type; 18 | } 19 | 20 | public void setType(ArgType type) { 21 | this.type = type; 22 | } 23 | 24 | public Set getBounds() { 25 | return bounds; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return "TypeInfo{type=" + type + ", bounds=" + bounds + '}'; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateEntry.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | import jadx.core.dex.instructions.args.ArgType; 4 | import jadx.core.dex.instructions.args.InsnArg; 5 | 6 | public final class TypeUpdateEntry { 7 | private final InsnArg arg; 8 | private final ArgType type; 9 | 10 | public TypeUpdateEntry(InsnArg arg, ArgType type) { 11 | this.arg = arg; 12 | this.type = type; 13 | } 14 | 15 | public InsnArg getArg() { 16 | return arg; 17 | } 18 | 19 | public ArgType getType() { 20 | return type; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return "TypeUpdateEntry{" + arg + " -> " + type + '}'; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateResult.java: -------------------------------------------------------------------------------- 1 | package jadx.core.dex.visitors.typeinference; 2 | 3 | public enum TypeUpdateResult { 4 | REJECT, 5 | SAME, 6 | CHANGED 7 | } 8 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/utils/CacheStorage.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils; 2 | 3 | import java.util.Collections; 4 | import java.util.Set; 5 | 6 | public class CacheStorage { 7 | 8 | private Set rootPkgs = Collections.emptySet(); 9 | 10 | public Set getRootPkgs() { 11 | return rootPkgs; 12 | } 13 | 14 | public void setRootPkgs(Set rootPkgs) { 15 | this.rootPkgs = rootPkgs; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/utils/exceptions/DecodeException.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils.exceptions; 2 | 3 | import jadx.core.dex.nodes.MethodNode; 4 | 5 | public class DecodeException extends JadxException { 6 | 7 | private static final long serialVersionUID = -6611189094923499636L; 8 | 9 | public DecodeException(String message) { 10 | super(message); 11 | } 12 | 13 | public DecodeException(String message, Throwable cause) { 14 | super(message, cause); 15 | } 16 | 17 | public DecodeException(MethodNode mth, String msg) { 18 | super(mth, msg, null); 19 | } 20 | 21 | public DecodeException(MethodNode mth, String msg, Throwable th) { 22 | super(mth, msg, th); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/utils/exceptions/JadxArgsValidateException.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils.exceptions; 2 | 3 | public class JadxArgsValidateException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = -7457621776087311909L; 6 | 7 | public JadxArgsValidateException(String message) { 8 | super(message); 9 | } 10 | 11 | public JadxArgsValidateException(String message, Throwable cause) { 12 | super(message, cause); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/utils/exceptions/JadxOverflowException.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils.exceptions; 2 | 3 | public class JadxOverflowException extends JadxRuntimeException { 4 | 5 | private static final long serialVersionUID = 2568659798680154204L; 6 | 7 | public JadxOverflowException(String message) { 8 | super(message); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/utils/exceptions/JadxRuntimeException.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils.exceptions; 2 | 3 | import java.util.Arrays; 4 | 5 | import jadx.api.ICodeWriter; 6 | import jadx.core.utils.Utils; 7 | 8 | public class JadxRuntimeException extends RuntimeException { 9 | 10 | private static final long serialVersionUID = -7410848445429898248L; 11 | 12 | public JadxRuntimeException(String message) { 13 | super(message); 14 | } 15 | 16 | public JadxRuntimeException(String... lines) { 17 | super(Utils.listToString(Arrays.asList(lines), ICodeWriter.NL + " ")); 18 | } 19 | 20 | public JadxRuntimeException(String message, Throwable cause) { 21 | super(message, cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/xmlgen/IResParser.java: -------------------------------------------------------------------------------- 1 | package jadx.core.xmlgen; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | 6 | public interface IResParser { 7 | 8 | void decode(InputStream inputStream) throws IOException; 9 | 10 | ResourceStorage getResStorage(); 11 | 12 | String[] getStrings(); 13 | } 14 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/xmlgen/entry/RawNamedValue.java: -------------------------------------------------------------------------------- 1 | package jadx.core.xmlgen.entry; 2 | 3 | public class RawNamedValue { 4 | private final int nameRef; 5 | private final RawValue rawValue; 6 | 7 | public RawNamedValue(int nameRef, RawValue rawValue) { 8 | this.nameRef = nameRef; 9 | this.rawValue = rawValue; 10 | } 11 | 12 | public int getNameRef() { 13 | return nameRef; 14 | } 15 | 16 | public RawValue getRawValue() { 17 | return rawValue; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return "RawNamedValue{nameRef=" + nameRef + ", rawValue=" + rawValue + '}'; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/main/java/jadx/core/xmlgen/entry/RawValue.java: -------------------------------------------------------------------------------- 1 | package jadx.core.xmlgen.entry; 2 | 3 | public final class RawValue { 4 | private final int dataType; 5 | private final int data; 6 | 7 | public RawValue(int dataType, int data) { 8 | this.dataType = dataType; 9 | this.data = data; 10 | } 11 | 12 | public int getDataType() { 13 | return dataType; 14 | } 15 | 16 | public int getData() { 17 | return data; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return "RawValue: type=0x" + Integer.toHexString(dataType) + ", value=" + data; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/main/resources/clst/core.jcst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-core/src/main/resources/clst/core.jcst -------------------------------------------------------------------------------- /jadx-core/src/main/resources/export/build.gradle.tmpl: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | dependencies { 7 | classpath 'com.android.tools.build:gradle:4.0.0' 8 | } 9 | } 10 | 11 | allprojects { 12 | repositories { 13 | google() 14 | jcenter() 15 | } 16 | } 17 | 18 | task clean(type: Delete) { 19 | delete rootProject.buildDir 20 | } 21 | -------------------------------------------------------------------------------- /jadx-core/src/main/resources/export/settings.gradle.tmpl: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = '{{applicationName}}' 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/api/JadxDecompilerTestUtils.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import jadx.core.dex.nodes.RootNode; 4 | import jadx.core.xmlgen.BinaryXMLParser; 5 | 6 | import static org.mockito.Mockito.mock; 7 | import static org.mockito.Mockito.when; 8 | 9 | public class JadxDecompilerTestUtils { 10 | public static JadxDecompiler getMockDecompiler() { 11 | JadxDecompiler decompiler = mock(JadxDecompiler.class); 12 | RootNode rootNode = new RootNode(new JadxArgs()); 13 | when(decompiler.getRoot()).thenReturn(rootNode); 14 | when(decompiler.getBinaryXmlParser()).thenReturn(new BinaryXMLParser(rootNode)); 15 | return decompiler; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/api/JadxInternalAccess.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import jadx.core.dex.nodes.ClassNode; 4 | import jadx.core.dex.nodes.FieldNode; 5 | import jadx.core.dex.nodes.MethodNode; 6 | import jadx.core.dex.nodes.RootNode; 7 | 8 | public class JadxInternalAccess { 9 | 10 | public static RootNode getRoot(JadxDecompiler d) { 11 | return d.getRoot(); 12 | } 13 | 14 | public static JavaClass convertClassNode(JadxDecompiler d, ClassNode clsNode) { 15 | return d.convertClassNode(clsNode); 16 | } 17 | 18 | public static JavaMethod convertMethodNode(JadxDecompiler d, MethodNode mthNode) { 19 | return d.convertMethodNode(mthNode); 20 | } 21 | 22 | public static JavaField convertFieldNode(JadxDecompiler d, FieldNode fldNode) { 23 | return d.convertFieldNode(fldNode); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/core/utils/TestBetterName.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static jadx.core.utils.BetterName.calcRating; 6 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 7 | 8 | public class TestBetterName { 9 | 10 | @Test 11 | public void test() { 12 | expectFirst("color_main", "t0"); 13 | expectFirst("done", "oOo0oO0o"); 14 | } 15 | 16 | private void expectFirst(String first, String second) { 17 | String best = BetterName.compareAndGet(first, second); 18 | assertThat(best) 19 | .as(() -> String.format("'%s'=%d, '%s'=%d", first, calcRating(first), second, calcRating(second))) 20 | .isEqualTo(first); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/core/utils/log/LogUtilsTest.java: -------------------------------------------------------------------------------- 1 | package jadx.core.utils.log; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | 7 | class LogUtilsTest { 8 | 9 | @Test 10 | void escape() { 11 | assertThat(LogUtils.escape("Guest'%0AUser:'Admin")).isEqualTo("Guest..0AUser..Admin"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/core/xmlgen/entry/ValuesParserTest.java: -------------------------------------------------------------------------------- 1 | package jadx.core.xmlgen.entry; 2 | 3 | import java.util.Map; 4 | 5 | import org.junit.jupiter.api.Test; 6 | 7 | import static org.assertj.core.api.Assertions.assertThat; 8 | 9 | class ValuesParserTest { 10 | 11 | @Test 12 | void testResMapLoad() { 13 | Map androidResMap = ValuesParser.getAndroidResMap(); 14 | assertThat(androidResMap).isNotNull().isNotEmpty(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/api/compiler/EclipseCompilerUtils.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.api.compiler; 2 | 3 | import javax.tools.JavaCompiler; 4 | 5 | public class EclipseCompilerUtils { 6 | 7 | public static JavaCompiler newInstance() { 8 | if (!JavaUtils.checkJavaVersion(11)) { 9 | throw new IllegalArgumentException("Eclipse compiler build with Java 11"); 10 | } 11 | try { 12 | Class ecjCls = Class.forName("org.eclipse.jdt.internal.compiler.tool.EclipseCompiler"); 13 | return (JavaCompiler) ecjCls.getConstructor().newInstance(); 14 | } catch (Exception e) { 15 | throw new RuntimeException("Failed to init Eclipse compiler", e); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/api/compiler/StringJavaFileObject.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.api.compiler; 2 | 3 | import java.net.URI; 4 | 5 | import javax.tools.SimpleJavaFileObject; 6 | 7 | public class StringJavaFileObject extends SimpleJavaFileObject { 8 | 9 | private final String content; 10 | 11 | public StringJavaFileObject(String className, String content) { 12 | super(URI.create("string:///" + className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); 13 | this.content = content; 14 | } 15 | 16 | @Override 17 | public CharSequence getCharContent(boolean ignoreEncodingErrors) { 18 | return content; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/api/extensions/profiles/TestWithProfiles.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.api.extensions.profiles; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | import org.junit.jupiter.api.TestTemplate; 9 | import org.junit.jupiter.api.extension.ExtendWith; 10 | 11 | @TestTemplate 12 | @ExtendWith(JadxTestProfilesExtension.class) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target(ElementType.METHOD) 15 | public @interface TestWithProfiles { 16 | 17 | TestProfile[] value(); 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/export/OptionalTargetSdkVersion.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.export; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.ExportGradleTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class OptionalTargetSdkVersion extends ExportGradleTest { 10 | 11 | @Test 12 | void test() { 13 | exportGradle("OptionalTargetSdkVersion.xml", "strings.xml"); 14 | 15 | assertThat(getAppGradleBuild()).contains("targetSdkVersion 14"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arith/TestArithConst.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arith; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.SmaliTest; 7 | 8 | import static jadx.tests.api.utils.JadxMatchers.containsOne; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | 11 | public class TestArithConst extends SmaliTest { 12 | 13 | @Test 14 | public void test() { 15 | noDebugInfo(); 16 | ClassNode cls = getClassNodeFromSmaliWithPath("arith", "TestArithConst"); 17 | String code = cls.getCode().toString(); 18 | 19 | assertThat(code, containsOne("return i + CONST_INT;")); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arith/TestSpecialValues2.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arith; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.NotYetImplemented; 6 | import jadx.tests.api.IntegrationTest; 7 | 8 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 9 | 10 | public class TestSpecialValues2 extends IntegrationTest { 11 | 12 | public static class TestCls { 13 | private static int compareUnsigned(final int x, final int y) { 14 | return Integer.compare(x + Integer.MIN_VALUE, y + Integer.MIN_VALUE); 15 | } 16 | } 17 | 18 | @NotYetImplemented("Constant value replace") 19 | @Test 20 | public void test() { 21 | noDebugInfo(); 22 | assertThat(getClassNode(TestCls.class)) 23 | .code() 24 | .countString(2, "Integer.MIN_VALUE"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arrays; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.IntegrationTest; 7 | 8 | import static org.hamcrest.CoreMatchers.containsString; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | 11 | public class TestArrayFill extends IntegrationTest { 12 | 13 | public static class TestCls { 14 | 15 | public String[] method() { 16 | return new String[] { "1", "2", "3" }; 17 | } 18 | } 19 | 20 | @Test 21 | public void test() { 22 | ClassNode cls = getClassNode(TestCls.class); 23 | String code = cls.getCode().toString(); 24 | 25 | assertThat(code, containsString("return new String[]{\"1\", \"2\", \"3\"};")); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFill3.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arrays; 2 | 3 | import jadx.tests.api.IntegrationTest; 4 | import jadx.tests.api.extensions.profiles.TestProfile; 5 | import jadx.tests.api.extensions.profiles.TestWithProfiles; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestArrayFill3 extends IntegrationTest { 10 | 11 | public static class TestCls { 12 | public byte[] test() { 13 | return new byte[] { 0, 1, 2 }; 14 | } 15 | } 16 | 17 | @TestWithProfiles({ TestProfile.ECJ_J8, TestProfile.ECJ_DX_J8 }) 18 | public void test() { 19 | assertThat(getClassNode(TestCls.class)) 20 | .code() 21 | .containsOne("return new byte[]{0, 1, 2}"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayFillConstReplace.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arrays; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.IntegrationTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestArrayFillConstReplace extends IntegrationTest { 10 | 11 | public static class TestCls { 12 | public static final int CONST_INT = 0xffff; 13 | 14 | public int[] test() { 15 | return new int[] { 127, 129, CONST_INT }; 16 | } 17 | } 18 | 19 | @Test 20 | public void test() { 21 | assertThat(getClassNode(TestCls.class)) 22 | .code() 23 | .containsOne(" int CONST_INT = 65535;") 24 | .containsOne("return new int[]{127, 129, CONST_INT};"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arrays/TestArrayInitField.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arrays; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.IntegrationTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestArrayInitField extends IntegrationTest { 10 | 11 | public static class TestCls { 12 | static byte[] a = new byte[] { 10, 20, 30 }; 13 | byte[] b = new byte[] { 40, 50, 60 }; 14 | } 15 | 16 | @Test 17 | public void test() { 18 | assertThat(getClassNode(TestCls.class)) 19 | .code() 20 | .containsOne("static byte[] a = {10, 20, 30};") 21 | .containsOne("byte[] b = {40, 50, 60};"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/arrays/TestFillArrayData.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.arrays; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.SmaliTest; 7 | 8 | import static org.hamcrest.CoreMatchers.containsString; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | 11 | public class TestFillArrayData extends SmaliTest { 12 | 13 | @Test 14 | public void test() { 15 | ClassNode cls = getClassNodeFromSmaliFiles("TestCls"); 16 | String code = cls.getCode().toString(); 17 | 18 | assertThat(code, containsString("jArr[0] = 1;")); 19 | assertThat(code, containsString("jArr[1] = 2;")); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/conditions/TestBooleanToFloat.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.conditions; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestBooleanToFloat extends SmaliTest { 10 | 11 | // @formatter:off 12 | /* 13 | private boolean showConsent; 14 | 15 | public void write(float f) { 16 | } 17 | 18 | public void writeToParcel(TestBooleanToFloat testBooleanToFloat) { 19 | testBooleanToFloat.write(this.showConsent ? 1 : 0); 20 | } 21 | */ 22 | // @formatter:on 23 | @Test 24 | public void test() { 25 | assertThat(getClassNodeFromSmali()) 26 | .code() 27 | .containsOne("write(this.showConsent ? 1.0f : 0.0f);"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/conditions/TestBooleanToLong.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.conditions; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestBooleanToLong extends SmaliTest { 10 | 11 | // @formatter:off 12 | /* 13 | private boolean showConsent; 14 | 15 | public void write(long j) { 16 | } 17 | 18 | public void writeToParcel(TestBooleanToLong testBooleanToLong) { 19 | testBooleanToLong.write(this.showConsent ? 1 : 0); 20 | } 21 | */ 22 | // @formatter:on 23 | @Test 24 | public void test() { 25 | assertThat(getClassNodeFromSmali()) 26 | .code() 27 | .containsOne("write(this.showConsent ? 1L : 0L);"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions2.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.conditions; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.IntegrationTest; 6 | 7 | public class TestConditions2 extends IntegrationTest { 8 | 9 | public static class TestCls { 10 | int c; 11 | String d; 12 | String f; 13 | 14 | public void testComplexIf(String a, int b) { 15 | if (d == null || (c == 0 && b != -1 && d.length() == 0)) { 16 | c = a.codePointAt(c); 17 | } else { 18 | if (a.hashCode() != 0xCDE) { 19 | c = f.compareTo(a); 20 | } 21 | } 22 | } 23 | } 24 | 25 | @Test 26 | public void test() { 27 | getClassNode(TestCls.class); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign3.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.conditions; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | /** 10 | * Issue #820 11 | */ 12 | public class TestInnerAssign3 extends SmaliTest { 13 | 14 | @Test 15 | public void test() { 16 | disableCompilation(); 17 | assertThat(getClassNodeFromSmali()) 18 | .code() 19 | .containsOne("(testMethod = (testClass1 = null).testMethod()) == null") 20 | .containsOne("testClass1.testField != null"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums10.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.enums; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | /** 10 | * Some enum field was removed, but still exist in values array 11 | */ 12 | public class TestEnums10 extends SmaliTest { 13 | 14 | @Test 15 | public void test() { 16 | assertThat(getClassNodeFromSmali()) 17 | .code() 18 | .doesNotContain("Failed to restore enum class") 19 | .containsOne("enum TestEnums10 {") 20 | .countString(4, "Fake field"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums5.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.enums; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestEnums5 extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | assertThat(getClassNodeFromSmaliWithClsName("kotlin.collections.State")) 14 | .code() 15 | .containsLines( 16 | "enum State {", 17 | indent() + "Ready,", 18 | indent() + "NotReady,", 19 | indent() + "Done,", 20 | indent() + "Failed", 21 | "}"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums8.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.enums; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestEnums8 extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | assertThat(getClassNodeFromSmali()) 14 | .code() 15 | .containsOne("enum TestEnums8"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsWithStaticFields.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.enums; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestEnumsWithStaticFields extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | disableCompilation(); 14 | assertThat(getClassNodeFromSmali()) 15 | .code() 16 | .containsOnlyOnce("INSTANCE;") 17 | .containsOnlyOnce("private static c sB") 18 | .doesNotContain(" sA") 19 | .doesNotContain(" sC") 20 | .doesNotContain("private TestEnumsWithStaticFields(String str) {"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/generics/TestClassSignature.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.generics; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestClassSignature extends SmaliTest { 10 | // @formatter:off 11 | /* 12 | Incorrect class signature, super class is equals to this class: Lgenerics/TestClassSignature; 13 | */ 14 | // @formatter:on 15 | 16 | @Test 17 | public void test() { 18 | allowWarnInCode(); 19 | assertThat(getClassNodeFromSmali()) 20 | .code() 21 | .containsOne("Incorrect class signature") 22 | .doesNotContain("StackOverflowError"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/generics/TestMethodOverride.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.generics; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestMethodOverride extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | disableCompilation(); 14 | 15 | assertThat(getClassNodeFromSmali()) 16 | .code() 17 | .containsOne("String createFromParcel(Parcel parcel) {") 18 | .containsOne("String[] newArray(int i) {") 19 | .countString(2, "@Override"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass13.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.inner; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.IntegrationTest; 6 | 7 | public class TestAnonymousClass13 extends IntegrationTest { 8 | 9 | public static class TestCls { 10 | 11 | public void test() { 12 | new TestCls() { 13 | }; 14 | } 15 | } 16 | 17 | @Test 18 | public void test() { 19 | getClassNode(TestCls.class); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/inner/TestInnerClassSyntheticConstructor.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.inner; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.IntegrationTest; 6 | 7 | public class TestInnerClassSyntheticConstructor extends IntegrationTest { 8 | 9 | private class TestCls { 10 | private int mth() { 11 | return 1; 12 | } 13 | } 14 | 15 | public int call() { 16 | return new TestCls().mth(); 17 | } 18 | 19 | @Test 20 | public void test() { 21 | getClassNode(TestInnerClassSyntheticConstructor.class); 22 | // must compile, no usage of removed synthetic empty class 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke2.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.invoke; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.SmaliTest; 7 | 8 | import static jadx.tests.api.utils.JadxMatchers.containsOne; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | 11 | public class TestCastInOverloadedInvoke2 extends SmaliTest { 12 | 13 | @Test 14 | public void test() { 15 | disableCompilation(); 16 | 17 | ClassNode cls = getClassNodeFromSmali(); 18 | String code = cls.getCode().toString(); 19 | 20 | assertThat(code, containsOne("new Intent().putExtra(\"param\", (Parcelable) null);")); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke4.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.invoke; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.IntegrationTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestCastInOverloadedInvoke4 extends IntegrationTest { 10 | 11 | public static class TestCls { 12 | public String test(String str) { 13 | return str.replace('\n', ' '); 14 | } 15 | } 16 | 17 | @Test 18 | public void test() { 19 | noDebugInfo(); 20 | assertThat(getClassNode(TestCls.class)) 21 | .code() 22 | .containsOne("return str.replace('\\n', ' ');"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/loops/TestEndlessLoop2.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.loops; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | /** 10 | * Empty endless loop, issue #1611 11 | */ 12 | public class TestEndlessLoop2 extends SmaliTest { 13 | @Test 14 | public void test() { 15 | disableCompilation(); 16 | assertThat(getClassNodeFromSmali()) 17 | .code() 18 | .countString(2, "while (true) {"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/loops/TestLoopRestore.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.loops; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestLoopRestore extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | assertThat(getClassNodeFromSmali()) 14 | .code() 15 | .containsOne("try {") 16 | .containsOne("for (byte b : digest) {"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/loops/TestMultiEntryLoop.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.loops; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestMultiEntryLoop extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | assertThat(getClassNodeFromSmali()) 14 | .code() 15 | .containsOne("while (true) {"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.names; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | public class TestClassNameWithInvalidChar extends SmaliTest { 8 | /* 9 | * public class do- {} 10 | * public class i-f {} 11 | */ 12 | 13 | @Test 14 | public void test() { 15 | loadFromSmaliFiles(); 16 | } 17 | 18 | @Test 19 | public void testWithDeobfuscation() { 20 | enableDeobfuscation(); 21 | loadFromSmaliFiles(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/names/pkg/a.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.names.pkg; 2 | 3 | @SuppressWarnings({ "TypeName", "MethodName" }) 4 | public class a { 5 | public static a a() { 6 | return null; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/names/pkg/b.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.names.pkg; 2 | 3 | @SuppressWarnings("TypeName") 4 | public class b { 5 | class a { 6 | } 7 | 8 | private jadx.tests.integration.names.pkg.a a = jadx.tests.integration.names.pkg.a.a(); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/names/pkg2/System.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.names.pkg2; 2 | 3 | public class System { 4 | public static void doSomething() { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/names/pkg2/TestCls.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.names.pkg2; 2 | 3 | public class TestCls { 4 | public void doSomething() { 5 | System.doSomething(); 6 | java.lang.System.out.println("Hello World"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestAllNops.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.SmaliTest; 7 | 8 | import static jadx.tests.api.utils.JadxMatchers.containsLines; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | 11 | public class TestAllNops extends SmaliTest { 12 | 13 | @Test 14 | public void test() { 15 | disableCompilation(); 16 | ClassNode cls = getClassNodeFromSmali(); 17 | String code = cls.getCode().toString(); 18 | 19 | assertThat(code, containsLines(1, "private boolean test() {", "}")); 20 | assertThat(code, containsLines(1, "private boolean testWithTryCatch() {", "}")); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestConstructor.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestConstructor extends SmaliTest { 10 | // @formatter:off 11 | /* 12 | private SomeObject test(double r23, double r25, SomeObject r27) { 13 | SomeObject r17 = new SomeObject 14 | r0 = r17 15 | r1 = r27 16 | r0.(r1) 17 | return r17 18 | } 19 | */ 20 | // @formatter:on 21 | 22 | @Test 23 | public void test() { 24 | disableCompilation(); 25 | assertThat(getClassNodeFromSmali()) 26 | .code() 27 | .containsOne("new SomeObject(arg3);") 28 | .doesNotContain("= someObject"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestDeadBlockReferencesStart.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.JadxMatchers.countString; 8 | import static org.hamcrest.MatcherAssert.assertThat; 9 | 10 | public class TestDeadBlockReferencesStart extends SmaliTest { 11 | @Test 12 | public void test() { 13 | String code = getClassNodeFromSmali().getCode().getCodeStr(); 14 | assertThat(code, countString(0, "throw")); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestExplicitOverride.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.JadxMatchers.countString; 8 | import static org.hamcrest.MatcherAssert.assertThat; 9 | 10 | public class TestExplicitOverride extends SmaliTest { 11 | @Test 12 | public void test() { 13 | String code = getClassNodeFromSmali().getCode().getCodeStr(); 14 | assertThat(code, countString(1, "@Override")); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestIncorrectMethodSignature.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | /** 10 | * Issue #858. 11 | * Incorrect method signature change argument type and shift register numbers 12 | */ 13 | public class TestIncorrectMethodSignature extends SmaliTest { 14 | 15 | @Test 16 | public void test() { 17 | allowWarnInCode(); 18 | assertThat(getClassNodeFromSmali()) 19 | .code() 20 | .containsOne("public TestIncorrectMethodSignature(String str) {"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestInlineVarArg.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestInlineVarArg extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | noDebugInfo(); 14 | assertThat(getClassNodeFromSmali()) 15 | .code() 16 | .containsOne("f(\"a\", \"b\", \"c\");"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestMultipleNOPs.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | public class TestMultipleNOPs extends SmaliTest { 8 | 9 | @Test 10 | public void test() { 11 | disableCompilation(); 12 | 13 | // expected no errors 14 | loadFromSmaliFiles(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestN21.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestN21 extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | assertThat(getClassNodeFromSmali()) 14 | .code() 15 | .countString(2, "while ("); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/others/TestSyntheticConstructor.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.others; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestSyntheticConstructor extends SmaliTest { 10 | // @formatter:off 11 | /* 12 | public class Test { 13 | static { 14 | new BuggyConstructor(); 15 | } 16 | } 17 | */ 18 | // @formatter:on 19 | 20 | @Test 21 | public void test() { 22 | disableCompilation(); 23 | assertThat(getClassNodeFromSmaliFiles("Test")) 24 | .code() 25 | .containsLine(2, "new BuggyConstructor();"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/synchronize/TestNestedSynchronize.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.synchronize; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestNestedSynchronize extends SmaliTest { 10 | 11 | // @formatter:off 12 | /* 13 | public final void test() { 14 | Object obj = null; 15 | Object obj2 = null; 16 | synchronized (obj) { 17 | synchronized (obj2) { 18 | } 19 | } 20 | } 21 | */ 22 | // @formatter:on 23 | 24 | @Test 25 | public void test() { 26 | assertThat(getClassNodeFromSmali()) 27 | .code() 28 | .countString(2, "synchronized"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized5.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.synchronize; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.SmaliTest; 7 | 8 | import static org.hamcrest.CoreMatchers.containsString; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | 11 | public class TestSynchronized5 extends SmaliTest { 12 | @Test 13 | public void test() { 14 | ClassNode cls = getClassNodeFromSmali(); 15 | String code = cls.getCode().toString(); 16 | 17 | assertThat(code, containsString("1 != 0")); 18 | assertThat(code, containsString("System.gc();")); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/trycatch/TestEmptyCatch.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.trycatch; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | /** 10 | * Empty catch blocks in enum switch remap building 11 | */ 12 | public class TestEmptyCatch extends SmaliTest { 13 | 14 | @Test 15 | public void test() { 16 | disableCompilation(); 17 | assertThat(getClassNodeFromSmali()) 18 | .code() 19 | .countString(5, "try {") 20 | .countString(5, "} catch (NoSuchFieldError unused"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch4.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.trycatch; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestNestedTryCatch4 extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | disableCompilation(); 14 | assertThat(getClassNodeFromSmali()) 15 | .code() 16 | .doesNotContain("?? "); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryWithEmptyCatchTriple.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.trycatch; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestTryWithEmptyCatchTriple extends SmaliTest { 10 | @Test 11 | public void test() { 12 | assertThat(getClassNodeFromSmali()) 13 | .code() 14 | // all catches are empty 15 | .containsLines(2, "} catch (Error unused) {", "}") 16 | .containsLines(2, "} catch (Error unused2) {", "}") 17 | .containsLines(2, "} catch (Error unused3) {", "}"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/types/TestPrimitiveConversion.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.types; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestPrimitiveConversion extends SmaliTest { 10 | // @formatter:off 11 | /* 12 | public void test(long j, boolean z) { 13 | putByte(j, z ? (byte) 1 : (byte) 0); 14 | } 15 | 16 | private static void putByte(long j, byte z) { 17 | } 18 | */ 19 | // @formatter:on 20 | 21 | @Test 22 | public void test() { 23 | assertThat(getClassNodeFromSmali()) 24 | .code() 25 | .doesNotContain("putByte(j, z);") 26 | .containsOne("putByte(j, z ? (byte) 1 : (byte) 0);"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/types/TestPrimitiveConversion2.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.types; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestPrimitiveConversion2 extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | disableCompilation(); 14 | assertThat(getClassNodeFromSmali()) 15 | .code() 16 | .containsOne("boolean z2 = !convertedPrice2.code.equals(itemCurrency.code);") 17 | .doesNotContain("z2 == 0") 18 | .doesNotContain("z2 | 2") 19 | .containsOne("(z2 ? 1 : 0) | 2") 20 | .containsOne("if (z2 && formatCurrency != null) {") 21 | .containsOne("i = 1;"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver21.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.types; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | /** 10 | * Issue 1527 11 | */ 12 | @SuppressWarnings("CommentedOutCode") 13 | public class TestTypeResolver21 extends SmaliTest { 14 | // @formatter:off 15 | /* 16 | public Number test(Object objectArray) { 17 | Object[] arr = (Object[]) objectArray; 18 | return (Number) arr[0]; 19 | } 20 | */ 21 | // @formatter:on 22 | 23 | @Test 24 | public void test() { 25 | assertThat(getClassNodeFromSmali()) 26 | .code() 27 | .containsOne("Object[] arr = (Object[]) objectArray;"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver5.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.types; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | import jadx.tests.api.SmaliTest; 7 | 8 | import static org.hamcrest.CoreMatchers.containsString; 9 | import static org.hamcrest.MatcherAssert.assertThat; 10 | import static org.hamcrest.Matchers.not; 11 | 12 | public class TestTypeResolver5 extends SmaliTest { 13 | 14 | @Test 15 | public void test() { 16 | disableCompilation(); 17 | 18 | ClassNode cls = getClassNodeFromSmaliWithPath("types", "TestTypeResolver5"); 19 | String code = cls.getCode().toString(); 20 | 21 | assertThat(code, not(containsString("Object string2"))); 22 | assertThat(code, not(containsString("r1v2"))); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesInLoop.java: -------------------------------------------------------------------------------- 1 | package jadx.tests.integration.variables; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import jadx.tests.api.SmaliTest; 6 | 7 | import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; 8 | 9 | public class TestVariablesInLoop extends SmaliTest { 10 | 11 | @Test 12 | public void test() { 13 | assertThat(getClassNodeFromSmali()) 14 | .code() 15 | .containsOne("int i;") 16 | .countString(2, "i = 0;") 17 | .doesNotContain("i3"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /jadx-core/src/test/manifest/OptionalTargetSdkVersion.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /jadx-core/src/test/manifest/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JadxTestApp 4 | 5 | -------------------------------------------------------------------------------- /jadx-core/src/test/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{HH:mm:ss} %-5level - %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /jadx-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline -------------------------------------------------------------------------------- /jadx-core/src/test/resources/test-samples/app-with-fake-dex.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-core/src/test/resources/test-samples/app-with-fake-dex.apk -------------------------------------------------------------------------------- /jadx-core/src/test/resources/test-samples/hello.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-core/src/test/resources/test-samples/hello.dex -------------------------------------------------------------------------------- /jadx-core/src/test/smali/arith/TestArithConst.smali: -------------------------------------------------------------------------------- 1 | .class public LTestArithConst; 2 | .super Ljava/lang/Object; 3 | 4 | .field public static final CONST_INT:I = 0xff 5 | 6 | .method private test(I)I 7 | .registers 2 8 | 9 | add-int/lit16 v0, p1, 0xff 10 | 11 | return v0 12 | .end method 13 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/arith/TestArithNot.smali: -------------------------------------------------------------------------------- 1 | .class public LTestArithNot; 2 | .super Ljava/lang/Object; 3 | 4 | .method private test1(I)I 5 | .registers 2 6 | .param p1, "a" 7 | 8 | not-int v0, p1 9 | 10 | return v0 11 | .end method 12 | 13 | .method private test2(J)J 14 | .registers 4 15 | .param p1, "b" 16 | 17 | not-long v0, p1 18 | 19 | return v0 20 | .end method 21 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/arith/TestXor.smali: -------------------------------------------------------------------------------- 1 | .class public Larith/TestXor; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | .method public test()Z 6 | .locals 1 7 | 8 | .line 20 9 | const/4 v0, 0x1 10 | 11 | return v0 12 | .end method 13 | 14 | .method public test1()Z 15 | .locals 1 16 | 17 | .line 12 18 | invoke-virtual {p0}, Larith/TestXor;->test()Z 19 | 20 | move-result v0 21 | 22 | xor-int/lit8 v0, v0, 0x1 23 | 24 | return v0 25 | .end method 26 | 27 | .method public test2()Z 28 | .locals 1 29 | 30 | .line 16 31 | invoke-virtual {p0}, Larith/TestXor;->test()Z 32 | 33 | move-result v0 34 | 35 | xor-int/lit8 v0, v0, 0x0 36 | 37 | return v0 38 | .end method 39 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/arrays/TestArrayFillWithMove/TestCls.smali: -------------------------------------------------------------------------------- 1 | .class public Larrays/TestCls; 2 | .super Ljava/lang/Object; 3 | 4 | .method public test()[J 5 | .registers 4 6 | 7 | const/16 v3, 0x2 8 | 9 | move/from16 v0, v3 10 | 11 | new-array v0, v0, [J 12 | 13 | move-object/from16 v1, v0 14 | 15 | fill-array-data v1, :array_0 16 | 17 | return v1 18 | 19 | :array_0 20 | .array-data 8 21 | 0x0 22 | 0x1 23 | .end array-data 24 | .end method 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/arrays/TestFillArrayData/TestCls.smali: -------------------------------------------------------------------------------- 1 | .class public Larrays/TestCls; 2 | .super Ljava/lang/Object; 3 | 4 | .method public test([J)V 5 | .registers 2 6 | 7 | fill-array-data p1, :array_0 8 | 9 | return-void 10 | 11 | :array_0 12 | .array-data 8 13 | 0x1 14 | 0x2 15 | .end array-data 16 | .end method 17 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToByte.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToByte; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToByte;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToByte;->showConsent:Z 10 | 11 | int-to-byte p1, p1 12 | 13 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToByte;->write(B)V 14 | 15 | return-void 16 | .end method 17 | 18 | .method public write(B)V 19 | .locals 0 20 | 21 | return-void 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToChar.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToChar; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToChar;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToChar;->showConsent:Z 10 | 11 | int-to-char p1, p1 12 | 13 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToChar;->write(C)V 14 | 15 | return-void 16 | .end method 17 | 18 | .method public write(C)V 19 | .locals 0 20 | 21 | return-void 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToDouble.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToDouble; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToDouble;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToDouble;->showConsent:Z 10 | 11 | int-to-double p1, p1 12 | 13 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToDouble;->write(D)V 14 | 15 | return-void 16 | .end method 17 | 18 | .method public write(D)V 19 | .locals 0 20 | 21 | return-void 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToFloat.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToFloat; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToFloat;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToFloat;->showConsent:Z 10 | 11 | int-to-float p1, p1 12 | 13 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToFloat;->write(F)V 14 | 15 | return-void 16 | .end method 17 | 18 | .method public write(F)V 19 | .locals 0 20 | 21 | return-void 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToInt.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToInt; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToInt;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToInt;->showConsent:Z 10 | 11 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToInt;->write(I)V 12 | 13 | return-void 14 | .end method 15 | 16 | .method public write(I)V 17 | .locals 0 18 | 19 | return-void 20 | .end method 21 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToLong.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToLong; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToLong;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToLong;->showConsent:Z 10 | 11 | int-to-long p1, p1 12 | 13 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToLong;->write(J)V 14 | 15 | return-void 16 | .end method 17 | 18 | .method public write(J)V 19 | .locals 0 20 | 21 | return-void 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestBooleanToShort.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestBooleanToShort; 2 | .super Ljava/lang/Object; 3 | 4 | .field private showConsent:Z 5 | 6 | .method public writeToParcel(Lconditions/TestBooleanToShort;)V 7 | .locals 0 8 | 9 | iget-boolean p1, p0, Lconditions/TestBooleanToShort;->showConsent:Z 10 | 11 | int-to-short p1, p1 12 | 13 | invoke-virtual {p0, p1}, Lconditions/TestBooleanToShort;->write(S)V 14 | 15 | return-void 16 | .end method 17 | 18 | .method public write(S)V 19 | .locals 0 20 | 21 | return-void 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/conditions/TestInnerAssign3.smali: -------------------------------------------------------------------------------- 1 | .class public Lconditions/TestInnerAssign3; 2 | .super LTestSuper; 3 | .source "Test.java" 4 | 5 | .method public test()V 6 | .locals 5 7 | 8 | const/4 v0, 0 9 | const/4 v1, 0 10 | const/4 v4, 0 11 | 12 | if-eqz v4, :cond_0 13 | 14 | const/4 v2, 0 15 | 16 | invoke-virtual {v2}, LTestClass1;->testMethod()LTestClass2; 17 | 18 | move-result-object v0 19 | 20 | if-eqz v0, :cond_0 21 | 22 | if-eq v1, v0, :cond_0 23 | 24 | iget-object v3, v2, LTestClass1;->testField:LTestClass3; 25 | 26 | if-eqz v3, :cond_0 27 | 28 | :cond_0 29 | return-void 30 | .end method 31 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/generics/TestSyntheticOverride/KotlinFunction1.smali: -------------------------------------------------------------------------------- 1 | .class public interface abstract Lkotlin/jvm/functions/Function1; 2 | .super Ljava/lang/Object; 3 | .source "SourceFile" 4 | 5 | .implements Lkotlin/Function; 6 | 7 | .annotation system Ldalvik/annotation/Signature; 8 | value = { 9 | "", 14 | "Ljava/lang/Object;", 15 | "Lkotlin/Function<", 16 | "TR;>;" 17 | } 18 | .end annotation 19 | 20 | .method public abstract invoke(Ljava/lang/Object;)Ljava/lang/Object; 21 | .annotation system Ldalvik/annotation/Signature; 22 | value = { 23 | "(TP1;)TR;" 24 | } 25 | .end annotation 26 | .end method 27 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inline/TestMethodInline/A.smali: -------------------------------------------------------------------------------- 1 | .class public Linline/A; 2 | .super Ljava/lang/Object; 3 | 4 | .method public static useMth()V 5 | .locals 1 6 | 7 | invoke-static {}, Linline/other/B;->bridgeMth()V 8 | 9 | return-void 10 | .end method 11 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inline/TestMethodInline/B.smali: -------------------------------------------------------------------------------- 1 | .class public Linline/other/B; 2 | .super Ljava/lang/Object; 3 | 4 | .method public static bridge synthetic bridgeMth()V 5 | .locals 1 6 | 7 | invoke-static {}, Linline/other/C;->test()V 8 | 9 | return-void 10 | .end method 11 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inline/TestMethodInline/C.smali: -------------------------------------------------------------------------------- 1 | .class Linline/other/C; # package-private 2 | .super Ljava/lang/Object; 3 | 4 | .method public static test()V 5 | .locals 1 6 | 7 | return-void 8 | .end method 9 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inline/TestSyntheticInline3/KotlinFunction1.smali: -------------------------------------------------------------------------------- 1 | .class public interface abstract Lkotlin/jvm/functions/Function1; 2 | .super Ljava/lang/Object; 3 | .source "SourceFile" 4 | 5 | .implements Lkotlin/Function; 6 | 7 | .annotation system Ldalvik/annotation/Signature; 8 | value = { 9 | "", 14 | "Ljava/lang/Object;", 15 | "Lkotlin/Function<", 16 | "TR;>;" 17 | } 18 | .end annotation 19 | 20 | .method public abstract invoke(Ljava/lang/Object;)Ljava/lang/Object; 21 | .annotation system Ldalvik/annotation/Signature; 22 | value = { 23 | "(TP1;)TR;" 24 | } 25 | .end annotation 26 | .end method 27 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inner/TestAnonymousClass14/OuterCls$1.smali: -------------------------------------------------------------------------------- 1 | .class Linner/OuterCls$1; 2 | .super Ljava/lang/Thread; 3 | .source "SourceFile" 4 | 5 | .annotation system Ldalvik/annotation/InnerClass; 6 | accessFlags = 0x0 7 | name = null 8 | .end annotation 9 | 10 | .field final synthetic this$0:Linner/OuterCls; 11 | 12 | 13 | # direct methods 14 | .method constructor (Linner/OuterCls;Ljava/lang/Runnable;)V 15 | .locals 0 16 | 17 | iput-object p1, p0, Linner/OuterCls$1;->this$0:Linner/OuterCls; 18 | 19 | return-void 20 | .end method 21 | 22 | 23 | # virtual methods 24 | .method public someMethod()V 25 | .locals 3 26 | 27 | return-void 28 | .end method 29 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inner/TestIncorrectAnonymousClass/TestCls$1.smali: -------------------------------------------------------------------------------- 1 | .class public final Linner/TestCls$1; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public constructor ()V 7 | .registers 1 8 | 9 | invoke-direct {p0}, Ljava/lang/Object;->()V 10 | 11 | return-void 12 | .end method 13 | 14 | 15 | # virtual methods 16 | .method public invoke()V 17 | .registers 2 18 | 19 | new-instance v0, Linner/TestCls$1; 20 | 21 | invoke-direct {v0}, Linner/TestCls$1;->()V 22 | 23 | return-void 24 | .end method 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inner/TestIncorrectAnonymousClass/TestCls.smali: -------------------------------------------------------------------------------- 1 | .class public Linner/TestCls; 2 | .super Ljava/lang/Object; 3 | 4 | # direct methods 5 | .method public constructor ()V 6 | .registers 1 7 | 8 | invoke-direct {p0}, Ljava/lang/Object;->()V 9 | 10 | return-void 11 | .end method 12 | 13 | .method public test()V 14 | .registers 2 15 | 16 | new-instance v0, Linner/TestCls$1; 17 | 18 | invoke-direct {v0}, Linner/TestCls$1;->()V 19 | 20 | return-void 21 | .end method 22 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inner/TestNestedAnonymousClass/C.smali: -------------------------------------------------------------------------------- 1 | .class synthetic Linner/C; 2 | .super Ljava/lang/Object; 3 | 4 | .implements Ljava/lang/Runnable; 5 | 6 | .field final synthetic this$1:Linner/B; 7 | 8 | .method constructor (Linner/B;)V 9 | .registers 2 10 | .prologue 11 | iput-object p1, p0, Linner/C;->this$1:Linner/B; 12 | invoke-direct {p0}, Ljava/lang/Object;->()V 13 | return-void 14 | .end method 15 | 16 | .method public run()V 17 | .registers 3 18 | .prologue 19 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 20 | const-string v1, "run" 21 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 22 | return-void 23 | .end method 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/inner/TestSyntheticMthRename/TestCls.smali: -------------------------------------------------------------------------------- 1 | .class public Linner/TestCls; 2 | .super Ljava/lang/Object; 3 | .source "TestCls.java" 4 | 5 | 6 | # annotations 7 | .annotation system Ldalvik/annotation/MemberClasses; 8 | value = { 9 | Linner/TestCls$A;, 10 | Linner/TestCls$I; 11 | } 12 | .end annotation 13 | 14 | 15 | # direct methods 16 | .method public constructor ()V 17 | .registers 1 18 | 19 | .prologue 20 | .line 3 21 | invoke-direct {p0}, Ljava/lang/Object;->()V 22 | 23 | return-void 24 | .end method 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/invoke/TestCastInOverloadedInvoke2.smali: -------------------------------------------------------------------------------- 1 | .class public Linvoke/TestCastInOverloadedInvoke2; 2 | .super Ljava/lang/Object; 3 | 4 | .method public test()V 5 | .locals 3 6 | 7 | new-instance v0, Landroid/content/Intent; 8 | 9 | invoke-direct {v0}, Landroid/content/Intent;->()V 10 | 11 | const-string v1, "param" 12 | 13 | const/4 v2, 0x0 14 | 15 | invoke-virtual {v0, v1, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent; 16 | 17 | return-void 18 | .end method 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/invoke/TestConstructorWithMoves.smali: -------------------------------------------------------------------------------- 1 | .class public Linvoke/TestConstructorWithMoves; 2 | .super Ljava/lang/Object; 3 | 4 | .method static public test()Z 5 | .registers 11 6 | 7 | new-instance v5, Ljava/lang/Boolean; 8 | move-object v8, v5 9 | move-object v5, v8 10 | move-object v6, v8 11 | const-string v7, "test" 12 | invoke-direct {v6, v7}, Ljava/lang/Boolean;->(Ljava/lang/String;)V 13 | check-cast v5, Ljava/lang/Boolean; 14 | invoke-virtual {v5}, Ljava/lang/Boolean;->booleanValue()Z 15 | move-result v5 16 | move v3, v5 17 | return v3 18 | .end method 19 | 20 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/loops/TestLoopCondition5.smali: -------------------------------------------------------------------------------- 1 | .class public LTestLoopCondition5; 2 | .super Ljava/lang/Object; 3 | .source "TestLoopCondition5.java" 4 | 5 | .method private static lastIndexOf([IIII)I 6 | .locals 1 7 | 8 | add-int/lit8 p3, p3, -0x1 9 | 10 | :goto_0 11 | const/4 v0, -0x1 12 | 13 | if-lt p3, p2, :cond_1 14 | 15 | .line 219 16 | aget v0, p0, p3 17 | 18 | if-ne v0, p1, :cond_0 19 | 20 | return p3 21 | 22 | :cond_0 23 | add-int/lit8 p3, p3, -0x1 24 | 25 | goto :goto_0 26 | 27 | :cond_1 28 | move p3, v0 29 | 30 | return p3 31 | .end method 32 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestCaseSensitiveChecks/1.smali: -------------------------------------------------------------------------------- 1 | .class public LA; 2 | .super Ljava/lang/Object; 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestCaseSensitiveChecks/2.smali: -------------------------------------------------------------------------------- 1 | .class public La; 2 | .super Ljava/lang/Object; 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali: -------------------------------------------------------------------------------- 1 | .class public Ldo-; 2 | .super Ljava/lang/Object; 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali: -------------------------------------------------------------------------------- 1 | .class public Li-f; 2 | .super Ljava/lang/Object; 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestFieldCollideWithPackage/1.smali: -------------------------------------------------------------------------------- 1 | .class public Lfirst/A; 2 | .super Ljava/lang/Object; 3 | 4 | .field public first:Lfirst/A; 5 | .field public second:Lsecond/A; 6 | 7 | .method public test()Ljava/lang/String; 8 | .registers 2 9 | 10 | invoke-static {}, Lsecond/A;->call()Ljava/lang/String; 11 | 12 | move-result-object v0 13 | 14 | return-object v0 15 | .end method 16 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestFieldCollideWithPackage/2.smali: -------------------------------------------------------------------------------- 1 | .class public Lsecond/A; 2 | .super Ljava/lang/Object; 3 | 4 | .method static public call()Ljava/lang/String; 5 | .registers 1 6 | 7 | const v0, 0 8 | 9 | return-object v0 10 | .end method 11 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/1.smali: -------------------------------------------------------------------------------- 1 | .class public Lfirst/A; 2 | .super Ljava/lang/Object; 3 | 4 | .method public test()Ljava/lang/String; 5 | .registers 2 6 | 7 | new-instance v1, Lpkg/Second; 8 | 9 | invoke-direct {v1}, Lpkg/Second;->()V 10 | 11 | .local v1, "second":Lpkg/Second; 12 | 13 | invoke-static {}, Lsecond/A;->call()Ljava/lang/String; 14 | 15 | iget-object v0, v1, Lpkg/Second;->str:Ljava/lang/String; 16 | 17 | return-object v0 18 | .end method 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/2.smali: -------------------------------------------------------------------------------- 1 | .class public Lsecond/A; 2 | .super Ljava/lang/Object; 3 | 4 | .method static public call()Ljava/lang/String; 5 | .registers 1 6 | 7 | const v0, 0 8 | 9 | return-object v0 10 | .end method 11 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestLocalVarCollideWithPackage/3.smali: -------------------------------------------------------------------------------- 1 | .class public Lpkg/Second; 2 | .super Ljava/lang/Object; 3 | 4 | .field public str:Ljava/lang/String; 5 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestReservedClassNames.smali: -------------------------------------------------------------------------------- 1 | .class public Ldo; 2 | .super Ljava/lang/Object; 3 | 4 | # direct methods 5 | .method public constructor ()V 6 | .locals 0 7 | 8 | .line 3 9 | invoke-direct {p0}, Ljava/lang/Object;->()V 10 | 11 | return-void 12 | .end method 13 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestReservedNames.smali: -------------------------------------------------------------------------------- 1 | .class public LTestReservedNames; 2 | .super Ljava/lang/Object; 3 | .source "TestReservedNames.java" 4 | 5 | 6 | # instance fields 7 | .field public do:Ljava/lang/String; # reserved name 8 | .field public 0f:Ljava/lang/String; # invalid identifier 9 | 10 | 11 | # direct methods 12 | .method public constructor ()V 13 | .registers 1 14 | 15 | .prologue 16 | .line 3 17 | invoke-direct {p0}, Ljava/lang/Object;->()V 18 | 19 | return-void 20 | .end method 21 | 22 | 23 | # virtual methods 24 | .method public try()Ljava/lang/String; 25 | .registers 2 26 | 27 | .prologue 28 | .line 8 29 | iget-object v0, p0, LTestReservedNames;->do:Ljava/lang/String; 30 | 31 | return-object v0 32 | .end method 33 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/names/TestReservedPackageNames/a.smali: -------------------------------------------------------------------------------- 1 | .class public Ldo/if/A; 2 | .super Ljava/lang/Object; 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestBadMethodAccessModifiers/TestCls.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/TestCls; 2 | .super Ljava/lang/Object; 3 | .source "TestCls.java" 4 | 5 | 6 | # annotations 7 | .annotation system Ldalvik/annotation/MemberClasses; 8 | value = { 9 | Lothers/TestCls$B;, 10 | Lothers/TestCls$A; 11 | } 12 | .end annotation 13 | 14 | 15 | # direct methods 16 | .method public constructor ()V 17 | .registers 1 18 | 19 | .prologue 20 | .line 3 21 | invoke-direct {p0}, Ljava/lang/Object;->()V 22 | 23 | return-void 24 | .end method 25 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestConstructor.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/TestConstructor; 2 | .super Ljava/lang/Object; 3 | 4 | .method private test(DDLSomeObject;)LSomeObject; 5 | .locals 22 6 | .param p1, "arg1" # D 7 | .param p3, "arg2" # D 8 | .param p5, "arg3" # LSomeObject; 9 | 10 | .prologue 11 | .line 54 12 | 13 | new-instance v17, LSomeObject; 14 | 15 | move-object/from16 v0, v17 16 | 17 | move-object/from16 v1, p5 18 | 19 | invoke-direct {v0, v1}, LSomeObject;->(LSomeObject;)V 20 | 21 | .line 59 22 | .local v17, "localSomeObject":LSomeObject; 23 | 24 | return-object v17 25 | .end method 26 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestDeadBlockReferencesStart.smali: -------------------------------------------------------------------------------- 1 | .class Lothers/TestDeadBlockReferencesStart; 2 | .super Ljava/lang/Object; 3 | 4 | .method public test()V 5 | .registers 6 6 | 7 | :start 8 | return-void 9 | 10 | goto :start 11 | .end method 12 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestFixClassAccessModifiers/Cls.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/Cls; 2 | .super Ljava/lang/Object; 3 | 4 | .annotation system Ldalvik/annotation/MemberClasses; 5 | value = { 6 | Lothers/Cls$InnerCls; 7 | } 8 | .end annotation 9 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestFixClassAccessModifiers/InnerCls.smali: -------------------------------------------------------------------------------- 1 | .class private Lothers/Cls$InnerCls; 2 | .super Ljava/lang/Object; 3 | 4 | .annotation system Ldalvik/annotation/EnclosingClass; 5 | value = Lothers/Cls; 6 | .end annotation 7 | 8 | .annotation system Ldalvik/annotation/InnerClass; 9 | accessFlags = 0xA 10 | name = "InnerCls" 11 | .end annotation 12 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestFixClassAccessModifiers/TestCls.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/TestCls; 2 | .super Ljava/lang/Object; 3 | 4 | .field public field:Lothers/Cls$InnerCls; 5 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestIncorrectMethodSignature.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/TestIncorrectMethodSignature; 2 | .super Ljava/lang/RuntimeException; 3 | .source "TestIncorrectMethodSignature.java" 4 | 5 | .method public constructor (Ljava/lang/String;)V 6 | .registers 2 7 | 8 | .annotation system Ldalvik/annotation/Signature; 9 | value = { 10 | "(J)V" 11 | } 12 | .end annotation 13 | 14 | invoke-direct {p0, p1}, Ljava/lang/RuntimeException;->(Ljava/lang/String;)V 15 | 16 | return-void 17 | .end method 18 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestInsnsBeforeSuper/A.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/A; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public constructor (Ljava/lang/String;)V 7 | .registers 3 8 | 9 | .prologue 10 | 11 | invoke-direct {p0}, Ljava/lang/Object;->()V 12 | 13 | return-void 14 | .end method 15 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestInsnsBeforeSuper/B.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/B; 2 | .super Lothers/A; 3 | 4 | 5 | # direct methods 6 | .method public constructor (Ljava/lang/String;)V 7 | .registers 3 8 | 9 | .prologue 10 | invoke-static {p1}, Lothers/B;->checkNull(Ljava/lang/Object;)V 11 | 12 | invoke-direct {p0, p1}, Lothers/A;->(Ljava/lang/String;)V 13 | 14 | return-void 15 | .end method 16 | 17 | 18 | .method public static checkNull(Ljava/lang/Object;)V 19 | .registers 3 20 | 21 | .prologue 22 | if-nez p0, :cond_8 23 | 24 | new-instance v0, Ljava/lang/NullPointerException; 25 | invoke-direct {v0}, Ljava/lang/NullPointerException;->()V 26 | throw v0 27 | 28 | :cond_8 29 | return-void 30 | .end method 31 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestOverridePackagePrivateMethod/A.smali: -------------------------------------------------------------------------------- 1 | .class public Ltest/A; 2 | .super Ljava/lang/Object; 3 | 4 | .method a()V # package-private 5 | .locals 1 6 | return-void 7 | .end method 8 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestOverridePackagePrivateMethod/B.smali: -------------------------------------------------------------------------------- 1 | .class public Ltest/B; 2 | .super Ltest/A; 3 | 4 | .method public a()V 5 | .locals 1 6 | return-void 7 | .end method 8 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestOverridePackagePrivateMethod/C.smali: -------------------------------------------------------------------------------- 1 | .class public Lother/C; 2 | .super Ltest/A; 3 | 4 | .method public a()V 5 | .locals 1 6 | return-void 7 | .end method 8 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestOverrideWithSameName/A.smali: -------------------------------------------------------------------------------- 1 | .class interface abstract Ltest/A; 2 | .super Ljava/lang/Object; 3 | 4 | .method public abstract a()Ltest/B; 5 | .end method 6 | 7 | .method public abstract a()Ltest/C; 8 | .end method 9 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestOverrideWithSameName/B.smali: -------------------------------------------------------------------------------- 1 | .class abstract Ltest/B; 2 | .super Ljava/lang/Object; 3 | 4 | .implements Ltest/A; 5 | 6 | .method public a()Ltest/C; 7 | .registers 2 8 | const/4 v0, 0x0 9 | return-object v0 10 | .end method 11 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestOverrideWithSameName/C.smali: -------------------------------------------------------------------------------- 1 | .class public Ltest/C; 2 | .super Ltest/B; 3 | 4 | .method public a()Ltest/B; 5 | .registers 2 6 | const/4 v0, 0x0 7 | return-object v0 8 | .end method 9 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestSyntheticConstructor/BuggyConstructor.smali: -------------------------------------------------------------------------------- 1 | .class public LBuggyConstructor; 2 | .super Ljava/lang/Object; 3 | .source "BuggyConstructor.java" 4 | 5 | #.implements LInterfaceClass; 6 | 7 | .method public synthetic constructor ()V 8 | .locals 0 9 | invoke-direct {p0}, Ljava/lang/Object;->()V 10 | return-void 11 | .end method 12 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/others/TestSyntheticConstructor/Test.smali: -------------------------------------------------------------------------------- 1 | .class public Lothers/Test; 2 | .super Ljava/lang/Object; 3 | .source "Test.java" 4 | 5 | .field public static final A00:Ljava/lang/Object; 6 | 7 | .method public static constructor ()V 8 | .locals 1 9 | new-instance v0, LBuggyConstructor; 10 | invoke-direct {v0}, LBuggyConstructor;->()V 11 | .end method 12 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/synchronize/TestNestedSynchronize.smali: -------------------------------------------------------------------------------- 1 | .class public final Lsynchronize/TestNestedSynchronize; 2 | .super Ljava/lang/Object; 3 | .source "TestNestedSynchronize.java" 4 | 5 | .method public final test()V 6 | .locals 2 7 | const/4 v0, 0 8 | const/4 v1, 0 9 | monitor-enter v0 10 | monitor-enter v1 11 | monitor-exit v1 12 | monitor-exit v0 13 | return-void 14 | .end method 15 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/trycatch/TestTryCatchNoMoveExc.smali: -------------------------------------------------------------------------------- 1 | .class public Ltrycatch/TestTryCatchNoMoveExc; 2 | .super Ljava/lang/Object; 3 | 4 | .method private static test(Ljava/lang/AutoCloseable;)V 5 | .locals 0 6 | 7 | if-eqz p0, :cond_0 8 | 9 | .line 187 10 | :try_start_0 11 | invoke-interface {p0}, Ljava/lang/AutoCloseable;->close()V 12 | :try_end_0 13 | .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 14 | 15 | :catch_0 16 | :cond_0 17 | return-void 18 | .end method 19 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/trycatch/TestTryCatchNoMoveExc2.smali: -------------------------------------------------------------------------------- 1 | .class public Ltrycatch/TestTryCatchNoMoveExc2; 2 | .super Ljava/lang/Object; 3 | 4 | .method private static test(Ljava/lang/AutoCloseable;)V 5 | .locals 0 6 | 7 | :try_start_0 8 | invoke-interface {p0}, Ljava/lang/AutoCloseable;->close()V 9 | :try_end_0 10 | .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 11 | 12 | :catch_0 13 | invoke-static {}, Ljava/lang/System;->nanoTime()J 14 | 15 | return-void 16 | .end method 17 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestGenericsInFullInnerCls/FieldCls.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/FieldCls; 2 | .super Ljava/lang/Object; 3 | 4 | .field private a:Landroidx/compose/animation/core/bb; 5 | .annotation system Ldalvik/annotation/Signature; 6 | value = { 7 | "Ltypes/test/ba<", 8 | "Ltypes/n;", 9 | ">.types/test/bb<", 10 | "Ltypes/n;", 11 | "Ltypes/n;", 12 | ">;" 13 | } 14 | .end annotation 15 | .end field 16 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestGenericsInFullInnerCls/ba.smali: -------------------------------------------------------------------------------- 1 | .class public final Ltypes/test/ba; 2 | .super Ljava/lang/Object; 3 | 4 | .annotation system Ldalvik/annotation/Signature; 5 | value = { 6 | "", 9 | "Ljava/lang/Object;" 10 | } 11 | .end annotation 12 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestGenericsInFullInnerCls/bc.smali: -------------------------------------------------------------------------------- 1 | .class public final Ltypes/test/bc; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # annotations 6 | .annotation system Ldalvik/annotation/Signature; 7 | value = { 8 | "", 13 | "Ljava/lang/Object;", 14 | "Ltypes/test/ca<", 15 | "TT;>;" 16 | } 17 | .end annotation 18 | 19 | 20 | .field private a:Ltypes/test/ba; 21 | .annotation system Ldalvik/annotation/Signature; 22 | value = { 23 | "Ltypes/test/ba<", 24 | "TS;>;" 25 | } 26 | .end annotation 27 | .end field 28 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestGenericsInFullInnerCls/n.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/n; 2 | .super Ljava/lang/Object; 3 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestPrimitiveConversion.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/TestPrimitiveConversion; 2 | .super Ljava/lang/Object; 3 | 4 | .method public test(JZ)V 5 | .registers 5 6 | 7 | invoke-static {p1, p2, p3}, Ltypes/TestPrimitiveConversion;->putByte(JB)V 8 | return-void 9 | .end method 10 | 11 | .method private static putByte(JB)V 12 | .registers 3 13 | 14 | return-void 15 | .end method 16 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestTypeResolver15.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/TestTypeResolver15; 2 | .super Ljava/lang/Object; 3 | 4 | .method private test(Z)V 5 | .locals 2 6 | 7 | if-eqz p1, :cond_0 8 | 9 | const/4 v1, 0x0 10 | goto :goto_0 11 | 12 | :cond_0 13 | const/16 v1, 0x8 14 | 15 | :goto_0 16 | invoke-virtual {p0, v1}, Ltypes/TestTypeResolver15;->useInt(I)V 17 | 18 | xor-int/lit8 p1, p1, 0x1 19 | invoke-virtual {p0, p1}, Ltypes/TestTypeResolver15;->useInt(I)V 20 | 21 | return-void 22 | .end method 23 | 24 | .method private useInt(I)V 25 | .registers 2 26 | return-void 27 | .end method 28 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestTypeResolver20/Sequence.smali: -------------------------------------------------------------------------------- 1 | .class public interface abstract Lkotlin/sequences/Sequence; 2 | .super Ljava/lang/Object; 3 | .source "SourceFile" 4 | 5 | .annotation system Ldalvik/annotation/Signature; 6 | value = { 7 | "", 10 | "Ljava/lang/Object;" 11 | } 12 | .end annotation 13 | 14 | .method public abstract iterator()Ljava/util/Iterator; 15 | .annotation system Ldalvik/annotation/Signature; 16 | value = { 17 | "()", 18 | "Ljava/util/Iterator<", 19 | "TT;>;" 20 | } 21 | .end annotation 22 | .end method 23 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestTypeResolver21.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/TestTypeResolver21; 2 | .super Ljava/lang/Object; 3 | .source "TestTypeResolver21.java" 4 | 5 | 6 | .method public test(Ljava/lang/Object;)Ljava/lang/Number; 7 | .registers 4 8 | .param p1, "objectArray" # Ljava/lang/Object; 9 | 10 | .prologue 11 | .line 16 12 | check-cast p1, [Ljava/lang/Object; 13 | .end local p1 # "objectArray":Ljava/lang/Object; 14 | move-object v0, p1 15 | check-cast v0, [Ljava/lang/Object; 16 | 17 | .line 17 18 | .local v0, "arr":[Ljava/lang/Object; 19 | const/4 v1, 0x0 20 | aget-object v1, v0, v1 21 | check-cast v1, Ljava/lang/Number; 22 | return-object v1 23 | .end method 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestTypeResolver8/A.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/TestCls$A; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # annotations 6 | .annotation system Ldalvik/annotation/EnclosingClass; 7 | value = Ljadx/tests/integration/types/TestTypeResolver8$TestCls; 8 | .end annotation 9 | 10 | .annotation system Ldalvik/annotation/InnerClass; 11 | accessFlags = 0x9 12 | name = "A" 13 | .end annotation 14 | 15 | 16 | # direct methods 17 | .method public constructor ()V 18 | .registers 1 19 | 20 | invoke-direct {p0}, Ljava/lang/Object;->()V 21 | 22 | return-void 23 | .end method 24 | -------------------------------------------------------------------------------- /jadx-core/src/test/smali/types/TestTypeResolver8/B.smali: -------------------------------------------------------------------------------- 1 | .class public Ltypes/TestCls$B; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # annotations 6 | .annotation system Ldalvik/annotation/EnclosingClass; 7 | value = Ltypes/TestCls; 8 | .end annotation 9 | 10 | .annotation system Ldalvik/annotation/InnerClass; 11 | accessFlags = 0x9 12 | name = "B" 13 | .end annotation 14 | 15 | 16 | # direct methods 17 | .method public constructor (Ltypes/A;)V 18 | .registers 2 19 | 20 | invoke-direct {p0}, Ljava/lang/Object;->()V 21 | 22 | return-void 23 | .end method 24 | -------------------------------------------------------------------------------- /jadx-gui/libs/jfontchooser-1.0.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/libs/jfontchooser-1.0.5.jar -------------------------------------------------------------------------------- /jadx-gui/libs/mapping-io-0.4.0-SNAPSHOT.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/libs/mapping-io-0.4.0-SNAPSHOT.jar -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/device/debugger/SmaliDebuggerException.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.device.debugger; 2 | 3 | public class SmaliDebuggerException extends Exception { 4 | private final int errCode; 5 | private static final long serialVersionUID = -1111111202102191403L; 6 | 7 | public SmaliDebuggerException(Exception e) { 8 | super(e); 9 | errCode = -1; 10 | } 11 | 12 | public SmaliDebuggerException(String msg) { 13 | super(msg); 14 | this.errCode = -1; 15 | } 16 | 17 | public SmaliDebuggerException(String msg, Exception e) { 18 | super(msg, e); 19 | errCode = -1; 20 | } 21 | 22 | public SmaliDebuggerException(String msg, int errCode) { 23 | super(msg); 24 | this.errCode = errCode; 25 | } 26 | 27 | public int getErrCode() { 28 | return errCode; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/device/debugger/smali/RegisterInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.device.debugger.smali; 2 | 3 | import jadx.api.plugins.input.data.ILocalVar; 4 | 5 | public abstract class RegisterInfo implements ILocalVar { 6 | 7 | public boolean isInitialized(long codeOffset) { 8 | return codeOffset >= getStartOffset() && codeOffset < getEndOffset(); 9 | } 10 | 11 | public boolean isUnInitialized(long codeOffset) { 12 | return codeOffset < getStartOffset() || codeOffset >= getEndOffset(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/jobs/Cancelable.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.jobs; 2 | 3 | public interface Cancelable { 4 | boolean isCanceled(); 5 | 6 | void cancel(); 7 | 8 | default int getCancelTimeoutMS() { 9 | return 2000; 10 | } 11 | 12 | default int getShutdownTimeoutMS() { 13 | return 5000; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/jobs/CancelableBackgroundTask.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.jobs; 2 | 3 | import java.util.concurrent.atomic.AtomicBoolean; 4 | 5 | public abstract class CancelableBackgroundTask implements IBackgroundTask { 6 | 7 | private final AtomicBoolean cancel = new AtomicBoolean(false); 8 | 9 | @Override 10 | public boolean isCanceled() { 11 | return cancel.get(); 12 | } 13 | 14 | @Override 15 | public void cancel() { 16 | cancel.set(true); 17 | } 18 | 19 | public void resetCancel() { 20 | cancel.set(false); 21 | } 22 | 23 | @Override 24 | public boolean canBeCanceled() { 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/jobs/ITaskInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.jobs; 2 | 3 | public interface ITaskInfo { 4 | TaskStatus getStatus(); 5 | 6 | long getJobsCount(); 7 | 8 | long getJobsComplete(); 9 | 10 | long getJobsSkipped(); 11 | 12 | long getTime(); 13 | } 14 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/jobs/ITaskProgress.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.jobs; 2 | 3 | public interface ITaskProgress { 4 | 5 | int progress(); 6 | 7 | int total(); 8 | } 9 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/jobs/ProcessResult.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.jobs; 2 | 3 | public class ProcessResult { 4 | private final int skipped; 5 | private final TaskStatus status; 6 | private final int timeLimit; 7 | 8 | public ProcessResult(int skipped, TaskStatus status, int timeLimit) { 9 | this.skipped = skipped; 10 | this.status = status; 11 | this.timeLimit = timeLimit; 12 | } 13 | 14 | public int getSkipped() { 15 | return skipped; 16 | } 17 | 18 | public TaskStatus getStatus() { 19 | return status; 20 | } 21 | 22 | public int getTimeLimit() { 23 | return timeLimit; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/jobs/TaskStatus.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.jobs; 2 | 3 | public enum TaskStatus { 4 | WAIT, 5 | STARTED, 6 | COMPLETE, 7 | CANCEL_BY_USER, 8 | CANCEL_BY_TIMEOUT, 9 | CANCEL_BY_MEMORY, 10 | ERROR; 11 | } 12 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/search/ISearchProvider.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.search; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | import jadx.gui.jobs.Cancelable; 6 | import jadx.gui.jobs.ITaskProgress; 7 | import jadx.gui.treemodel.JNode; 8 | 9 | public interface ISearchProvider extends ITaskProgress { 10 | 11 | /** 12 | * Return next result or null if search complete 13 | */ 14 | @Nullable 15 | JNode next(Cancelable cancelable); 16 | } 17 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/settings/LineNumbersMode.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.settings; 2 | 3 | public enum LineNumbersMode { 4 | DISABLE, 5 | NORMAL, 6 | DEBUG, 7 | AUTO 8 | } 9 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/treemodel/JLoadableNode.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.treemodel; 2 | 3 | public abstract class JLoadableNode extends JNode { 4 | private static final long serialVersionUID = 5543590584166374958L; 5 | 6 | public abstract void loadNode(); 7 | } 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/treemodel/TextNode.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.treemodel; 2 | 3 | import javax.swing.Icon; 4 | 5 | public class TextNode extends JNode { 6 | 7 | private static final long serialVersionUID = 2342749142368352232L; 8 | 9 | private final String label; 10 | 11 | public TextNode(String str) { 12 | this.label = str; 13 | } 14 | 15 | @Override 16 | public JClass getJParent() { 17 | return null; 18 | } 19 | 20 | @Override 21 | public Icon getIcon() { 22 | return null; 23 | } 24 | 25 | @Override 26 | public String makeString() { 27 | return label; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/ui/codearea/AbstractCodeContentPanel.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.ui.codearea; 2 | 3 | import jadx.gui.treemodel.JNode; 4 | import jadx.gui.ui.TabbedPane; 5 | import jadx.gui.ui.panel.ContentPanel; 6 | 7 | /** 8 | * The abstract base class for a content panel that show text based code or a.g. a resource 9 | */ 10 | public abstract class AbstractCodeContentPanel extends ContentPanel { 11 | private static final long serialVersionUID = 4685846894279064422L; 12 | 13 | protected AbstractCodeContentPanel(TabbedPane panel, JNode jnode) { 14 | super(panel, jnode); 15 | } 16 | 17 | public abstract AbstractCodeArea getCodeArea(); 18 | } 19 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/ui/codearea/GoToDeclarationAction.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.ui.codearea; 2 | 3 | import java.awt.event.KeyEvent; 4 | 5 | import jadx.gui.treemodel.JNode; 6 | import jadx.gui.utils.NLS; 7 | 8 | import static javax.swing.KeyStroke.getKeyStroke; 9 | 10 | public final class GoToDeclarationAction extends JNodeAction { 11 | private static final long serialVersionUID = -1186470538894941301L; 12 | 13 | public GoToDeclarationAction(CodeArea codeArea) { 14 | super(NLS.str("popup.go_to_declaration") + " (d)", codeArea); 15 | addKeyBinding(getKeyStroke(KeyEvent.VK_D, 0), "trigger goto decl"); 16 | } 17 | 18 | @Override 19 | public void runAction(JNode node) { 20 | getCodeArea().getContentPanel().getTabbedPane().codeJump(node); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/ui/filedialog/FileOpenMode.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.ui.filedialog; 2 | 3 | public enum FileOpenMode { 4 | OPEN, 5 | OPEN_PROJECT, 6 | ADD, 7 | SAVE_PROJECT, 8 | EXPORT, 9 | CUSTOM_SAVE, 10 | CUSTOM_OPEN 11 | } 12 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/ui/panel/IViewStateSupport.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.ui.panel; 2 | 3 | import jadx.gui.ui.codearea.EditorViewState; 4 | 5 | public interface IViewStateSupport { 6 | 7 | EditorViewState getEditorViewState(); 8 | 9 | void restoreEditorViewState(EditorViewState viewState); 10 | } 11 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/DefaultPopupMenuListener.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils; 2 | 3 | import javax.swing.event.PopupMenuEvent; 4 | import javax.swing.event.PopupMenuListener; 5 | 6 | public interface DefaultPopupMenuListener extends PopupMenuListener { 7 | @Override 8 | default void popupMenuWillBecomeVisible(PopupMenuEvent e) { 9 | } 10 | 11 | @Override 12 | default void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 13 | } 14 | 15 | @Override 16 | default void popupMenuCanceled(PopupMenuEvent e) { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/ILoadListener.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils; 2 | 3 | public interface ILoadListener { 4 | 5 | /** 6 | * Update files/project loaded state 7 | * 8 | * @return true to remove listener 9 | */ 10 | boolean update(boolean loaded); 11 | } 12 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/codecache/FixedCodeCache.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.codecache; 2 | 3 | import jadx.api.ICodeCache; 4 | import jadx.api.ICodeInfo; 5 | import jadx.api.impl.DelegateCodeCache; 6 | 7 | /** 8 | * Code cache with fixed size of wrapped code cache ('remove' and 'add' methods will do nothing). 9 | */ 10 | public class FixedCodeCache extends DelegateCodeCache { 11 | 12 | public FixedCodeCache(ICodeCache codeCache) { 13 | super(codeCache); 14 | } 15 | 16 | @Override 17 | public void remove(String clsFullName) { 18 | // no op 19 | } 20 | 21 | @Override 22 | public void add(String clsFullName, ICodeInfo codeInfo) { 23 | // no op 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/codecache/disk/adapters/ClassNodeAdapter.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.codecache.disk.adapters; 2 | 3 | import java.io.DataInput; 4 | import java.io.DataOutput; 5 | import java.io.IOException; 6 | 7 | import jadx.core.dex.nodes.ClassNode; 8 | import jadx.core.dex.nodes.RootNode; 9 | 10 | public class ClassNodeAdapter implements DataAdapter { 11 | private final RootNode root; 12 | 13 | public ClassNodeAdapter(RootNode root) { 14 | this.root = root; 15 | } 16 | 17 | @Override 18 | public void write(DataOutput out, ClassNode value) throws IOException { 19 | out.writeUTF(value.getClassInfo().getRawName()); 20 | } 21 | 22 | @Override 23 | public ClassNode read(DataInput in) throws IOException { 24 | return root.resolveClass(in.readUTF()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/codecache/disk/adapters/DataAdapter.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.codecache.disk.adapters; 2 | 3 | import java.io.DataInput; 4 | import java.io.DataOutput; 5 | import java.io.IOException; 6 | 7 | public interface DataAdapter { 8 | 9 | void write(DataOutput out, T value) throws IOException; 10 | 11 | T read(DataInput in) throws IOException; 12 | } 13 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/codecache/disk/adapters/InsnCodeOffsetAdapter.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.codecache.disk.adapters; 2 | 3 | import java.io.DataInput; 4 | import java.io.DataOutput; 5 | import java.io.IOException; 6 | 7 | import jadx.api.metadata.annotations.InsnCodeOffset; 8 | 9 | public class InsnCodeOffsetAdapter implements DataAdapter { 10 | 11 | public static final InsnCodeOffsetAdapter INSTANCE = new InsnCodeOffsetAdapter(); 12 | 13 | @Override 14 | public void write(DataOutput out, InsnCodeOffset value) throws IOException { 15 | DataAdapterHelper.writeUVInt(out, value.getOffset()); 16 | } 17 | 18 | @Override 19 | public InsnCodeOffset read(DataInput in) throws IOException { 20 | return new InsnCodeOffset(DataAdapterHelper.readUVInt(in)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/codecache/disk/adapters/NodeEndAdapter.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.codecache.disk.adapters; 2 | 3 | import java.io.DataInput; 4 | import java.io.DataOutput; 5 | import java.io.IOException; 6 | 7 | import jadx.api.metadata.annotations.NodeEnd; 8 | 9 | public class NodeEndAdapter implements DataAdapter { 10 | 11 | @Override 12 | public void write(DataOutput out, NodeEnd value) throws IOException { 13 | } 14 | 15 | @Override 16 | public NodeEnd read(DataInput in) throws IOException { 17 | return NodeEnd.VALUE; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/codecache/disk/adapters/VarRefAdapter.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.codecache.disk.adapters; 2 | 3 | import java.io.DataInput; 4 | import java.io.DataOutput; 5 | import java.io.IOException; 6 | 7 | import jadx.api.metadata.annotations.VarRef; 8 | 9 | public class VarRefAdapter implements DataAdapter { 10 | 11 | public static final VarRefAdapter INSTANCE = new VarRefAdapter(); 12 | 13 | @Override 14 | public void write(DataOutput out, VarRef value) throws IOException { 15 | int refPos = value.getRefPos(); 16 | DataAdapterHelper.writeUVInt(out, refPos); 17 | } 18 | 19 | @Override 20 | public VarRef read(DataInput in) throws IOException { 21 | int refPos = DataAdapterHelper.readUVInt(in); 22 | return VarRef.fromPos(refPos); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/logs/ILogIssuesListener.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.logs; 2 | 3 | public interface ILogIssuesListener { 4 | void onChange(int error, int warnings); 5 | } 6 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/logs/ILogListener.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.logs; 2 | 3 | import ch.qos.logback.classic.Level; 4 | 5 | public interface ILogListener { 6 | Level getFilterLevel(); 7 | 8 | void onAppend(String logStr); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/logs/LogEvent.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.logs; 2 | 3 | import ch.qos.logback.classic.Level; 4 | 5 | final class LogEvent { 6 | private final Level level; 7 | private final String msg; 8 | 9 | LogEvent(Level level, String msg) { 10 | this.level = level; 11 | this.msg = msg; 12 | } 13 | 14 | public Level getLevel() { 15 | return level; 16 | } 17 | 18 | public String getMsg() { 19 | return msg; 20 | } 21 | 22 | @Override 23 | public String toString() { 24 | return level + ": " + msg; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /jadx-gui/src/main/java/jadx/gui/utils/rx/CustomDisposable.java: -------------------------------------------------------------------------------- 1 | package jadx.gui.utils.rx; 2 | 3 | import java.util.concurrent.atomic.AtomicBoolean; 4 | 5 | import io.reactivex.disposables.Disposable; 6 | 7 | public class CustomDisposable implements Disposable { 8 | 9 | private final AtomicBoolean disposed = new AtomicBoolean(false); 10 | private final Runnable disposeTask; 11 | 12 | public CustomDisposable(Runnable disposeTask) { 13 | this.disposeTask = disposeTask; 14 | } 15 | 16 | @Override 17 | public void dispose() { 18 | try { 19 | disposeTask.run(); 20 | } finally { 21 | disposed.set(true); 22 | } 23 | } 24 | 25 | @Override 26 | public boolean isDisposed() { 27 | return disposed.get(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/fonts/Hack-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/main/resources/fonts/Hack-Regular.ttf -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/db_set_breakpoint.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/execute.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/rerun.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/stepOut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/suspend.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/suspendGray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/threadFrozen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/traceInto.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/traceOver.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/debugger/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/detailView.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/enum.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/file_any_type.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/finalMark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/interface.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/newWindow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/package.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/packageClasses.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/resourceBundle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/rootPackageFolder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/staticMark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/nodes/xml.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/search/regexSelected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/search/wordsHovered.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/search/wordsSelected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/Module.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/addFile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/closeHovered.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/exit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/export.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/find.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/logVerbose.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/menu-saveall.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/moduleGroup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/newFolder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/openDisk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/pagination.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/projectDirectory.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/settings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/showInfos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/icons/ui/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/logos/jadx-logo-16px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/main/resources/logos/jadx-logo-16px.png -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/logos/jadx-logo-32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/main/resources/logos/jadx-logo-32px.png -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/logos/jadx-logo-48px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/main/resources/logos/jadx-logo-48px.png -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/logos/jadx-logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/main/resources/logos/jadx-logo.ico -------------------------------------------------------------------------------- /jadx-gui/src/main/resources/logos/jadx-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/main/resources/logos/jadx-logo.png -------------------------------------------------------------------------------- /jadx-gui/src/test/java/jadx/api/Factory.java: -------------------------------------------------------------------------------- 1 | package jadx.api; 2 | 3 | import java.util.List; 4 | 5 | import jadx.core.dex.nodes.ClassNode; 6 | 7 | public class Factory { 8 | 9 | public static JavaPackage newPackage(String name, List classes) { 10 | return new JavaPackage(name, classes); 11 | } 12 | 13 | public static JavaClass newClass(JadxDecompiler decompiler, ClassNode classNode) { 14 | return new JavaClass(classNode, decompiler); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-gui/src/test/resources/certificate-test/CERT.DSA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/test/resources/certificate-test/CERT.DSA -------------------------------------------------------------------------------- /jadx-gui/src/test/resources/certificate-test/CERT.RSA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-gui/src/test/resources/certificate-test/CERT.RSA -------------------------------------------------------------------------------- /jadx-gui/src/test/resources/certificate-test/EMPTY.txt: -------------------------------------------------------------------------------- 1 | test 2 | -------------------------------------------------------------------------------- /jadx-gui/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{HH:mm:ss} %-5level - %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'jadx-library' 3 | } 4 | 5 | dependencies { 6 | api(project(":jadx-plugins:jadx-plugins-api")) 7 | 8 | // TODO: finish own smali printer 9 | implementation 'org.smali:baksmali:2.5.2' 10 | // force latest version for smali 11 | constraints { 12 | implementation 'com.google.guava:guava:30.1.1-jre' 13 | implementation 'com.beust:jcommander:1.81' 14 | } 15 | 16 | // compile smali files in tests 17 | testImplementation('org.smali:smali:2.5.2') { 18 | exclude(group: 'junit', module: 'junit') // ignore junit 4 transitive dependency 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexException.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.dex; 2 | 3 | public class DexException extends RuntimeException { 4 | private static final long serialVersionUID = -5575702801815409269L; 5 | 6 | public DexException(String message, Throwable cause) { 7 | super(message, cause); 8 | } 9 | 10 | public DexException(String message) { 11 | super(message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/insns/payloads/DexArrayPayload.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.dex.insns.payloads; 2 | 3 | import jadx.api.plugins.input.insns.custom.IArrayPayload; 4 | 5 | public class DexArrayPayload implements IArrayPayload { 6 | 7 | private final int size; 8 | private final int elemSize; 9 | private final Object data; 10 | 11 | public DexArrayPayload(int size, int elemSize, Object data) { 12 | this.size = size; 13 | this.elemSize = elemSize; 14 | this.data = data; 15 | } 16 | 17 | @Override 18 | public int getSize() { 19 | return size; 20 | } 21 | 22 | @Override 23 | public int getElementSize() { 24 | return elemSize; 25 | } 26 | 27 | @Override 28 | public Object getData() { 29 | return data; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/DexConsts.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.dex.sections; 2 | 3 | public class DexConsts { 4 | 5 | public static final byte[] DEX_FILE_MAGIC = { 0x64, 0x65, 0x78, 0x0a }; // 'dex\n' 6 | 7 | public static final byte[] ZIP_FILE_MAGIC = { 0x50, 0x4B, 0x03, 0x04 }; 8 | 9 | public static final int MAX_MAGIC_SIZE = 4; 10 | 11 | public static final int ENDIAN_CONSTANT = 0x12345678; 12 | 13 | public static final int NO_INDEX = -1; 14 | } 15 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/smali/InsnFormatter.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.dex.smali; 2 | 3 | interface InsnFormatter { 4 | void format(InsnFormatterInfo insnFormatInfo); 5 | } 6 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/main/resources/META-INF/services/jadx.api.plugins.JadxPlugin: -------------------------------------------------------------------------------- 1 | jadx.plugins.input.dex.DexInputPlugin 2 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/test/resources/samples/app-with-fake-dex.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-plugins/jadx-dex-input/src/test/resources/samples/app-with-fake-dex.apk -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/test/resources/samples/hello.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asmjmp0/AndroidRunnableJadx/82ce3d308da5950bed3a6b7173ca6f6531e1c43c/jadx-plugins/jadx-dex-input/src/test/resources/samples/hello.dex -------------------------------------------------------------------------------- /jadx-plugins/jadx-dex-input/src/test/resources/samples/test.smali: -------------------------------------------------------------------------------- 1 | .class LHello; 2 | .super Ljava/lang/Object; 3 | .source "test.java" 4 | 5 | 6 | .method public main([Ljava/lang/String;)V 7 | .registers 2 8 | 9 | .line 3 10 | nop 11 | 12 | move v0, v1 13 | 14 | .line 4 15 | return-void 16 | .end method 17 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-convert/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'jadx-library' 3 | } 4 | 5 | dependencies { 6 | api(project(":jadx-plugins:jadx-plugins-api")) 7 | 8 | implementation(project(":jadx-plugins:jadx-dex-input")) 9 | implementation('com.jakewharton.android.repackaged:dalvik-dx:11.0.0_r3') 10 | implementation('com.android.tools:r8:4.0.48') 11 | 12 | implementation 'org.ow2.asm:asm:9.4' 13 | } 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-convert/src/main/resources/META-INF/services/jadx.api.plugins.JadxPlugin: -------------------------------------------------------------------------------- 1 | jadx.plugins.input.javaconvert.JavaConvertPlugin 2 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'jadx-library' 3 | } 4 | 5 | dependencies { 6 | api(project(":jadx-plugins:jadx-plugins-api")) 7 | 8 | // show bytecode disassemble 9 | implementation 'io.github.skylot:raung-disasm:0.0.2' 10 | } 11 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/IJavaAttribute.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes; 2 | 3 | public interface IJavaAttribute { 4 | } 5 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/IJavaAttributeReader.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes; 2 | 3 | import jadx.plugins.input.java.data.DataReader; 4 | import jadx.plugins.input.java.data.JavaClassData; 5 | 6 | public interface IJavaAttributeReader { 7 | IJavaAttribute read(JavaClassData clsData, DataReader reader); 8 | } 9 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/types/CodeAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes.types; 2 | 3 | import jadx.plugins.input.java.data.attributes.IJavaAttribute; 4 | import jadx.plugins.input.java.data.attributes.IJavaAttributeReader; 5 | 6 | public class CodeAttr implements IJavaAttribute { 7 | private final int offset; 8 | 9 | public CodeAttr(int offset) { 10 | this.offset = offset; 11 | } 12 | 13 | public int getOffset() { 14 | return offset; 15 | } 16 | 17 | public static IJavaAttributeReader reader() { 18 | return (clsData, reader) -> new CodeAttr(reader.getOffset()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/types/IgnoredAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes.types; 2 | 3 | import jadx.plugins.input.java.data.attributes.IJavaAttribute; 4 | 5 | @SuppressWarnings("unused") 6 | public class IgnoredAttr implements IJavaAttribute { 7 | } 8 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/types/JavaExceptionsAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes.types; 2 | 3 | import java.util.List; 4 | 5 | import jadx.api.plugins.input.data.attributes.types.ExceptionsAttr; 6 | import jadx.plugins.input.java.data.attributes.IJavaAttribute; 7 | import jadx.plugins.input.java.data.attributes.IJavaAttributeReader; 8 | 9 | public class JavaExceptionsAttr extends ExceptionsAttr implements IJavaAttribute { 10 | public JavaExceptionsAttr(List list) { 11 | super(list); 12 | } 13 | 14 | public static IJavaAttributeReader reader() { 15 | return (clsData, reader) -> new JavaExceptionsAttr(reader.readClassesList(clsData.getConstPoolReader())); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/types/JavaSignatureAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes.types; 2 | 3 | import jadx.api.plugins.input.data.attributes.types.SignatureAttr; 4 | import jadx.plugins.input.java.data.attributes.IJavaAttribute; 5 | import jadx.plugins.input.java.data.attributes.IJavaAttributeReader; 6 | 7 | public class JavaSignatureAttr extends SignatureAttr implements IJavaAttribute { 8 | 9 | public JavaSignatureAttr(String signature) { 10 | super(signature); 11 | } 12 | 13 | public static IJavaAttributeReader reader() { 14 | return (clsData, reader) -> new JavaSignatureAttr(clsData.getConstPoolReader().getUtf8(reader.readU2())); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/types/JavaSourceFileAttr.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes.types; 2 | 3 | import jadx.api.plugins.input.data.attributes.types.SourceFileAttr; 4 | import jadx.plugins.input.java.data.attributes.IJavaAttribute; 5 | import jadx.plugins.input.java.data.attributes.IJavaAttributeReader; 6 | 7 | public class JavaSourceFileAttr extends SourceFileAttr implements IJavaAttribute { 8 | 9 | public JavaSourceFileAttr(String fileName) { 10 | super(fileName); 11 | } 12 | 13 | public static IJavaAttributeReader reader() { 14 | return (clsData, reader) -> new JavaSourceFileAttr(clsData.getConstPoolReader().getUtf8(reader.readU2())); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/attributes/types/data/RawBootstrapMethod.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.attributes.types.data; 2 | 3 | public class RawBootstrapMethod { 4 | private final int methodHandleIdx; 5 | private final int[] args; 6 | 7 | public RawBootstrapMethod(int methodHandleIdx, int[] args) { 8 | this.methodHandleIdx = methodHandleIdx; 9 | this.args = args; 10 | } 11 | 12 | public int getMethodHandleIdx() { 13 | return methodHandleIdx; 14 | } 15 | 16 | public int[] getArgs() { 17 | return args; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/ArrayType.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.code; 2 | 3 | import jadx.plugins.input.java.utils.JavaClassParseException; 4 | 5 | public class ArrayType { 6 | 7 | public static String byValue(int val) { 8 | switch (val) { 9 | case 4: 10 | return "Z"; 11 | case 5: 12 | return "C"; 13 | case 6: 14 | return "F"; 15 | case 7: 16 | return "D"; 17 | case 8: 18 | return "B"; 19 | case 9: 20 | return "S"; 21 | case 10: 22 | return "I"; 23 | case 11: 24 | return "J"; 25 | 26 | default: 27 | throw new JavaClassParseException("Unknown array type value: " + val); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/decoders/IJavaInsnDecoder.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.code.decoders; 2 | 3 | import jadx.plugins.input.java.data.code.CodeDecodeState; 4 | 5 | public interface IJavaInsnDecoder { 6 | void decode(CodeDecodeState state); 7 | 8 | default void skip(CodeDecodeState state) { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/data/code/trycatch/JavaSingleCatch.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.data.code.trycatch; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | public class JavaSingleCatch { 6 | private final int handler; 7 | private final @Nullable String type; 8 | 9 | public JavaSingleCatch(int handler, @Nullable String type) { 10 | this.handler = handler; 11 | this.type = type; 12 | } 13 | 14 | public int getHandler() { 15 | return handler; 16 | } 17 | 18 | public @Nullable String getType() { 19 | return type; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/java/jadx/plugins/input/java/utils/JavaClassParseException.java: -------------------------------------------------------------------------------- 1 | package jadx.plugins.input.java.utils; 2 | 3 | public class JavaClassParseException extends RuntimeException { 4 | private static final long serialVersionUID = -8452845601753645491L; 5 | 6 | public JavaClassParseException(String message, Throwable cause) { 7 | super(message, cause); 8 | } 9 | 10 | public JavaClassParseException(String message) { 11 | super(message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-java-input/src/main/resources/META-INF/services/jadx.api.plugins.JadxPlugin: -------------------------------------------------------------------------------- 1 | jadx.plugins.input.java.JavaInputPlugin 2 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'jadx-library' 3 | } 4 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/JadxPlugin.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins; 2 | 3 | public interface JadxPlugin { 4 | JadxPluginInfo getPluginInfo(); 5 | } 6 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/JadxInputPlugin.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input; 2 | 3 | import java.nio.file.Path; 4 | import java.util.List; 5 | 6 | import jadx.api.plugins.JadxPlugin; 7 | import jadx.api.plugins.input.data.ILoadResult; 8 | 9 | public interface JadxInputPlugin extends JadxPlugin { 10 | ILoadResult loadFiles(List input); 11 | } 12 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/AccessFlagsScope.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public enum AccessFlagsScope { 4 | CLASS, FIELD, METHOD 5 | } 6 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ICallSite.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | 5 | import jadx.api.plugins.input.data.annotations.EncodedValue; 6 | import jadx.api.plugins.input.insns.custom.ICustomPayload; 7 | 8 | public interface ICallSite extends ICustomPayload { 9 | 10 | List getValues(); 11 | 12 | void load(); 13 | } 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ICatch.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public interface ICatch { 4 | String[] getTypes(); 5 | 6 | int[] getHandlers(); 7 | 8 | int getCatchAllHandler(); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IClassData.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import jadx.api.plugins.input.data.attributes.IJadxAttribute; 8 | 9 | public interface IClassData { 10 | IClassData copy(); 11 | 12 | String getInputFileName(); 13 | 14 | String getType(); 15 | 16 | int getAccessFlags(); 17 | 18 | @Nullable 19 | String getSuperType(); 20 | 21 | List getInterfacesTypes(); 22 | 23 | void visitFieldsAndMethods(ISeqConsumer fieldsConsumer, ISeqConsumer mthConsumer); 24 | 25 | List getAttributes(); 26 | 27 | String getDisassembledCode(); 28 | } 29 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ICodeReader.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | import java.util.function.Consumer; 5 | 6 | import org.jetbrains.annotations.Nullable; 7 | 8 | import jadx.api.plugins.input.insns.InsnData; 9 | 10 | public interface ICodeReader { 11 | ICodeReader copy(); 12 | 13 | void visitInstructions(Consumer insnConsumer); 14 | 15 | int getRegistersCount(); 16 | 17 | int getArgsStartReg(); 18 | 19 | int getUnitsCount(); 20 | 21 | @Nullable 22 | IDebugInfo getDebugInfo(); 23 | 24 | int getCodeOffset(); 25 | 26 | List getTries(); 27 | } 28 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IDebugInfo.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | public interface IDebugInfo { 7 | 8 | /** 9 | * Map instruction offset to source line number 10 | */ 11 | Map getSourceLineMapping(); 12 | 13 | List getLocalVars(); 14 | } 15 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IFieldData.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | 5 | import jadx.api.plugins.input.data.attributes.IJadxAttribute; 6 | 7 | public interface IFieldData extends IFieldRef { 8 | 9 | int getAccessFlags(); 10 | 11 | List getAttributes(); 12 | } 13 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IFieldRef.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public interface IFieldRef { 4 | String getParentClassType(); 5 | 6 | String getName(); 7 | 8 | String getType(); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ILoadResult.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.io.Closeable; 4 | import java.util.function.Consumer; 5 | 6 | public interface ILoadResult extends Closeable { 7 | void visitClasses(Consumer consumer); 8 | 9 | void visitResources(Consumer consumer); 10 | 11 | boolean isEmpty(); 12 | } 13 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ILocalVar.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | public interface ILocalVar { 6 | String getName(); 7 | 8 | int getRegNum(); 9 | 10 | String getType(); 11 | 12 | @Nullable 13 | String getSignature(); 14 | 15 | int getStartOffset(); 16 | 17 | int getEndOffset(); 18 | 19 | /** 20 | * Hint if variable is a method parameter. 21 | * Can be incorrect and shouldn't be trusted. 22 | */ 23 | boolean isMarkedAsParameter(); 24 | } 25 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IMethodData.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | import jadx.api.plugins.input.data.attributes.IJadxAttribute; 8 | 9 | public interface IMethodData { 10 | 11 | IMethodRef getMethodRef(); 12 | 13 | int getAccessFlags(); 14 | 15 | @Nullable 16 | ICodeReader getCodeReader(); 17 | 18 | String disassembleMethod(); 19 | 20 | List getAttributes(); 21 | } 22 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IMethodHandle.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public interface IMethodHandle { 4 | 5 | MethodHandleType getType(); 6 | 7 | IFieldRef getFieldRef(); 8 | 9 | IMethodRef getMethodRef(); 10 | 11 | void load(); 12 | } 13 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IMethodProto.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.List; 4 | 5 | public interface IMethodProto { 6 | 7 | String getReturnType(); 8 | 9 | List getArgTypes(); 10 | } 11 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IMethodRef.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import jadx.api.plugins.input.insns.custom.ICustomPayload; 4 | 5 | public interface IMethodRef extends IMethodProto, ICustomPayload { 6 | 7 | /** 8 | * Method unique id (will be used for caching). 9 | * 10 | * @return 0 if can't calculate good unique identifier (disable caching) 11 | */ 12 | int getUniqId(); 13 | 14 | /** 15 | * Lazy loading for method info, until load() is called only getUniqId() can be used 16 | */ 17 | void load(); 18 | 19 | String getParentClassType(); 20 | 21 | String getName(); 22 | } 23 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/IResourceData.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public interface IResourceData { 4 | } 5 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ISeqConsumer.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | import java.util.function.Consumer; 4 | 5 | /** 6 | * "Sequence consumer" allows getting count of elements available 7 | */ 8 | public interface ISeqConsumer extends Consumer { 9 | 10 | default void init(int count) { 11 | // no-op implementation 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/ITry.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public interface ITry { 4 | ICatch getCatch(); 5 | 6 | int getStartOffset(); 7 | 8 | int getEndOffset(); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/MethodHandleType.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data; 2 | 3 | public enum MethodHandleType { 4 | STATIC_PUT, 5 | STATIC_GET, 6 | INSTANCE_PUT, 7 | INSTANCE_GET, 8 | INVOKE_STATIC, 9 | INVOKE_INSTANCE, 10 | INVOKE_DIRECT, 11 | INVOKE_CONSTRUCTOR, 12 | INVOKE_INTERFACE; 13 | 14 | public boolean isField() { 15 | switch (this) { 16 | case STATIC_PUT: 17 | case STATIC_GET: 18 | case INSTANCE_PUT: 19 | case INSTANCE_GET: 20 | return true; 21 | 22 | default: 23 | return false; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/annotations/AnnotationVisibility.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data.annotations; 2 | 3 | public enum AnnotationVisibility { 4 | BUILD, 5 | RUNTIME, 6 | SYSTEM 7 | } 8 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/annotations/EncodedType.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data.annotations; 2 | 3 | public enum EncodedType { 4 | ENCODED_NULL, 5 | ENCODED_BOOLEAN, 6 | ENCODED_BYTE, 7 | ENCODED_SHORT, 8 | ENCODED_CHAR, 9 | ENCODED_INT, 10 | ENCODED_LONG, 11 | ENCODED_FLOAT, 12 | ENCODED_DOUBLE, 13 | ENCODED_STRING, 14 | ENCODED_TYPE, 15 | ENCODED_ENUM, 16 | ENCODED_FIELD, 17 | ENCODED_METHOD, 18 | ENCODED_METHOD_TYPE, 19 | ENCODED_METHOD_HANDLE, 20 | ENCODED_ARRAY, 21 | ENCODED_ANNOTATION 22 | } 23 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/annotations/IAnnotation.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data.annotations; 2 | 3 | import java.util.Map; 4 | 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface IAnnotation { 8 | String getAnnotationClass(); 9 | 10 | AnnotationVisibility getVisibility(); 11 | 12 | Map getValues(); 13 | 14 | @Nullable 15 | default EncodedValue getDefaultValue() { 16 | return getValues().get("value"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/attributes/IJadxAttrType.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data.attributes; 2 | 3 | /** 4 | * Marker interface for attribute type. 5 | * Used for attach attribute instance class information (T). 6 | * T - class of attribute instance 7 | */ 8 | public interface IJadxAttrType { 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/attributes/IJadxAttribute.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data.attributes; 2 | 3 | public interface IJadxAttribute { 4 | 5 | IJadxAttrType getAttrType(); 6 | 7 | /** 8 | * Mark type to skip unloading on node unload 9 | */ 10 | default boolean keepLoaded() { 11 | return false; 12 | } 13 | 14 | default String toAttrString() { 15 | return this.toString(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/data/attributes/PinnedAttribute.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.data.attributes; 2 | 3 | public abstract class PinnedAttribute implements IJadxAttribute { 4 | 5 | @Override 6 | public final boolean keepLoaded() { 7 | return true; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/InsnIndexType.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.insns; 2 | 3 | public enum InsnIndexType { 4 | NONE, 5 | TYPE_REF, 6 | STRING_REF, 7 | FIELD_REF, 8 | METHOD_REF, 9 | CALL_SITE 10 | } 11 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/custom/IArrayPayload.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.insns.custom; 2 | 3 | public interface IArrayPayload extends ICustomPayload { 4 | int getSize(); 5 | 6 | int getElementSize(); 7 | 8 | Object getData(); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/custom/ICustomPayload.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.insns.custom; 2 | 3 | public interface ICustomPayload { 4 | } 5 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/custom/ISwitchPayload.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.insns.custom; 2 | 3 | public interface ISwitchPayload extends ICustomPayload { 4 | int getSize(); 5 | 6 | int[] getKeys(); 7 | 8 | int[] getTargets(); 9 | } 10 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/input/insns/custom/impl/SwitchPayload.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.input.insns.custom.impl; 2 | 3 | import jadx.api.plugins.input.insns.custom.ISwitchPayload; 4 | 5 | public class SwitchPayload implements ISwitchPayload { 6 | 7 | private final int size; 8 | private final int[] keys; 9 | private final int[] targets; 10 | 11 | public SwitchPayload(int size, int[] keys, int[] targets) { 12 | this.size = size; 13 | this.keys = keys; 14 | this.targets = targets; 15 | } 16 | 17 | @Override 18 | public int getSize() { 19 | return size; 20 | } 21 | 22 | @Override 23 | public int[] getKeys() { 24 | return keys; 25 | } 26 | 27 | @Override 28 | public int[] getTargets() { 29 | return targets; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/options/JadxPluginOptions.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.options; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | import jadx.api.plugins.JadxPlugin; 7 | 8 | public interface JadxPluginOptions extends JadxPlugin { 9 | 10 | void setOptions(Map options); 11 | 12 | List getOptionsDescriptions(); 13 | } 14 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-plugins-api/src/main/java/jadx/api/plugins/options/OptionDescription.java: -------------------------------------------------------------------------------- 1 | package jadx.api.plugins.options; 2 | 3 | import java.util.List; 4 | 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | public interface OptionDescription { 8 | 9 | String name(); 10 | 11 | String description(); 12 | 13 | /** 14 | * Possible values. 15 | * Empty if not a limited set 16 | */ 17 | List values(); 18 | 19 | /** 20 | * Default value. 21 | * Null if required 22 | */ 23 | @Nullable 24 | String defaultValue(); 25 | } 26 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-raung-input/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'jadx-library' 3 | } 4 | 5 | dependencies { 6 | api(project(":jadx-plugins:jadx-plugins-api")) 7 | 8 | implementation(project(":jadx-plugins:jadx-java-input")) 9 | 10 | implementation('io.github.skylot:raung-asm:0.0.2') 11 | } 12 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-raung-input/src/main/resources/META-INF/services/jadx.api.plugins.JadxPlugin: -------------------------------------------------------------------------------- 1 | jadx.plugins.input.raung.RaungInputPlugin 2 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-smali-input/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'jadx-library' 3 | } 4 | 5 | dependencies { 6 | api(project(":jadx-plugins:jadx-plugins-api")) 7 | 8 | implementation(project(":jadx-plugins:jadx-dex-input")) 9 | 10 | implementation('org.smali:smali:2.5.2') { 11 | exclude(group: 'junit', module: 'junit') // ignore junit 4 transitive dependency 12 | } 13 | // force latest version for smali 14 | constraints { 15 | implementation 'com.google.guava:guava:30.1.1-jre' 16 | implementation 'com.beust:jcommander:1.81' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jadx-plugins/jadx-smali-input/src/main/resources/META-INF/services/jadx.api.plugins.JadxPlugin: -------------------------------------------------------------------------------- 1 | jadx.plugins.input.smali.SmaliInputPlugin 2 | -------------------------------------------------------------------------------- /lgtm.yml: -------------------------------------------------------------------------------- 1 | path_classifiers: 2 | test: 3 | - "**/test/**/*.java" 4 | 5 | extraction: 6 | java: 7 | index: 8 | build_command: ./gradlew clean build -x test 9 | java_version: 11 10 | properties_files: true 11 | xml_mode: disabled 12 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'jadx' 2 | 3 | include 'jadx-core' 4 | include 'jadx-cli' 5 | include 'jadx-gui' 6 | include 'jadx-plugins' 7 | include 'jadx-plugins:jadx-plugins-api' 8 | include 'jadx-plugins:jadx-dex-input' 9 | include 'jadx-plugins:jadx-java-input' 10 | include 'jadx-plugins:jadx-raung-input' 11 | include 'jadx-plugins:jadx-smali-input' 12 | include 'jadx-plugins:jadx-java-convert' 13 | --------------------------------------------------------------------------------