├── .gitignore ├── LICENSE ├── README.md ├── appforload ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── dreamheart │ │ └── demo │ │ └── appforload │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── dreamheart │ │ │ └── demo │ │ │ └── appforload │ │ │ ├── Main2Activity.java │ │ │ ├── MainActivity.java │ │ │ ├── TestApp.java │ │ │ └── TestClass.java │ └── res │ │ ├── drawable-xxxhdpi │ │ └── default_avatar.png │ │ ├── layout │ │ ├── activity_main.xml │ │ └── activity_main2.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── me │ └── dreamheart │ └── demo │ └── appforload │ └── ExampleUnitTest.java ├── build.gradle ├── chameleon ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── dreamheart │ │ └── chameleon │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── dreamheart │ │ │ └── chameleon │ │ │ ├── common │ │ │ ├── FrameworkClassLoader.java │ │ │ ├── Globals.java │ │ │ ├── LayoutInflaterProxyContext.java │ │ │ ├── PlugInfo.java │ │ │ ├── PluginClassLoader.java │ │ │ └── PluginContext.java │ │ │ ├── installer │ │ │ └── PluginInstaller.java │ │ │ ├── loader │ │ │ ├── PluginHook.java │ │ │ └── PluginLoader.java │ │ │ ├── tools │ │ │ ├── Tools.java │ │ │ ├── reflect │ │ │ │ ├── NULL.java │ │ │ │ ├── Reflect.java │ │ │ │ └── ReflectException.java │ │ │ └── widget │ │ │ │ ├── LayoutInflaterWrapper.java │ │ │ │ └── ViewStub.java │ │ │ └── utils │ │ │ ├── FileUtil.java │ │ │ ├── PluginManifestUtil.java │ │ │ ├── ReflectionUtils.java │ │ │ ├── Trace.java │ │ │ └── XmlManifestReader.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── me │ └── dreamheart │ └── chameleon │ └── ExampleUnitTest.java ├── demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── dreamheart │ │ └── chameleon │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── dreamheart │ │ │ └── chameleon │ │ │ └── demo │ │ │ ├── DemoActivity.java │ │ │ └── DemoApp.java │ └── res │ │ ├── layout │ │ └── activity_demo.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── me │ └── dreamheart │ └── chameleon │ └── ExampleUnitTest.java ├── dextool ├── .gitignore ├── build.gradle ├── src │ ├── main │ │ └── java │ │ │ ├── me │ │ │ └── dreamheart │ │ │ │ └── chameleon │ │ │ │ └── dex │ │ │ │ ├── AccessFlagUtils.java │ │ │ │ ├── ApkRefactor.java │ │ │ │ ├── ClassDefSet.java │ │ │ │ ├── ClassDefWrapper.java │ │ │ │ ├── Config.java │ │ │ │ ├── DexFileWrapper.java │ │ │ │ └── InjectMethodBuilder.java │ │ │ └── org │ │ │ └── jf │ │ │ ├── dexlib2 │ │ │ ├── AccessFlags.java │ │ │ ├── AnnotationVisibility.java │ │ │ ├── DebugItemType.java │ │ │ ├── DexFileFactory.java │ │ │ ├── Format.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 │ │ │ │ ├── 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 │ │ │ │ │ ├── BaseFieldReference.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 │ │ │ │ │ ├── BaseNullEncodedValue.java │ │ │ │ │ ├── BaseShortEncodedValue.java │ │ │ │ │ ├── BaseStringEncodedValue.java │ │ │ │ │ └── BaseTypeEncodedValue.java │ │ │ ├── builder │ │ │ │ ├── BuilderDebugItem.java │ │ │ │ ├── BuilderExceptionHandler.java │ │ │ │ ├── BuilderInstruction.java │ │ │ │ ├── BuilderOffsetInstruction.java │ │ │ │ ├── BuilderSwitchPayload.java │ │ │ │ ├── BuilderTryBlock.java │ │ │ │ ├── Label.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 │ │ │ │ │ ├── BuilderInstruction22s.java │ │ │ │ │ ├── BuilderInstruction22t.java │ │ │ │ │ ├── BuilderInstruction22x.java │ │ │ │ │ ├── BuilderInstruction23x.java │ │ │ │ │ ├── BuilderInstruction30t.java │ │ │ │ │ ├── BuilderInstruction31c.java │ │ │ │ │ ├── BuilderInstruction31i.java │ │ │ │ │ ├── BuilderInstruction31t.java │ │ │ │ │ ├── BuilderInstruction32x.java │ │ │ │ │ ├── BuilderInstruction35c.java │ │ │ │ │ ├── BuilderInstruction3rc.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 │ │ │ │ │ ├── ClassDataItem.java │ │ │ │ │ ├── ClassDefItem.java │ │ │ │ │ ├── CodeItem.java │ │ │ │ │ ├── DebugInfoItem.java │ │ │ │ │ ├── EncodedArrayItem.java │ │ │ │ │ ├── EncodedValue.java │ │ │ │ │ ├── FieldIdItem.java │ │ │ │ │ ├── HeaderItem.java │ │ │ │ │ ├── ItemType.java │ │ │ │ │ ├── MapItem.java │ │ │ │ │ ├── MethodIdItem.java │ │ │ │ │ ├── OdexHeaderItem.java │ │ │ │ │ ├── ProtoIdItem.java │ │ │ │ │ ├── RawDexFile.java │ │ │ │ │ ├── SectionAnnotator.java │ │ │ │ │ ├── StringDataItem.java │ │ │ │ │ ├── StringIdItem.java │ │ │ │ │ ├── TypeIdItem.java │ │ │ │ │ ├── TypeListItem.java │ │ │ │ │ └── util │ │ │ │ │ │ └── DexAnnotator.java │ │ │ │ ├── reference │ │ │ │ │ ├── DexBackedFieldReference.java │ │ │ │ │ ├── DexBackedMethodProtoReference.java │ │ │ │ │ ├── DexBackedMethodReference.java │ │ │ │ │ ├── DexBackedReference.java │ │ │ │ │ ├── DexBackedStringReference.java │ │ │ │ │ └── DexBackedTypeReference.java │ │ │ │ ├── util │ │ │ │ │ ├── AnnotationsDirectory.java │ │ │ │ │ ├── DebugInfo.java │ │ │ │ │ ├── FixedSizeList.java │ │ │ │ │ ├── FixedSizeSet.java │ │ │ │ │ ├── ParameterIterator.java │ │ │ │ │ ├── StaticInitialValueIterator.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 │ │ │ │ │ ├── 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 │ │ │ │ │ ├── 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 │ │ │ │ │ ├── FieldReference.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 │ │ │ │ │ ├── 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 │ │ │ │ │ ├── ImmutableInstruction51l.java │ │ │ │ │ ├── ImmutableInstructionFactory.java │ │ │ │ │ ├── ImmutablePackedSwitchPayload.java │ │ │ │ │ ├── ImmutableSparseSwitchPayload.java │ │ │ │ │ ├── ImmutableSwitchElement.java │ │ │ │ │ └── ImmutableUnknownInstruction.java │ │ │ │ ├── reference │ │ │ │ │ ├── ImmutableFieldReference.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 │ │ │ │ │ ├── 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 │ │ │ │ ├── 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 │ │ │ │ ├── ClassSection.java │ │ │ │ ├── DebugWriter.java │ │ │ │ ├── DexDataWriter.java │ │ │ │ ├── DexWriter.java │ │ │ │ ├── EncodedValueWriter.java │ │ │ │ ├── FieldSection.java │ │ │ │ ├── IndexSection.java │ │ │ │ ├── InstructionFactory.java │ │ │ │ ├── InstructionWriter.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 │ │ │ │ ├── BuilderClassDef.java │ │ │ │ ├── BuilderClassPool.java │ │ │ │ ├── BuilderEncodedValues.java │ │ │ │ ├── BuilderExceptionHandler.java │ │ │ │ ├── BuilderField.java │ │ │ │ ├── BuilderFieldPool.java │ │ │ │ ├── BuilderFieldReference.java │ │ │ │ ├── BuilderMapEntryCollection.java │ │ │ │ ├── BuilderMethod.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 │ │ │ │ ├── ClassPool.java │ │ │ │ ├── DexPool.java │ │ │ │ ├── FieldPool.java │ │ │ │ ├── Markable.java │ │ │ │ ├── MethodPool.java │ │ │ │ ├── PoolClassDef.java │ │ │ │ ├── PoolMethod.java │ │ │ │ ├── PoolMethodProto.java │ │ │ │ ├── ProtoPool.java │ │ │ │ ├── StringPool.java │ │ │ │ ├── StringTypeBasePool.java │ │ │ │ ├── TypeListPool.java │ │ │ │ └── TypePool.java │ │ │ │ └── util │ │ │ │ └── TryListBuilder.java │ │ │ └── util │ │ │ ├── AbstractForwardSequentialList.java │ │ │ ├── AbstractListIterator.java │ │ │ ├── AlignmentUtils.java │ │ │ ├── ArraySortedSet.java │ │ │ ├── BitSetUtils.java │ │ │ ├── BlankReader.java │ │ │ ├── CharSequenceUtils.java │ │ │ ├── ClassFileNameHandler.java │ │ │ ├── CollectionUtils.java │ │ │ ├── ConsoleUtil.java │ │ │ ├── ExceptionWithContext.java │ │ │ ├── Hex.java │ │ │ ├── ImmutableConverter.java │ │ │ ├── ImmutableUtils.java │ │ │ ├── IndentingWriter.java │ │ │ ├── LinearSearch.java │ │ │ ├── NakedByteArrayOutputStream.java │ │ │ ├── NibbleUtils.java │ │ │ ├── NumberUtils.java │ │ │ ├── OldWrappedIndentingWriter.java │ │ │ ├── PathUtil.java │ │ │ ├── RandomAccessFileInputStream.java │ │ │ ├── RandomAccessFileOutputStream.java │ │ │ ├── SparseArray.java │ │ │ ├── SparseIntArray.java │ │ │ ├── StringUtils.java │ │ │ ├── StringWrapper.java │ │ │ ├── TextUtils.java │ │ │ ├── TwoColumnOutput.java │ │ │ ├── Utf8Utils.java │ │ │ ├── WrappedIndentingWriter.java │ │ │ └── jcommander │ │ │ ├── ColonParameterSplitter.java │ │ │ ├── Command.java │ │ │ ├── ExtendedCommands.java │ │ │ ├── ExtendedParameter.java │ │ │ ├── ExtendedParameters.java │ │ │ └── HelpFormatter.java │ └── test │ │ └── java │ │ └── me │ │ └── dreamheart │ │ └── chameleon │ │ └── dex │ │ └── MainTest.java └── testData │ ├── appforload.apk │ └── classes.dex ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── hook ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── me │ └── dreamheart │ └── chameleon │ └── Hook.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | /.idea 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Junhua102 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chameleon 2 | 修改dex文件实现插件加载 3 | [说明链接](https://zhuanlan.zhihu.com/p/25074791 "修改dex文件实现插件加载") 4 | -------------------------------------------------------------------------------- /appforload/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /appforload/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "24.0.0" 6 | 7 | defaultConfig { 8 | applicationId "me.dreamheart.demo.appforload" 9 | minSdkVersion 9 10 | targetSdkVersion 25 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(dir: 'libs', include: ['*.jar']) 27 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 28 | exclude group: 'com.android.support', module: 'support-annotations' 29 | }) 30 | provided project(':hook') 31 | testCompile 'junit:junit:4.12' 32 | } 33 | -------------------------------------------------------------------------------- /appforload/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\dev\android-studio\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /appforload/src/androidTest/java/me/dreamheart/demo/appforload/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package me.dreamheart.demo.appforload; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("me.dreamheart.demo.appforload", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /appforload/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /appforload/src/main/java/me/dreamheart/demo/appforload/Main2Activity.java: -------------------------------------------------------------------------------- 1 | package me.dreamheart.demo.appforload; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | public class Main2Activity extends Activity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_main2); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /appforload/src/main/java/me/dreamheart/demo/appforload/MainActivity.java: -------------------------------------------------------------------------------- 1 | package me.dreamheart.demo.appforload; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | public class MainActivity extends Activity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_main); 14 | findViewById(R.id.activity_btn).setOnClickListener(new View.OnClickListener() { 15 | @Override 16 | public void onClick(View v) { 17 | startActivity(new Intent(MainActivity.this, Main2Activity.class)); 18 | } 19 | }); 20 | new TestClass().test(); 21 | new TestClass.TestSubClass().test(TestClass.TestSubClass.testStr); 22 | new TestClass.TestSubClass.TestSubSubClass().test(); 23 | // ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(this.getPackageName(), PackageManager.GET_META_DATA); 24 | // appInfo.metaData.getInt("DH_APP_CHANNEL"); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /appforload/src/main/java/me/dreamheart/demo/appforload/TestApp.java: -------------------------------------------------------------------------------- 1 | package me.dreamheart.demo.appforload; 2 | 3 | import android.app.Application; 4 | import android.util.Log; 5 | 6 | /** 7 | * Created by Junhua Lv on 2017/1/26. 8 | */ 9 | 10 | public class TestApp extends Application { 11 | 12 | @Override 13 | public void onCreate() { 14 | super.onCreate(); 15 | Log.v("TestApp", "TestApp onCreate"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /appforload/src/main/java/me/dreamheart/demo/appforload/TestClass.java: -------------------------------------------------------------------------------- 1 | package me.dreamheart.demo.appforload; 2 | 3 | import android.util.Log; 4 | 5 | /** 6 | * Created by Junhua Lv on 2017/2/1. 7 | * 测试非public的类调用的问题 8 | */ 9 | 10 | class TestClass { 11 | static class TestSubClass { 12 | static class TestSubSubClass { 13 | void test () { 14 | Log.v("TestClass", "TestSubSubClass ok"); 15 | } 16 | } 17 | static String testStr = "TestSubClass ok"; 18 | void test (String str) { 19 | Log.v("TestClass", str); 20 | } 21 | } 22 | 23 | void test() { 24 | Log.v("TestClass", "test ok"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /appforload/src/main/res/drawable-xxxhdpi/default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Junhua102/Chameleon/81a870db5608e76454e70852476e18e305e1c1a6/appforload/src/main/res/drawable-xxxhdpi/default_avatar.png -------------------------------------------------------------------------------- /appforload/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 18 | 19 |