├── .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 │ │ │ ├── EncodedValue │ │ │ │ ├── AnnotationEncodedValueAdaptor.java │ │ │ │ ├── ArrayEncodedValueAdaptor.java │ │ │ │ └── EncodedValueAdaptor.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 │ │ │ ├── ReferenceFormatter.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 │ │ │ └── Renderers │ │ │ ├── BooleanRenderer.java │ │ │ ├── ByteRenderer.java │ │ │ ├── CharRenderer.java │ │ │ ├── DoubleRenderer.java │ │ │ ├── FloatRenderer.java │ │ │ ├── IntegerRenderer.java │ │ │ ├── LongRenderer.java │ │ │ └── ShortRenderer.java │ └── resources │ │ └── baksmali.properties │ └── test │ ├── java │ └── org │ │ └── jf │ │ └── baksmali │ │ ├── AnalysisTest.java │ │ ├── BaksmaliTestUtils.java │ │ ├── DexTest.java │ │ ├── DisassemblyTest.java │ │ ├── FieldGapOrderTest.java │ │ ├── IdenticalRoundtripTest.java │ │ ├── ImplicitReferenceTest.java │ │ ├── InstructionRoundtripTest.java │ │ ├── InterfaceOrderTest.java │ │ ├── InvokeCustomTest.java │ │ ├── LargeLocalTest.java │ │ ├── ManyRegistersTest.java │ │ ├── MultiSwitchTest.java │ │ ├── ParamListMethodNameTest.java │ │ ├── RoundtripTest.java │ │ └── SwitchTest.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 │ ├── 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 │ └── 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.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 │ │ │ ├── MethodHandleType.java │ │ │ ├── MultiDex.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 │ │ │ │ ├── LegacyArtInstanceFieldsSupplier.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 │ │ │ │ │ ├── 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 │ │ │ │ ├── BaseDexBuffer.java │ │ │ │ ├── BaseDexReader.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 │ │ │ │ ├── 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 │ │ │ │ │ ├── ClassDataItem.java │ │ │ │ │ ├── ClassDefItem.java │ │ │ │ │ ├── CodeItem.java │ │ │ │ │ ├── DebugInfoItem.java │ │ │ │ │ ├── EncodedArrayItem.java │ │ │ │ │ ├── EncodedValue.java │ │ │ │ │ ├── FieldIdItem.java │ │ │ │ │ ├── HeaderItem.java │ │ │ │ │ ├── ItemType.java │ │ │ │ │ ├── MapItem.java │ │ │ │ │ ├── MethodHandleItem.java │ │ │ │ │ ├── MethodIdItem.java │ │ │ │ │ ├── OdexHeaderItem.java │ │ │ │ │ ├── ProtoIdItem.java │ │ │ │ │ ├── RawDexFile.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 │ │ │ │ │ ├── CompactOffsetTable.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 │ │ │ ├── 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 │ │ │ │ │ ├── LocalInfoWithRegister.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 │ │ │ │ ├── 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 │ │ │ │ │ ├── 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 │ │ │ │ ├── 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 │ │ │ ├── Hex.java │ │ │ ├── ImmutableConverter.java │ │ │ ├── ImmutableUtils.java │ │ │ ├── IndentingWriter.java │ │ │ ├── NibbleUtils.java │ │ │ ├── NumberUtils.java │ │ │ ├── RandomAccessFileInputStream.java │ │ │ ├── RandomAccessFileOutputStream.java │ │ │ ├── SparseArray.java │ │ │ ├── SparseIntArray.java │ │ │ ├── StringUtils.java │ │ │ ├── TwoColumnOutput.java │ │ │ └── Utf8Utils.java │ └── ragel │ │ ├── Opcodes.rl │ │ └── SyntheticAccessorFSM.rl │ └── test │ ├── java │ └── org │ │ └── jf │ │ ├── dexlib2 │ │ ├── AccessorTest.java │ │ ├── DexEntryFinderTest.java │ │ ├── analysis │ │ │ ├── CommonSuperclassTest.java │ │ │ ├── CustomMethodInlineTableTest.java │ │ │ ├── MethodAnalyzerTest.java │ │ │ ├── TestUtils.java │ │ │ └── util │ │ │ │ └── SuperclassChainTest.java │ │ ├── builder │ │ │ ├── FixGotoTest.java │ │ │ ├── FixOffsetsTest.java │ │ │ ├── LocatedItemsTest.java │ │ │ ├── MutableMethodImplementationTest.java │ │ │ └── PayloadAlignmentTest.java │ │ ├── dexbacked │ │ │ ├── BaseDexBufferTest.java │ │ │ ├── BaseDexReaderLeb128Test.java │ │ │ ├── BaseDexReaderSleb128Test.java │ │ │ └── BaseDexReaderTest.java │ │ ├── pool │ │ │ └── RollbackTest.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 │ │ ├── IndentingWriterTest.java │ │ ├── NumberUtilsTest.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 │ │ │ ├── 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 ├── smalidea ├── .gitignore ├── build.gradle ├── src │ ├── main │ │ ├── antlr │ │ │ └── smalideaParser.g │ │ ├── java │ │ │ └── org │ │ │ │ └── jf │ │ │ │ └── smalidea │ │ │ │ ├── PsiBuilderTokenStream.java │ │ │ │ ├── SmaliASTFactory.java │ │ │ │ ├── SmaliColorsPage.java │ │ │ │ ├── SmaliFileType.java │ │ │ │ ├── SmaliFileTypeFactory.java │ │ │ │ ├── SmaliHighlighter.java │ │ │ │ ├── SmaliHighlightingColors.java │ │ │ │ ├── SmaliIcons.java │ │ │ │ ├── SmaliLanguage.java │ │ │ │ ├── SmaliLexer.java │ │ │ │ ├── SmaliLexicalElementType.java │ │ │ │ ├── SmaliParser.java │ │ │ │ ├── SmaliParserDefinition.java │ │ │ │ ├── SmaliTokens.java │ │ │ │ ├── debugging │ │ │ │ ├── SmaliCodeFragmentFactory.java │ │ │ │ ├── SmaliExpressionEvaluator.java │ │ │ │ ├── SmaliPositionManager.java │ │ │ │ ├── SmaliPositionManagerFactory.java │ │ │ │ ├── SmaliSteppingCommandProvider.java │ │ │ │ └── value │ │ │ │ │ ├── LazyArrayReference.java │ │ │ │ │ ├── LazyBooleanValue.java │ │ │ │ │ ├── LazyByteValue.java │ │ │ │ │ ├── LazyCharValue.java │ │ │ │ │ ├── LazyClassLoaderReference.java │ │ │ │ │ ├── LazyClassObjectReference.java │ │ │ │ │ ├── LazyComparablePrimitiveValue.java │ │ │ │ │ ├── LazyDoubleValue.java │ │ │ │ │ ├── LazyFloatValue.java │ │ │ │ │ ├── LazyIntegerValue.java │ │ │ │ │ ├── LazyLongValue.java │ │ │ │ │ ├── LazyObjectReference.java │ │ │ │ │ ├── LazyPrimitiveValue.java │ │ │ │ │ ├── LazyShortValue.java │ │ │ │ │ ├── LazyStringReference.java │ │ │ │ │ ├── LazyThreadGroupReference.java │ │ │ │ │ ├── LazyThreadReference.java │ │ │ │ │ ├── LazyValue.java │ │ │ │ │ └── LazyVoidValue.java │ │ │ │ ├── dexlib │ │ │ │ ├── SmalideaClassDef.java │ │ │ │ ├── SmalideaExceptionHandler.java │ │ │ │ ├── SmalideaField.java │ │ │ │ ├── SmalideaMethod.java │ │ │ │ ├── SmalideaMethodParameter.java │ │ │ │ ├── SmalideaTryBlock.java │ │ │ │ ├── analysis │ │ │ │ │ └── SmalideaClassProvider.java │ │ │ │ └── instruction │ │ │ │ │ ├── SmalideaArrayPayload.java │ │ │ │ │ ├── SmalideaInstruction.java │ │ │ │ │ ├── SmalideaInstruction10t.java │ │ │ │ │ ├── SmalideaInstruction10x.java │ │ │ │ │ ├── SmalideaInstruction11n.java │ │ │ │ │ ├── SmalideaInstruction11x.java │ │ │ │ │ ├── SmalideaInstruction12x.java │ │ │ │ │ ├── SmalideaInstruction20t.java │ │ │ │ │ ├── SmalideaInstruction21c.java │ │ │ │ │ ├── SmalideaInstruction21ih.java │ │ │ │ │ ├── SmalideaInstruction21lh.java │ │ │ │ │ ├── SmalideaInstruction21s.java │ │ │ │ │ ├── SmalideaInstruction21t.java │ │ │ │ │ ├── SmalideaInstruction22b.java │ │ │ │ │ ├── SmalideaInstruction22c.java │ │ │ │ │ ├── SmalideaInstruction22s.java │ │ │ │ │ ├── SmalideaInstruction22t.java │ │ │ │ │ ├── SmalideaInstruction22x.java │ │ │ │ │ ├── SmalideaInstruction23x.java │ │ │ │ │ ├── SmalideaInstruction30t.java │ │ │ │ │ ├── SmalideaInstruction31c.java │ │ │ │ │ ├── SmalideaInstruction31i.java │ │ │ │ │ ├── SmalideaInstruction31t.java │ │ │ │ │ ├── SmalideaInstruction32x.java │ │ │ │ │ ├── SmalideaInstruction35c.java │ │ │ │ │ ├── SmalideaInstruction3rc.java │ │ │ │ │ ├── SmalideaInstruction51l.java │ │ │ │ │ ├── SmalideaPackedSwitchPayload.java │ │ │ │ │ └── SmalideaSparseSwitchPayload.java │ │ │ │ ├── errorReporting │ │ │ │ ├── ErrorReporter.java │ │ │ │ ├── GithubFeedbackTask.java │ │ │ │ └── ITNProxy.java │ │ │ │ ├── findUsages │ │ │ │ ├── SmaliClassReferenceSearcher.java │ │ │ │ ├── SmaliFindUsagesProvider.java │ │ │ │ ├── SmaliUsageTargetProvider.java │ │ │ │ ├── SmaliUsageTypeProvider.java │ │ │ │ └── SmaliWordScanner.java │ │ │ │ ├── psi │ │ │ │ ├── SmaliCompositeElementFactory.java │ │ │ │ ├── SmaliCompositeElementType.java │ │ │ │ ├── SmaliElementTypes.java │ │ │ │ ├── iface │ │ │ │ │ └── SmaliModifierListOwner.java │ │ │ │ ├── impl │ │ │ │ │ ├── LightSmaliClassTypeElement.java │ │ │ │ │ ├── SmaliAnnotation.java │ │ │ │ │ ├── SmaliAnnotationElement.java │ │ │ │ │ ├── SmaliAnnotationElementName.java │ │ │ │ │ ├── SmaliAnnotationParameterList.java │ │ │ │ │ ├── SmaliArrayDataElement.java │ │ │ │ │ ├── SmaliArrayTypeElement.java │ │ │ │ │ ├── SmaliBaseReferenceList.java │ │ │ │ │ ├── SmaliCatchAllStatement.java │ │ │ │ │ ├── SmaliCatchStatement.java │ │ │ │ │ ├── SmaliClass.java │ │ │ │ │ ├── SmaliClassStatement.java │ │ │ │ │ ├── SmaliClassType.java │ │ │ │ │ ├── SmaliClassTypeElement.java │ │ │ │ │ ├── SmaliCompositeElement.java │ │ │ │ │ ├── SmaliEndLocalDebugStatement.java │ │ │ │ │ ├── SmaliEpilogueDebugStatement.java │ │ │ │ │ ├── SmaliExtendsList.java │ │ │ │ │ ├── SmaliField.java │ │ │ │ │ ├── SmaliFieldInitializer.java │ │ │ │ │ ├── SmaliFieldReference.java │ │ │ │ │ ├── SmaliFile.java │ │ │ │ │ ├── SmaliImplementsList.java │ │ │ │ │ ├── SmaliImplementsStatement.java │ │ │ │ │ ├── SmaliInstruction.java │ │ │ │ │ ├── SmaliLabel.java │ │ │ │ │ ├── SmaliLabelReference.java │ │ │ │ │ ├── SmaliLineDebugStatement.java │ │ │ │ │ ├── SmaliLiteral.java │ │ │ │ │ ├── SmaliLocalDebugStatement.java │ │ │ │ │ ├── SmaliLocalName.java │ │ │ │ │ ├── SmaliMemberName.java │ │ │ │ │ ├── SmaliMethod.java │ │ │ │ │ ├── SmaliMethodParamList.java │ │ │ │ │ ├── SmaliMethodParameter.java │ │ │ │ │ ├── SmaliMethodPrototype.java │ │ │ │ │ ├── SmaliMethodReference.java │ │ │ │ │ ├── SmaliMethodReferenceParamList.java │ │ │ │ │ ├── SmaliModifierList.java │ │ │ │ │ ├── SmaliPackedSwitchElement.java │ │ │ │ │ ├── SmaliParameterStatement.java │ │ │ │ │ ├── SmaliPrimitiveTypeElement.java │ │ │ │ │ ├── SmaliPrologueDebugStatement.java │ │ │ │ │ ├── SmaliRegisterReference.java │ │ │ │ │ ├── SmaliRegistersStatement.java │ │ │ │ │ ├── SmaliRestartLocalDebugStatement.java │ │ │ │ │ ├── SmaliSourceDebugStatement.java │ │ │ │ │ ├── SmaliSourceStatement.java │ │ │ │ │ ├── SmaliSparseSwitchElement.java │ │ │ │ │ ├── SmaliStubBasedPsiElement.java │ │ │ │ │ ├── SmaliSuperStatement.java │ │ │ │ │ ├── SmaliThrowsList.java │ │ │ │ │ ├── SmaliTypeElement.java │ │ │ │ │ └── SmaliVoidTypeElement.java │ │ │ │ ├── index │ │ │ │ │ ├── SmaliClassFinder.java │ │ │ │ │ └── SmaliClassNameIndex.java │ │ │ │ ├── leaf │ │ │ │ │ ├── SmaliClassDescriptor.java │ │ │ │ │ └── SmaliSimpleName.java │ │ │ │ └── stub │ │ │ │ │ ├── SmaliAnnotationStub.java │ │ │ │ │ ├── SmaliBaseReferenceListStub.java │ │ │ │ │ ├── SmaliClassStatementStub.java │ │ │ │ │ ├── SmaliClassStub.java │ │ │ │ │ ├── SmaliExtendsListStub.java │ │ │ │ │ ├── SmaliFieldStub.java │ │ │ │ │ ├── SmaliFileStub.java │ │ │ │ │ ├── SmaliImplementsListStub.java │ │ │ │ │ ├── SmaliMethodParamListStub.java │ │ │ │ │ ├── SmaliMethodParameterStub.java │ │ │ │ │ ├── SmaliMethodPrototypeStub.java │ │ │ │ │ ├── SmaliMethodStub.java │ │ │ │ │ ├── SmaliModifierListStub.java │ │ │ │ │ ├── SmaliThrowsListStub.java │ │ │ │ │ └── element │ │ │ │ │ ├── SmaliAnnotationElementType.java │ │ │ │ │ ├── SmaliBaseReferenceListElementType.java │ │ │ │ │ ├── SmaliClassElementType.java │ │ │ │ │ ├── SmaliClassStatementElementType.java │ │ │ │ │ ├── SmaliExtendsListElementType.java │ │ │ │ │ ├── SmaliFieldElementType.java │ │ │ │ │ ├── SmaliFileElementType.java │ │ │ │ │ ├── SmaliImplementsListElementType.java │ │ │ │ │ ├── SmaliMethodElementType.java │ │ │ │ │ ├── SmaliMethodParamListElementType.java │ │ │ │ │ ├── SmaliMethodParameterElementType.java │ │ │ │ │ ├── SmaliMethodPrototypeElementType.java │ │ │ │ │ ├── SmaliModifierListElementType.java │ │ │ │ │ ├── SmaliStubElementType.java │ │ │ │ │ └── SmaliThrowsListElementType.java │ │ │ │ └── util │ │ │ │ ├── InstructionUtils.java │ │ │ │ ├── NameUtils.java │ │ │ │ ├── PsiUtil.java │ │ │ │ └── StringUtils.java │ │ └── resources │ │ │ ├── META-INF │ │ │ └── plugin.xml │ │ │ └── icons │ │ │ └── smali.png │ └── test │ │ └── java │ │ └── org │ │ └── jf │ │ └── smalidea │ │ ├── AnnotationElementNameReferenceTest.java │ │ ├── ClassMoveTest.java │ │ ├── ClassReferenceTest.java │ │ ├── ClassRenameTest.java │ │ ├── FieldReferenceTest.java │ │ ├── FieldRenameTest.java │ │ ├── LightCodeInsightParsingTestCase.java │ │ ├── MethodReferenceTest.java │ │ ├── MethodRenameTest.java │ │ ├── ParserTest.java │ │ ├── SmaliAnnotationTest.java │ │ ├── SmaliClassModifierListTest.java │ │ ├── SmaliClassTest.java │ │ ├── SmaliClassTypeElementTest.java │ │ ├── SmaliCodeFragmentFactoryTest.java │ │ ├── SmaliFieldTest.java │ │ ├── SmaliFileTest.java │ │ ├── SmaliFileTypeTest.java │ │ ├── SmaliImplementsExtendsTest.java │ │ ├── SmaliInstructionTest.java │ │ ├── SmaliLabelReferenceTest.java │ │ ├── SmaliLexerTest.java │ │ ├── SmaliLiteralTest.java │ │ ├── SmaliMethodTest.java │ │ ├── SmaliPositionManagerTest.java │ │ ├── SmaliRegisterTest.java │ │ ├── dexlib │ │ └── SmalideaMethodTest.java │ │ ├── findUsages │ │ ├── ClassUsageTypeTest.java │ │ ├── FieldUsageTypeTest.java │ │ ├── FindAnnotationElementUsagesTest.java │ │ ├── FindClassUsagesTest.java │ │ ├── FindFieldUsagesTest.java │ │ ├── FindMethodUsagesTest.java │ │ ├── FindUsagesTest.java │ │ ├── HighlightLocalClassUsagesTest.java │ │ ├── MethodUsageTypeTest.java │ │ └── UsageTypeTest.java │ │ └── util │ │ ├── NameUtilsTest.java │ │ └── StringUtilsTest.java └── testData │ ├── Empty.smalidea │ ├── Empty.txt │ ├── FieldAnnotations.smalidea │ ├── FieldAnnotations.txt │ ├── InvalidAnnotation.smalidea │ ├── InvalidAnnotation.txt │ ├── InvalidClassDirective.smalidea │ ├── InvalidClassDirective.txt │ ├── InvalidClassDirective2.smalidea │ ├── InvalidClassDirective2.txt │ ├── InvalidClassDirective3.smalidea │ ├── InvalidClassDirective3.txt │ ├── InvalidEnumLiteral.smalidea │ ├── InvalidEnumLiteral.txt │ ├── InvalidField.smalidea │ ├── InvalidField.txt │ ├── InvalidField2.smalidea │ ├── InvalidField2.txt │ ├── InvalidField3.smalidea │ ├── InvalidField3.txt │ ├── InvalidField4.smalidea │ ├── InvalidField4.txt │ ├── InvalidInstruction.smalidea │ ├── InvalidInstruction.txt │ ├── InvalidLocal.smalidea │ ├── InvalidLocal.txt │ ├── InvalidMethod.smalidea │ ├── InvalidMethod.txt │ ├── InvalidMethod2.smalidea │ ├── InvalidMethod2.txt │ ├── InvalidMethod3.smalidea │ ├── InvalidMethod3.txt │ ├── InvalidMethod4.smalidea │ ├── InvalidMethod4.txt │ ├── InvalidMethodReference.smalidea │ ├── InvalidMethodReference.txt │ ├── InvalidParameter.smalidea │ ├── InvalidParameter.txt │ ├── MissingDotDot.smalidea │ ├── MissingDotDot.txt │ ├── ParamListInvalidParameter.smalidea │ ├── ParamListInvalidParameter.txt │ ├── SuperClassInvalidSyntax.smalidea │ ├── SuperClassInvalidSyntax.txt │ ├── SuperClassInvalidSyntax2.smalidea │ ├── SuperClassInvalidSyntax2.txt │ ├── classMove │ ├── basicFromNoPackage │ │ ├── after │ │ │ └── my │ │ │ │ └── blah.smali │ │ └── before │ │ │ └── blah.smali │ └── basicToNoPackage │ │ ├── after │ │ ├── blah.smali │ │ └── my │ │ │ └── placeholder.smali │ │ └── before │ │ └── my │ │ ├── blah.smali │ │ └── placeholder.smali │ ├── classRename │ ├── basicNoPackage │ │ ├── after │ │ │ └── blah2.smali │ │ └── before │ │ │ └── blah.smali │ └── basicWithPackage │ │ ├── after │ │ └── my │ │ │ └── blah2.smali │ │ └── before │ │ └── my │ │ └── blah.smali │ ├── fieldRename │ └── fieldRename │ │ ├── after │ │ └── blah.smali │ │ └── before │ │ └── blah.smali │ └── methodRename │ └── methodRename │ ├── after │ └── blah.smali │ └── before │ └── blah.smali ├── smaliex ├── build.gradle └── src │ └── main │ └── java │ ├── com │ └── android │ │ ├── annotations │ │ ├── NonNull.java │ │ └── Nullable.java │ │ └── ddmlib │ │ ├── AdbHelper.java │ │ ├── AndroidDebugBridge.java │ │ ├── ArrayHelper.java │ │ ├── CollectingOutputReceiver.java │ │ ├── DdmPreferences.java │ │ ├── Device.java │ │ ├── DeviceMonitor.java │ │ ├── IShellOutputReceiver.java │ │ ├── Log.java │ │ ├── MultiLineReceiver.java │ │ ├── PropertyFetcher.java │ │ └── SyncService.java │ └── org │ └── rh │ └── smaliex │ ├── AdbUtil.java │ ├── DeodexFrameworkFromDevice.java │ ├── DexUtil.java │ ├── LLog.java │ ├── Main.java │ ├── MiscUtil.java │ ├── OatUtil.java │ ├── OdexUtil.java │ ├── deopt │ ├── OdexRewriter.java │ └── VdexDecompiler.java │ └── reader │ ├── DataReader.java │ ├── Dex.java │ ├── Elf.java │ ├── Oat.java │ └── Vdex.java └── util ├── build.gradle └── src ├── main └── java │ └── org │ └── jf │ └── util │ ├── ClassFileNameHandler.java │ ├── ConsoleUtil.java │ ├── ExceptionWithContext.java │ ├── LinearSearch.java │ ├── PathUtil.java │ ├── StringWrapper.java │ ├── WrappedIndentingWriter.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 | /smaliex/build 8 | /smaliex/src/main/java/localtest 9 | /smaliex-bin/* 10 | /util/build 11 | /smalidea/build 12 | /build 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### About 2 | This is forked from https://github.com/JesusFreke/smali 3 | The additional modification is to support convert oat file to dex, and able to smali/baksmali multi-dex. 4 | 5 | Function concept: 6 | boot.oat -> extract optimized boot class dex files -> deoptimize to dex files 7 | app.odex(oat) -> reference boot dex files to deoptimize 8 | 9 | Download latest version: 10 | https://github.com/testwhat/SmaliEx/releases/tag/snapshot 11 | 12 | Build command: 13 | gradlew -b smaliex/build.gradle dist 14 | 15 | Usage: 16 | Deoptimize boot classes (The output will be in "odex" and "dex" folders): 17 |   java -jar oat2dex.jar boot <boot.oat file> 18 | Deoptimize application: 19 |   java -jar oat2dex.jar <app.odex> <boot-class-folder output from above> 20 | Get odex from oat: 21 |   java -jar oat2dex.jar odex <oat file> 22 | Get odex smali (with optimized opcode) from oat/odex: 23 |   java -jar oat2dex.jar smali <oat/odex file> 24 | Deodex /system/framework/ from device (need to connect with adb): 25 |   java -jar oat2dex.jar devfw 26 | 27 | Limitation: 28 | - If debug infomration is trimmed (e.g. with android support library or proguarded), then it is unable to recover type information. 29 | - Cannot recognize informal oat/dex format. 30 | 31 | Used by: 32 | [JoelDroid](http://forum.xda-developers.com/android/software-hacking/script-app-joeldroid-lollipop-batch-t2980857) 33 | [SVADeodexerForArt](http://forum.xda-developers.com/galaxy-s5/general/tool-deodex-tool-android-l-t2972025) 34 | [PUMa - Patch Utility Manager](http://forum.xda-developers.com/showthread.php?t=1434946) 35 | -------------------------------------------------------------------------------- /baksmali/src/main/resources/baksmali.properties: -------------------------------------------------------------------------------- 1 | application.version=${version} -------------------------------------------------------------------------------- /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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/baksmali/src/test/resources/FieldGapOrderTest/FieldGapOrderInput.dex -------------------------------------------------------------------------------- /baksmali/src/test/resources/InstanceOfTest/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/InvokeCustomTest/InvokeCustom.smali: -------------------------------------------------------------------------------- 1 | .class LInvokeCustom; 2 | .super Ljava/lang/Object; 3 | 4 | 5 | # direct methods 6 | .method public static invokeCustom([Ljava/lang/String;)V 7 | .registers 15 8 | 9 | new-instance v0, LCustom; 10 | 11 | invoke-direct {v0}, LCustom;->()V 12 | 13 | const-string v1, "Arg to doSomething" 14 | 15 | invoke-custom {v0, v1}, call_site_1("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing")@LBootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite; 16 | 17 | move-result-object v2 18 | 19 | sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream; 20 | 21 | const-string v4, "got back - " 22 | 23 | invoke-virtual {v3, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V 24 | 25 | invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 26 | 27 | invoke-custom {v0, v1}, call_site_0("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing")@LBootstrapLinker;->backwardsLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite; 28 | 29 | move-result-object v2 30 | 31 | sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream; 32 | 33 | const-string v4, "got back - " 34 | 35 | invoke-virtual {v3, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V 36 | 37 | invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 38 | .end method 39 | -------------------------------------------------------------------------------- /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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/classes.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/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/testwhat/SmaliEx/ec013978187a41313b9d7726d3976ed3e55a471e/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex -------------------------------------------------------------------------------- /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/VdexVersions.txt: -------------------------------------------------------------------------------- 1 | 7b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2 - 0 - introduction of vdex files 2 | 5d5a36bddbc008cd52a3207aa2b31177c47f9a49 - 0 - verifier deps 3 | 4acefd33064d37b41ca55c3c9355345a20e5f9c2 - 0 - quickening info 4 | f54e5df37cb42d9a83fc54b375da5ef335d604a9 - 1 - dex file count + dex location checksum 5 | 7498105ec7497bae2ba9f1a697da9efa0c979654 - 2 - verify profile 6 | 3eba863e41d531340392d9ec64e17963ac898d81 - 3 7 | 97fa9928c07d3e0ee631235e9619fb0f8949ed7a - 4 8 | 6e54f78c7c1e01c1a91a458c6e51cca1c7d13ad4 - 5 9 | -------------------------------------------------------------------------------- /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