├── .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**
8 | 3. click R key,or click right mouse button on a method node.
9 | 4. click init button.
10 | 5. click run button.
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 extends IJadxAttribute> 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 extends ICodeNode> 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 |
10 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/execute.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/rerun.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/stepOut.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/suspend.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/suspendGray.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/threadFrozen.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/traceInto.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/traceOver.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/debugger/trash.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/detailView.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/enum.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/file_any_type.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/finalMark.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/folder.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/interface.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/newWindow.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/package.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/packageClasses.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/resourceBundle.svg:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/rootPackageFolder.svg:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/staticMark.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/nodes/xml.svg:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/search/regexSelected.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/search/wordsHovered.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/search/wordsSelected.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/Module.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/addFile.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/close.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/closeHovered.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/error.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/exit.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/export.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/find.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/logVerbose.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/menu-saveall.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/moduleGroup.svg:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/newFolder.svg:
--------------------------------------------------------------------------------
1 |
2 |
9 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/openDisk.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/pagination.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/projectDirectory.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/settings.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/showInfos.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/jadx-gui/src/main/resources/icons/ui/warning.svg:
--------------------------------------------------------------------------------
1 |
2 |
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 extends IJadxAttribute> 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 |
--------------------------------------------------------------------------------