├── .gitignore ├── NOTICE ├── README.md ├── baksmali ├── build.gradle └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── jf │ │ │ └── baksmali │ │ │ ├── Adaptors │ │ │ ├── AnnotationFormatter.java │ │ │ ├── BlankMethodItem.java │ │ │ ├── CatchMethodItem.java │ │ │ ├── ClassDefinition.java │ │ │ ├── CommentMethodItem.java │ │ │ ├── CommentedOutMethodItem.java │ │ │ ├── CommentingIndentingWriter.java │ │ │ ├── Debug │ │ │ │ ├── BeginEpilogueMethodItem.java │ │ │ │ ├── DebugMethodItem.java │ │ │ │ ├── EndLocalMethodItem.java │ │ │ │ ├── EndPrologueMethodItem.java │ │ │ │ ├── LineNumberMethodItem.java │ │ │ │ ├── LocalFormatter.java │ │ │ │ ├── RestartLocalMethodItem.java │ │ │ │ ├── SetSourceFileMethodItem.java │ │ │ │ └── StartLocalMethodItem.java │ │ │ ├── EndTryLabelMethodItem.java │ │ │ ├── FieldDefinition.java │ │ │ ├── Format │ │ │ │ ├── ArrayDataMethodItem.java │ │ │ │ ├── InstructionMethodItem.java │ │ │ │ ├── InstructionMethodItemFactory.java │ │ │ │ ├── OffsetInstructionFormatMethodItem.java │ │ │ │ ├── PackedSwitchMethodItem.java │ │ │ │ ├── SparseSwitchMethodItem.java │ │ │ │ └── UnresolvedOdexInstructionMethodItem.java │ │ │ ├── LabelMethodItem.java │ │ │ ├── MethodDefinition.java │ │ │ ├── MethodItem.java │ │ │ ├── PostInstructionRegisterInfoMethodItem.java │ │ │ ├── PreInstructionRegisterInfoMethodItem.java │ │ │ ├── RegisterFormatter.java │ │ │ └── SyntheticAccessCommentMethodItem.java │ │ │ ├── AnalysisArguments.java │ │ │ ├── Baksmali.java │ │ │ ├── BaksmaliOptions.java │ │ │ ├── DeodexCommand.java │ │ │ ├── DexInputCommand.java │ │ │ ├── DisassembleCommand.java │ │ │ ├── DumpCommand.java │ │ │ ├── HelpCommand.java │ │ │ ├── ListClassesCommand.java │ │ │ ├── ListCommand.java │ │ │ ├── ListDependenciesCommand.java │ │ │ ├── ListDexCommand.java │ │ │ ├── ListFieldOffsetsCommand.java │ │ │ ├── ListFieldsCommand.java │ │ │ ├── ListHelpCommand.java │ │ │ ├── ListMethodsCommand.java │ │ │ ├── ListReferencesCommand.java │ │ │ ├── ListStringsCommand.java │ │ │ ├── ListTypesCommand.java │ │ │ ├── ListVtablesCommand.java │ │ │ ├── Main.java │ │ │ └── formatter │ │ │ ├── BaksmaliFormatter.java │ │ │ └── BaksmaliWriter.java │ └── resources │ │ └── baksmali.properties │ └── test │ ├── java │ └── org │ │ └── jf │ │ └── baksmali │ │ ├── AnalysisTest.java │ │ ├── BaksmaliTestUtils.java │ │ ├── DexTest.java │ │ ├── DisassemblyTest.java │ │ ├── FieldGapOrderTest.java │ │ ├── HiddenApiRestrictionsRoundtripTest.java │ │ ├── HiddenApiRestrictionsTest.java │ │ ├── IdenticalRoundtripTest.java │ │ ├── ImplicitReferenceTest.java │ │ ├── InstructionMethodItemTest.java │ │ ├── InstructionRoundtripTest.java │ │ ├── InterfaceOrderTest.java │ │ ├── InvokeCustomTest.java │ │ ├── LargeLocalTest.java │ │ ├── ManyRegistersTest.java │ │ ├── MultiSwitchTest.java │ │ ├── ParamListMethodNameTest.java │ │ ├── RoundtripTest.java │ │ ├── SwitchTest.java │ │ ├── ZeroArrayPayloadWidthTest.java │ │ └── formatter │ │ ├── BaksmaliWriterTest.java │ │ └── BaksmaliWriterTypeTest.java │ ├── resources │ ├── ConstructorTest │ │ ├── ConstructorTest.smali │ │ ├── ConstructorTest2.smali │ │ └── classes.dex │ ├── DuplicateTest │ │ ├── DuplicateDirectMethods.smali │ │ ├── DuplicateDirectVirtualMethods.smali │ │ ├── DuplicateInstanceFields.smali │ │ ├── DuplicateStaticFields.smali │ │ ├── DuplicateStaticInstanceFields.smali │ │ ├── DuplicateVirtualMethods.smali │ │ ├── classes.dex │ │ └── src │ │ │ ├── DuplicateDirectMethods.smali │ │ │ ├── DuplicateDirectVirtualMethods.smali │ │ │ ├── DuplicateInstanceFields.smali │ │ │ ├── DuplicateStaticFields.smali │ │ │ ├── DuplicateStaticInstanceFields.smali │ │ │ ├── DuplicateVirtualMethods.smali │ │ │ └── README │ ├── FieldGapOrderTest │ │ └── FieldGapOrderInput.dex │ ├── HiddenApiRestrictionsRoundtripTest │ │ ├── HiddenApiRestrictionsInput.smali │ │ └── HiddenApiRestrictionsOutput.smali │ ├── InstanceOfTest │ │ ├── InstanceOfTest.smali │ │ └── classes.dex │ ├── InstructionRoundtripTest │ │ ├── ConstMethodHandle.smali │ │ └── ConstMethodType.smali │ ├── InterfaceOrderTest │ │ └── InterfaceOrder.smali │ ├── InvokeCustomTest │ │ └── InvokeCustom.smali │ ├── LargeLocalTest │ │ ├── LargeEndLocal.smali │ │ ├── LargeRestartLocal.smali │ │ └── LargeStartLocal.smali │ ├── LocalTest │ │ ├── LocalTest.smali │ │ └── classes.dex │ ├── ManyRegistersTest │ │ └── ManyRegisters.smali │ ├── MultiSwitchTest │ │ ├── MultiSwitchInput.dex │ │ ├── MultiSwitchInput.smali │ │ └── MultiSwitchOutput.smali │ ├── MultipleStartInstructionsTest │ │ ├── MultipleStartInstructionsTest.smali │ │ └── classes.dex │ ├── ParamListMethodNameTest │ │ └── ParamListMethodName.smali │ ├── RegisterEqualityOnMergeTest │ │ ├── RegisterEqualityOnMerge.smali │ │ └── classes.dex │ ├── SwitchTest │ │ ├── UnorderedSparseSwitchInput.smali │ │ └── UnorderedSparseSwitchOutput.smali │ ├── UninitRefIdentityTest │ │ ├── UninitRefIdentityTest.smali │ │ └── classes.dex │ └── ZeroArrayPayloadWidthTest │ │ ├── ZeroArrayPayloadWidthTestInput.dex │ │ └── ZeroArrayPayloadWidthTestOutput.smali │ └── smali │ ├── baksmali_test_class.smali │ ├── deodex_test1 │ ├── main.smali │ ├── randomclass.smali │ ├── subclass.smali │ └── superclass.smali │ └── deodex_test2 │ ├── app_classes │ └── main.smali │ └── bootclass_classes │ ├── randomclass.smali │ ├── subclass1.smali │ ├── subclass2.smali │ ├── superclass.smali │ └── supersuperclass.smali ├── build.gradle ├── deodexerant ├── Android.mk ├── README └── deodexerant.c ├── dexlib2 ├── OatVersions-README.md ├── OatVersions.txt ├── VdexVersions.txt ├── accessorTestGenerator │ ├── build.gradle │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── jf │ │ │ └── dexlib2 │ │ │ └── AccessorTestGenerator.java │ │ └── resources │ │ └── AccessorTest.stg ├── build.gradle └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── jf │ │ │ ├── dexlib2 │ │ │ ├── AccessFlags.java │ │ │ ├── AnnotationVisibility.java │ │ │ ├── DebugItemType.java │ │ │ ├── DexFileFactory.java │ │ │ ├── Format.java │ │ │ ├── HiddenApiRestriction.java │ │ │ ├── MethodHandleType.java │ │ │ ├── Opcode.java │ │ │ ├── Opcodes.java │ │ │ ├── ReferenceType.java │ │ │ ├── ValueType.java │ │ │ ├── VerificationError.java │ │ │ ├── VersionMap.java │ │ │ ├── analysis │ │ │ │ ├── AnalysisException.java │ │ │ │ ├── AnalyzedInstruction.java │ │ │ │ ├── AnalyzedMethodUtil.java │ │ │ │ ├── ArrayProto.java │ │ │ │ ├── ClassPath.java │ │ │ │ ├── ClassPathResolver.java │ │ │ │ ├── ClassProto.java │ │ │ │ ├── ClassProvider.java │ │ │ │ ├── CustomInlineMethodResolver.java │ │ │ │ ├── DexClassProvider.java │ │ │ │ ├── InlineMethodResolver.java │ │ │ │ ├── MethodAnalyzer.java │ │ │ │ ├── OdexedFieldInstructionMapper.java │ │ │ │ ├── PathEntryLoader.java │ │ │ │ ├── PrimitiveProto.java │ │ │ │ ├── RegisterType.java │ │ │ │ ├── TypeProto.java │ │ │ │ ├── UnknownClassProto.java │ │ │ │ ├── UnresolvedClassException.java │ │ │ │ ├── UnresolvedOdexInstruction.java │ │ │ │ ├── reflection │ │ │ │ │ ├── ReflectionClassDef.java │ │ │ │ │ ├── ReflectionConstructor.java │ │ │ │ │ ├── ReflectionField.java │ │ │ │ │ ├── ReflectionMethod.java │ │ │ │ │ └── util │ │ │ │ │ │ └── ReflectionUtils.java │ │ │ │ └── util │ │ │ │ │ └── TypeProtoUtils.java │ │ │ ├── base │ │ │ │ ├── BaseAnnotation.java │ │ │ │ ├── BaseAnnotationElement.java │ │ │ │ ├── BaseExceptionHandler.java │ │ │ │ ├── BaseMethodParameter.java │ │ │ │ ├── BaseTryBlock.java │ │ │ │ ├── reference │ │ │ │ │ ├── BaseCallSiteReference.java │ │ │ │ │ ├── BaseFieldReference.java │ │ │ │ │ ├── BaseMethodHandleReference.java │ │ │ │ │ ├── BaseMethodProtoReference.java │ │ │ │ │ ├── BaseMethodReference.java │ │ │ │ │ ├── BaseReference.java │ │ │ │ │ ├── BaseStringReference.java │ │ │ │ │ └── BaseTypeReference.java │ │ │ │ └── value │ │ │ │ │ ├── BaseAnnotationEncodedValue.java │ │ │ │ │ ├── BaseArrayEncodedValue.java │ │ │ │ │ ├── BaseBooleanEncodedValue.java │ │ │ │ │ ├── BaseByteEncodedValue.java │ │ │ │ │ ├── BaseCharEncodedValue.java │ │ │ │ │ ├── BaseDoubleEncodedValue.java │ │ │ │ │ ├── BaseEnumEncodedValue.java │ │ │ │ │ ├── BaseFieldEncodedValue.java │ │ │ │ │ ├── BaseFloatEncodedValue.java │ │ │ │ │ ├── BaseIntEncodedValue.java │ │ │ │ │ ├── BaseLongEncodedValue.java │ │ │ │ │ ├── BaseMethodEncodedValue.java │ │ │ │ │ ├── BaseMethodHandleEncodedValue.java │ │ │ │ │ ├── BaseMethodTypeEncodedValue.java │ │ │ │ │ ├── BaseNullEncodedValue.java │ │ │ │ │ ├── BaseShortEncodedValue.java │ │ │ │ │ ├── BaseStringEncodedValue.java │ │ │ │ │ └── BaseTypeEncodedValue.java │ │ │ ├── builder │ │ │ │ ├── BuilderDebugItem.java │ │ │ │ ├── BuilderExceptionHandler.java │ │ │ │ ├── BuilderInstruction.java │ │ │ │ ├── BuilderOffsetInstruction.java │ │ │ │ ├── BuilderSwitchPayload.java │ │ │ │ ├── BuilderTryBlock.java │ │ │ │ ├── ItemWithLocation.java │ │ │ │ ├── Label.java │ │ │ │ ├── LocatedDebugItems.java │ │ │ │ ├── LocatedItems.java │ │ │ │ ├── LocatedLabels.java │ │ │ │ ├── MethodImplementationBuilder.java │ │ │ │ ├── MethodLocation.java │ │ │ │ ├── MutableMethodImplementation.java │ │ │ │ ├── SwitchLabelElement.java │ │ │ │ ├── debug │ │ │ │ │ ├── BuilderEndLocal.java │ │ │ │ │ ├── BuilderEpilogueBegin.java │ │ │ │ │ ├── BuilderLineNumber.java │ │ │ │ │ ├── BuilderPrologueEnd.java │ │ │ │ │ ├── BuilderRestartLocal.java │ │ │ │ │ ├── BuilderSetSourceFile.java │ │ │ │ │ └── BuilderStartLocal.java │ │ │ │ └── instruction │ │ │ │ │ ├── BuilderArrayPayload.java │ │ │ │ │ ├── BuilderInstruction10t.java │ │ │ │ │ ├── BuilderInstruction10x.java │ │ │ │ │ ├── BuilderInstruction11n.java │ │ │ │ │ ├── BuilderInstruction11x.java │ │ │ │ │ ├── BuilderInstruction12x.java │ │ │ │ │ ├── BuilderInstruction20bc.java │ │ │ │ │ ├── BuilderInstruction20t.java │ │ │ │ │ ├── BuilderInstruction21c.java │ │ │ │ │ ├── BuilderInstruction21ih.java │ │ │ │ │ ├── BuilderInstruction21lh.java │ │ │ │ │ ├── BuilderInstruction21s.java │ │ │ │ │ ├── BuilderInstruction21t.java │ │ │ │ │ ├── BuilderInstruction22b.java │ │ │ │ │ ├── BuilderInstruction22c.java │ │ │ │ │ ├── BuilderInstruction22cs.java │ │ │ │ │ ├── BuilderInstruction22s.java │ │ │ │ │ ├── BuilderInstruction22t.java │ │ │ │ │ ├── BuilderInstruction22x.java │ │ │ │ │ ├── BuilderInstruction23x.java │ │ │ │ │ ├── BuilderInstruction30t.java │ │ │ │ │ ├── BuilderInstruction31c.java │ │ │ │ │ ├── BuilderInstruction31i.java │ │ │ │ │ ├── BuilderInstruction31t.java │ │ │ │ │ ├── BuilderInstruction32x.java │ │ │ │ │ ├── BuilderInstruction35c.java │ │ │ │ │ ├── BuilderInstruction35mi.java │ │ │ │ │ ├── BuilderInstruction35ms.java │ │ │ │ │ ├── BuilderInstruction3rc.java │ │ │ │ │ ├── BuilderInstruction3rmi.java │ │ │ │ │ ├── BuilderInstruction3rms.java │ │ │ │ │ ├── BuilderInstruction45cc.java │ │ │ │ │ ├── BuilderInstruction4rcc.java │ │ │ │ │ ├── BuilderInstruction51l.java │ │ │ │ │ ├── BuilderPackedSwitchPayload.java │ │ │ │ │ ├── BuilderSparseSwitchPayload.java │ │ │ │ │ └── BuilderSwitchElement.java │ │ │ ├── dexbacked │ │ │ │ ├── CDexBackedDexFile.java │ │ │ │ ├── CDexBackedMethodImplementation.java │ │ │ │ ├── DexBackedAnnotation.java │ │ │ │ ├── DexBackedAnnotationElement.java │ │ │ │ ├── DexBackedCatchAllExceptionHandler.java │ │ │ │ ├── DexBackedClassDef.java │ │ │ │ ├── DexBackedDexFile.java │ │ │ │ ├── DexBackedExceptionHandler.java │ │ │ │ ├── DexBackedField.java │ │ │ │ ├── DexBackedMethod.java │ │ │ │ ├── DexBackedMethodImplementation.java │ │ │ │ ├── DexBackedOdexFile.java │ │ │ │ ├── DexBackedTryBlock.java │ │ │ │ ├── DexBackedTypedExceptionHandler.java │ │ │ │ ├── DexBuffer.java │ │ │ │ ├── DexReader.java │ │ │ │ ├── OatFile.java │ │ │ │ ├── ZipDexContainer.java │ │ │ │ ├── instruction │ │ │ │ │ ├── DexBackedArrayPayload.java │ │ │ │ │ ├── DexBackedInstruction.java │ │ │ │ │ ├── DexBackedInstruction10t.java │ │ │ │ │ ├── DexBackedInstruction10x.java │ │ │ │ │ ├── DexBackedInstruction11n.java │ │ │ │ │ ├── DexBackedInstruction11x.java │ │ │ │ │ ├── DexBackedInstruction12x.java │ │ │ │ │ ├── DexBackedInstruction20bc.java │ │ │ │ │ ├── DexBackedInstruction20t.java │ │ │ │ │ ├── DexBackedInstruction21c.java │ │ │ │ │ ├── DexBackedInstruction21ih.java │ │ │ │ │ ├── DexBackedInstruction21lh.java │ │ │ │ │ ├── DexBackedInstruction21s.java │ │ │ │ │ ├── DexBackedInstruction21t.java │ │ │ │ │ ├── DexBackedInstruction22b.java │ │ │ │ │ ├── DexBackedInstruction22c.java │ │ │ │ │ ├── DexBackedInstruction22cs.java │ │ │ │ │ ├── DexBackedInstruction22s.java │ │ │ │ │ ├── DexBackedInstruction22t.java │ │ │ │ │ ├── DexBackedInstruction22x.java │ │ │ │ │ ├── DexBackedInstruction23x.java │ │ │ │ │ ├── DexBackedInstruction30t.java │ │ │ │ │ ├── DexBackedInstruction31c.java │ │ │ │ │ ├── DexBackedInstruction31i.java │ │ │ │ │ ├── DexBackedInstruction31t.java │ │ │ │ │ ├── DexBackedInstruction32x.java │ │ │ │ │ ├── DexBackedInstruction35c.java │ │ │ │ │ ├── DexBackedInstruction35mi.java │ │ │ │ │ ├── DexBackedInstruction35ms.java │ │ │ │ │ ├── DexBackedInstruction3rc.java │ │ │ │ │ ├── DexBackedInstruction3rmi.java │ │ │ │ │ ├── DexBackedInstruction3rms.java │ │ │ │ │ ├── DexBackedInstruction45cc.java │ │ │ │ │ ├── DexBackedInstruction4rcc.java │ │ │ │ │ ├── DexBackedInstruction51l.java │ │ │ │ │ ├── DexBackedPackedSwitchPayload.java │ │ │ │ │ ├── DexBackedSparseSwitchPayload.java │ │ │ │ │ └── DexBackedUnknownInstruction.java │ │ │ │ ├── raw │ │ │ │ │ ├── AnnotationDirectoryItem.java │ │ │ │ │ ├── AnnotationItem.java │ │ │ │ │ ├── AnnotationSetItem.java │ │ │ │ │ ├── AnnotationSetRefList.java │ │ │ │ │ ├── CallSiteIdItem.java │ │ │ │ │ ├── CdexDebugOffsetTable.java │ │ │ │ │ ├── CdexHeaderItem.java │ │ │ │ │ ├── ClassDataItem.java │ │ │ │ │ ├── ClassDefItem.java │ │ │ │ │ ├── CodeItem.java │ │ │ │ │ ├── DebugInfoItem.java │ │ │ │ │ ├── EncodedArrayItem.java │ │ │ │ │ ├── EncodedValue.java │ │ │ │ │ ├── FieldIdItem.java │ │ │ │ │ ├── HeaderItem.java │ │ │ │ │ ├── HiddenApiClassDataItem.java │ │ │ │ │ ├── ItemType.java │ │ │ │ │ ├── MapItem.java │ │ │ │ │ ├── MethodHandleItem.java │ │ │ │ │ ├── MethodIdItem.java │ │ │ │ │ ├── OdexHeaderItem.java │ │ │ │ │ ├── ProtoIdItem.java │ │ │ │ │ ├── SectionAnnotator.java │ │ │ │ │ ├── StringDataItem.java │ │ │ │ │ ├── StringIdItem.java │ │ │ │ │ ├── TypeIdItem.java │ │ │ │ │ ├── TypeListItem.java │ │ │ │ │ └── util │ │ │ │ │ │ └── DexAnnotator.java │ │ │ │ ├── reference │ │ │ │ │ ├── DexBackedCallSiteReference.java │ │ │ │ │ ├── DexBackedFieldReference.java │ │ │ │ │ ├── DexBackedMethodHandleReference.java │ │ │ │ │ ├── DexBackedMethodProtoReference.java │ │ │ │ │ ├── DexBackedMethodReference.java │ │ │ │ │ ├── DexBackedReference.java │ │ │ │ │ ├── DexBackedStringReference.java │ │ │ │ │ └── DexBackedTypeReference.java │ │ │ │ ├── util │ │ │ │ │ ├── AnnotationsDirectory.java │ │ │ │ │ ├── DebugInfo.java │ │ │ │ │ ├── EncodedArrayItemIterator.java │ │ │ │ │ ├── FixedSizeList.java │ │ │ │ │ ├── FixedSizeSet.java │ │ │ │ │ ├── ParameterIterator.java │ │ │ │ │ ├── VariableSizeCollection.java │ │ │ │ │ ├── VariableSizeIterator.java │ │ │ │ │ ├── VariableSizeList.java │ │ │ │ │ ├── VariableSizeListIterator.java │ │ │ │ │ ├── VariableSizeLookaheadIterator.java │ │ │ │ │ └── VariableSizeSet.java │ │ │ │ └── value │ │ │ │ │ ├── DexBackedAnnotationEncodedValue.java │ │ │ │ │ ├── DexBackedArrayEncodedValue.java │ │ │ │ │ ├── DexBackedEncodedValue.java │ │ │ │ │ ├── DexBackedEnumEncodedValue.java │ │ │ │ │ ├── DexBackedFieldEncodedValue.java │ │ │ │ │ ├── DexBackedMethodEncodedValue.java │ │ │ │ │ ├── DexBackedMethodHandleEncodedValue.java │ │ │ │ │ ├── DexBackedMethodTypeEncodedValue.java │ │ │ │ │ ├── DexBackedStringEncodedValue.java │ │ │ │ │ └── DexBackedTypeEncodedValue.java │ │ │ ├── formatter │ │ │ │ ├── DexFormattedWriter.java │ │ │ │ └── DexFormatter.java │ │ │ ├── iface │ │ │ │ ├── Annotatable.java │ │ │ │ ├── Annotation.java │ │ │ │ ├── AnnotationElement.java │ │ │ │ ├── BasicAnnotation.java │ │ │ │ ├── ClassDef.java │ │ │ │ ├── DexFile.java │ │ │ │ ├── ExceptionHandler.java │ │ │ │ ├── Field.java │ │ │ │ ├── Member.java │ │ │ │ ├── Method.java │ │ │ │ ├── MethodImplementation.java │ │ │ │ ├── MethodParameter.java │ │ │ │ ├── MultiDexContainer.java │ │ │ │ ├── TryBlock.java │ │ │ │ ├── debug │ │ │ │ │ ├── DebugItem.java │ │ │ │ │ ├── EndLocal.java │ │ │ │ │ ├── EpilogueBegin.java │ │ │ │ │ ├── LineNumber.java │ │ │ │ │ ├── LocalInfo.java │ │ │ │ │ ├── PrologueEnd.java │ │ │ │ │ ├── RestartLocal.java │ │ │ │ │ ├── SetSourceFile.java │ │ │ │ │ └── StartLocal.java │ │ │ │ ├── instruction │ │ │ │ │ ├── DualReferenceInstruction.java │ │ │ │ │ ├── FieldOffsetInstruction.java │ │ │ │ │ ├── FiveRegisterInstruction.java │ │ │ │ │ ├── HatLiteralInstruction.java │ │ │ │ │ ├── InlineIndexInstruction.java │ │ │ │ │ ├── Instruction.java │ │ │ │ │ ├── LongHatLiteralInstruction.java │ │ │ │ │ ├── NarrowHatLiteralInstruction.java │ │ │ │ │ ├── NarrowLiteralInstruction.java │ │ │ │ │ ├── OffsetInstruction.java │ │ │ │ │ ├── OneRegisterInstruction.java │ │ │ │ │ ├── PayloadInstruction.java │ │ │ │ │ ├── ReferenceInstruction.java │ │ │ │ │ ├── RegisterRangeInstruction.java │ │ │ │ │ ├── SwitchElement.java │ │ │ │ │ ├── SwitchPayload.java │ │ │ │ │ ├── ThreeRegisterInstruction.java │ │ │ │ │ ├── TwoRegisterInstruction.java │ │ │ │ │ ├── VariableRegisterInstruction.java │ │ │ │ │ ├── VerificationErrorInstruction.java │ │ │ │ │ ├── VtableIndexInstruction.java │ │ │ │ │ ├── WideLiteralInstruction.java │ │ │ │ │ └── formats │ │ │ │ │ │ ├── ArrayPayload.java │ │ │ │ │ │ ├── Instruction10t.java │ │ │ │ │ │ ├── Instruction10x.java │ │ │ │ │ │ ├── Instruction11n.java │ │ │ │ │ │ ├── Instruction11x.java │ │ │ │ │ │ ├── Instruction12x.java │ │ │ │ │ │ ├── Instruction20bc.java │ │ │ │ │ │ ├── Instruction20t.java │ │ │ │ │ │ ├── Instruction21c.java │ │ │ │ │ │ ├── Instruction21ih.java │ │ │ │ │ │ ├── Instruction21lh.java │ │ │ │ │ │ ├── Instruction21s.java │ │ │ │ │ │ ├── Instruction21t.java │ │ │ │ │ │ ├── Instruction22b.java │ │ │ │ │ │ ├── Instruction22c.java │ │ │ │ │ │ ├── Instruction22cs.java │ │ │ │ │ │ ├── Instruction22s.java │ │ │ │ │ │ ├── Instruction22t.java │ │ │ │ │ │ ├── Instruction22x.java │ │ │ │ │ │ ├── Instruction23x.java │ │ │ │ │ │ ├── Instruction30t.java │ │ │ │ │ │ ├── Instruction31c.java │ │ │ │ │ │ ├── Instruction31i.java │ │ │ │ │ │ ├── Instruction31t.java │ │ │ │ │ │ ├── Instruction32x.java │ │ │ │ │ │ ├── Instruction35c.java │ │ │ │ │ │ ├── Instruction35mi.java │ │ │ │ │ │ ├── Instruction35ms.java │ │ │ │ │ │ ├── Instruction3rc.java │ │ │ │ │ │ ├── Instruction3rmi.java │ │ │ │ │ │ ├── Instruction3rms.java │ │ │ │ │ │ ├── Instruction45cc.java │ │ │ │ │ │ ├── Instruction4rcc.java │ │ │ │ │ │ ├── Instruction51l.java │ │ │ │ │ │ ├── PackedSwitchPayload.java │ │ │ │ │ │ ├── SparseSwitchPayload.java │ │ │ │ │ │ └── UnknownInstruction.java │ │ │ │ ├── reference │ │ │ │ │ ├── CallSiteReference.java │ │ │ │ │ ├── FieldReference.java │ │ │ │ │ ├── MethodHandleReference.java │ │ │ │ │ ├── MethodProtoReference.java │ │ │ │ │ ├── MethodReference.java │ │ │ │ │ ├── Reference.java │ │ │ │ │ ├── StringReference.java │ │ │ │ │ └── TypeReference.java │ │ │ │ └── value │ │ │ │ │ ├── AnnotationEncodedValue.java │ │ │ │ │ ├── ArrayEncodedValue.java │ │ │ │ │ ├── BooleanEncodedValue.java │ │ │ │ │ ├── ByteEncodedValue.java │ │ │ │ │ ├── CharEncodedValue.java │ │ │ │ │ ├── DoubleEncodedValue.java │ │ │ │ │ ├── EncodedValue.java │ │ │ │ │ ├── EnumEncodedValue.java │ │ │ │ │ ├── FieldEncodedValue.java │ │ │ │ │ ├── FloatEncodedValue.java │ │ │ │ │ ├── IntEncodedValue.java │ │ │ │ │ ├── LongEncodedValue.java │ │ │ │ │ ├── MethodEncodedValue.java │ │ │ │ │ ├── MethodHandleEncodedValue.java │ │ │ │ │ ├── MethodTypeEncodedValue.java │ │ │ │ │ ├── NullEncodedValue.java │ │ │ │ │ ├── ShortEncodedValue.java │ │ │ │ │ ├── StringEncodedValue.java │ │ │ │ │ └── TypeEncodedValue.java │ │ │ ├── immutable │ │ │ │ ├── ImmutableAnnotation.java │ │ │ │ ├── ImmutableAnnotationElement.java │ │ │ │ ├── ImmutableClassDef.java │ │ │ │ ├── ImmutableDexFile.java │ │ │ │ ├── ImmutableExceptionHandler.java │ │ │ │ ├── ImmutableField.java │ │ │ │ ├── ImmutableMethod.java │ │ │ │ ├── ImmutableMethodImplementation.java │ │ │ │ ├── ImmutableMethodParameter.java │ │ │ │ ├── ImmutableMultiDexContainer.java │ │ │ │ ├── ImmutableTryBlock.java │ │ │ │ ├── debug │ │ │ │ │ ├── ImmutableDebugItem.java │ │ │ │ │ ├── ImmutableEndLocal.java │ │ │ │ │ ├── ImmutableEpilogueBegin.java │ │ │ │ │ ├── ImmutableLineNumber.java │ │ │ │ │ ├── ImmutablePrologueEnd.java │ │ │ │ │ ├── ImmutableRestartLocal.java │ │ │ │ │ ├── ImmutableSetSourceFile.java │ │ │ │ │ └── ImmutableStartLocal.java │ │ │ │ ├── instruction │ │ │ │ │ ├── ImmutableArrayPayload.java │ │ │ │ │ ├── ImmutableInstruction.java │ │ │ │ │ ├── ImmutableInstruction10t.java │ │ │ │ │ ├── ImmutableInstruction10x.java │ │ │ │ │ ├── ImmutableInstruction11n.java │ │ │ │ │ ├── ImmutableInstruction11x.java │ │ │ │ │ ├── ImmutableInstruction12x.java │ │ │ │ │ ├── ImmutableInstruction20bc.java │ │ │ │ │ ├── ImmutableInstruction20t.java │ │ │ │ │ ├── ImmutableInstruction21c.java │ │ │ │ │ ├── ImmutableInstruction21ih.java │ │ │ │ │ ├── ImmutableInstruction21lh.java │ │ │ │ │ ├── ImmutableInstruction21s.java │ │ │ │ │ ├── ImmutableInstruction21t.java │ │ │ │ │ ├── ImmutableInstruction22b.java │ │ │ │ │ ├── ImmutableInstruction22c.java │ │ │ │ │ ├── ImmutableInstruction22cs.java │ │ │ │ │ ├── ImmutableInstruction22s.java │ │ │ │ │ ├── ImmutableInstruction22t.java │ │ │ │ │ ├── ImmutableInstruction22x.java │ │ │ │ │ ├── ImmutableInstruction23x.java │ │ │ │ │ ├── ImmutableInstruction30t.java │ │ │ │ │ ├── ImmutableInstruction31c.java │ │ │ │ │ ├── ImmutableInstruction31i.java │ │ │ │ │ ├── ImmutableInstruction31t.java │ │ │ │ │ ├── ImmutableInstruction32x.java │ │ │ │ │ ├── ImmutableInstruction35c.java │ │ │ │ │ ├── ImmutableInstruction35mi.java │ │ │ │ │ ├── ImmutableInstruction35ms.java │ │ │ │ │ ├── ImmutableInstruction3rc.java │ │ │ │ │ ├── ImmutableInstruction3rmi.java │ │ │ │ │ ├── ImmutableInstruction3rms.java │ │ │ │ │ ├── ImmutableInstruction45cc.java │ │ │ │ │ ├── ImmutableInstruction4rcc.java │ │ │ │ │ ├── ImmutableInstruction51l.java │ │ │ │ │ ├── ImmutableInstructionFactory.java │ │ │ │ │ ├── ImmutablePackedSwitchPayload.java │ │ │ │ │ ├── ImmutableSparseSwitchPayload.java │ │ │ │ │ ├── ImmutableSwitchElement.java │ │ │ │ │ └── ImmutableUnknownInstruction.java │ │ │ │ ├── reference │ │ │ │ │ ├── ImmutableCallSiteReference.java │ │ │ │ │ ├── ImmutableFieldReference.java │ │ │ │ │ ├── ImmutableMethodHandleReference.java │ │ │ │ │ ├── ImmutableMethodProtoReference.java │ │ │ │ │ ├── ImmutableMethodReference.java │ │ │ │ │ ├── ImmutableReference.java │ │ │ │ │ ├── ImmutableReferenceFactory.java │ │ │ │ │ ├── ImmutableStringReference.java │ │ │ │ │ └── ImmutableTypeReference.java │ │ │ │ ├── util │ │ │ │ │ ├── CharSequenceConverter.java │ │ │ │ │ └── ParamUtil.java │ │ │ │ └── value │ │ │ │ │ ├── ImmutableAnnotationEncodedValue.java │ │ │ │ │ ├── ImmutableArrayEncodedValue.java │ │ │ │ │ ├── ImmutableBooleanEncodedValue.java │ │ │ │ │ ├── ImmutableByteEncodedValue.java │ │ │ │ │ ├── ImmutableCharEncodedValue.java │ │ │ │ │ ├── ImmutableDoubleEncodedValue.java │ │ │ │ │ ├── ImmutableEncodedValue.java │ │ │ │ │ ├── ImmutableEncodedValueFactory.java │ │ │ │ │ ├── ImmutableEnumEncodedValue.java │ │ │ │ │ ├── ImmutableFieldEncodedValue.java │ │ │ │ │ ├── ImmutableFloatEncodedValue.java │ │ │ │ │ ├── ImmutableIntEncodedValue.java │ │ │ │ │ ├── ImmutableLongEncodedValue.java │ │ │ │ │ ├── ImmutableMethodEncodedValue.java │ │ │ │ │ ├── ImmutableMethodHandleEncodedValue.java │ │ │ │ │ ├── ImmutableMethodTypeEncodedValue.java │ │ │ │ │ ├── ImmutableNullEncodedValue.java │ │ │ │ │ ├── ImmutableShortEncodedValue.java │ │ │ │ │ ├── ImmutableStringEncodedValue.java │ │ │ │ │ └── ImmutableTypeEncodedValue.java │ │ │ ├── rewriter │ │ │ │ ├── AnnotationElementRewriter.java │ │ │ │ ├── AnnotationRewriter.java │ │ │ │ ├── ClassDefRewriter.java │ │ │ │ ├── DebugItemRewriter.java │ │ │ │ ├── DexFileRewriter.java │ │ │ │ ├── DexRewriter.java │ │ │ │ ├── EncodedValueRewriter.java │ │ │ │ ├── ExceptionHandlerRewriter.java │ │ │ │ ├── FieldReferenceRewriter.java │ │ │ │ ├── FieldRewriter.java │ │ │ │ ├── InstructionRewriter.java │ │ │ │ ├── MethodImplementationRewriter.java │ │ │ │ ├── MethodParameterRewriter.java │ │ │ │ ├── MethodReferenceRewriter.java │ │ │ │ ├── MethodRewriter.java │ │ │ │ ├── Rewriter.java │ │ │ │ ├── RewriterModule.java │ │ │ │ ├── RewriterUtils.java │ │ │ │ ├── Rewriters.java │ │ │ │ ├── TryBlockRewriter.java │ │ │ │ └── TypeRewriter.java │ │ │ ├── util │ │ │ │ ├── AlignmentUtils.java │ │ │ │ ├── AnnotatedBytes.java │ │ │ │ ├── DexUtil.java │ │ │ │ ├── EncodedValueUtils.java │ │ │ │ ├── FieldUtil.java │ │ │ │ ├── InstructionOffsetMap.java │ │ │ │ ├── InstructionUtil.java │ │ │ │ ├── MethodUtil.java │ │ │ │ ├── Preconditions.java │ │ │ │ ├── ReferenceUtil.java │ │ │ │ ├── SyntheticAccessorFSM.java │ │ │ │ ├── SyntheticAccessorResolver.java │ │ │ │ └── TypeUtils.java │ │ │ └── writer │ │ │ │ ├── AnnotationSection.java │ │ │ │ ├── AnnotationSetSection.java │ │ │ │ ├── CallSiteSection.java │ │ │ │ ├── ClassSection.java │ │ │ │ ├── DebugWriter.java │ │ │ │ ├── DexDataWriter.java │ │ │ │ ├── DexWriter.java │ │ │ │ ├── EncodedArraySection.java │ │ │ │ ├── EncodedValueWriter.java │ │ │ │ ├── FieldSection.java │ │ │ │ ├── IndexSection.java │ │ │ │ ├── InstructionFactory.java │ │ │ │ ├── InstructionWriter.java │ │ │ │ ├── MethodHandleSection.java │ │ │ │ ├── MethodSection.java │ │ │ │ ├── NullableIndexSection.java │ │ │ │ ├── NullableOffsetSection.java │ │ │ │ ├── OffsetSection.java │ │ │ │ ├── ProtoSection.java │ │ │ │ ├── StringSection.java │ │ │ │ ├── TypeListSection.java │ │ │ │ ├── TypeSection.java │ │ │ │ ├── builder │ │ │ │ ├── BaseBuilderPool.java │ │ │ │ ├── BuilderAnnotation.java │ │ │ │ ├── BuilderAnnotationElement.java │ │ │ │ ├── BuilderAnnotationPool.java │ │ │ │ ├── BuilderAnnotationSet.java │ │ │ │ ├── BuilderAnnotationSetPool.java │ │ │ │ ├── BuilderCallSitePool.java │ │ │ │ ├── BuilderCallSiteReference.java │ │ │ │ ├── BuilderClassDef.java │ │ │ │ ├── BuilderClassPool.java │ │ │ │ ├── BuilderEncodedArrayPool.java │ │ │ │ ├── BuilderEncodedValues.java │ │ │ │ ├── BuilderExceptionHandler.java │ │ │ │ ├── BuilderField.java │ │ │ │ ├── BuilderFieldPool.java │ │ │ │ ├── BuilderFieldReference.java │ │ │ │ ├── BuilderMapEntryCollection.java │ │ │ │ ├── BuilderMethod.java │ │ │ │ ├── BuilderMethodHandlePool.java │ │ │ │ ├── BuilderMethodHandleReference.java │ │ │ │ ├── BuilderMethodParameter.java │ │ │ │ ├── BuilderMethodPool.java │ │ │ │ ├── BuilderMethodProtoReference.java │ │ │ │ ├── BuilderMethodReference.java │ │ │ │ ├── BuilderProtoPool.java │ │ │ │ ├── BuilderReference.java │ │ │ │ ├── BuilderStringPool.java │ │ │ │ ├── BuilderStringReference.java │ │ │ │ ├── BuilderTryBlock.java │ │ │ │ ├── BuilderTypeList.java │ │ │ │ ├── BuilderTypeListPool.java │ │ │ │ ├── BuilderTypePool.java │ │ │ │ ├── BuilderTypeReference.java │ │ │ │ └── DexBuilder.java │ │ │ │ ├── io │ │ │ │ ├── DeferredOutputStream.java │ │ │ │ ├── DeferredOutputStreamFactory.java │ │ │ │ ├── DexDataStore.java │ │ │ │ ├── FileDataStore.java │ │ │ │ ├── FileDeferredOutputStream.java │ │ │ │ ├── MemoryDataStore.java │ │ │ │ └── MemoryDeferredOutputStream.java │ │ │ │ ├── pool │ │ │ │ ├── AnnotationPool.java │ │ │ │ ├── AnnotationSetPool.java │ │ │ │ ├── BaseIndexPool.java │ │ │ │ ├── BaseNullableOffsetPool.java │ │ │ │ ├── BaseOffsetPool.java │ │ │ │ ├── BasePool.java │ │ │ │ ├── CallSitePool.java │ │ │ │ ├── ClassPool.java │ │ │ │ ├── DexPool.java │ │ │ │ ├── EncodedArrayPool.java │ │ │ │ ├── FieldPool.java │ │ │ │ ├── Markable.java │ │ │ │ ├── MethodHandlePool.java │ │ │ │ ├── MethodPool.java │ │ │ │ ├── PoolClassDef.java │ │ │ │ ├── PoolMethod.java │ │ │ │ ├── PoolMethodProto.java │ │ │ │ ├── ProtoPool.java │ │ │ │ ├── StringPool.java │ │ │ │ ├── StringTypeBasePool.java │ │ │ │ ├── TypeListPool.java │ │ │ │ └── TypePool.java │ │ │ │ └── util │ │ │ │ ├── CallSiteUtil.java │ │ │ │ ├── StaticInitializerUtil.java │ │ │ │ └── TryListBuilder.java │ │ │ └── util │ │ │ ├── AbstractForwardSequentialList.java │ │ │ ├── AbstractListIterator.java │ │ │ ├── ArraySortedSet.java │ │ │ ├── BitSetUtils.java │ │ │ ├── CharSequenceUtils.java │ │ │ ├── CollectionUtils.java │ │ │ ├── ExceptionWithContext.java │ │ │ ├── Hex.java │ │ │ ├── ImmutableConverter.java │ │ │ ├── ImmutableUtils.java │ │ │ ├── IndentingWriter.java │ │ │ ├── NibbleUtils.java │ │ │ ├── NumberUtils.java │ │ │ ├── RandomAccessFileInputStream.java │ │ │ ├── RandomAccessFileOutputStream.java │ │ │ ├── SparseArray.java │ │ │ ├── SparseIntArray.java │ │ │ ├── StringUtils.java │ │ │ ├── StringWrapper.java │ │ │ ├── TwoColumnOutput.java │ │ │ ├── Utf8Utils.java │ │ │ └── WrappedIndentingWriter.java │ └── ragel │ │ ├── Opcodes.rl │ │ └── SyntheticAccessorFSM.rl │ └── test │ ├── java │ └── org │ │ └── jf │ │ ├── dexlib2 │ │ ├── AccessorTest.java │ │ ├── DexEntryFinderTest.java │ │ ├── analysis │ │ │ ├── CommonSuperclassTest.java │ │ │ ├── CustomMethodInlineTableTest.java │ │ │ ├── MethodAnalyzerTest.java │ │ │ ├── TestUtils.java │ │ │ ├── reflection │ │ │ │ └── util │ │ │ │ │ └── ReflectionUtilsTest.java │ │ │ └── util │ │ │ │ └── SuperclassChainTest.java │ │ ├── builder │ │ │ ├── FixGotoTest.java │ │ │ ├── FixOffsetsTest.java │ │ │ ├── LocatedItemsTest.java │ │ │ ├── MutableMethodImplementationTest.java │ │ │ └── PayloadAlignmentTest.java │ │ ├── dexbacked │ │ │ ├── BaseDexBufferTest.java │ │ │ ├── BaseDexReaderLeb128Test.java │ │ │ ├── BaseDexReaderSleb128Test.java │ │ │ └── BaseDexReaderTest.java │ │ ├── formatter │ │ │ ├── DexFormattedWriterStringTest.java │ │ │ ├── DexFormattedWriterTest.java │ │ │ ├── DexFormattedWriterTypeTest.java │ │ │ └── DexFormatterTest.java │ │ ├── pool │ │ │ └── RollbackTest.java │ │ ├── rewriter │ │ │ └── RewriteArrayTypeTest.java │ │ ├── util │ │ │ └── InstructionOffsetMapTest.java │ │ └── writer │ │ │ ├── CallSiteTest.java │ │ │ ├── DexDataWriterTest.java │ │ │ ├── DexWriterSleb128Test.java │ │ │ ├── DexWriterTest.java │ │ │ ├── DexWriterUleb128Test.java │ │ │ ├── JumboStringConversionTest.java │ │ │ ├── NakedByteArrayOutputStream.java │ │ │ └── util │ │ │ └── TryListBuilderTest.java │ │ └── util │ │ ├── AbstractForwardSequentialListTest.java │ │ ├── HexTest.java │ │ ├── NumberUtilsTest.java │ │ ├── PreconditionsTest.java │ │ └── StringWrapperTest.java │ └── resources │ └── accessorTest.dex ├── examples ├── AnnotationTypes │ ├── ClassAnnotation.smali │ ├── FieldAnnotation.smali │ ├── Main.smali │ ├── MethodAnnotation.smali │ └── ParameterAnnotation.smali ├── AnnotationValues │ ├── 10.smali │ ├── AnnotationWithValues.smali │ ├── Enum.smali │ ├── Main.smali │ └── SubAnnotation.smali ├── BracketedMemberNames │ └── BracketedMemberNames.smali ├── Enums │ ├── Enum.smali │ └── Main.smali ├── HelloWorld │ └── HelloWorld.smali ├── Interface │ ├── Interface.smali │ └── Main.smali ├── InvokeCustom │ ├── BootstrapLinker.smali │ ├── Custom.smali │ └── Main.smali ├── MethodOverloading │ └── Main.smali ├── RecursiveAnnotation │ ├── Main.smali │ └── RecursiveAnnotation.smali └── RecursiveExceptionHandler │ └── Main.smali ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── scripts ├── baksmali └── smali ├── settings.gradle ├── smali-integration-tests └── src │ ├── assemble │ ├── jumbo-field-tests.xml │ ├── jumbo-method-tests.xml │ ├── jumbo-string-tests.xml │ ├── jumbo-type-tests.xml │ └── junit-tests.xml │ └── test │ └── smali │ ├── jumbo-string-tests │ ├── Format31c.smali │ └── TestSuite.smali │ └── junit-tests │ ├── AnnotationTests │ ├── AnnotationTests.smali │ └── TestAnnotationClass.smali │ ├── AutofixTests │ └── GotoTest.smali │ ├── ExceptionTest │ └── ExceptionTest.smali │ ├── FieldTest │ └── FieldTest.smali │ ├── InstructionTests │ ├── Format10t │ │ └── Format10t.smali │ ├── Format10x │ │ └── Format10x.smali │ ├── Format11n │ │ └── Format11n.smali │ ├── Format11x │ │ └── Format11x.smali │ ├── Format12x │ │ └── Format12x.smali │ ├── Format20t │ │ └── Format20t.smali │ ├── Format21c │ │ ├── Format21c.smali │ │ ├── StaticFields.smali │ │ └── StringWrapper.smali │ ├── Format21h │ │ └── Format21h.smali │ ├── Format21s │ │ └── Format21s.smali │ ├── Format21t │ │ └── Format21t.smali │ ├── Format22b │ │ └── Format22b.smali │ ├── Format22c │ │ ├── Format22c.smali │ │ └── InstanceFields.smali │ ├── Format22s │ │ └── Format22s.smali │ ├── Format22t │ │ └── Format22t.smali │ ├── Format22x │ │ └── Format22x.smali │ ├── Format23x │ │ └── Format23x.smali │ ├── Format30t │ │ └── Format30t.smali │ ├── Format31i │ │ └── Format31i.smali │ ├── Format31t │ │ └── Format31t.smali │ ├── Format32x │ │ └── Format32x.smali │ ├── Format35c │ │ ├── Format35c.smali │ │ ├── Methods.smali │ │ ├── MethodsInterface.smali │ │ └── MethodsSuper.smali │ ├── Format3rc │ │ ├── Format3rc.smali │ │ ├── RangeMethods.smali │ │ ├── RangeMethodsInterface.smali │ │ └── RangeMethodsSuper.smali │ └── Format51l │ │ └── Format51l.smali │ ├── LineTest │ └── LineTest.smali │ ├── SpecialInstructionPaddingTest │ └── SpecialInstructionPaddingTest.smali │ ├── StaticFieldInitializerTest │ └── StaticFieldInitializerTest.smali │ ├── TestSuite.smali │ └── Util │ └── Assert.smali ├── smali ├── build.gradle └── src │ ├── main │ ├── antlr │ │ ├── smaliParser.g │ │ └── smaliTreeWalker.g │ ├── java │ │ └── org │ │ │ └── jf │ │ │ └── smali │ │ │ ├── AssembleCommand.java │ │ │ ├── HelpCommand.java │ │ │ ├── InvalidToken.java │ │ │ ├── LexerErrorInterface.java │ │ │ ├── LiteralTools.java │ │ │ ├── Main.java │ │ │ ├── OdexedInstructionException.java │ │ │ ├── PrintTokensCommand.java │ │ │ ├── SemanticException.java │ │ │ ├── Smali.java │ │ │ ├── SmaliMethodParameter.java │ │ │ ├── SmaliOptions.java │ │ │ ├── SmaliTestUtils.java │ │ │ ├── WithRegister.java │ │ │ └── util │ │ │ └── BlankReader.java │ ├── jflex │ │ └── smaliLexer.jflex │ └── resources │ │ └── smali.properties │ └── test │ ├── antlr │ └── org │ │ └── jf │ │ └── smali │ │ └── expectedTokensTestGrammar.g │ ├── java │ └── org │ │ └── jf │ │ └── smali │ │ ├── ByteLiteralTest.java │ │ ├── ImplicitReferenceTest.java │ │ ├── IntLiteralTest.java │ │ ├── LexerTest.java │ │ ├── LongLiteralTest.java │ │ └── ShortLiteralTest.java │ └── resources │ └── LexerTest │ ├── .gitattributes │ ├── ByteLiteralTest.smali │ ├── ByteLiteralTest.tokens │ ├── CharLiteralTest.smali │ ├── CharLiteralTest.tokens │ ├── CommentTest.smali │ ├── CommentTest.tokens │ ├── DirectiveTest.smali │ ├── DirectiveTest.tokens │ ├── FloatLiteralTest.smali │ ├── FloatLiteralTest.tokens │ ├── InstructionTest.smali │ ├── InstructionTest.tokens │ ├── IntegerLiteralTest.smali │ ├── IntegerLiteralTest.tokens │ ├── LongLiteralTest.smali │ ├── LongLiteralTest.tokens │ ├── MiscTest.smali │ ├── MiscTest.tokens │ ├── RealSmaliFileTest.smali │ ├── RealSmaliFileTest.tokens │ ├── ShortLiteralTest.smali │ ├── ShortLiteralTest.tokens │ ├── StringLiteralTest.smali │ ├── StringLiteralTest.tokens │ ├── SymbolTest.smali │ ├── SymbolTest.tokens │ ├── TypeAndIdentifierTest.smali │ ├── TypeAndIdentifierTest.tokens │ ├── TypeAndIdentifierTest_api29.smali │ └── TypeAndIdentifierTest_api29.tokens └── util ├── build.gradle └── src ├── main └── java │ └── org │ └── jf │ └── util │ ├── ClassFileNameHandler.java │ ├── ConsoleUtil.java │ ├── LinearSearch.java │ ├── PathUtil.java │ └── jcommander │ ├── ColonParameterSplitter.java │ ├── Command.java │ ├── ExtendedCommands.java │ ├── ExtendedParameter.java │ ├── ExtendedParameters.java │ └── HelpFormatter.java └── test └── java └── org └── jf └── util ├── ClassFileNameHandlerTest.java ├── LinearSearchTest.java └── PathUtilTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | /.gradle 2 | /baksmali/build 3 | /dexlib/build 4 | /dexlib2/build 5 | /dexlib2/accessorTestGenerator/build 6 | /smali/build 7 | /util/build 8 | /smalidea/build 9 | *.iml 10 | *.ipr 11 | *.iws 12 | .idea 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### About 2 | 3 | smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on Jasmin's/dedexer's syntax, and supports the full functionality of the dex format (annotations, debug info, line info, etc.) 4 | 5 | Downloads are at https://bitbucket.org/JesusFreke/smali/downloads/. If you are interested in submitting a patch, feel free to send me a pull request here. 6 | 7 | See [the wiki](https://github.com/JesusFreke/smali/wiki) for more info/news/release notes/etc. 8 | 9 | #### Support 10 | - [github Issue tracker](https://github.com/JesusFreke/smali/issues) - For any bugs/issues/feature requests 11 | - [#smali on freenode](http://webchat.freenode.net/?channels=smali) - Free free to drop by and ask a question. Don't expect an instant response, but if you hang around someone will respond. 12 | 13 | 14 | #### Some useful links for getting started with smali 15 | 16 | - [Official dex bytecode reference](https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html) 17 | - [Registers wiki page](https://github.com/JesusFreke/smali/wiki/Registers) 18 | - [Types, Methods and Fields wiki page](https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields) 19 | - [Official dex format reference](https://source.android.com/devices/tech/dalvik/dex-format.html) 20 | -------------------------------------------------------------------------------- /baksmali/src/main/resources/baksmali.properties: -------------------------------------------------------------------------------- 1 | application.version=${version} -------------------------------------------------------------------------------- /baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | package org.jf.baksmali; 33 | 34 | import org.junit.Test; 35 | 36 | public class InterfaceOrderTest extends IdenticalRoundtripTest { 37 | @Test 38 | public void testInterfaceOrder() { 39 | runTest("InterfaceOrder", new BaksmaliOptions()); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /baksmali/src/test/java/org/jf/baksmali/ManyRegistersTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | package org.jf.baksmali; 33 | 34 | import org.junit.Test; 35 | 36 | public class ManyRegistersTest extends IdenticalRoundtripTest { 37 | 38 | @Test 39 | public void testManyRegisters() { 40 | runTest("ManyRegisters"); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /baksmali/src/test/java/org/jf/baksmali/MultiSwitchTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | package org.jf.baksmali; 33 | 34 | import org.junit.Test; 35 | 36 | public class MultiSwitchTest extends DisassemblyTest { 37 | 38 | @Test 39 | public void testMultiSwitch() { 40 | runTest("MultiSwitch"); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /baksmali/src/test/java/org/jf/baksmali/ParamListMethodNameTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | package org.jf.baksmali; 33 | 34 | import org.junit.Test; 35 | 36 | public class ParamListMethodNameTest extends IdenticalRoundtripTest { 37 | 38 | @Test 39 | public void testParamListMethodName() { 40 | runTest("ParamListMethodName"); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /baksmali/src/test/java/org/jf/baksmali/SwitchTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | package org.jf.baksmali; 33 | 34 | import org.junit.Test; 35 | 36 | public class SwitchTest extends RoundtripTest { 37 | @Test 38 | public void testUnorderedSparseSwitch() { 39 | runTest("UnorderedSparseSwitch"); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/ConstructorTest/ConstructorTest.smali: -------------------------------------------------------------------------------- 1 | .class public LConstructorTest; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public constructor ()V 7 | .registers 4 8 | 9 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest;); 10 | invoke-direct {p0}, Ljava/lang/Object;->()V 11 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest;); 12 | 13 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest;); 14 | return-void 15 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest;); 16 | .end method 17 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/ConstructorTest/ConstructorTest2.smali: -------------------------------------------------------------------------------- 1 | .class public LConstructorTest2; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public constructor ()V 7 | .registers 4 8 | 9 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;); 10 | if-eqz p0, :cond_3 11 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;); 12 | 13 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;); 14 | nop 15 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;); 16 | 17 | :cond_3 18 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;); 19 | invoke-direct {p0}, Ljava/lang/Object;->()V 20 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest2;); 21 | 22 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest2;); 23 | return-void 24 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest2;); 25 | .end method 26 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/ConstructorTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/ConstructorTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/DuplicateDirectMethods.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateDirectMethods; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method private alah()V 7 | .registers 1 8 | 9 | return-void 10 | .end method 11 | 12 | .method private blah()V 13 | .registers 1 14 | 15 | return-void 16 | .end method 17 | 18 | # duplicate method ignored 19 | # .method private blah()V 20 | # .registers 1 21 | 22 | # return-void 23 | # .end method 24 | 25 | .method private clah()V 26 | .registers 1 27 | 28 | return-void 29 | .end method 30 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/DuplicateDirectVirtualMethods.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateDirectVirtualMethods; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method private blah()V 7 | .registers 1 8 | 9 | return-void 10 | .end method 11 | 12 | # duplicate method ignored 13 | # .method private blah()V 14 | # .registers 1 15 | 16 | # return-void 17 | # .end method 18 | 19 | 20 | # virtual methods 21 | .method public alah()V 22 | .registers 1 23 | 24 | return-void 25 | .end method 26 | 27 | # There is both a direct and virtual method with this signature. 28 | # You will need to rename one of these methods, including all references. 29 | .method public blah()V 30 | .registers 1 31 | 32 | return-void 33 | .end method 34 | 35 | # duplicate method ignored 36 | # .method public blah()V 37 | # .registers 1 38 | 39 | # return-void 40 | # .end method 41 | 42 | .method public clah()V 43 | .registers 1 44 | 45 | return-void 46 | .end method 47 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/DuplicateInstanceFields.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateInstanceFields; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # instance fields 6 | .field public alah:I 7 | 8 | .field public blah:I 9 | 10 | # duplicate field ignored 11 | # .field public blah:I 12 | 13 | .field public clah:I 14 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/DuplicateStaticFields.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateStaticFields; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # static fields 6 | .field public static alah:I 7 | 8 | .field public static blah:I 9 | 10 | # duplicate field ignored 11 | # .field public static blah:I 12 | 13 | .field public static clah:I 14 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/DuplicateStaticInstanceFields.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateStaticInstanceFields; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # static fields 6 | .field public static blah:I 7 | 8 | # duplicate field ignored 9 | # .field public static blah:I 10 | 11 | 12 | # instance fields 13 | .field public alah:I 14 | 15 | # There is both a static and instance field with this signature. 16 | # You will need to rename one of these fields, including all references. 17 | .field public blah:I 18 | 19 | # duplicate field ignored 20 | # .field public blah:I 21 | 22 | .field public clah:I 23 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/DuplicateVirtualMethods.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateVirtualMethods; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # virtual methods 6 | .method public alah()V 7 | .registers 1 8 | 9 | return-void 10 | .end method 11 | 12 | .method public blah()V 13 | .registers 1 14 | 15 | return-void 16 | .end method 17 | 18 | # duplicate method ignored 19 | # .method public blah()V 20 | # .registers 1 21 | 22 | # return-void 23 | # .end method 24 | 25 | .method public clah()V 26 | .registers 1 27 | 28 | return-void 29 | .end method 30 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/DuplicateTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectMethods.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateDirectMethods; 2 | .super Ljava/lang/Object; 3 | 4 | .method private alah()V 5 | .registers 1 6 | return-void 7 | .end method 8 | 9 | .method private blah()V 10 | .registers 1 11 | return-void 12 | .end method 13 | 14 | .method private blah()V 15 | .registers 1 16 | return-void 17 | .end method 18 | 19 | .method private clah()V 20 | .registers 1 21 | return-void 22 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectVirtualMethods.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateDirectVirtualMethods; 2 | .super Ljava/lang/Object; 3 | 4 | .method public alah()V 5 | .registers 1 6 | return-void 7 | .end method 8 | 9 | .method private blah()V 10 | .registers 1 11 | return-void 12 | .end method 13 | 14 | .method private blah()V 15 | .registers 1 16 | return-void 17 | .end method 18 | 19 | .method public blah()V 20 | .registers 1 21 | return-void 22 | .end method 23 | 24 | .method public blah()V 25 | .registers 1 26 | return-void 27 | .end method 28 | 29 | .method public clah()V 30 | .registers 1 31 | return-void 32 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/DuplicateInstanceFields.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateInstanceFields; 2 | .super Ljava/lang/Object; 3 | 4 | .field public alah:I 5 | 6 | .field public blah:I 7 | .field public blah:I 8 | 9 | .field public clah:I -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticFields.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateStaticFields; 2 | .super Ljava/lang/Object; 3 | 4 | .field public static alah:I 5 | 6 | .field public static blah:I 7 | .field public static blah:I 8 | 9 | .field public static clah:I -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticInstanceFields.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateStaticInstanceFields; 2 | .super Ljava/lang/Object; 3 | 4 | .field public alah:I 5 | 6 | .field public blah:I 7 | .field public blah:I 8 | .field static public blah:I 9 | .field static public blah:I 10 | 11 | .field public clah:I -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/DuplicateVirtualMethods.smali: -------------------------------------------------------------------------------- 1 | .class public LDuplicateVirtualMethods; 2 | .super Ljava/lang/Object; 3 | 4 | .method public alah()V 5 | .registers 1 6 | return-void 7 | .end method 8 | 9 | .method public blah()V 10 | .registers 1 11 | return-void 12 | .end method 13 | 14 | .method public blah()V 15 | .registers 1 16 | return-void 17 | .end method 18 | 19 | .method public clah()V 20 | .registers 1 21 | return-void 22 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/DuplicateTest/src/README: -------------------------------------------------------------------------------- 1 | The test dex file was produced from these smali files, using 2 | an old version of smali that doesn't check for field/method 3 | duplicates -------------------------------------------------------------------------------- /baksmali/src/test/resources/FieldGapOrderTest/FieldGapOrderInput.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/FieldGapOrderTest/FieldGapOrderInput.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsInput.smali: -------------------------------------------------------------------------------- 1 | .class public LHiddenApiRestrictions; 2 | .super Ljava/lang/Object; 3 | 4 | .field public static whitelist staticField:I 5 | 6 | .field public core-platform-api domainSpecificFlagTest:I 7 | 8 | .field public blacklist instanceField:I 9 | 10 | .field public test-api testApiField:I 11 | 12 | .method public blacklist virtualMethod()V 13 | .registers 1 14 | return-void 15 | .end method 16 | 17 | .method private greylist-max-o directMethod()V 18 | .registers 1 19 | return-void 20 | .end method 21 | 22 | .method private core-platform-api corePlatformApiTest()V 23 | .registers 1 24 | return-void 25 | .end method 26 | 27 | .method greylist-max-q private core-platform-api corePlatformApiAndHiddenApiTest()V 28 | .registers 1 29 | return-void 30 | .end method 31 | 32 | .method greylist-max-q private test-api testApiMethod()V 33 | .registers 1 34 | return-void 35 | .end method 36 | 37 | .method greylist-max-q private test-api core-platform-api testAndCorePlatformApiMethod()V 38 | .registers 1 39 | return-void 40 | .end method 41 | 42 | .method private greylist-max-r greylistMaxR()V 43 | .registers 1 44 | return-void 45 | .end method 46 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsOutput.smali: -------------------------------------------------------------------------------- 1 | .class public LHiddenApiRestrictions; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # static fields 6 | .field public static whitelist staticField:I 7 | 8 | 9 | # instance fields 10 | .field public whitelist core-platform-api domainSpecificFlagTest:I 11 | 12 | .field public blacklist instanceField:I 13 | 14 | .field public whitelist test-api testApiField:I 15 | 16 | 17 | # direct methods 18 | .method private greylist-max-q core-platform-api corePlatformApiAndHiddenApiTest()V 19 | .registers 1 20 | 21 | return-void 22 | .end method 23 | 24 | .method private whitelist core-platform-api corePlatformApiTest()V 25 | .registers 1 26 | 27 | return-void 28 | .end method 29 | 30 | .method private greylist-max-o directMethod()V 31 | .registers 1 32 | 33 | return-void 34 | .end method 35 | 36 | .method private greylist-max-r greylistMaxR()V 37 | .registers 1 38 | return-void 39 | .end method 40 | 41 | .method private greylist-max-q core-platform-api test-api testAndCorePlatformApiMethod()V 42 | .registers 1 43 | return-void 44 | .end method 45 | 46 | .method private greylist-max-q test-api testApiMethod()V 47 | .registers 1 48 | return-void 49 | .end method 50 | 51 | # virtual methods 52 | .method public blacklist virtualMethod()V 53 | .registers 1 54 | 55 | return-void 56 | .end method 57 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/InstanceOfTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/InstanceOfTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodHandle.smali: -------------------------------------------------------------------------------- 1 | .class LConstMethodHandle; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # static fields 6 | .field public static staticField:Ljava/lang/Object; 7 | 8 | 9 | # instance fields 10 | .field public instanceField:Ljava/lang/Object; 11 | 12 | 13 | # direct methods 14 | .method public static constMethodHandle()V 15 | .registers 15 16 | 17 | const-method-handle v0, invoke-static@Ljava/lang/Integer;->toString(I)Ljava/lang/String; 18 | 19 | const-method-handle v0, invoke-instance@Ljava/lang/Integer;->toString()Ljava/lang/String; 20 | 21 | const-method-handle v0, static-put@LConstMethodHandle;->instanceField:Ljava/lang/Object; 22 | 23 | const-method-handle v0, static-put@LConstMethodHandle;->instanceField:Ljava/lang/Object; 24 | 25 | const-method-handle v0, static-put@LConstMethodHandle;->staticField:Ljava/lang/Object; 26 | 27 | const-method-handle v0, static-put@LConstMethodHandle;->staticField:Ljava/lang/Object; 28 | 29 | return-void 30 | .end method 31 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodType.smali: -------------------------------------------------------------------------------- 1 | .class LConstMethodType; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # static fields 6 | .field public static staticField:Ljava/lang/Object; 7 | 8 | 9 | # instance fields 10 | .field public instanceField:Ljava/lang/Object; 11 | 12 | 13 | # direct methods 14 | .method public static constMethodHandle()V 15 | .registers 15 16 | 17 | const-method-type v0, ()V 18 | 19 | const-method-type v0, (II)I 20 | 21 | const-method-type v0, (Ljava/lang/String;)Ljava/lang/String; 22 | 23 | return-void 24 | .end method 25 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/InterfaceOrderTest/InterfaceOrder.smali: -------------------------------------------------------------------------------- 1 | .class public LInterfaceOrder; 2 | .super Ljava/lang/Object; 3 | 4 | # Note how these two interfaces are not in alphabetical order 5 | .implements Ljava/io/Serializable; 6 | .implements Ljava/util/EventListener; 7 | .implements Ljava/lang/Runnable; 8 | .implements Ljava/io/Flushable; 9 | .implements Ljava/lang/Clonable; 10 | .implements Ljava/util/Observer; 11 | .implements Ljava/io/Closeable; 12 | 13 | # direct methods 14 | .method public constructor ()V 15 | .registers 1 16 | return-void 17 | .end method 18 | 19 | .method public close()V 20 | .registers 1 21 | return-void 22 | .end method 23 | 24 | .method public flush()V 25 | .registers 1 26 | return-void 27 | .end method 28 | 29 | .method public run()V 30 | .registers 1 31 | return-void 32 | .end method 33 | 34 | .method public update(Ljava/util/Observable;Ljava/lang/Object;)V 35 | .registers 3 36 | return-void 37 | .end method 38 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/LargeLocalTest/LargeEndLocal.smali: -------------------------------------------------------------------------------- 1 | .class LLargeRestartLocal; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # virtual methods 6 | .method public static main([Ljava/lang/String;)V 7 | .registers 2 8 | 9 | .end local p99 10 | return-void 11 | .end method 12 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/LargeLocalTest/LargeRestartLocal.smali: -------------------------------------------------------------------------------- 1 | .class LLargeEndLocal; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # virtual methods 6 | .method public static main([Ljava/lang/String;)V 7 | .registers 2 8 | 9 | .restart local p99 10 | return-void 11 | .end method 12 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/LargeLocalTest/LargeStartLocal.smali: -------------------------------------------------------------------------------- 1 | .class LLargeStartLocal; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # virtual methods 6 | .method public static main([Ljava/lang/String;)V 7 | .registers 2 8 | 9 | .local p99, "blah":I 10 | return-void 11 | .end method 12 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/LocalTest/LocalTest.smali: -------------------------------------------------------------------------------- 1 | .class public LLocalTest; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public static method1()V 7 | .registers 10 8 | 9 | .local v0, "blah! This local name has some spaces, a colon, even a \nnewline!":I, "some sig info:\nblah." 10 | .local v1, "blah! This local name has some spaces, a colon, even a \nnewline!":V, "some sig info:\nblah." 11 | .local v2, "blah! This local name has some spaces, a colon, even a \nnewline!":I 12 | .local v3, "blah! This local name has some spaces, a colon, even a \nnewline!":V 13 | .local v4, null:I, "some sig info:\nblah." 14 | .local v5, null:V, "some sig info:\nblah." 15 | .local v6, null:I 16 | .local v7 17 | .local v8 18 | .local v9 19 | return-void 20 | .end method 21 | 22 | .method public static method2(IJLjava/lang/String;)V 23 | .registers 10 24 | .param p0, "blah! This local name has some spaces, a colon, even a \nnewline!" # I 25 | .param p1 # J 26 | .annotation runtime LAnnotationWithValues; 27 | .end annotation 28 | .end param 29 | 30 | return-void 31 | .end method 32 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/LocalTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/LocalTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/ManyRegistersTest/ManyRegisters.smali: -------------------------------------------------------------------------------- 1 | .class LManyRegisters; 2 | .super Ljava/lang/Object; 3 | 4 | .method public manyRegisters()V 5 | .registers 65535 6 | return-void 7 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.smali: -------------------------------------------------------------------------------- 1 | .class public LMultiSwitch; 2 | .super Ljava/lang/Object; 3 | .source "Format31t.smali" 4 | 5 | .method public multi-packed-switch()V 6 | .registers 1 7 | const p0, 0xc 8 | packed-switch p0, :pswitch_data_12 9 | goto :goto_b 10 | :pswitch_7 11 | return-void 12 | :pswitch_8 13 | return-void 14 | :pswitch_9 15 | return-void 16 | :pswitch_a 17 | return-void 18 | :goto_b 19 | packed-switch p0, :pswitch_data_12 20 | nop 21 | return-void 22 | :pswitch_f 23 | return-void 24 | :pswitch_10 25 | return-void 26 | :pswitch_11 27 | return-void 28 | :pswitch_12 29 | :pswitch_data_12 30 | .packed-switch 0xa 31 | :pswitch_7 32 | :pswitch_8 33 | :pswitch_9 34 | :pswitch_a 35 | .end packed-switch 36 | 37 | .end method 38 | 39 | .method public multi-sparse-switch()V 40 | .registers 1 41 | const p0, 0xd 42 | sparse-switch p0, :sswitch_data_12 43 | goto :goto_b 44 | :sswitch_7 45 | return-void 46 | :sswitch_8 47 | return-void 48 | :sswitch_9 49 | return-void 50 | :sswitch_a 51 | return-void 52 | :goto_b 53 | sparse-switch p0, :sswitch_data_12 54 | nop 55 | return-void 56 | :sswitch_f 57 | return-void 58 | :sswitch_10 59 | return-void 60 | :sswitch_11 61 | return-void 62 | 63 | :sswitch_12 64 | 65 | :sswitch_data_12 66 | .sparse-switch 67 | 0xa -> :sswitch_7 68 | 0xf -> :sswitch_9 69 | 0x14 -> :sswitch_8 70 | 0x63 -> :sswitch_a 71 | .end sparse-switch 72 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/MultipleStartInstructionsTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/MultipleStartInstructionsTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/ParamListMethodNameTest/ParamListMethodName.smali: -------------------------------------------------------------------------------- 1 | .class Lblah; 2 | .super Ljava/lang/Object; 3 | 4 | .method public abstract II()V 5 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali: -------------------------------------------------------------------------------- 1 | .class public LRegisterEqualityOnMerge; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public constructor ()V 7 | .registers 4 8 | 9 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LRegisterEqualityOnMerge;); 10 | invoke-direct {p0}, Ljava/lang/Object;->()V 11 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 12 | 13 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 14 | invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String; 15 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 16 | 17 | #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 18 | move-result-object v0 19 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 20 | 21 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 22 | if-eqz v0, :cond_d 23 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 24 | 25 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 26 | invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String; 27 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 28 | 29 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 30 | move-result-object v0 31 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 32 | 33 | :cond_d 34 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 35 | return-void 36 | #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;); 37 | .end method 38 | -------------------------------------------------------------------------------- /baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchInput.smali: -------------------------------------------------------------------------------- 1 | .class public LUnorderedSparseSwitch; 2 | .super Ljava/lang/Object; 3 | 4 | .method public static test_sparse-switch()V 5 | .registers 1 6 | 7 | const v0, 13 8 | 9 | sparse-switch v0, :SparseSwitch 10 | 11 | :Label10 12 | return-void 13 | 14 | :Label20 15 | return-void 16 | 17 | :Label15 18 | return-void 19 | 20 | :Label13 21 | return-void 22 | 23 | :Label99 24 | return-void 25 | 26 | # Note: unordered keys 27 | :SparseSwitch 28 | .sparse-switch 29 | 10 -> :Label10 30 | 20 -> :Label20 31 | 15 -> :Label15 32 | 99 -> :Label99 33 | 13 -> :Label13 34 | .end sparse-switch 35 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchOutput.smali: -------------------------------------------------------------------------------- 1 | .class public LUnorderedSparseSwitch; 2 | .super Ljava/lang/Object; 3 | .method public static test_sparse-switch()V 4 | .registers 1 5 | const v0, 0xd 6 | sparse-switch v0, :sswitch_data_c 7 | :sswitch_6 8 | return-void 9 | :sswitch_7 10 | return-void 11 | :sswitch_8 12 | return-void 13 | :sswitch_9 14 | return-void 15 | :sswitch_a 16 | return-void 17 | nop 18 | 19 | # Note: ordered keys 20 | :sswitch_data_c 21 | .sparse-switch 22 | 0xa -> :sswitch_6 23 | 0xd -> :sswitch_9 24 | 0xf -> :sswitch_8 25 | 0x14 -> :sswitch_7 26 | 0x63 -> :sswitch_a 27 | .end sparse-switch 28 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/resources/UninitRefIdentityTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestInput.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusFreke/smali/2771eae0a11f07bd892732232e6ee4e32437230d/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestInput.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestOutput.smali: -------------------------------------------------------------------------------- 1 | .class public LZeroArrayPayloadWidthTest; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # virtual methods 6 | .method public zeroWidth()V 7 | .registers 3 8 | 9 | return-void 10 | 11 | nop 12 | 13 | .array-data 1 14 | .end array-data 15 | .end method 16 | -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test1/randomclass.smali: -------------------------------------------------------------------------------- 1 | .class public Lrandomclass; 2 | 3 | .super Ljava/lang/Object; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Ljava/lang/Object;->()V 8 | return-void 9 | .end method 10 | 11 | .method public getSuperclass()Lsuperclass; 12 | .registers 2 13 | 14 | new-instance v0, Lsuperclass; 15 | invoke-direct {v0}, Lsuperclass;->()V 16 | 17 | return-object v0 18 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test1/subclass.smali: -------------------------------------------------------------------------------- 1 | .class public Lsubclass; 2 | 3 | .super Lsuperclass; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Lsuperclass;->()V 8 | return-void 9 | .end method 10 | 11 | .method public somemethod()V 12 | .registers 2 13 | 14 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 15 | 16 | const-string v1, "subclass.somemethod" 17 | 18 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 19 | 20 | return-void 21 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test1/superclass.smali: -------------------------------------------------------------------------------- 1 | .class public Lsuperclass; 2 | 3 | .super Ljava/lang/Object; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Ljava/lang/Object;->()V 8 | return-void 9 | .end method 10 | 11 | .method public somemethod()V 12 | .registers 2 13 | 14 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 15 | 16 | const-string v1, "superclass.somemethod" 17 | 18 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 19 | 20 | return-void 21 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test2/app_classes/main.smali: -------------------------------------------------------------------------------- 1 | .class public Lmain; 2 | 3 | .super Ljava/lang/Object; 4 | 5 | .method public static main([Ljava/lang/String;)V 6 | .registers 6 7 | 8 | const v2, 0 9 | 10 | 11 | const v3, 1 12 | const v4, 0 13 | new-array v1, v3, [Lsubclass1; 14 | new-instance v0, Lsubclass1; 15 | invoke-direct {v0}, Lsubclass1;->()V 16 | aput-object v0, v1, v4 17 | 18 | goto :here2 19 | 20 | :here 21 | const v2, 1 22 | 23 | :here2 24 | 25 | #this is tricky, because it has to merge two array types, [Lsubclass1; and [Lsubclass2 26 | #which should result in [Lsuperclass;. However, this dex file won't have a reference 27 | #to [Lsuperclass; 28 | aget-object v5, v1, v4 29 | 30 | invoke-virtual {v5}, Lsupersuperclass;->somemethod()V 31 | 32 | 33 | new-array v1, v3, [Lsubclass2; 34 | new-instance v0, Lsubclass2; 35 | invoke-direct {v0}, Lsubclass2;->()V 36 | aput-object v0, v1, v4 37 | 38 | if-eqz v2, :here 39 | 40 | return-void 41 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test2/bootclass_classes/randomclass.smali: -------------------------------------------------------------------------------- 1 | .class public Lrandomclass; 2 | 3 | .super Ljava/lang/Object; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Ljava/lang/Object;->()V 8 | return-void 9 | .end method 10 | 11 | .method public getSuperclass()Lsuperclass; 12 | .registers 2 13 | 14 | new-instance v0, Lsuperclass; 15 | invoke-direct {v0}, Lsuperclass;->()V 16 | 17 | return-object v0 18 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass1.smali: -------------------------------------------------------------------------------- 1 | .class public Lsubclass1; 2 | 3 | .super Lsuperclass; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Lsuperclass;->()V 8 | return-void 9 | .end method 10 | 11 | .method public somemethod()V 12 | .registers 2 13 | 14 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 15 | 16 | const-string v1, "subclass1.somemethod" 17 | 18 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 19 | 20 | return-void 21 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass2.smali: -------------------------------------------------------------------------------- 1 | .class public Lsubclass2; 2 | 3 | .super Lsuperclass; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Lsuperclass;->()V 8 | return-void 9 | .end method 10 | 11 | .method public somemethod()V 12 | .registers 2 13 | 14 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 15 | 16 | const-string v1, "subclass2.somemethod" 17 | 18 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 19 | 20 | return-void 21 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test2/bootclass_classes/superclass.smali: -------------------------------------------------------------------------------- 1 | .class public Lsuperclass; 2 | 3 | .super Lsupersuperclass; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Lsupersuperclass;->()V 8 | return-void 9 | .end method 10 | 11 | .method public somemethod()V 12 | .registers 2 13 | 14 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 15 | 16 | const-string v1, "superclass.somemethod" 17 | 18 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 19 | 20 | return-void 21 | .end method -------------------------------------------------------------------------------- /baksmali/src/test/smali/deodex_test2/bootclass_classes/supersuperclass.smali: -------------------------------------------------------------------------------- 1 | .class public Lsupersuperclass; 2 | 3 | .super Ljava/lang/Object; 4 | 5 | .method public constructor ()V 6 | .registers 1 7 | invoke-direct {p0}, Ljava/lang/Object;->()V 8 | return-void 9 | .end method 10 | 11 | .method public somemethod()V 12 | .registers 2 13 | 14 | sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 15 | 16 | const-string v1, "supersuperclass.somemethod" 17 | 18 | invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 19 | 20 | return-void 21 | .end method -------------------------------------------------------------------------------- /deodexerant/Android.mk: -------------------------------------------------------------------------------- 1 | # Copyright 2011, Google Inc. 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are 6 | # met: 7 | # 8 | # * Redistributions of source code must retain the above copyright 9 | # notice, this list of conditions and the following disclaimer. 10 | # * Redistributions in binary form must reproduce the above 11 | # copyright notice, this list of conditions and the following disclaimer 12 | # in the documentation and/or other materials provided with the 13 | # distribution. 14 | # * Neither the name of Google Inc. nor the names of its 15 | # contributors may be used to endorse or promote products derived from 16 | # this software without specific prior written permission. 17 | # 18 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 | # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 | # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | 30 | LOCAL_PATH:= $(call my-dir) 31 | 32 | include $(CLEAR_VARS) 33 | 34 | LOCAL_MODULE := deodexerant 35 | 36 | LOCAL_SRC_FILES:= deodexerant.c 37 | 38 | LOCAL_SHARED_LIBRARIES := libdl 39 | 40 | LOCAL_MODULE_TAGS := optional 41 | 42 | LOCAL_LDFLAGS := -Wl,--hash-style=sysv 43 | 44 | include $(BUILD_EXECUTABLE) 45 | -------------------------------------------------------------------------------- /deodexerant/README: -------------------------------------------------------------------------------- 1 | usage: 2 | adb push deodexerant /data/local 3 | adb shell chmod +x /data/local/deodexerant 4 | adb shell /data/local/deodexerant > inline.txt 5 | 6 | deodexerant is a binary that runs on a device and dumps out dalvik's inline 7 | method table. 8 | 9 | This can be used in cases where a particular built of dalvik has a non-standard 10 | inline method table for whatever reason. The output from this tool is intended 11 | to be used with the -T option for baksmali 12 | 13 | deodexerant is intended to be build within the AOSP build system. Assuming 14 | you have $MYDROID set to the root of the AOSP source tree, and $SMALI 15 | set to the root of the smali source tree, 16 | 17 | 1. mkdir -p $MYDROID/external/deodexerant 18 | 2. cp -r $SMALI/deodexerant $MYDROID/dalvik/deodexerant 19 | 3. cd $MYDROID 20 | 3. source build/envsetup.sh 21 | 4. lunch generic-eng 22 | 5. make deodexerant 23 | 24 | If all goes well, you should now have a deodexerant binary at: 25 | 26 | $MYDROID/out/target/product/generic/system/bin/deodexerant 27 | -------------------------------------------------------------------------------- /dexlib2/OatVersions-README.md: -------------------------------------------------------------------------------- 1 | When assessing art changes for impact to baksmali/dexlib2's deodexing functionality, there are a 2 | few key structures to keep an eye on. 3 | 4 | - The oat version is stored in runtime/oat.h 5 | - The OatHeader structure in runtime/oat.h 6 | - The OatDexFile structure, as it is written in OatWriter::OatDexFile::Write in 7 | compiler/oat_writer.cc (later moved to dex2oat/linker/oat_writer.cc) -------------------------------------------------------------------------------- /dexlib2/accessorTestGenerator/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | dependencies { 33 | implementation project(':util') 34 | implementation 'com.google.code.findbugs:jsr305:1.3.9' 35 | implementation 'com.google.guava:guava:13.0.1' 36 | implementation 'org.antlr:ST4:4.0.7' 37 | 38 | testImplementation 'junit:junit:4.6' 39 | } -------------------------------------------------------------------------------- /dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016, Google Inc. 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions are 7 | * met: 8 | * 9 | * Redistributions of source code must retain the above copyright 10 | * notice, this list of conditions and the following disclaimer. 11 | * Redistributions in binary form must reproduce the above 12 | * copyright notice, this list of conditions and the following disclaimer 13 | * in the documentation and/or other materials provided with the 14 | * distribution. 15 | * Neither the name of Google Inc. nor the names of its 16 | * contributors may be used to endorse or promote products derived from 17 | * this software without specific prior written permission. 18 | * 19 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | */ 31 | 32 | package org.jf.dexlib2.analysis; 33 | 34 | import org.jf.dexlib2.iface.ClassDef; 35 | 36 | import javax.annotation.Nullable; 37 | 38 | public interface ClassProvider { 39 | @Nullable ClassDef getClassDef(String type); 40 | } 41 | -------------------------------------------------------------------------------- /dexlib2/src/main/java/org/jf/dexlib2/builder/ItemWithLocation.java: -------------------------------------------------------------------------------- 1 | package org.jf.dexlib2.builder; 2 | 3 | import javax.annotation.Nullable; 4 | 5 | public abstract class ItemWithLocation { 6 | @Nullable 7 | MethodLocation location; 8 | 9 | public boolean isPlaced() { 10 | return location != null; 11 | } 12 | 13 | public void setLocation(MethodLocation methodLocation) { 14 | location = methodLocation; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedDebugItems.java: -------------------------------------------------------------------------------- 1 | package org.jf.dexlib2.builder; 2 | 3 | public class LocatedDebugItems extends LocatedItems { 4 | 5 | @Override 6 | protected String getAddLocatedItemError() { 7 | return "Cannot add a debug item that has already been added to a method." + 8 | "You must remove it from its current location first."; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedLabels.java: -------------------------------------------------------------------------------- 1 | package org.jf.dexlib2.builder; 2 | 3 | public class LocatedLabels extends LocatedItems