Full Code of Tencent/tinker for AI

dev d40dfcbd24e6 cached
427 files
2.5 MB
671.7k tokens
3259 symbols
1 requests
Download .txt
Showing preview only (2,686K chars total). Download the full file or copy to clipboard to get everything.
Repository: Tencent/tinker
Branch: dev
Commit: d40dfcbd24e6
Files: 427
Total size: 2.5 MB

Directory structure:
gitextract_2owebcte/

├── .github/
│   └── ISSUE_TEMPLATE.md
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── build.gradle
├── checkstyle.xml
├── findbugs-exclude.xml
├── gradle/
│   ├── PublishArtifact.gradle
│   ├── WeChatPublish.gradle
│   ├── check.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── pmd-ruleset.xml
├── settings.gradle
├── suppressions.xml
├── third-party/
│   ├── aosp-dexutils/
│   │   ├── .gitignore
│   │   ├── NOTICE
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── android/
│   │                               ├── dex/
│   │                               │   ├── Annotation.java
│   │                               │   ├── AnnotationSet.java
│   │                               │   ├── AnnotationSetRefList.java
│   │                               │   ├── AnnotationsDirectory.java
│   │                               │   ├── CallSiteId.java
│   │                               │   ├── ClassData.java
│   │                               │   ├── ClassDef.java
│   │                               │   ├── Code.java
│   │                               │   ├── DebugInfoItem.java
│   │                               │   ├── Dex.java
│   │                               │   ├── DexException.java
│   │                               │   ├── DexFormat.java
│   │                               │   ├── EncodedValue.java
│   │                               │   ├── EncodedValueCodec.java
│   │                               │   ├── EncodedValueReader.java
│   │                               │   ├── FieldId.java
│   │                               │   ├── Leb128.java
│   │                               │   ├── MethodHandle.java
│   │                               │   ├── MethodId.java
│   │                               │   ├── Mutf8.java
│   │                               │   ├── ProtoId.java
│   │                               │   ├── SizeOf.java
│   │                               │   ├── StringData.java
│   │                               │   ├── TableOfContents.java
│   │                               │   ├── TypeList.java
│   │                               │   ├── io/
│   │                               │   │   └── DexDataBuffer.java
│   │                               │   └── util/
│   │                               │       ├── ByteInput.java
│   │                               │       ├── ByteOutput.java
│   │                               │       ├── CompareUtils.java
│   │                               │       ├── FileUtils.java
│   │                               │       └── HashCodeHelper.java
│   │                               ├── dx/
│   │                               │   ├── instruction/
│   │                               │   │   ├── CodeCursor.java
│   │                               │   │   ├── InstructionCodec.java
│   │                               │   │   ├── InstructionComparator.java
│   │                               │   │   ├── InstructionPromoter.java
│   │                               │   │   ├── InstructionReader.java
│   │                               │   │   ├── InstructionVisitor.java
│   │                               │   │   ├── InstructionWriter.java
│   │                               │   │   ├── Opcodes.java
│   │                               │   │   ├── ShortArrayCodeInput.java
│   │                               │   │   └── ShortArrayCodeOutput.java
│   │                               │   └── util/
│   │                               │       └── Hex.java
│   │                               └── utils/
│   │                                   ├── SparseBoolArray.java
│   │                                   └── SparseIntArray.java
│   ├── bsdiff-util/
│   │   ├── .gitignore
│   │   ├── LICENSE.txt
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── bsdiff/
│   │                               ├── BSDiff.java
│   │                               ├── BSPatch.java
│   │                               └── BSUtil.java
│   └── tinker-ziputils/
│       ├── .gitignore
│       ├── NOTICE.txt
│       ├── build.gradle
│       ├── gradle.properties
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── tencent/
│                           └── tinker/
│                               └── ziputils/
│                                   └── ziputil/
│                                       ├── AlignedZipOutputStream.java
│                                       ├── Arrays.java
│                                       ├── BufferIterator.java
│                                       ├── HeapBufferIterator.java
│                                       ├── Memory.java
│                                       ├── SizeOf.java
│                                       ├── StandardCharsets.java
│                                       ├── Streams.java
│                                       ├── TinkerZipEntry.java
│                                       ├── TinkerZipFile.java
│                                       ├── TinkerZipOutputStream.java
│                                       ├── TinkerZipUtil.java
│                                       └── ZipConstants.java
├── tinker-android/
│   ├── consumer-proguard.txt
│   ├── tinker-android-anno/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       ├── main/
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   └── services/
│   │       │       │       └── javax.annotation.processing.Processor
│   │       │       └── TinkerAnnoApplication.tmpl
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── anno/
│   │                               └── test/
│   │                                   └── TestLifeCycle.java
│   ├── tinker-android-anno-support/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── anno/
│   │                               ├── AnnotationProcessor.java
│   │                               ├── DefaultLifeCycle.java
│   │                               └── Keep.java
│   ├── tinker-android-lib/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   └── lib/
│   │       │                       └── patch/
│   │       │                           └── ApplicationTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── aidl/
│   │       │   │   └── com/
│   │       │   │       └── tencent/
│   │       │   │           └── tinker/
│   │       │   │               └── lib/
│   │       │   │                   └── IForeService.aidl
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   ├── entry/
│   │       │                   │   ├── ApplicationLifeCycle.java
│   │       │                   │   ├── ApplicationLike.java
│   │       │                   │   ├── DefaultApplicationLike.java
│   │       │                   │   └── TinkerApplicationInlineFence.java
│   │       │                   └── lib/
│   │       │                       ├── filepatch/
│   │       │                       │   ├── AbstractFilePatch.java
│   │       │                       │   ├── BsFilePatch.java
│   │       │                       │   └── FilePatchFactory.java
│   │       │                       ├── library/
│   │       │                       │   └── TinkerLoadLibrary.java
│   │       │                       ├── listener/
│   │       │                       │   ├── DefaultPatchListener.java
│   │       │                       │   └── PatchListener.java
│   │       │                       ├── patch/
│   │       │                       │   ├── AbstractPatch.java
│   │       │                       │   ├── ArkHotDiffPatchInternal.java
│   │       │                       │   ├── BasePatchInternal.java
│   │       │                       │   ├── DexDiffPatchInternal.java
│   │       │                       │   ├── ResDiffPatchInternal.java
│   │       │                       │   ├── SoDiffPatchInternal.java
│   │       │                       │   └── UpgradePatch.java
│   │       │                       ├── reporter/
│   │       │                       │   ├── DefaultLoadReporter.java
│   │       │                       │   ├── DefaultPatchReporter.java
│   │       │                       │   ├── LoadReporter.java
│   │       │                       │   └── PatchReporter.java
│   │       │                       ├── service/
│   │       │                       │   ├── AbstractResultService.java
│   │       │                       │   ├── DefaultTinkerResultService.java
│   │       │                       │   ├── PatchResult.java
│   │       │                       │   ├── TinkerPatchForeService.java
│   │       │                       │   └── TinkerPatchService.java
│   │       │                       ├── tinker/
│   │       │                       │   ├── Tinker.java
│   │       │                       │   ├── TinkerApplicationHelper.java
│   │       │                       │   ├── TinkerInstaller.java
│   │       │                       │   └── TinkerLoadResult.java
│   │       │                       └── util/
│   │       │                           ├── TinkerLog.java
│   │       │                           ├── TinkerServiceInternals.java
│   │       │                           └── UpgradePatchRetry.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── recover/
│   │                               └── ExampleUnitTest.java
│   ├── tinker-android-lib-no-op/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   └── lib/
│   │       │                       └── patch/
│   │       │                           └── ApplicationTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   └── lib/
│   │       │                       ├── library/
│   │       │                       │   └── TinkerLoadLibrary.java
│   │       │                       ├── listener/
│   │       │                       │   ├── DefaultPatchListener.java
│   │       │                       │   └── PatchListener.java
│   │       │                       ├── patch/
│   │       │                       │   ├── AbstractPatch.java
│   │       │                       │   └── UpgradePatch.java
│   │       │                       ├── reporter/
│   │       │                       │   ├── DefaultLoadReporter.java
│   │       │                       │   ├── DefaultPatchReporter.java
│   │       │                       │   ├── LoadReporter.java
│   │       │                       │   └── PatchReporter.java
│   │       │                       ├── service/
│   │       │                       │   ├── AbstractResultService.java
│   │       │                       │   ├── DefaultTinkerResultService.java
│   │       │                       │   └── PatchResult.java
│   │       │                       ├── tinker/
│   │       │                       │   ├── Tinker.java
│   │       │                       │   ├── TinkerApplicationHelper.java
│   │       │                       │   ├── TinkerInstaller.java
│   │       │                       │   └── TinkerLoadResult.java
│   │       │                       └── util/
│   │       │                           ├── TinkerLog.java
│   │       │                           ├── TinkerServiceInternals.java
│   │       │                           └── UpgradePatchRetry.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── recover/
│   │                               └── ExampleUnitTest.java
│   ├── tinker-android-loader/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   ├── proguard-rules.pro
│   │   ├── src/
│   │   │   ├── androidTest/
│   │   │   │   └── java/
│   │   │   │       └── com/
│   │   │   │           └── tencent/
│   │   │   │               └── tinker/
│   │   │   │                   └── loader/
│   │   │   │                       └── ApplicationTest.java
│   │   │   ├── main/
│   │   │   │   ├── AndroidManifest.xml
│   │   │   │   └── java/
│   │   │   │       └── com/
│   │   │   │           └── tencent/
│   │   │   │               └── tinker/
│   │   │   │                   └── loader/
│   │   │   │                       ├── AbstractTinkerLoader.java
│   │   │   │                       ├── AppInfoChangedBlocker.java
│   │   │   │                       ├── NewClassLoaderInjector.java
│   │   │   │                       ├── SystemClassLoaderAdder.java
│   │   │   │                       ├── TinkerArkHotLoader.java
│   │   │   │                       ├── TinkerClassLoader.java
│   │   │   │                       ├── TinkerDexLoader.java
│   │   │   │                       ├── TinkerDexOptimizer.java
│   │   │   │                       ├── TinkerLoader.java
│   │   │   │                       ├── TinkerResourceLoader.java
│   │   │   │                       ├── TinkerResourcePatcher.java
│   │   │   │                       ├── TinkerResourcesKey.java
│   │   │   │                       ├── TinkerRuntimeException.java
│   │   │   │                       ├── TinkerSoLoader.java
│   │   │   │                       ├── TinkerTestDexLoad.java
│   │   │   │                       ├── TinkerUncaughtHandler.java
│   │   │   │                       ├── app/
│   │   │   │                       │   ├── TinkerApplication.java
│   │   │   │                       │   └── TinkerInlineFenceAction.java
│   │   │   │                       ├── hotplug/
│   │   │   │                       │   ├── ActivityStubManager.java
│   │   │   │                       │   ├── ActivityStubs.java
│   │   │   │                       │   ├── ComponentHotplug.java
│   │   │   │                       │   ├── EnvConsts.java
│   │   │   │                       │   ├── IncrementComponentManager.java
│   │   │   │                       │   ├── UnsupportedEnvironmentException.java
│   │   │   │                       │   ├── handler/
│   │   │   │                       │   │   ├── AMSInterceptHandler.java
│   │   │   │                       │   │   ├── MHMessageHandler.java
│   │   │   │                       │   │   └── PMSInterceptHandler.java
│   │   │   │                       │   └── interceptor/
│   │   │   │                       │       ├── HandlerMessageInterceptor.java
│   │   │   │                       │       ├── InterceptFailedException.java
│   │   │   │                       │       ├── Interceptor.java
│   │   │   │                       │       ├── ServiceBinderInterceptor.java
│   │   │   │                       │       └── TinkerHackInstrumentation.java
│   │   │   │                       └── shareutil/
│   │   │   │                           ├── Guard.java
│   │   │   │                           ├── ShareArkHotDiffPatchInfo.java
│   │   │   │                           ├── ShareBsDiffPatchInfo.java
│   │   │   │                           ├── ShareConstants.java
│   │   │   │                           ├── ShareDexDiffPatchInfo.java
│   │   │   │                           ├── ShareElfFile.java
│   │   │   │                           ├── ShareFileLockHelper.java
│   │   │   │                           ├── ShareIntentUtil.java
│   │   │   │                           ├── ShareOatUtil.java
│   │   │   │                           ├── SharePatchFileUtil.java
│   │   │   │                           ├── SharePatchInfo.java
│   │   │   │                           ├── ShareReflectUtil.java
│   │   │   │                           ├── ShareResPatchInfo.java
│   │   │   │                           ├── ShareSecurityCheck.java
│   │   │   │                           ├── ShareTinkerInternals.java
│   │   │   │                           ├── ShareTinkerLog.java
│   │   │   │                           └── TinkerLogInlineFence.java
│   │   │   └── test/
│   │   │       └── java/
│   │   │           └── com/
│   │   │               └── tencent/
│   │   │                   └── tinker/
│   │   │                       └── loader/
│   │   │                           ├── ExampleUnitTest.java
│   │   │                           └── shareutil/
│   │   │                               └── GuardTest.java
│   │   └── stubs/
│   │       └── sysapi-access-stub.jar
│   └── tinker-android-loader-no-op/
│       ├── .gitignore
│       ├── build.gradle
│       ├── gradle.properties
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── tencent/
│           │               └── tinker/
│           │                   └── loader/
│           │                       └── ApplicationTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   └── java/
│           │       └── com/
│           │           └── tencent/
│           │               └── tinker/
│           │                   ├── entry/
│           │                   │   ├── ApplicationLifeCycle.java
│           │                   │   ├── ApplicationLike.java
│           │                   │   └── DefaultApplicationLike.java
│           │                   └── loader/
│           │                       ├── TinkerRuntimeException.java
│           │                       ├── app/
│           │                       │   └── TinkerApplication.java
│           │                       └── shareutil/
│           │                           ├── ShareArkHotDiffPatchInfo.java
│           │                           ├── ShareBsDiffPatchInfo.java
│           │                           ├── ShareConstants.java
│           │                           ├── ShareDexDiffPatchInfo.java
│           │                           ├── ShareElfFile.java
│           │                           ├── ShareFileLockHelper.java
│           │                           ├── ShareIntentUtil.java
│           │                           ├── ShareOatUtil.java
│           │                           ├── SharePatchFileUtil.java
│           │                           ├── SharePatchInfo.java
│           │                           ├── ShareReflectUtil.java
│           │                           ├── ShareResPatchInfo.java
│           │                           ├── ShareSecurityCheck.java
│           │                           ├── ShareTinkerInternals.java
│           │                           ├── ShareTinkerLog.java
│           │                           └── TinkerLogInlineFence.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── tencent/
│                           └── tinker/
│                               └── loader/
│                                   └── ExampleUnitTest.java
├── tinker-build/
│   ├── tinker-patch-cli/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── src/
│   │   │   └── main/
│   │   │       └── java/
│   │   │           └── com/
│   │   │               └── tencent/
│   │   │                   └── tinker/
│   │   │                       └── patch/
│   │   │                           ├── CliMain.java
│   │   │                           └── Test.java
│   │   ├── tool_maple/
│   │   │   ├── DexCmp.jar
│   │   │   └── build_patch_dexdiff.sh
│   │   └── tool_output/
│   │       ├── merge_mapping.py
│   │       ├── proguard_warning.py
│   │       ├── release.keystore
│   │       ├── tinker_config.xml
│   │       ├── tinker_multidexkeep.pro
│   │       └── tinker_proguard.pro
│   ├── tinker-patch-gradle-plugin/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           ├── groovy/
│   │           │   └── com/
│   │           │       └── tencent/
│   │           │           └── tinker/
│   │           │               └── build/
│   │           │                   └── gradle/
│   │           │                       ├── Compatibilities.groovy
│   │           │                       ├── TinkerPatchPlugin.groovy
│   │           │                       ├── common/
│   │           │                       │   └── TinkerBuildPath.groovy
│   │           │                       ├── extension/
│   │           │                       │   ├── TinkerArkHotExtension.groovy
│   │           │                       │   ├── TinkerBuildConfigExtension.groovy
│   │           │                       │   ├── TinkerDexExtension.groovy
│   │           │                       │   ├── TinkerLibExtension.groovy
│   │           │                       │   ├── TinkerPackageConfigExtension.groovy
│   │           │                       │   ├── TinkerPatchExtension.groovy
│   │           │                       │   ├── TinkerResourceExtension.groovy
│   │           │                       │   └── TinkerSevenZipExtension.groovy
│   │           │                       ├── task/
│   │           │                       │   ├── TinkerManifestAction.groovy
│   │           │                       │   ├── TinkerMultidexConfigTask.groovy
│   │           │                       │   ├── TinkerPatchSchemaTask.groovy
│   │           │                       │   ├── TinkerProguardConfigAction.groovy
│   │           │                       │   └── TinkerResourceIdTask.groovy
│   │           │                       └── transform/
│   │           │                           └── ImmutableDexTransform.groovy
│   │           └── resources/
│   │               └── META-INF/
│   │                   └── gradle-plugins/
│   │                       └── com.tencent.tinker.patch.properties
│   └── tinker-patch-lib/
│       ├── .gitignore
│       ├── build.gradle
│       ├── gradle.properties
│       └── src/
│           └── main/
│               ├── java/
│               │   ├── com/
│               │   │   └── tencent/
│               │   │       └── tinker/
│               │   │           └── build/
│               │   │               ├── aapt/
│               │   │               │   ├── AaptResourceCollector.java
│               │   │               │   ├── AaptUtil.java
│               │   │               │   ├── Constant.java
│               │   │               │   ├── FakeRDotTxtEntry.java
│               │   │               │   ├── FileCopyException.java
│               │   │               │   ├── FileUtil.java
│               │   │               │   ├── Generator.java
│               │   │               │   ├── JavaXmlUtil.java
│               │   │               │   ├── ObjectUtil.java
│               │   │               │   ├── PatchUtil.java
│               │   │               │   ├── RDotTxtEntry.java
│               │   │               │   ├── ResourceDirectory.java
│               │   │               │   ├── ResourceEntry.java
│               │   │               │   └── StringUtil.java
│               │   │               ├── apkparser/
│               │   │               │   └── AndroidParser.java
│               │   │               ├── builder/
│               │   │               │   └── PatchBuilder.java
│               │   │               ├── decoder/
│               │   │               │   ├── ApkDecoder.java
│               │   │               │   ├── ArkHotDecoder.java
│               │   │               │   ├── BaseDecoder.java
│               │   │               │   ├── DexDiffDecoder.java
│               │   │               │   ├── ManifestDecoder.java
│               │   │               │   ├── ResDiffDecoder.java
│               │   │               │   ├── SoDiffDecoder.java
│               │   │               │   └── UniqueDexDiffDecoder.java
│               │   │               ├── dexpatcher/
│               │   │               │   ├── DexPatchGenerator.java
│               │   │               │   ├── algorithms/
│               │   │               │   │   └── diff/
│               │   │               │   │       ├── AnnotationSectionDiffAlgorithm.java
│               │   │               │   │       ├── AnnotationSetRefListSectionDiffAlgorithm.java
│               │   │               │   │       ├── AnnotationSetSectionDiffAlgorithm.java
│               │   │               │   │       ├── AnnotationsDirectorySectionDiffAlgorithm.java
│               │   │               │   │       ├── CallSiteIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── ClassDataSectionDiffAlgorithm.java
│               │   │               │   │       ├── ClassDefSectionDiffAlgorithm.java
│               │   │               │   │       ├── CodeSectionDiffAlgorithm.java
│               │   │               │   │       ├── DebugInfoItemSectionDiffAlgorithm.java
│               │   │               │   │       ├── DexSectionDiffAlgorithm.java
│               │   │               │   │       ├── FieldIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── MethodHandleSectionDiffAlgorithm.java
│               │   │               │   │       ├── MethodIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── ProtoIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── StaticValueSectionDiffAlgorithm.java
│               │   │               │   │       ├── StringDataSectionDiffAlgorithm.java
│               │   │               │   │       ├── TypeIdSectionDiffAlgorithm.java
│               │   │               │   │       └── TypeListSectionDiffAlgorithm.java
│               │   │               │   └── util/
│               │   │               │       ├── ChangedClassesDexClassInfoCollector.java
│               │   │               │       └── PatternUtils.java
│               │   │               ├── immutable/
│               │   │               │   ├── ClassSimDef.java
│               │   │               │   └── DexRefData.java
│               │   │               ├── info/
│               │   │               │   ├── InfoWriter.java
│               │   │               │   ├── PatchInfo.java
│               │   │               │   └── PatchInfoGen.java
│               │   │               ├── patch/
│               │   │               │   ├── Configuration.java
│               │   │               │   ├── InputParam.java
│               │   │               │   └── Runner.java
│               │   │               └── util/
│               │   │                   ├── CustomDiff.java
│               │   │                   ├── DexClassesComparator.java
│               │   │                   ├── DiffFactory.java
│               │   │                   ├── ExcludedClassModifiedChecker.java
│               │   │                   ├── FileOperation.java
│               │   │                   ├── Logger.java
│               │   │                   ├── MD5.java
│               │   │                   ├── TinkerPatchException.java
│               │   │                   ├── TypedValue.java
│               │   │                   └── Utils.java
│               │   └── org/
│               │       └── jf/
│               │           └── dexlib2/
│               │               └── builder/
│               │                   └── BuilderMutableMethodImplementation.java
│               └── resources/
│                   ├── only_use_to_test_tinker_resource.txt
│                   └── test.dex
├── tinker-commons/
│   ├── .gitignore
│   ├── NOTICE.txt
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── tencent/
│                       └── tinker/
│                           └── commons/
│                               ├── dexpatcher/
│                               │   ├── DexPatchApplier.java
│                               │   ├── DexPatcherLogger.java
│                               │   ├── algorithms/
│                               │   │   └── patch/
│                               │   │       ├── AnnotationSectionPatchAlgorithm.java
│                               │   │       ├── AnnotationSetRefListSectionPatchAlgorithm.java
│                               │   │       ├── AnnotationSetSectionPatchAlgorithm.java
│                               │   │       ├── AnnotationsDirectorySectionPatchAlgorithm.java
│                               │   │       ├── CallSiteIdSectionPatchAlgorithm.java
│                               │   │       ├── ClassDataSectionPatchAlgorithm.java
│                               │   │       ├── ClassDefSectionPatchAlgorithm.java
│                               │   │       ├── CodeSectionPatchAlgorithm.java
│                               │   │       ├── DebugInfoItemSectionPatchAlgorithm.java
│                               │   │       ├── DexSectionPatchAlgorithm.java
│                               │   │       ├── FieldIdSectionPatchAlgorithm.java
│                               │   │       ├── MethodHandleSectionPatchAlgorithm.java
│                               │   │       ├── MethodIdSectionPatchAlgorithm.java
│                               │   │       ├── ProtoIdSectionPatchAlgorithm.java
│                               │   │       ├── StaticValueSectionPatchAlgorithm.java
│                               │   │       ├── StringDataSectionPatchAlgorithm.java
│                               │   │       ├── TypeIdSectionPatchAlgorithm.java
│                               │   │       └── TypeListSectionPatchAlgorithm.java
│                               │   ├── struct/
│                               │   │   ├── DexPatchFile.java
│                               │   │   └── PatchOperation.java
│                               │   └── util/
│                               │       ├── AbstractIndexMap.java
│                               │       ├── InstructionTransformer.java
│                               │       └── SparseIndexMap.java
│                               └── util/
│                                   ├── DigestUtil.java
│                                   └── IOHelper.java
└── tinker-sample-android/
    ├── .gitignore
    ├── app/
    │   ├── .gitignore
    │   ├── build.gradle
    │   ├── keystore/
    │   │   ├── debug.keystore
    │   │   └── release.keystore
    │   ├── proguard-rules.pro
    │   ├── src/
    │   │   ├── main/
    │   │   │   ├── AndroidManifest.xml
    │   │   │   ├── java/
    │   │   │   │   └── tinker/
    │   │   │   │       └── sample/
    │   │   │   │           └── android/
    │   │   │   │               ├── Log/
    │   │   │   │               │   └── MyLogImp.java
    │   │   │   │               ├── app/
    │   │   │   │               │   ├── BaseBuildInfo.java
    │   │   │   │               │   ├── BuildInfo.java
    │   │   │   │               │   ├── MainActivity.java
    │   │   │   │               │   └── SampleApplicationLike.java
    │   │   │   │               ├── crash/
    │   │   │   │               │   └── SampleUncaughtExceptionHandler.java
    │   │   │   │               ├── reporter/
    │   │   │   │               │   ├── SampleLoadReporter.java
    │   │   │   │               │   ├── SamplePatchListener.java
    │   │   │   │               │   ├── SamplePatchReporter.java
    │   │   │   │               │   └── SampleTinkerReport.java
    │   │   │   │               ├── service/
    │   │   │   │               │   └── SampleResultService.java
    │   │   │   │               └── util/
    │   │   │   │                   ├── SampleApplicationContext.java
    │   │   │   │                   ├── TinkerManager.java
    │   │   │   │                   └── Utils.java
    │   │   │   └── res/
    │   │   │       ├── layout/
    │   │   │       │   └── activity_main.xml
    │   │   │       ├── values/
    │   │   │       │   ├── colors.xml
    │   │   │       │   ├── dimens.xml
    │   │   │       │   ├── strings.xml
    │   │   │       │   └── styles.xml
    │   │   │       └── values-w820dp/
    │   │   │           └── dimens.xml
    │   │   └── test/
    │   │       └── java/
    │   │           └── tinker/
    │   │               └── sample/
    │   │                   └── android/
    │   │                       └── ExampleUnitTest.java
    │   └── tinker_multidexkeep.pro
    ├── build.gradle
    ├── gradle/
    │   └── wrapper/
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── updateTinkerLib.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
## Issue/提问须知
**在提交issue之前,我们应该先查询是否已经有相关的issue以及[常见问题](https://github.com/Tencent/tinker/wiki/Tinker-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)。提交issue时,我们需要写明issue的原因,以及编译或运行过程的日志(加载进程以及Patch进程)。issue需要以下面的格式:**

```
异常类型:app运行时异常/编译异常

手机型号:如:Nexus 5(如是编译异常,则可以不填)

手机系统版本:如:Android 5.0 (如是编译异常,则可以不填)

tinker版本:如:1.7.7

gradle版本:如:2.10

是否使用热更新SDK: 如 TinkerPatch SDK 或者 Bugly SDK

系统:如:Mac

堆栈/日志:
1. 如是编译异常,请在执行gradle命令时,加上--stacktrace;
2. 日志我们需要过滤"Tinker."关键字;
3. 对于合成失败的情况,请给出:patch进程的日志,这里需要将Android Moniter右上角设为No Filter。
```

提问题时若使用`不能用/没效果/有问题/报错`此类模糊表达,但又没给出任何代码截图报错的,将绝对不会有任何反馈。这种issue也是一律直接关闭的,大家可以参阅[提问的智慧](https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way)。

Tinker是一个开源项目,希望大家遇到问题时要学会先思考,看看sample与Tinker的源码,更鼓励大家给我们提pr.

================================================
FILE: .gitignore
================================================
/build

# Ignore Gradle GUI config
gradle-app.setting

# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar

# Cache of project
.gradletasknamecache

.DS_Store
node_modules

# Built application files
*.apk
*.ap_

# Java class files
*.class

# Generated files
bin/
gen/

# Gradle files
.gradle/
*.iml
.idea

# Local configuration file (sdk path, etc)
local.properties
local.gradle

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

/buildSdk




================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Tinker
Welcome to [report Issues](https://github.com/Tencent/tinker/issues) or [pull requests](https://github.com/Tencent/tinker/pulls). It's recommended to read the following Contributing Guide first before contributing. 

## Issues
We use Github Issues to track public bugs and feature requests.

### Search Known Issues First
Please search the existing issues to see if any similar issue or feature request has already been filed. You should make sure your issue isn't redundant.

### Reporting New Issues
If you open an issue, the more information the better. Such as detailed description, screenshot or video of your problem, logcat or code blocks for your crash.

## Pull Requests
We strongly welcome your pull request to make Tinker better. 

### Branch Management
There are three main branches here:

1. `master` branch.
	1. It is the latest (pre-)release branch. We use `master` for tags, with version number `1.1.0`, `1.2.0`, `1.3.0`...
	2. **Don't submit any PR on `master` branch.**
2. `dev` branch. 
	1. It is our stable developing branch. After full testing, `dev` will be merged to `master` branch for the next release.
	2. **You are recommended to submit bugfix or feature PR on `dev` branch.**
3. `hotfix` branch. 
	1. It is the latest tag version for hot fix. If we accept your pull request, we may just tag with version number `1.1.1`, `1.2.3`.
	2. **Only submit urgent PR on `hotfix` branch for next specific release.**

Normal bugfix or feature request should be submitted to `dev` branch. After full testing, we will merge them to `master` branch for the next release. 

If you have some urgent bugfixes on a published version, but the `master` branch have already far away with the latest tag version, you can submit a PR on hotfix. And it will be cherry picked to `dev` branch if it is possible.

```
master
 ↑
dev        <--- hotfix PR
 ↑ 
feature/bugfix PR
```  

### Make Pull Requests
The code team will monitor all pull request, we run some code check and test on it. After all tests passed, we will accecpt this PR. But it won't merge to `master` branch at once, which have some delay.

Before submitting a pull request, please make sure the followings are done:

1. Fork the repo and create your branch from `master` or `hotfix`.
2. Update code or documentation if you have changed APIs.
3. Add the copyright notice to the top of any new files you've added.
4. Check your code lints and checkstyles.
5. Test and test again your code.
6. Now, you can submit your pull request on `dev` or `hotfix` branch.

## Code Style Guide
Use [Code Style](https://github.com/Tencent/tinker/blob/master/checkstyle.xml) for Java and Android.

* 4 spaces for indentation rather than tabs

## License
By contributing to Tinker, you agree that your contributions will be licensed
under its [BSD LICENSE](https://github.com/Tencent/tinker/blob/master/LICENSE)


================================================
FILE: LICENSE
================================================
Tencent is pleased to support the open source community by making Tinker available.

Copyright (C) 2016 THL A29 Limited, a Tencent company.  All rights reserved.

If you have downloaded a copy of the Tinker binary from Tencent, please note that the Tinker binary
is licensed under the BSD 3-Clause License.


If you have downloaded a copy of the Tinker source code from Tencent, please note that Tinker
source code is licensed under the BSD 3-Clause License, except for the third-party components
listed below which are subject to different license terms.  Your integration of Tinker into your own
projects may require compliance with the BSD 3-Clause License, as well as the other licenses
applicable to the third-party components included within Tinker.

A copy of the BSD 3-Clause License is included in this file.

Other dependencies and licenses:
----------------------------------------------------------------------------------------

Open Source Software Licensed Under the Apache License, Version 2.0: 
The below software in this distribution may have been modified by THL A29 Limited (“Tencent
Modifications”). All Tencent Modifications are Copyright (C) 2016 THL A29 Limited.
----------------------------------------------------------------------------------------
1. Android Source Code  4.4_r1
Copyright (C) 2005-2015 The Android Open Source Project 

2. buck  v2016.04.18.01
Copyright 2014-present Facebook, Inc.

3. leakcanary  v1.3.1
Copyright (C) 2014-2015 Square, Inc.


Terms of the Apache License, Version 2.0:
---------------------------------------------------

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by
Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is
granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are
controlled by, or are under common control with that entity. For the purposes of this definition,
“control” means (i) the power, direct or indirect, to cause the direction or management of such
entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this
License.

“Source” form shall mean the preferred form for making modifications, including but not limited to
software source code, documentation source, and configuration files.

“Object” form shall mean any form resulting from mechanical transformation or translation of a
Source form, including but not limited to compiled object code, generated documentation, and
conversions to other media types.

“Work” shall mean the work of authorship, whether in Source or Object form, made available under
the License, as indicated by a copyright notice that is included in or attached to the work (an
example is provided in the Appendix below).

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or
derived from) the Work and for which the editorial revisions, annotations, elaborations, or other
modifications represent, as a whole, an original work of authorship. For the purposes of this License,
Derivative Works shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.

“Contribution” shall mean any work of authorship, including the original version of the Work and
any modifications or additions to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal
Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent to the Licensor or
its representatives, including but not limited to communication on electronic mailing lists, source
code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor
for the purpose of discussing and improving the Work, but excluding communication that is
conspicuously marked or otherwise designated in writing by the copyright owner as “Not a
Contribution.”

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a
Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor
hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform,
sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor
hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made, use, offer to sell, sell, import,
and otherwise transfer the Work, where such license applies only to those patent claims licensable by
such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of
their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute
patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that
the Work or a Contribution incorporated within the Work constitutes direct or contributory patent
infringement, then any patent licenses granted to You under this License for that Work shall
terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form, provided that You
meet the following conditions:

    a) You must give any other recipients of the Work or Derivative Works a copy of this License;
       and

    b) You must cause any modified files to carry prominent notices stating that You changed the
       files;and

    c) You must retain, in the Source form of any Derivative Works that You distribute, all
       copyright, patent, trademark, and attribution notices from the Source form of the Work,
       excluding those notices that do not pertain to any part of the Derivative Works;and

    d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative
       Works that You distribute must include a readable copy of the attribution notices contained
       within such NOTICE file, excluding those notices that do not pertain to any part of the
       Derivative Works, in at least one of the following places: within a NOTICE text file
       distributed as part of the Derivative Works; within the Source form or documentation, if
       provided along with the Derivative Works; or, within a display generated by the Derivative
       Works, if and wherever such third-party notices normally appear. The contents of the
       NOTICE file are for informational purposes only and do not modify the License. You may
       add Your own attribution notices within Derivative Works that You distribute, alongside or
       as an addendum to the NOTICE text from the Work, provided that such additional attribution
       notices cannot be construed as modifying the License.

You may add Your own copyright statement to Your modifications and may provide additional or
different license terms and conditions for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the
Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution
intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms
and conditions of this License, without any additional terms or conditions. Notwithstanding the
above, nothing herein shall supersede or modify the terms of any separate license agreement you
may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service
marks, or product names of the Licensor, except as required for reasonable and customary use in
describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor
provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
responsible for determining the appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including
negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including
any direct, indirect, special, incidental, or consequential damages of any character arising as a result
of this License or out of the use or inability to use the Work (including but not limited to damages
for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other
commercial damages or losses), even if such Contributor has been advised of the possibility of such
damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works
thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this License. However, in accepting such
obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of
any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor
harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
----------------------------------------------------------------------------------------


Open Source Software Licensed Under the GNU Lesser General Public License, version 2.1 (LGPL-2.1): 
----------------------------------------------------------------------------------------
1. 7-Zip  16.02
7-Zip Copyright (C) 1999-2016 Igor Pavlov.


Terms of the GNU Lesser General Public License, version 2.1 (LGPL-2.1):
---------------------------------------------------

GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999

Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing
it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts as the successor of the GNU
Library Public License, version 2, hence the version number 2.1.]

                                        Preamble

The licenses for most software are designed to take away your freedom to share and change it.  By
contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and
change free software--to make sure the software is free for all its users.

This license, the Lesser General Public License, applies to some specially designated software
packages--typically libraries--of the Free Software Foundation and other authors who decide to use
it.  You can use it too, but we suggest you first think carefully about whether this license or the
ordinary General Public License is the better strategy to use in any particular case, based on the
explanations below.

When we speak of free software, we are referring to freedom of use, not price.  Our General Public
Licenses are designed to make sure that you have the freedom to distribute copies of free software
(and charge for this service if you wish); that you receive source code or can get it if you want it;
that you can change the software and use pieces of it in new free programs; and that you are
nformed that you can do these things.

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights
or to ask you to surrender these rights.  These restrictions translate to certain responsibilities for you
if you distribute copies of the library or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the
recipients all the rights that we gave you.  You must make sure that they, too, receive or can get the
source code.  If you link other code with the library, you must provide complete object files to the
recipients, so that they can relink them with the library after making changes to the library and
recompiling it.  And you must show them these terms so they know their rights.

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you
this license, which gives you legal permission to copy, distribute and/or modify the library.

To protect each distributor, we want to make it very clear that there is no warranty for the free
library.  Also, if the library is modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original author's reputation will not be
affected by problems that might be introduced by others.

Finally, software patents pose a constant threat to the existence of any free program.  We wish to
make sure that a company cannot effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that any patent license obtained for a
version of the library must be consistent with the full freedom of use specified in this license.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public
License.  This license, the GNU Lesser General Public License, applies to certain designated
libraries, and is quite different from the ordinary General Public License.  We use this license for
certain libraries in order to permit linking those libraries into non-free programs.

When a program is linked with a library, whether statically or using a shared library, the
combination of the two is legally speaking a combined work, a derivative of the original library
The ordinary General Public License therefore permits such linking only if the entire combination
fits its criteria of freedom.  The Lesser General Public License permits more lax criteria for linking
other code with the library.

We call this license the "Lesser" General Public License because it does Less to protect the user's
freedom than the ordinary General Public License.  It also provides other free software developers
Less of an advantage over competing non-free programs.  These disadvantages are the reason we use
the ordinary General Public License for many libraries.  However, the Lesser license provides
advantages in certain special circumstances.

For example, on rare occasions, there may be a special need to encourage the widest possible use of a
certain library, so that it becomes a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free library does the same job as widely
used non-free libraries.  In this case, there is little to gain by limiting the free library to free software
only, so we use the Lesser General Public License.

In other cases, permission to use a particular library in non-free programs enables a greater number
of people to use a large body of free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU operating system, as well as its
variant, the GNU/Linux operating system.

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure
that the user of a program that is linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

The precise terms and conditions for copying, distribution and modification follow.  Pay close
attention to the difference between a "work based on the library" and a "work that uses the library".
The former contains code derived from the library, whereas the latter must be combined with the library
in order to run.

                                 GNU LESSER GENERAL PUBLIC LICENSE
                TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License Agreement applies to any software library or other program which contains a notice
placed by the copyright holder or other authorized party saying it may be distributed under the terms
of this Lesser General Public License (also called "this License"). Each licensee is addressed as
you".

A "library" means a collection of software functions and/or data prepared so as to be conveniently
linked with application programs (which use some of those functions and data) to form executables.

The "Library", below, refers to any such software library or work which has been distributed under
these terms.  A "work based on the Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with
modifications and/or translated straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

"Source code" for a work means the preferred form of the work for making modifications to it.  For a
library, complete source code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to control compilation and installation of
the library.

Activities other than copying, distribution and modification are not covered by this License; they are
outside its scope.  The act of running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based on the Library (independent of
the use of the Library in a tool for writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

1. You may copy and distribute verbatim copies of the Library's complete source code as you receive
it, in any medium, provided that you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this
License and to the absence of any warranty; and distribute a copy of this License along with the
Library.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer
warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Library or any portion of it, thus forming a work
based on the Library, and copy and distribute such modifications or work under the terms of Sectio
1 above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If identifiable sections of that work are
not derived from the Library, and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those sections when you distribute them
as separate works.  But when you distribute the same sections as part of a whole which is a work
based on the Library, the distribution of the whole must be on the terms of this License, whose
permissions for other licensees extend to the entire whole, and thus to each and every part regardless
of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely
by you; rather, the intent is to exercise the right to control the distribution of derivative or collective
works based on the Library.

In addition, mere aggregation of another work not based on the Library with the Library (or with a
work based on the Library) on a volume of a storage or distribution medium does not bring the other
work under the scope of this License.

3. You may opt to apply the terms of the ordinary GNU General Public License instead of this
License to a given copy of the Library.  To do this, you must alter all the notices that refer to this
License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this
License.  (If a newer version than version 2 of the ordinary GNU General Public License has
appeared, then you can specify that version instead if you wish.)  Do not make any other change in
these notices.

Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU
General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not
a library.

4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in
object code or executable form under the terms of Sections 1 and 2 above provided that you
accompany it with the complete corresponding machine-readable source code, which must be
distributed under the terms of Sections 1 and 2 above on a medium customarily used for software
interchange.

If distribution of object code is made by offering access to copy from a designated place, then
offering equivalent access to copy the source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not compelled to copy the source along with
the object code.

5. A program that contains no derivative of any portion of the Library, but is designed to work with
the Library by being compiled or linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this
License.

However, linking a "work that uses the Library" with the Library creates an executable that is a
derivative of the Library (because it contains portions of the Library), rather than a "work that uses
the library".  The executable is therefore covered by this License. Section 6 states terms for
distribution of such executables.

When a "work that uses the Library" uses material from a header file that is part of the Library, the
object code for the work may be a derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be linked without the Library, or if the
work is itself a library.  The threshold for this to be true is not precisely defined by law.

If such an object file uses only numerical parameters, data structure layouts and accessors, and small
macros and small inline functions (ten lines or less in length), then the use of the object file is
unrestricted, regardless of whether it is legally a derivative work.  (Executables containing this
object code plus portions of the Library will still fall under Section 6.)

Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work
under the terms of Section 6. Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

6. As an exception to the Sections above, you may also combine or link a "work that uses the
Library" with the Library to produce a work containing portions of the Library, and distribute that
work under terms of your choice, provided that the terms permit modification of the work for the
customer's own use and reverse engineering for debugging such modifications.

You must give prominent notice with each copy of the work that the Library is used in it and that the
Library and its use are covered by this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the copyright notice for the Library
among them, as well as a reference directing the user to the copy of this License.  Also, you must do
one of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

For an executable, the required form of the "work that uses the Library" must include any data and
utility programs needed for reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is normally distributed (in either source
or binary form) with the major components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies the executable.

It may happen that this requirement contradicts the license restrictions of other proprietary libraries
that do not normally accompany the operating system.  Such a contradiction means you cannot use
both them and the Library together in an executable that you distribute.

7. You may place library facilities that are a work based on the Library side-by-side in a single
ibrary together with other library facilities not covered by this License, and distribute such a
combined library, provided that the separate distribution of the work based on the Library and of the
other library facilities is otherwise permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly
provided under this License.  Any attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under this License will not have
their licenses terminated so long as such parties remain in full compliance.

9. You are not required to accept this License, since you have not signed it.  However, nothing else
grants you permission to modify or distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by modifying or distributing the
Library (or any work based on the Library), you indicate your acceptance of this License to do so,
and all its terms and conditions for copying, distributing or modifying the Library or works based on
it.

10. Each time you redistribute the Library (or any work based on the Library), the recipient
automatically receives a license from the original licensor to copy, distribute, link with or modify the
Library subject to these terms and conditions.  You may not impose any further restrictions on the
recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by
third parties with this License.

11. If, as a consequence of a court judgment or allegation of patent infringement or for any other
reason (not limited to patent issues), conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this License, they do not excuse you from
the conditions of this License.  If you cannot distribute so as to satisfy simultaneously your
obligations under this License and any other pertinent obligations, then as a consequence you may
not distribute the Library at all.  For example, if a patent license would not permit royalty-free
redistribution of the Library by all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to refrain entirely from distribution
of the Library.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the
balance of the section is intended to apply, and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right
claims or to contest validity of any such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is implemented by public license practices.
Many people have made generous contributions to the wide range of software distributed through
that system in reliance on consistent application of that system; it is up to the author/donor to decide
if he or she is willing to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest o
 this License.

12. If the distribution and/or use of the Library is restricted in certain countries either by patents or
by copyrighted interfaces, the original copyright holder who places the Library under this License
may add an explicit geographical distribution limitation excluding those countries, so that
distribution is permitted only in or among countries not thus excluded.  In such case, this License
incorporates the limitation as if written in the body of this License.

13. The Free Software Foundation may publish revised and/or new versions of the Lesser General
Public License from time to time. Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library specifies a version number of
this License which applies to it and "any later version", you have the option of following the terms
and conditions either of that version or of any later version published by the Free Software
Foundation.  If the Library does not specify a license version number, you may choose any version
ever published by the Free Software Foundation.

14. If you wish to incorporate parts of the Library into other free programs whose distribution
conditions are incompatible with these, write to the author to ask for permission.  For software which
is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we
sometimes make exceptions for this.  Our decision will be guided by the two goals of preserving the
free status of all derivatives of our free software and of promoting the sharing and reuse of software
generally.

                         NO WARRANTY

15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS
WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO
YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

                         END OF TERMS AND CONDITIONS

                   How to Apply These Terms to Your New Libraries

If you develop a new library, and you want it to be of the greatest possible use to the public, we
recommend making it free software that everyone can redistribute and change.  You can do so
by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General
Public License).

To apply these terms, attach the following notices to the library.  It is safest to attach them to the
start of each source file to most effectively convey the exclusion of warranty; and each file should
have at least the "copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a
"copyright disclaimer" for the library, if necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!


Open Source Software Licensed Under the BSD 2-Clause License: 
The below software in this distribution may have been modified by THL A29 Limited (“Tencent
Modifications”). All Tencent Modifications are Copyright (C) 2016 THL A29 Limited.
----------------------------------------------------------------------------------------
1. bsdiff and bspatch  4.3
Copyright 2003-2005 Colin Percival
All rights reserved



Terms of the BSD 2-Clause License:
---------------------------------------------------
Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice, this list of conditions and
      the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
      the following disclaimer in the documentation and/or other materials provided with
      the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Open Source Software Licensed Under the BSD 3-Clause License: 
The below software in this distribution may have been modified by THL A29 Limited (“Tencent
Modifications”). All Tencent Modifications are Copyright (C) 2016 THL A29 Limited.
----------------------------------------------------------------------------------------
1. jbsdiff and jbspatch  0.1.1
Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com)
Based on a direct translation of bsdiff utility by Colin Percival and available at
http://www.daemonology.net/bsdiff/ under the same license.



Terms of the BSD 3-Clause License:
--------------------------------------------------------------------

Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this list of conditions and
      the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
      and the following disclaimer in the documentation and/or other materials provided with the
      distribution.

    * Neither the name of [copyright holder] nor the names of its contributors may be used to endorse
      or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NO
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



================================================
FILE: README.md
================================================
## Tinker
[![license](http://img.shields.io/badge/license-BSD3-brightgreen.svg?style=flat)](https://github.com/Tencent/tinker/blob/master/LICENSE)
[![Release Version](https://img.shields.io/badge/release-1.9.15.1-red.svg)](https://github.com/Tencent/tinker/releases)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/Tencent/tinker/pulls)
[![WeChat Approved](https://img.shields.io/badge/Wechat_Approved-1.9.15.1-red.svg)](https://github.com/Tencent/tinker/wiki)

[中文说明](https://github.com/Tencent/tinker/wiki)

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstalling apk.

![tinker.png](assets/tinker.png)

## Getting started
Add tinker-gradle-plugin as a dependency in your main `build.gradle` in the root of your project:

```gradle
buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.9.1')
    }
}
```

Then you need to "apply" the plugin and add dependencies by adding the following lines to your `app/build.gradle`.

```gradle
dependencies {
    //optional, help to generate the final application
    provided('com.tencent.tinker:tinker-android-anno:1.9.1')
    //tinker's main Android lib
    compile('com.tencent.tinker:tinker-android-lib:1.9.1')
}
...
...
apply plugin: 'com.tencent.tinker.patch'
```

If your app has a class that subclasses android.app.Application, then you need to modify that class, and move all its implements to [SampleApplicationLike](https://github.com/Tencent/tinker/blob/master/tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java) rather than Application:

```java
-public class YourApplication extends Application {
+public class SampleApplicationLike extends DefaultApplicationLike {
```

Now you should change your `Application` class, make it a subclass of [TinkerApplication](https://github.com/Tencent/tinker/blob/master/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java). As you can see from its API, it is an abstract class that does not have a default constructor, so you must define a no-arg constructor:

```java
public class SampleApplication extends TinkerApplication {
    public SampleApplication() {
      super(
        //tinkerFlags, which types is supported
        //dex only, library only, all support
        ShareConstants.TINKER_ENABLE_ALL,
        // This is passed as a string so the shell application does not
        // have a binary dependency on your ApplicationLifeCycle class.
        "tinker.sample.android.app.SampleApplicationLike");
    }
}
```

Use `tinker-android-anno` to generate your `Application` is recommended, you just need to add an annotation for your [SampleApplicationLike](https://github.com/Tencent/tinker/blob/master/tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java) class

```java
@DefaultLifeCycle(
application = "tinker.sample.android.app.SampleApplication",             //application name to generate
flags = ShareConstants.TINKER_ENABLE_ALL)                                //tinkerFlags above
public class SampleApplicationLike extends DefaultApplicationLike
```

How to install tinker? learn more at the sample [SampleApplicationLike](https://github.com/Tencent/tinker/blob/master/tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java).

For proguard, we have already made the proguard config automatic, and tinker will also generate the multiDex keep proguard file for you.

For more tinker configurations, learn more at the sample [app/build.gradle](https://github.com/Tencent/tinker/blob/master/tinker-sample-android/app/build.gradle).

## Ark Support
How to run tinker on the Ark?
### building patch
Just use the following command:
```buildconfig
bash build_patch_dexdiff.sh old=xxx new=xxx
```
* `old` indicates the absolute path of android apk(not compiled by Ark) with bugs
* `new` indicates the absolute path of android apk(not compiled by Ark) with fixing

The patch file is packaged in APK.
### compiling in Ark
TODO

At present it's compiled by Ark compiler team. The output patch is still packaged in APK format without signature.
### packaging the patch
For tinker-cli, add the following lines to your `tinker_config.xml`. Otherwise, the default configure will be used.
```xml
<issue id="arkHot">
   <path value="arkHot"/>         // path of patch
   <name value="patch.apk"/>      // name of patch
</issue>
```
For gradle, add the following lines to your `app/build.gradle`. Otherwise, the default configure will be used.
```gradle
ark {
   path = "arkHot"         // path of patch
   name = "patch.apk"      // name of patch
}
```
The patch is compiled by Ark and placed on the above path. all subsequent operations are same as tinker-cli or gradle.

The ultimated patch APK consists of two patch files:

* `classes.dex` for android
* `patch.apk` with so for Ark.

## Tinker Known Issues
There are some issues which Tinker can't dynamic update.

1. Can't update AndroidManifest.xml, such as add Android Component.
2. Do not support some Samsung models with os version android-21.
3. Due to Google Play Developer Distribution Agreement, we can't dynamic update our apk.

## Tinker Support
Any problem?

1. Learn more from [tinker-sample-android](https://github.com/Tencent/tinker/tree/master/tinker-sample-android).
2. Read the [source code](https://github.com/Tencent/tinker/tree/master).
3. Read the [wiki](https://github.com/Tencent/tinker/wiki) or [FAQ](https://github.com/Tencent/tinker/wiki/Tinker-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) for help.
4. Contact us for help.

## Contributing
For more information about contributing issues or pull requests, see our [Tinker Contributing Guide](https://github.com/Tencent/tinker/blob/master/CONTRIBUTING.md).

## License
Tinker is under the BSD license. See the [LICENSE](https://github.com/Tencent/tinker/blob/master/LICENSE) file for details.


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
        gradlePluginPortal()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.0'
        classpath "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:4.0.4"
    }
}

allprojects {
    repositories {
        mavenLocal()
        mavenCentral()
        gradlePluginPortal()
        google()
    }

    tasks.withType(Javadoc).all {
        enabled = false
        options.setEncoding('UTF-8')
    }
}

ext {
    minSdkVersion = 10
    compileSdkVersion = 29
    targetSdkVersion = 23
    buildToolsVersion = '28.0.3'
    androidXAnnotationVersion = '1.1.0'
    javaVersion = JavaVersion.VERSION_1_8

    GROUP = 'com.tencent.tinker'
    VERSION_NAME = '1.9.15.2'

    POM_DESCRIPTION = 'Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstalling apk.'
    POM_URL = 'https://github.com/Tencent/tinker'
    POM_SCM_URL = 'https://github.com/Tencent/tinker.git'

    POM_LICENCE_NAME = 'BSD License'
    POM_LICENCE_URL = 'https://opensource.org/licenses/BSD-3-Clause'
    POM_LICENCE_DIST = 'repo'

    POM_DEVELOPER_ID = 'Tencent Wechat'
    POM_DEVELOPER_NAME = 'Tencent Wechat, Inc.'
}

apply from: rootProject.file('gradle/check.gradle')


================================================
FILE: checkstyle.xml
================================================
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
    "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">

<!--
    Checkstyle configuration that checks the Google coding conventions from Google Java Style
    that can be found at https://google.github.io/styleguide/javaguide.html.
    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.sf.net (or in your downloaded distribution).
    To completely disable a check, just comment it out or delete it from the file.
    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
    References:
    'https://source.android.com/setup/contribute/code-style'
    'https://google.github.io/styleguide/javaguide.html'
    'https://github.com/checkstyle/checkstyle/tree/master/src/main/resources'
 -->

<module name="Checker">
    <module name="SuppressionFilter">
        <property name="file" default="suppressions.xml" value="${checkstyleSuppressionsPath}"/>
    </module>
    <property name="charset" value="UTF-8"/>
    <property name="severity" value="warning"/>
    <!--<property name="localeLanguage" value="en"/>-->
    <property name="fileExtensions" value="java"/>
    <!-- Checks for whitespace                               -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>
    <module name="NewlineAtEndOfFile">
        <property name="severity" value="info"/>
    </module>
    <module name="FileLength">
        <property name="severity" value="info"/>
        <property name="max" value="1500"/>
    </module>

    <module name="TreeWalker">
        <!-- 1. Source File Basic-->
        <module name="OuterTypeFilename"/>
        <module name="IllegalTokenText">
            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
            <property name="format"
                      value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
            <property name="message"
                      value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
        </module>
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowEscapesForControlCharacters" value="true"/>
            <property name="allowByTailComment" value="true"/>
            <property name="allowNonPrintableEscapes" value="true"/>
        </module>


        <!-- 2. Source File Structure -->
        <module name="AvoidStarImport">
            <property name="excludes"
                      value="java.io,java.net,java.lang.Math,org.junit,org.junit.Assert"/>
        </module>
        <module name="IllegalImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>
        <module name="OneTopLevelClass"/>
        <module name="OverloadMethodsDeclarationOrder">
            <property name="severity" value="ignore"/>
        </module>


        <!-- 3. Formatting -->
        <module name="LineLength">
            <property name="severity" value="ignore"/>
            <property name="max" value="200"/>
            <property name="ignorePattern"
                      value="^package.*|^import.*|a href|href|http://|https://|ftp://|^\{.*\}"/>
        </module>
        <module name="MethodLength">
            <property name="max" value="300"/>
        </module>
        <module name="ParameterNumber">
            <property name="severity" value="ignore"/>
        </module>
        <module name="NoLineWrap"/>
        <module name="EmptyBlock">
            <property name="option" value="TEXT"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
        </module>
        <module name="NeedBraces">
            <property name="allowSingleLineStatement" value="true"/>
        </module>
        <module name="LeftCurly"/>
        <module name="RightCurly">
            <property name="id" value="RightCurlySame"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO"/>
        </module>
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone"/>
            <property name="option" value="alone"/>
            <property name="tokens"
                      value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT"/>
        </module>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyLambdas" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
            <property name="allowEmptyTypes" value="true"/>
            <property name="allowEmptyLoops" value="true"/>
            <message key="ws.notFollowed"
                     value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
            <message key="ws.notPreceded"
                     value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="OneStatementPerLine">
            <property name="severity" value="info"/>
        </module>
        <module name="MultipleVariableDeclarations">
            <property name="severity" value="ignore"/>
        </module>
        <module name="ArrayTypeStyle"/>
        <module name="ModifierOrder">
            <property name="severity" value="ignore"/>
        </module>
        <module name="RedundantModifier">
            <property name="severity" value="ignore"/>
        </module>
        <module name="EmptyLineSeparator">
            <property name="severity" value="ignore"/>
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapDot"/>
            <property name="tokens" value="DOT"/>
            <property name="option" value="nl"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapComma"/>
            <property name="tokens" value="COMMA"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
            <property name="id" value="SeparatorWrapEllipsis"/>
            <property name="tokens" value="ELLIPSIS"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
            <property name="id" value="SeparatorWrapArrayDeclarator"/>
            <property name="tokens" value="ARRAY_DECLARATOR"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapMethodRef"/>
            <property name="tokens" value="METHOD_REF"/>
            <property name="option" value="nl"/>
        </module>
        <module name="GenericWhitespace">
            <message key="ws.followed"
                     value="GenericWhitespace ''{0}'' is followed by whitespace."/>
            <message key="ws.preceded"
                     value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
            <message key="ws.illegalFollow"
                     value="GenericWhitespace ''{0}'' should followed by whitespace."/>
            <message key="ws.notPreceded"
                     value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="Indentation">
            <property name="severity" value="ignore"/>
            <property name="basicOffset" value="4"/>
            <property name="lineWrappingIndentation" value="8"/>
        </module>
        <module name="AbbreviationAsWordInName">
            <property name="severity" value="ignore"/>
        </module>
        <module name="VariableDeclarationUsageDistance">
            <property name="severity" value="ignore"/>
            <property name="allowedDistance" value="4"/>
        </module>
        <module name="EmptyForIteratorPad"/>
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceBefore">
            <property name="tokens"
                      value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
            <property name="allowLineBreaks" value="true"/>
        </module>
        <module name="NoWhitespaceAfter"/>
        <module name="ParenPad"/>
        <module name="OperatorWrap">
            <property name="option" value="NL"/>
            <property name="tokens"
                      value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, QUESTION, SL, SR, STAR, METHOD_REF "/>
        </module>
        <module name="CommentsIndentation">
            <property name="severity" value="info"/>
        </module>
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationMostCases"/>
            <property name="tokens"
                      value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
        </module>
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationVariables"/>
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="allowSamelineMultipleAnnotations" value="true"/>
        </module>


        <!-- 4. Naming -->
        <module name="MethodName">
            <property name="severity" value="ignore"/>
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
                     value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern"
                     value="Package name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="TypeName">
            <property name="format" value="^[A-Z][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
                     value="Type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MemberName">
            <property name="severity" value="ignore"/>
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
            <property name="applyToPublic" value="true"/>
            <property name="applyToPackage" value="false"/>
            <property name="applyToPrivate" value="false"/>
            <property name="applyToProtected" value="false"/>
            <message key="name.invalidPattern"
                     value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MemberName">
            <property name="severity" value="ignore"/>
            <property name="format" value="^m[A-Z][a-zA-Z0-9]*$"/>
            <property name="applyToPublic" value="false"/>
            <property name="applyToProtected" value="true"/>
            <property name="applyToPackage" value="true"/>
            <property name="applyToPrivate" value="true"/>
            <message key="name.invalidPattern"
                     value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ParameterName">
            <property name="severity" value="ignore"/>
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="LambdaParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="CatchParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="LocalVariableName">
            <property name="severity" value="info"/>
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="format" value="^[a-z]([a-zA-Z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Class type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Method type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="InterfaceTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Interface type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ConstantName"/>
        <module name="LocalFinalVariableName"/>
        <module name="StaticVariableName"/>


        <!-- 5. Programming Practise -->
        <module name="NoFinalizer"/>
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected|ignored"/>
        </module>
        <module name="MissingSwitchDefault"/>
        <module name="FallThrough"/>
        <module name="UpperEll">
        </module>
        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <!--<module name="AvoidInlineConditionals"/>-->
        <module name="CovariantEquals"/>
        <module name="EmptyStatement"/>
        <!--<module name="EqualsAvoidNull"/>-->
        <module name="EqualsHashCode"/>
        <!--<module name="HiddenField"/>-->
        <module name="IllegalInstantiation"/>
        <!--<module name="InnerAssignment"/>-->
        <!--<module name="MagicNumber"/>-->
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <!--<module name="DesignForExtension"/>-->
        <!--<module name="FinalClass"/>-->
        <!--<module name="HideUtilityClassConstructor"/>-->
        <!--<module name="InterfaceIsType"/>-->
        <!--<module name="VisibilityModifier"/>-->
        <!-- Others -->
        <module name="StringLiteralEquality"/>
        <module name="NestedForDepth">
            <property name="max" value="2"/>
        </module>
        <module name="NestedIfDepth">
            <property name="max" value="3"/>
        </module>
        <module name="ReturnCount">
            <property name="severity" value="ignore"/>
            <property name="max" value="3"/>
        </module>
        <module name="NestedTryDepth ">
            <property name="max" value="3"/>
        </module>
        <module name="SuperClone"/>
        <module name="SuperFinalize"/>
        <module name="UncommentedMain">
            <property name="excludedClasses" value=".*[Application,Test]$"/>
        </module>

        <!-- 6. Javadoc -->
        <module name="NonEmptyAtclauseDescription">
            <property name="severity" value="ignore"/>
        </module>
        <module name="JavadocTagContinuationIndentation">
            <property name="severity" value="ignore"/>
        </module>
        <module name="SummaryJavadoc">
            <property name="severity" value="ignore"/>
            <property name="forbiddenSummaryFragments"
                      value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
        </module>
        <module name="JavadocParagraph">
            <property name="severity" value="ignore"/>
        </module>
        <module name="AtclauseOrder">
            <property name="severity" value="ignore"/>
            <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
            <property name="target"
                      value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
        </module>
        <module name="JavadocMethod">
            <property name="severity" value="ignore"/>
            <property name="scope" value="public"/>
            <property name="allowMissingParamTags" value="true"/>
            <property name="allowMissingThrowsTags" value="true"/>
            <property name="allowMissingReturnTag" value="true"/>
            <property name="minLineCount" value="2"/>
            <property name="allowedAnnotations" value="Override, Test"/>
            <property name="allowThrowsTagsForSubclasses" value="true"/>
        </module>
        <module name="SingleLineJavadoc">
            <property name="severity" value="ignore"/>
            <property name="ignoreInlineTags" value="false"/>
        </module>


        <!-- *. Others -->
        <module name="RegexpSinglelineJava">
            <property name="severity" value="ignore"/>
            <!-- . matches any character, so we need to
                 escape it and use \. to match dots. -->
            <property name="format" value="System\.(out)|(err)\.print(ln)?\("/>
            <property name="ignoreComments" value="true"/>
        </module>
        <module name="Regexp">
            <property name="format" value="System\.out\.println"/>
            <property name="illegalPattern" value="true"/>
        </module>
    </module>
</module>

================================================
FILE: findbugs-exclude.xml
================================================
<FindBugsFilter>

    <Match>
        <Class name="~.*R\$.*" />
    </Match>
    <Match>
        <Class name="~.*Manifest\$.*" />
    </Match>
</FindBugsFilter>

================================================
FILE: gradle/PublishArtifact.gradle
================================================
apply from: rootProject.file('gradle/WeChatPublish.gradle')

def checkAndGetOption(name) {
    if (!project.hasProperty(name)) {
        throw new GradleException("Please specify '$name' option in gradle project properties.")
    }
    return project[name]
}

wechatPublish {
    pom {
        name = checkAndGetOption('POM_NAME')
        description = checkAndGetOption('POM_DESCRIPTION')
        url = checkAndGetOption('POM_URL')

        scm {
            url = checkAndGetOption('POM_SCM_URL')
        }

        licenses {
            license {
                name = checkAndGetOption('POM_LICENCE_NAME')
                url = checkAndGetOption('POM_LICENCE_URL')
            }
        }

        developers {
            developer {
                id = checkAndGetOption('POM_DEVELOPER_ID')
                name = checkAndGetOption('POM_DEVELOPER_NAME')
            }
        }
    }
}

================================================
FILE: gradle/WeChatPublish.gradle
================================================

def extensionClass

// Detect supported plugin modules
if (plugins.hasPlugin('com.android.library')) {
    // Android library mode
    extensionClass = WeChatAndroidLibraryPublishExtension.class
} else if (plugins.hasPlugin('java')) {
    // Java library mode
    extensionClass = WeChatJavaLibraryPublishExtension.class
} else {
    // TODO: Support more languages
    throw new GradleException('This plugin must be applied after "java" or "com.android.library" plugin')
}

// Register wechatPublish extension
extensions.create('wechatPublish', extensionClass, project)
ext.artifactId = name

class WeChatPublishExtension {

    boolean isSnapshot = true
    private String versionSuffix = ''
    protected boolean printModules = false

    boolean withJavadoc = true
    boolean withSources = true
    boolean withNativeSymbols = true
    boolean withDependencies = true

    boolean publishToBintray = false /* Deprecated */

    boolean publishAllVariants = false
    Set<String> publishVariants = []

    boolean publishAllFlavors = true
    Set<String> publishFlavors = []
    String defaultFlavor

    private final Project project
    private boolean usedDefaultIsSnapshot = true

    private final ArrayList<Closure> mavenPublishClosures = []

    protected final ArrayList<Closure> pomClosures = []

    WeChatPublishExtension(Project proj) {
        project = proj
        fillDefaultConfiguration()
        proj.afterEvaluate { this.publish() }
    }

    protected final String uncapitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str
        }
        return "" + Character.toLowerCase(str.charAt(0)) + str.substring(1)
    }

    protected void publish() {
        // Load local gradle script
        applyLocalScript()

        // Verify configuration values
        verifyPublishConfiguration()

        // Emit Maven DSL
        // Apply plugins if not done already
        if (!project.plugins.hasPlugin('maven-publish')) {
            project.plugins.apply('maven-publish')
        }

        mountAdditionalLogic(project)

        emitPublicationDSL(project)

        if (project.hasProperty('signingKeyId') || project.hasProperty('signing.keyId')) {
            if (!project.plugins.hasPlugin('signing')) {
                project.plugins.apply('signing')
            }
            emitSigningConfig(project)
        }

        emitRepositoryDSL(project)
    }

    void bintrayPackage(Closure cl) {
         // if (cl != null)
         //     bintrayConfigureClosures << cl
    }

    void publishToMaven(Closure cl) {
        if (cl != null)
            mavenPublishClosures << cl
    }

    void pom(Closure cl) {
        if (cl != null)
            pomClosures << cl
    }

    void publishToBintray(Closure cl) {
         if (cl != null) {
             publishToBintray = true
             // bintrayConfigureClosures << cl
         }
    }

    String getFullVersion() {
        def ver = version + versionSuffix
        if (isSnapshot && !ver.endsWith('-SNAPSHOT'))
            ver += '-SNAPSHOT'
        return ver
    }

    protected void fillDefaultConfiguration() {
        isSnapshot = !project.rootProject.hasProperty('release')
        printModules = project.rootProject.hasProperty('printModules')
        if (project.rootProject.hasProperty('versionSuffix'))
            versionSuffix = project.rootProject.versionSuffix
    }

    private void applyLocalScript() {
        def localScriptFile
        if (project.rootProject.hasProperty('repoScript')) {
            // Repo script file specified using -PrepoScript=xxx argument, use that script.
            def repoScript = project.rootProject.property('repoScript')
            if (!repoScript.startsWith('/'))
                repoScript = "${System.getProperty('user.dir')}/${repoScript}"
            localScriptFile = new File(repoScript)
        } else {
            // No -PrepoScript=xxx argument, try 'local.gradle' in projectDir then rootProjectDir
            localScriptFile = project.file('local.gradle')
            if (!localScriptFile.file)
                localScriptFile = project.rootProject.file('local.gradle')
        }

        if (localScriptFile.file) {
            project.apply from: localScriptFile
        }
    }

    private void verifyPublishConfiguration() {
        // Warn default artifactId, groupId, version
        if (groupId.empty) {
            groupId = 'com.tencent.mm'
            System.err.println "groupId not specified, used default value: ${groupId}"
        }

        if (version == 'unspecified') {
            version = '0.1'
            System.err.println "version not specified, used default value: ${version}"
        }
        checkVersion()

        if (!usedDefaultIsSnapshot) {
            System.err.println 'isSnapshot should be avoided in build scripts.'
        }

        if (isSnapshot) {
            // Bintray does not allow SNAPSHOT publish
            publishToBintray = false
        }

        project.ext.fullVersion = fullVersion
    }

    private void checkVersion() {
        if (!(fullVersion ==~ /\d+\.\d+(?:\.\d+)?(?:\.\d+)?(?:\.\d+)?(?:-[\w-]+)?/)) {
            def message = "Invalid version: ${fullVersion}"
            if (!isSnapshot)
                throw new GradleException(message)
            System.err.println(message)
        }
    }

    final protected String getPublicationName() {
        String result = ""
        artifactId.split("[-_]").each { result += it.capitalize() }
        return uncapitalize(result)
    }

    protected void mountAdditionalLogic(project) {}

    protected void emitPublicationDSL(Project project) {}

    private void emitSigningConfig(Project project) {
        project.ext['signing.keyId'] = project.findProperty("signingKeyId")
        project.ext['signing.password'] = project.findProperty("signingPassword")
        project.ext['signing.secretKeyRingFile'] = project.findProperty("signingSecretKeyRingFile")
        project.signing {
            project.publishing.publications.all { publication ->
                sign publication
            }
        }
    }

    private void emitRepositoryDSL(Project project) {
        mavenPublishClosures.each { cl ->
            project.publishing.repositories {
                maven {
                    cl.delegate = delegate
                    cl()
                }
            }
        }

        if (publishToBintray) {
            System.err.println("[WeChatPublish] [W] 'publishToBintray' was deprecated and ignored now, consider migrate to MavenCentral instead.")
        }
    }

    String getArtifactId() {
        return project.artifactId
    }

    void setArtifactId(String id) {
        project.artifactId = id
    }

    String getGroupId() {
        return project.group
    }

    void setGroupId(String id) {
        project.group = id
    }

    String getVersion() {
        return project.version
    }

    void setVersion(String ver) {
        project.version = ver
    }

    void setIsSnapshot(boolean v) {
        isSnapshot = v
        usedDefaultIsSnapshot = false
    }
}

class WeChatJavaLibraryPublishExtension extends WeChatPublishExtension {

    WeChatJavaLibraryPublishExtension(Project project) {
        super(project)
    }

    @Override
    protected void mountAdditionalLogic(project) {
        // Print module description if needed
        if (printModules) {
            def anchorTask = project.tasks.findByName('compileJava')
            def printTask = project.task('printPublishArtifactInfo').doFirst {
                println "@@@WeChatPublish@@@ ${artifactId}: ${fullVersion}"
            }
            anchorTask.dependsOn printTask
        }
    }

    @Override
    protected void emitPublicationDSL(Project project) {

        def sourcesJarTask = project.task('sourcesJar', type: Jar) {
            classifier = 'sources'

            def srcDirs = []
            def sources = project.sourceSets.main
            ['java', 'groovy', 'scala', 'kotlin'].each {
                if (sources.hasProperty(it))
                    srcDirs << sources[it].srcDirs
            }

            from srcDirs
        }

        def javadocTask = (project.tasks.findByName('javadoc') as Javadoc).with {
            title = null
            options {
                memberLevel = JavadocMemberLevel.PUBLIC

                def doclavaJar = project.rootProject.file('gradle/doclava-1.0.6.jar')
                if (doclavaJar.exists()) {
                    doclet = 'com.google.doclava.Doclava'
                    docletpath = [doclavaJar]
                }
                //docletpath = project.configurations.doclava.files as List
            }
            it
        }
        def javadocJarTask = project.task('javadocJar', type: Jar) {
            dependsOn javadocTask
            classifier = 'javadoc'
            from javadocTask.destinationDir
        }
        // TODO: upload javadoc to documentation site

        project.publishing.publications {
            "${publicationName}" (MavenPublication) {
                from project.components.java

                groupId this.groupId
                artifactId this.artifactId
                version this.fullVersion

                // Emit sourcesJar task
                if (withSources) {
                    artifact sourcesJarTask
                }

                // Emit javadocJar task
                if (withJavadoc) {
                    artifact javadocJarTask
                }
            }
        }

        pomClosures.each { cl ->
            project.publishing.publications {
                "${publicationName}"(MavenPublication) {
                    pom cl
                }
            }
        }
    }
}

class WeChatAndroidLibraryPublishExtension extends WeChatPublishExtension {

    WeChatAndroidLibraryPublishExtension(Project project) {
        super(project)
    }

    @Override
    protected void mountAdditionalLogic(project) {
        // Print module description if needed
        if (printModules) {
            def anchorTask = project.tasks.findByName('preBuild')
            def printTask = project.task('printPublishArtifactInfo').doFirst {
                println "@@@WeChatPublish@@@ ${artifactId}: ${fullVersion}"
            }
            anchorTask.dependsOn printTask
        }
    }

    @Override
    protected void emitPublicationDSL(Project project) {
        HashSet<String> emittedFlavors = new HashSet<>()
        def android = project.android
        def hasReleaseVariant = false

        android.libraryVariants.all { variant ->
            def variantName = variant.name
            def cVariantName = variantName.capitalize()

            def flavorName = variant.flavorName
            def variantOnlyName = uncapitalize(variantName.substring(flavorName.length(), variantName.length()))
            def hasFlavor = variant.flavorName != null && !variant.flavorName.isEmpty()

            if (flavorName == defaultFlavor)
                flavorName = ''
            def cFlavorName = flavorName.capitalize()

            if (!publishAllFlavors && !flavorName.empty && !publishFlavors.contains(flavorName))
                return

            def generateSourcesTask = project.tasks.findByName("generate${cVariantName}Sources")

            def javadocTask = project.task("javadoc${cVariantName}", type: Javadoc) {
                group = 'documentation'
                title = null

                def classpathFiles = project.files(android.getBootClasspath().join(File.pathSeparator))
                classpathFiles += project.files(project.configurations.compile)
                doFirst { classpath += classpathFiles }

                source = variant.javaCompile.source
                options {
                    memberLevel = JavadocMemberLevel.PUBLIC

                    def doclavaJar = project.rootProject.file('gradle/doclava-1.0.6.jar')
                    if (doclavaJar.exists()) {
                        doclet = 'com.google.doclava.Doclava'
                        docletpath = [doclavaJar]
                    }
                    //docletpath = project.configurations.doclava.files as List
                }
                destinationDir = project.file("${project.buildDir}/docs/javadoc")
                exclude '**/BuildConfig.java'
                exclude '**/R.java'
                failOnError false

                dependsOn generateSourcesTask
            }

            def javadocJarTask = project.task("javadocJar${cVariantName}", type: Jar) {
                classifier = 'javadoc'
                from javadocTask.destinationDir
                dependsOn javadocTask
            }

            def sourcesJarTask = project.task("sourcesJar${cVariantName}", type: Jar) {
                classifier = 'sources'

                def srcDirs = []
                variant.sourceSets.each { sources ->
                    ['java', 'groovy', 'scala', 'kotlin'].each {
                        if (sources.hasProperty(it))
                            srcDirs << sources[it].srcDirs
                    }
                }

                from srcDirs
                dependsOn generateSourcesTask
            }

            def externalNativeBuildTask = project.tasks.findByName(
                    "externalNativeBuild${cVariantName}")
            Zip nativeSymbolZipTask = null
            if (externalNativeBuildTask != null) {
                nativeSymbolZipTask = project.task("nativeSymbolZip${cVariantName}", type: Zip) {
                    classifier = "${variantOnlyName}Symbols"
                    from externalNativeBuildTask.objFolder
                    include '*/*.so'
                    dependsOn externalNativeBuildTask
                }

                externalNativeBuildTask.doLast {
                    // If externalNativeBuild generates no shared library files,
                    // remove symbols artifact from the publication.
                    if (nativeSymbolZipTask.inputs.sourceFiles.empty) {
                        def publication = project.publishing.publications
                                .getByName("${publicationName}${cFlavorName}")
                        publication.artifacts.removeIf {
                            it.file == nativeSymbolZipTask.archivePath
                        }
                    }
                }
            }

            def bundleTask = project.tasks.findByName("bundle${cVariantName}Aar")
            if (bundleTask == null)
                bundleTask = project.tasks.findByName("bundle${cVariantName}")

            project.publishing.publications {
                "${publicationName}${cFlavorName}"(MavenPublication) {
                    if (variantOnlyName == 'release') {
                        hasReleaseVariant = true

                        artifact(source: bundleTask, classifier: null)

                        if (withSources) {
                            artifact(source: sourcesJarTask, classifier: 'sources')
                        }
                        if (withJavadoc) {
                            artifact(source: javadocJarTask, classifier: 'javadoc')
                        }
                        if (withNativeSymbols && nativeSymbolZipTask != null) {
                            artifact(source: nativeSymbolZipTask, classifier: 'symbols')
                        }
                    } else if (publishAllVariants || publishVariants.contains(variantOnlyName)) {
                        artifact(source: bundleTask, classifier: variantOnlyName)

                        if (withNativeSymbols && nativeSymbolZipTask != null) {
                            artifact(source: nativeSymbolZipTask, classifier: "${variantOnlyName}Symbols")
                        }
                    }

                    if (!emittedFlavors.contains(flavorName)) {
                        emittedFlavors << flavorName

                        groupId this.groupId
                        version this.fullVersion

                        if (hasFlavor) {
                            def currFlavor = variant.productFlavors.get(0)
                            def actualArtifactIdSuffix = ''
                            if (currFlavor.ext.has('artifactIdSuffix')) {
                                actualArtifactIdSuffix = currFlavor.ext.artifactIdSuffix
                                int firstNotBarPos = 0
                                while (firstNotBarPos < actualArtifactIdSuffix.length()
                                        && actualArtifactIdSuffix.charAt(firstNotBarPos) == '-') {
                                    ++firstNotBarPos
                                }
                                actualArtifactIdSuffix = actualArtifactIdSuffix.substring(firstNotBarPos)
                            } else {
                                actualArtifactIdSuffix = flavorName
                            }
                            artifactId actualArtifactIdSuffix.empty ?
                                    this.artifactId : "${this.artifactId}-${actualArtifactIdSuffix}"
                        } else {
                            artifactId this.artifactId
                        }

                        pom {
                            packaging 'aar'

                            withXml {
                                // Resolve dependencies
                                final depsNode = asNode().appendNode('dependencies')
                                final addDep = { Dependency dep, String scope ->
                                    if (dep.group == null || dep.version == null || dep.name == null
                                            || dep.name == "unspecified")
                                        return // ignore invalid dependencies

                                    // Determine actual artifactId for the dependency
                                    def artifactId = dep.name
                                    def version = dep.version
                                    if (dep instanceof ProjectDependency) {
                                        def p = (dep as ProjectDependency).dependencyProject
                                        if (p.hasProperty('artifactId'))
                                            artifactId = p.property('artifactId')
                                        if (p.hasProperty('fullVersion'))
                                            version = p.property('fullVersion')
                                    }

                                    def node = depsNode.appendNode('dependency')
                                    node.appendNode('groupId', dep.group)
                                    node.appendNode('artifactId', artifactId)
                                    node.appendNode('version', version)
                                    node.appendNode('scope', scope)

                                    if (!dep.transitive) {
                                        // If this dependency is transitive, we should force exclude all its dependencies them from the POM
                                        final exclusionNode = node.appendNode('exclusions').appendNode('exclusion')
                                        exclusionNode.appendNode('groupId', '*')
                                        exclusionNode.appendNode('artifactId', '*')
                                    } else if (!dep.properties.excludeRules.empty) {
                                        // Otherwise add specified exclude rules
                                        final exclusions = node.appendNode('exclusions')
                                        dep.properties.excludeRules.each { ExcludeRule rule ->
                                            def exclusionNode = exclusions.appendNode('exclusion')
                                            exclusionNode.appendNode('groupId', rule.group ?: '*')
                                            exclusionNode.appendNode('artifactId', rule.module ?: '*')
                                        }
                                    }
                                }

                                if (withDependencies) {
                                    def visitedDeps = [] as Set<Dependency>

                                    [
                                            'compile':            'compile',
                                            'api':                'compile',
                                            'implementation':     'compile',
                                            'runtimeOnly':        'runtime',
                                            'provided':           'runtime'
                                    ].each { conf, scope ->
                                        if (project.configurations.find {
                                            it.name.equals(conf)
                                        }) {
                                            project.configurations[conf].allDependencies.each {
                                                if (visitedDeps.contains(it)) {
                                                    return
                                                }
                                                addDep(it, scope)
                                                visitedDeps.add(it)
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            pomClosures.each { cl ->
                project.publishing.publications {
                    "${publicationName}${cFlavorName}"(MavenPublication) {
                        pom cl
                    }
                }
            }
        } // android.libraryVariants.all

        // Check whether "release" variant is published
        project.afterEvaluate {
            if (!hasReleaseVariant)
                throw new GradleException('Publishing Android library require "release" variant')
        }
    }
}


================================================
FILE: gradle/check.gradle
================================================
if (project == rootProject) {
    task('checkAll') {
        group 'verification'
        doFirst {
            logger.lifecycle 'Run checkAll task'
        }
        outputs.upToDateWhen { false }
    }
    task('checkIncremental') {
        group 'verification'
        doFirst {
            logger.lifecycle 'Run checkIncremental task'
        }
        outputs.upToDateWhen { false }
    }
    return
}


// ----------
// Changed Files
// ----------
def reportsDir = "${rootProject.buildDir}/reports/${project.name}"
def projectHeader = project.path.replaceAll(':', '/').substring(1)

logger.lifecycle "Analyze code of module '${project.path}':"
logger.lifecycle "Reading changed files..."

if (!project.ext.has('filesChanged')) {
    project.ext.filesChanged = []

    if ("jenkins" == System.env.BUILDER_MODEL) {
        logger.lifecycle 'Check MR changed files'
        def inputFile = 'changed_file_list.txt'
        if (project.hasProperty('changed_files')) { inputFile = project.properties['changed_files'] }
        def file = rootProject.file(inputFile)
        if (file.exists()) {
            file.eachLine {
                if (it.startsWith(projectHeader)) project.ext.filesChanged << it
            }
        }
    } else {
        logger.lifecycle 'Check git-diff changed files'
        String command = "git diff --name-only --diff-filter=ACMRTUXB ${projectHeader}"
        String changeInfo = command.execute(null, rootProject.rootDir).text.trim()
        if (changeInfo && !changeInfo.isEmpty()) {
            project.ext.filesChanged = changeInfo.split("\n").toList()
        }
    }
}

if (filesChanged.size() == 0) {
    logger.lifecycle "No files changed found, skip analyzing."
} else {
    logger.lifecycle "Files changed found:"
    filesChanged.each { project.logger.lifecycle it }
}


// ----------
// CheckStyle, :checkstyleAll, :checkstyleIncremental
// ----------
def checkStyleConfig = rootProject.file('checkstyle.xml')
if (checkStyleConfig.exists()) {
    if (!project.plugins.hasPlugin('checkstyle')) {
        apply plugin: 'checkstyle'
    }

    checkstyle {
        configFile checkStyleConfig
        configProperties.checkstyleSuppressionsPath = rootProject.file("suppressions.xml").absolutePath
        toolVersion '8.19'
        ignoreFailures true
        showViolations true
    }

    task('checkstyleAll', type: Checkstyle) {
        group 'verification'
        classpath = files()
        source 'src/main'

        include '**/*.java'
        exclude '**/gen/**'
        reports {
            html { enabled = false }
            xml {
                enabled = true
                destination file("$reportsDir/checkstyle.xml")
            }
        }
        outputs.upToDateWhen { false }
    }

    if (filesChanged.size > 0) {
        def task = task('checkstyleIncremental', type: Checkstyle) {
            group 'verification'
            classpath = files()
            source 'src'

            exclude '**/gen/**'
            exclude '**/test/**'
            exclude '**/*.gradle'
            exclude '**/proto/*.java'
            exclude '**/protobuf/*.java'
            exclude '**/com/google/**/*.java'

            for (String item: filesChanged) {
                if (item.contains('src/')) {
                    include "**/${item.substring(item.lastIndexOf('src/') + 'src/'.length())}"
                }
            }
            reports {
                html { enabled = false }
                xml {
                    enabled = true
                    destination file("$reportsDir/checkstyle.xml")
                }
            }
            outputs.upToDateWhen { false }
        }
    }

    project.afterEvaluate {
        tasks.findByName('checkstyleAll')?.with { rootProject.tasks.findByName('checkAll')?.finalizedBy(it) }
        tasks.findByName('checkstyleIncremental')?.with { rootProject.tasks.findByName('checkIncremental')?.finalizedBy(it) }
    }

} else {
    logger.lifecycle "Can not find CheckStyle config file, skip."
}

================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
 org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

android.useAndroidX=true


================================================
FILE: gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: pmd-ruleset.xml
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ruleset name="PMD.rul" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">

    <description>This ruleset was created from PMD.rul</description>

    <rule ref="rulesets/java/basic.xml">
        <exclude name="AvoidBranchingStatementAsLastInLoop"/>
    </rule>
    <rule ref="rulesets/java/braces.xml"/>
    <rule ref="rulesets/java/strings.xml">
        <!-- TODO: This warns about annotations, apparently fixed in a later version. -->
        <exclude name="AvoidDuplicateLiterals"/>
    </rule>
    <rule ref="rulesets/java/unusedcode.xml"/>

    <rule ref="rulesets/java/design.xml">
        <exclude name="ConfusingTernary"/>
        <exclude name="EmptyMethodInAbstractClassShouldBeAbstract"/>
        <exclude name="AvoidSynchronizedAtMethodLevel"/>

        <!-- This check breaks on double checked locking which is safe in Java 6/7 -->
        <exclude name="NonThreadSafeSingleton"/>
        <!-- This check breaks the builder pattern, I didn't find the solution-->
        <exclude name="AccessorClassGeneration"/>
        <!-- TODO: Fix these -->
        <exclude name="AvoidReassigningParameters"/>
        <exclude name="GodClass"/>

    </rule>

    <rule ref="rulesets/java/design.xml/AvoidDeeplyNestedIfStmts">
        <properties>
            <property name="problemDepth" value="5"/>
        </properties>
    </rule>

    <rule message="Commented blocks are ok" ref="rulesets/java/empty.xml/EmptyCatchBlock">
        <properties>
            <property name="allowCommentedBlocks" value="true"/>
        </properties>
    </rule>
</ruleset>

================================================
FILE: settings.gradle
================================================
include ':tinker-commons'
include ':tinker-android:tinker-android-loader'
include ':tinker-android:tinker-android-loader-no-op'
include ':tinker-android:tinker-android-lib'
include ':tinker-android:tinker-android-lib-no-op'
include ':tinker-android:tinker-android-anno'
include ':tinker-android:tinker-android-anno-support'
include ':tinker-build:tinker-patch-cli'
include ':tinker-build:tinker-patch-lib'
include ':tinker-build:tinker-patch-gradle-plugin'
include ':third-party:aosp-dexutils'
include ':third-party:bsdiff-util'
include ':third-party:tinker-ziputils'


================================================
FILE: suppressions.xml
================================================
<?xml version="1.0"?>

<!DOCTYPE suppressions PUBLIC
    "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
    "https://checkstyle.org/dtds/suppressions_1_2.dtd">

<suppressions>
    <!-- can't split long messages between lines -->
    <suppress checks="RegexpSingleline" files="google_checks\.xml" lines="42,83"/>

    <suppress checks="FileLength"
              files="TokenTypes.java|IndentationCheckTest.java"
              lines="1"/>

    <!-- illegal words are part of Javadoc -->
    <suppress checks="TodoComment" files=".*TodoCommentCheck\.java"/>

    <!-- 'Abstract' pattern is used to show it is checking for abstract class name -->
    <suppress checks="AbstractClassNameCheck"
              files="AbstractClassNameCheck.java"/>
    <!-- test should be named as their main class -->
    <suppress checks="AbstractClassNameCheck"
              files="AbstractCheckTest.java|AbstractClassNameCheckTest.java|
                     |AbstractTypeAwareCheckTest.java|AbstractJavadocCheckTest.java|
                     |AbstractViolationReporterTest.java|AbstractFileSetCheckTest.java"/>

    <!-- Tone down the checking for test code -->
    <suppress checks="ExecutableStatementCount|JavaNCSS|BooleanExpressionComplexity|
                      |NestedIfDepth|MethodLength"
              files="[\\/]XdocsPagesTest\.java"/>

    <suppress checks="JavadocPackage" files=".*[\\/]src[\\/](test|it)[\\/]"/>
    <!-- we do not need javadocs in all classes except for *Support classes -->
    <suppress checks="JavadocMethod" files=".*[\\/]src[\\/](test|it)[\\/].*(?&lt;!Support)\.java"/>
    <!-- till https://github.com/checkstyle/checkstyle/issues/6336 -->
    <suppress checks="JavadocMethod" files=".*AbstractIndentationTestSupport\.java"/>
    <suppress checks="JavadocMethod" files=".*AbstractModuleTestSupport\.java"/>
    <suppress checks="JavadocMethod" files=".*AbstractXpathTestSupport\.java"/>
    <suppress checks="JavadocMethod" files=".*AbstractModuleTestSupport\.java"/>
    <suppress checks="JavadocMethod" files=".*AbstractPathTestSupport\.java"/>
    <suppress checks="JavadocMethod" files=".*AbstractXmlTestSupport\.java"/>

    <!--The Check generates too many violations, fixing them will make code unmanageable.-->
    <suppress checks="MagicNumber" files="(ParseTreeTablePresentation|MainFrame)\.java"/>

    <!-- Methods that build fake AST are very long-->
    <suppress checks="MethodLength" files=".*(Generated)?Java(doc)?TokenTypesTest\.java"/>
    <suppress checks="ExecutableStatementCount"
              files=".*(Generated)?Java(doc)?TokenTypesTest\.java"/>
    <suppress checks="JavaNCSS" files=".*(Generated)?Java(doc)?TokenTypesTest\.java"/>
    <suppress checks="ExecutableStatementCount" files=".*IllegalInstantiationCheckTest\.java"/>
    <suppress checks="ExecutableStatementCount" files=".*Main\.java"/>

    <!-- till https://github.com/checkstyle/checkstyle/issues/4983 -->
    <suppress checks="MissingDeprecated" files=".*JavadocTokenTypes\.java"/>

    <!-- Till https://github.com/checkstyle/checkstyle/issues/1854 -->
    <suppress checks="TrailingComment"
              files="(InnerAssignmentCheck\.java|OperatorWrapCheck\.java|
                     |AbbreviationAsWordInNameCheckTest\.java)"/>

    <!-- Fixing these cases will decrease code readability -->
    <suppress checks="MultipleStringLiterals" files="JavadocStyleCheck\.java|XMLLogger\.java"/>

    <!-- There are a lot of setters/getters in the Check.
         A small number of methods is left for Check's logic -->
    <suppress checks="MethodCount" files="[\\/]JavadocMethodCheck.java$"/>
    <!-- Apart from a complex logic there is a lot of small methods for a better readability.  -->
    <suppress checks="MethodCount" files="[\\/]CommentsIndentationCheck.java$"/>
    <!--VisibilityModifierCheck has 7 options which require 7 additional methods (setters)-->
    <suppress checks="MethodCount" files="[\\/]VisibilityModifierCheck.java$"/>
    <!--RequireThisCheck has a hierarchy of nested classes which contains a lot of methods. -->
    <suppress checks="MethodCount" files="[\\/]RequireThisCheck.java$"/>

    <!-- we need that set of converters -->
    <suppress checks="ClassDataAbstractionCoupling" files="AutomaticBean\.java"/>
    <!-- they are aggregators of logic, usage a several of classes are ok -->
    <suppress checks="ClassDataAbstractionCoupling"
              files="(Checker|Main|CheckstyleAntTask|JavadocDetailNodeParser)\.java"/>
    <suppress checks="ClassDataAbstractionCoupling"
              files="(CheckerTest|AbstractModuleTestSupport|CheckstyleAntTaskTest|
                     |TranslationCheckTest|LocalizedMessageTest|AbstractFileSetCheckTest|
                     |AbstractCheckTest|AutomaticBeanTest)\.java"/>
    <suppress checks="ClassDataAbstractionCoupling" files="PropertyCacheFileTest\.java"/>
    <suppress checks="ClassDataAbstractionCoupling"
              files="XpathFileGeneratorAuditListenerTest\.java"/>
    <suppress checks="ClassFanOutComplexity" files="[\\/]Main\.java"/>
    <suppress checks="ClassFanOutComplexity" files="CheckstyleAntTask\.java"/>
    <suppress checks="ClassFanOutComplexity" files="CheckerTest\.java"/>
    <suppress checks="ClassFanOutComplexity" files="Checker\.java"/>
    <!-- a lot of GUI elements is OK -->
    <suppress checks="ClassDataAbstractionCoupling" files="(TreeTable|MainFrame)\.java"/>

    <!-- Should be fixed after moving
    https://github.com/sevntu-checkstyle/sevntu.checkstyle/blob/master/sevntu-checks/src/main/java/com/github/sevntu/checkstyle/checks/coding/ReturnCountExtendedCheck.java
    into the main repo, to allow skip guard sentences(or by topLinesToIgnoreCount) -->
    <suppress checks="ReturnCount" files="(ConfigurationLoader|LambdaHandler)\.java"/>

    <!-- HandlerFactory crosses allowed limit for executable statements -->
    <suppress checks="ExecutableStatementCount" files="HandlerFactory\.java"/>

    <suppress id="ImportControlTest" files="[\\/]powermock[\\/]" message=".* - org\.(powermock|mockito).*" />

    <!-- Tinker -->
    <suppress checks="OneStatementPerLine" files="Hex.java" lines="275,276,277,278"/>

    <suppress checks="NewlineAtEndOfFile" />

    <suppress checks="FallThrough" files="BuilderMutableMethodImplementation" />

    <suppress checks="FileLength" />

    <suppress checks="MethodLength" files="InstructionReader.java" />
</suppressions>

================================================
FILE: third-party/aosp-dexutils/.gitignore
================================================
/build


================================================
FILE: third-party/aosp-dexutils/NOTICE
================================================
   Original work Copyright (c) 2005-2008, The Android Open Source Project
   Modified work Copyright (C) 2016 THL A29 Limited, a Tencent company.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS



================================================
FILE: third-party/aosp-dexutils/build.gradle
================================================
apply plugin: 'java-library'

version rootProject.ext.VERSION_NAME
group rootProject.ext.GROUP

[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'

sourceCompatibility = rootProject.ext.javaVersion
targetCompatibility = rootProject.ext.javaVersion

task buildTinkerSdk(type: Copy, dependsOn: [build]) {
    group = "tinker"
    from('build/libs') {
        include '*.jar'
        exclude '*javadoc.jar'
        exclude '*-sources.jar'
    }
    into(rootProject.file("buildSdk/android"))
}

apply from: rootProject.file('gradle/PublishArtifact.gradle')

================================================
FILE: third-party/aosp-dexutils/gradle.properties
================================================
POM_ARTIFACT_ID=aosp-dexutils
POM_NAME=Dex Utils Lib From AOSP
POM_PACKAGING=jar

================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section.Item;
import com.tencent.tinker.android.dex.util.CompareUtils;
import com.tencent.tinker.android.dex.util.HashCodeHelper;

import static com.tencent.tinker.android.dex.EncodedValueReader.ENCODED_ANNOTATION;

/**
 * An annotation.
 */
public final class Annotation extends Item<Annotation> {
    public byte visibility;
    public EncodedValue encodedAnnotation;

    public Annotation(int off, byte visibility, EncodedValue encodedAnnotation) {
        super(off);
        this.visibility = visibility;
        this.encodedAnnotation = encodedAnnotation;
    }

    public EncodedValueReader getReader() {
        return new EncodedValueReader(encodedAnnotation, ENCODED_ANNOTATION);
    }

    public int getTypeIndex() {
        EncodedValueReader reader = getReader();
        reader.readAnnotation();
        return reader.getAnnotationType();
    }

    @Override public int compareTo(Annotation other) {
        int cmpRes = encodedAnnotation.compareTo(other.encodedAnnotation);
        if (cmpRes != 0) return cmpRes;
        return CompareUtils.uCompare(visibility, other.visibility);
    }

    @Override
    public int hashCode() {
        return HashCodeHelper.hash(visibility, encodedAnnotation);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Annotation)) {
            return false;
        }
        return this.compareTo((Annotation) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        return SizeOf.UBYTE + encodedAnnotation.byteCountInDex();
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section;
import com.tencent.tinker.android.dex.util.CompareUtils;

import java.util.Arrays;

/**
 * *** This file is NOT a part of AOSP. ***
 *
 * Structure of AnnotationSet element in Dex file.
 */
public class AnnotationSet extends Section.Item<AnnotationSet> {
    public int[] annotationOffsets;

    public AnnotationSet(int off, int[] annotationOffsets) {
        super(off);
        this.annotationOffsets = annotationOffsets;
    }

    @Override
    public int compareTo(AnnotationSet other) {
        int size = annotationOffsets.length;
        int oSize = other.annotationOffsets.length;

        if (size != oSize) {
            return CompareUtils.uCompare(size, oSize);
        }

        for (int i = 0; i < size; ++i) {
            if (annotationOffsets[i] != other.annotationOffsets[i]) {
                return CompareUtils.uCompare(annotationOffsets[i], other.annotationOffsets[i]);
            }
        }

        return 0;
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(annotationOffsets);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof AnnotationSet)) {
            return false;
        }
        return this.compareTo((AnnotationSet) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        return SizeOf.UINT * (1 + annotationOffsets.length);
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section;
import com.tencent.tinker.android.dex.util.CompareUtils;

import java.util.Arrays;

/**
 * *** This file is NOT a part of AOSP. ***
 *
 * Structure of AnnotationSetRefList element in Dex file.
 */
public class AnnotationSetRefList extends Section.Item<AnnotationSetRefList> {
    public int[] annotationSetRefItems;

    public AnnotationSetRefList(int off, int[] annotationSetRefItems) {
        super(off);
        this.annotationSetRefItems = annotationSetRefItems;
    }

    @Override
    public int compareTo(AnnotationSetRefList other) {
        int size = annotationSetRefItems.length;
        int oSize = other.annotationSetRefItems.length;

        if (size != oSize) {
            return CompareUtils.uCompare(size, oSize);
        }

        for (int i = 0; i < size; ++i) {
            if (annotationSetRefItems[i] != other.annotationSetRefItems[i]) {
                return CompareUtils.uCompare(annotationSetRefItems[i], other.annotationSetRefItems[i]);
            }
        }

        return 0;
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(annotationSetRefItems);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof AnnotationSetRefList)) {
            return false;
        }
        return this.compareTo((AnnotationSetRefList) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        return SizeOf.UINT * (1 + annotationSetRefItems.length);
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section;
import com.tencent.tinker.android.dex.util.CompareUtils;
import com.tencent.tinker.android.dex.util.HashCodeHelper;

/**
 * *** This file is NOT a part of AOSP. ***
 *
 * Structure of AnnotationsDirectory element in Dex file.
 */
public class AnnotationsDirectory extends Section.Item<AnnotationsDirectory> {
    public int classAnnotationsOffset;

    /**
     * fieldAnnotations[][2];
     * fieldAnnotations[i][0]: fieldIndex, fieldAnnotations[i][1]: annotation set Offset
     */
    public int[][] fieldAnnotations;

    /**
     * methodAnnotations[][2];
     * methodAnnotations[i][0]: methodIndex, methodAnnotations[i][1]: annotation set Offset
     */
    public int[][] methodAnnotations;

    /**
     * parameterAnnotations[][2];
     * parameterAnnotations[i][0]: methodIndex, parameterAnnotations[i][1]: annotation set reflist Offset
     */
    public int[][] parameterAnnotations;

    public AnnotationsDirectory(
            int off,
            int classAnnotationsOffset,
            int[][] fieldAnnotations, int[][] methodAnnotations, int[][] parameterAnnotations
    ) {
        super(off);
        this.classAnnotationsOffset = classAnnotationsOffset;
        this.fieldAnnotations = fieldAnnotations;
        this.methodAnnotations = methodAnnotations;
        this.parameterAnnotations = parameterAnnotations;
    }

    @Override
    public int compareTo(AnnotationsDirectory other) {
        if (classAnnotationsOffset != other.classAnnotationsOffset) {
            return CompareUtils.uCompare(classAnnotationsOffset, other.classAnnotationsOffset);
        }

        int fieldsSize = fieldAnnotations.length;
        int methodsSize = methodAnnotations.length;
        int parameterListSize = parameterAnnotations.length;
        int oFieldsSize = other.fieldAnnotations.length;
        int oMethodsSize = other.methodAnnotations.length;
        int oParameterListSize = other.parameterAnnotations.length;

        if (fieldsSize != oFieldsSize) {
            return CompareUtils.sCompare(fieldsSize, oFieldsSize);
        }

        if (methodsSize != oMethodsSize) {
            return CompareUtils.sCompare(methodsSize, oMethodsSize);
        }

        if (parameterListSize != oParameterListSize) {
            return CompareUtils.sCompare(parameterListSize, oParameterListSize);
        }

        for (int i = 0; i < fieldsSize; ++i) {
            int fieldIdx = fieldAnnotations[i][0];
            int annotationOffset = fieldAnnotations[i][1];
            int othFieldIdx = other.fieldAnnotations[i][0];
            int othAnnotationOffset = other.fieldAnnotations[i][1];

            if (fieldIdx != othFieldIdx) {
                return CompareUtils.uCompare(fieldIdx, othFieldIdx);
            }

            if (annotationOffset != othAnnotationOffset) {
                return CompareUtils.sCompare(annotationOffset, othAnnotationOffset);
            }
        }

        for (int i = 0; i < methodsSize; ++i) {
            int methodIdx = methodAnnotations[i][0];
            int annotationOffset = methodAnnotations[i][1];
            int othMethodIdx = other.methodAnnotations[i][0];
            int othAnnotationOffset = other.methodAnnotations[i][1];

            if (methodIdx != othMethodIdx) {
                return CompareUtils.uCompare(methodIdx, othMethodIdx);
            }

            if (annotationOffset != othAnnotationOffset) {
                return CompareUtils.sCompare(annotationOffset, othAnnotationOffset);
            }
        }

        for (int i = 0; i < parameterListSize; ++i) {
            int methodIdx = parameterAnnotations[i][0];
            int annotationOffset = parameterAnnotations[i][1];
            int othMethodIdx = other.parameterAnnotations[i][0];
            int othAnnotationOffset = other.parameterAnnotations[i][1];

            if (methodIdx != othMethodIdx) {
                return CompareUtils.uCompare(methodIdx, othMethodIdx);
            }

            if (annotationOffset != othAnnotationOffset) {
                return CompareUtils.sCompare(annotationOffset, othAnnotationOffset);
            }
        }

        return 0;
    }

    @Override
    public int hashCode() {
        return HashCodeHelper.hash(classAnnotationsOffset, fieldAnnotations, methodAnnotations,
                parameterAnnotations);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof AnnotationsDirectory)) {
            return false;
        }
        return this.compareTo((AnnotationsDirectory) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        return SizeOf.UINT * (4 + 2 * (fieldAnnotations.length + methodAnnotations.length + parameterAnnotations.length));
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/CallSiteId.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section.Item;
import com.tencent.tinker.android.dex.util.CompareUtils;

public class CallSiteId extends Item<CallSiteId> {
    public int offset;

    public CallSiteId(int off, int offset) {
        super(off);
        this.offset = offset;
    }

    public void writeTo(Dex.Section out) {
        out.writeInt(offset);
    }

    @Override
    public int byteCountInDex() {
        return SizeOf.UINT;
    }

    @Override
    public int compareTo(CallSiteId o) {
        return CompareUtils.uCompare(offset, o.offset);
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section.Item;
import com.tencent.tinker.android.dex.util.CompareUtils;
import com.tencent.tinker.android.dex.util.HashCodeHelper;

public final class ClassData extends Item<ClassData> {
    public Field[] staticFields;
    public Field[] instanceFields;
    public Method[] directMethods;
    public Method[] virtualMethods;

    public ClassData(int off, Field[] staticFields, Field[] instanceFields,
            Method[] directMethods, Method[] virtualMethods) {
        super(off);

        this.staticFields = staticFields;
        this.instanceFields = instanceFields;
        this.directMethods = directMethods;
        this.virtualMethods = virtualMethods;
    }

    @Override
    public int compareTo(ClassData other) {
        int res = CompareUtils.aArrCompare(staticFields, other.staticFields);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.aArrCompare(instanceFields, other.instanceFields);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.aArrCompare(directMethods, other.directMethods);
        if (res != 0) {
            return res;
        }
        return CompareUtils.aArrCompare(virtualMethods, other.virtualMethods);
    }

    @Override
    public int hashCode() {
        return HashCodeHelper.hash(staticFields, instanceFields, directMethods, virtualMethods);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof ClassData)) {
            return false;
        }
        return this.compareTo((ClassData) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        int res = Leb128.unsignedLeb128Size(staticFields.length);
        res += Leb128.unsignedLeb128Size(instanceFields.length);
        res += Leb128.unsignedLeb128Size(directMethods.length);
        res += Leb128.unsignedLeb128Size(virtualMethods.length);
        res += calcFieldsSize(staticFields);
        res += calcFieldsSize(instanceFields);
        res += calcMethodsSize(directMethods);
        res += calcMethodsSize(virtualMethods);
        return res;
    }

    private int calcFieldsSize(Field[] fields) {
        int res = 0;
        int prevFieldIndex = 0;
        for (Field field : fields) {
            int fieldIndexDelta = field.fieldIndex - prevFieldIndex;
            prevFieldIndex = field.fieldIndex;
            res += Leb128.unsignedLeb128Size(fieldIndexDelta) + Leb128.unsignedLeb128Size(field.accessFlags);
        }
        return res;
    }

    private int calcMethodsSize(Method[] methods) {
        int res = 0;
        int prevMethodIndex = 0;
        for (Method method : methods) {
            int methodIndexDelta = method.methodIndex - prevMethodIndex;
            prevMethodIndex = method.methodIndex;
            res += Leb128.unsignedLeb128Size(methodIndexDelta)
                 + Leb128.unsignedLeb128Size(method.accessFlags)
                 + Leb128.unsignedLeb128Size(method.codeOffset);
        }
        return res;
    }

    public static class Field implements Comparable<Field> {
        public int fieldIndex;
        public int accessFlags;

        public Field(int fieldIndex, int accessFlags) {
            this.fieldIndex = fieldIndex;
            this.accessFlags = accessFlags;
        }

        @Override
        public int compareTo(Field other) {
            int res = CompareUtils.uCompare(fieldIndex, other.fieldIndex);
            if (res != 0) {
                return res;
            }
            return CompareUtils.sCompare(accessFlags, other.accessFlags);
        }

        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof Field)) {
                return false;
            }
            return this.compareTo((Field) obj) == 0;
        }

        @Override
        public int hashCode() {
            return HashCodeHelper.hash(fieldIndex, accessFlags);
        }
    }

    public static class Method implements Comparable<Method> {
        public int methodIndex;
        public int accessFlags;
        public int codeOffset;

        public Method(int methodIndex, int accessFlags, int codeOffset) {
            this.methodIndex = methodIndex;
            this.accessFlags = accessFlags;
            this.codeOffset = codeOffset;
        }

        @Override
        public int compareTo(Method other) {
            int res = CompareUtils.uCompare(methodIndex, other.methodIndex);
            if (res != 0) {
                return res;
            }
            res = CompareUtils.sCompare(accessFlags, other.accessFlags);
            if (res != 0) {
                return res;
            }
            return CompareUtils.sCompare(codeOffset, other.codeOffset);
        }

        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof Method)) {
                return false;
            }
            return this.compareTo((Method) obj) == 0;
        }

        @Override
        public int hashCode() {
            return HashCodeHelper.hash(methodIndex, accessFlags, codeOffset);
        }
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.util.CompareUtils;
import com.tencent.tinker.android.dex.util.HashCodeHelper;

/**
 * A type definition.
 */
public final class ClassDef extends TableOfContents.Section.Item<ClassDef> {
    public static final int NO_INDEX = -1;
    public static final int NO_OFFSET = 0;

    public int typeIndex;
    public int accessFlags;
    public int supertypeIndex;
    public int interfacesOffset;
    public int sourceFileIndex;
    public int annotationsOffset;
    public int classDataOffset;
    public int staticValuesOffset;

    public ClassDef(int off, int typeIndex, int accessFlags,
            int supertypeIndex, int interfacesOffset, int sourceFileIndex,
            int annotationsOffset, int classDataOffset, int staticValuesOffset) {
        super(off);
        this.typeIndex = typeIndex;
        this.accessFlags = accessFlags;
        this.supertypeIndex = supertypeIndex;
        this.interfacesOffset = interfacesOffset;
        this.sourceFileIndex = sourceFileIndex;
        this.annotationsOffset = annotationsOffset;
        this.classDataOffset = classDataOffset;
        this.staticValuesOffset = staticValuesOffset;
    }

    @Override
    public int compareTo(ClassDef other) {
        int res = CompareUtils.uCompare(typeIndex, other.typeIndex);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(accessFlags, other.accessFlags);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.uCompare(supertypeIndex, other.supertypeIndex);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(interfacesOffset, other.interfacesOffset);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.uCompare(sourceFileIndex, other.sourceFileIndex);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(annotationsOffset, other.annotationsOffset);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(classDataOffset, other.classDataOffset);
        if (res != 0) {
            return res;
        }
        return CompareUtils.sCompare(staticValuesOffset, other.staticValuesOffset);
    }

    @Override
    public int hashCode() {
        return HashCodeHelper.hash(typeIndex, accessFlags, supertypeIndex, interfacesOffset,
                sourceFileIndex, annotationsOffset, classDataOffset, staticValuesOffset);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof ClassDef)) {
            return false;
        }
        return this.compareTo((ClassDef) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        return SizeOf.CLASS_DEF_ITEM;
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section.Item;
import com.tencent.tinker.android.dex.util.CompareUtils;
import com.tencent.tinker.android.dex.util.HashCodeHelper;

public final class Code extends Item<Code> {
    public int registersSize;
    public int insSize;
    public int outsSize;
    public int debugInfoOffset;
    public short[] instructions;
    public Try[] tries;
    public CatchHandler[] catchHandlers;

    public Code(int off, int registersSize, int insSize, int outsSize, int debugInfoOffset,
            short[] instructions, Try[] tries, CatchHandler[] catchHandlers) {
        super(off);
        this.registersSize = registersSize;
        this.insSize = insSize;
        this.outsSize = outsSize;
        this.debugInfoOffset = debugInfoOffset;
        this.instructions = instructions;
        this.tries = tries;
        this.catchHandlers = catchHandlers;
    }

    @Override
    public int compareTo(Code other) {
        int res = CompareUtils.sCompare(registersSize, other.registersSize);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(insSize, other.insSize);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(outsSize, other.outsSize);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.sCompare(debugInfoOffset, other.debugInfoOffset);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.uArrCompare(instructions, other.instructions);
        if (res != 0) {
            return res;
        }
        res = CompareUtils.aArrCompare(tries, other.tries);
        if (res != 0) {
            return res;
        }
        return CompareUtils.aArrCompare(catchHandlers, other.catchHandlers);
    }

    @Override
    public int hashCode() {
        return HashCodeHelper.hash(registersSize,
                insSize, outsSize, debugInfoOffset, instructions, tries, catchHandlers);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Code)) {
            return false;
        }
        return this.compareTo((Code) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        int insnsSize = instructions.length;
        int res = 4 * SizeOf.USHORT + 2 * SizeOf.UINT + insnsSize * SizeOf.USHORT;
        if (tries.length > 0) {
            if ((insnsSize & 1) == 1) {
                res += SizeOf.USHORT;
            }
            res += tries.length * SizeOf.TRY_ITEM;

            int catchHandlerSize = catchHandlers.length;
            res += Leb128.unsignedLeb128Size(catchHandlerSize);

            for (CatchHandler catchHandler : catchHandlers) {
                int typeIdxAddrPairCount = catchHandler.typeIndexes.length;
                if (catchHandler.catchAllAddress != -1) {
                    res += Leb128.signedLeb128Size(-typeIdxAddrPairCount)
                         + Leb128.unsignedLeb128Size(catchHandler.catchAllAddress);
                } else {
                    res += Leb128.signedLeb128Size(typeIdxAddrPairCount);
                }
                for (int i = 0; i < typeIdxAddrPairCount; ++i) {
                    res += Leb128.unsignedLeb128Size(catchHandler.typeIndexes[i])
                         + Leb128.unsignedLeb128Size(catchHandler.addresses[i]);
                }
            }
        }

        return res;
    }

    public static class Try implements Comparable<Try> {
        public int startAddress;
        public int instructionCount;
        public int catchHandlerIndex;

        public Try(int startAddress, int instructionCount, int catchHandlerIndex) {
            this.startAddress = startAddress;
            this.instructionCount = instructionCount;
            this.catchHandlerIndex = catchHandlerIndex;
        }

        @Override
        public int compareTo(Try other) {
            int res = CompareUtils.sCompare(startAddress, other.startAddress);
            if (res != 0) {
                return res;
            }
            res = CompareUtils.sCompare(instructionCount, other.instructionCount);
            if (res != 0) {
                return res;
            }
            return CompareUtils.sCompare(catchHandlerIndex, other.catchHandlerIndex);
        }
    }

    public static class CatchHandler implements Comparable<CatchHandler> {
        public int[] typeIndexes;
        public int[] addresses;
        public int catchAllAddress;
        public int offset;

        public CatchHandler(int[] typeIndexes, int[] addresses, int catchAllAddress, int offset) {
            this.typeIndexes = typeIndexes;
            this.addresses = addresses;
            this.catchAllAddress = catchAllAddress;
            this.offset = offset;
        }

        @Override
        public int compareTo(CatchHandler other) {
            int res = CompareUtils.sArrCompare(typeIndexes, other.typeIndexes);
            if (res != 0) {
                return res;
            }
            res = CompareUtils.sArrCompare(addresses, other.addresses);
            if (res != 0) {
                return res;
            }
            return CompareUtils.sCompare(catchAllAddress, other.catchAllAddress);
        }
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.TableOfContents.Section.Item;
import com.tencent.tinker.android.dex.util.CompareUtils;
import com.tencent.tinker.android.dex.util.HashCodeHelper;

/**
 * *** This file is NOT a part of AOSP. ***
 *
 * Structure of DebugInfoItem element in Dex file.
 */
public class DebugInfoItem extends Item<DebugInfoItem> {
    public static final byte DBG_END_SEQUENCE = 0x00;
    public static final byte DBG_ADVANCE_PC = 0x01;
    public static final byte DBG_ADVANCE_LINE = 0x02;
    public static final byte DBG_START_LOCAL = 0x03;
    public static final byte DBG_START_LOCAL_EXTENDED = 0x04;
    public static final byte DBG_END_LOCAL = 0x05;
    public static final byte DBG_RESTART_LOCAL = 0x06;
    public static final byte DBG_SET_PROLOGUE_END = 0x07;
    public static final byte DBG_SET_EPILOGUE_BEGIN = 0x08;
    public static final byte DBG_SET_FILE = 0x09;

    public int lineStart;
    public int[] parameterNames;

    public byte[] infoSTM;

    public DebugInfoItem(int off, int lineStart, int[] parameterNames, byte[] infoSTM) {
        super(off);
        this.lineStart = lineStart;
        this.parameterNames = parameterNames;
        this.infoSTM = infoSTM;
    }

    @Override
    public int compareTo(DebugInfoItem o) {
        int origLineStart = lineStart;
        int destLineStart = o.lineStart;
        if (origLineStart != destLineStart) {
            return origLineStart - destLineStart;
        }

        int cmpRes = CompareUtils.uArrCompare(parameterNames, o.parameterNames);
        if (cmpRes != 0) return cmpRes;

        cmpRes = CompareUtils.uArrCompare(infoSTM, o.infoSTM);
        return cmpRes;
    }

    @Override
    public int hashCode() {
        return HashCodeHelper.hash(lineStart, parameterNames, infoSTM);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof DebugInfoItem)) {
            return false;
        }
        return this.compareTo((DebugInfoItem) obj) == 0;
    }

    @Override
    public int byteCountInDex() {
        int byteCount = Leb128.unsignedLeb128Size(lineStart) + Leb128.unsignedLeb128Size(parameterNames.length);
        for (int pn : parameterNames) {
            byteCount += Leb128.unsignedLeb128p1Size(pn);
        }
        byteCount += infoSTM.length * SizeOf.UBYTE;
        return byteCount;
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java
================================================
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.tinker.android.dex;

import com.tencent.tinker.android.dex.io.DexDataBuffer;
import com.tencent.tinker.android.dex.util.FileUtils;
import com.tencent.tinker.android.dx.util.Hex;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.AbstractList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.RandomAccess;
import java.util.zip.Adler32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * The bytes of a dex file in memory for reading and writing. All int offsets
 * are unsigned.
 */
public final class Dex {
    // Provided as a convenience to avoid a memory allocation to benefit Dalvik.
    // Note: libcore.util.EmptyArray cannot be accessed when this code isn't run on Dalvik.
    static final short[] EMPTY_SHORT_ARRAY = new short[0];
    private static final int CHECKSUM_OFFSET = 8;
    private static final int SIGNATURE_OFFSET = CHECKSUM_OFFSET + SizeOf.CHECKSUM;

    public static final int ACC_PUBLIC = 0x1;
    public static final int ACC_PRIVATE = 0x2;
    public static final int ACC_PROTECTED = 0x4;
    public static final int ACC_STATIC = 0x8;
    public static final int ACC_FINAL = 0x10;
    public static final int ACC_SYNCHRONIZED = 0x20;
    public static final int ACC_VOLATILE = 0x40;
    public static final int ACC_BRIDGE = 0x40;
    public static final int ACC_TRANSIENT = 0x80;
    public static final int ACC_VARARGS = 0x80;
    public static final int ACC_NATIVE = 0x100;
    public static final int ACC_INTERFACE = 0x200;
    public static final int ACC_ABSTRACT = 0x400;
    public static final int ACC_STRICT = 0x800;
    public static final int ACC_SYNTHETIC = 0x1000;
    public static final int ACC_ANNOTATION = 0x2000;
    public static final int ACC_ENUM = 0x4000;
    public static final int ACC_CONSTRUCTOR = 0x10000;
    public static final int ACC_DECLARED_SYNCHRONIZED = 0x20000;

    private final TableOfContents tableOfContents = new TableOfContents();
    private final StringTable strings = new StringTable();
    private final TypeIndexToDescriptorIndexTable typeIds = new TypeIndexToDescriptorIndexTable();
    private final TypeIndexToDescriptorTable typeNames = new TypeIndexToDescriptorTable();
    private final ProtoIdTable protoIds = new ProtoIdTable();
    private final FieldIdTable fieldIds = new FieldIdTable();
    private final MethodIdTable methodIds = new MethodIdTable();
    private final CallSiteIdTable callsiteIds = new CallSiteIdTable();
    private final MethodHandleTable methodHandles = new MethodHandleTable();
    private final ClassDefTable classDefs = new ClassDefTable();
    private ByteBuffer data;
    private int nextSectionStart = 0;
    private byte[] signature = null;

    /**
     * Creates a new dex that reads from {@code data}. It is an error to modify
     * {@code data} after using it to create a dex buffer.
     */
    public Dex(byte[] data) throws IOException {
        this(ByteBuffer.wrap(data));
    }

    private Dex(ByteBuffer data) throws IOException {
        this.data = data;
        this.data.order(ByteOrder.LITTLE_ENDIAN);
        this.tableOfContents.readFrom(this);
    }

    /**
     * Creates a new empty dex of the specified size.
     */
    public Dex(int byteCount) {
        this.data = ByteBuffer.wrap(new byte[byteCount]);
        this.data.order(ByteOrder.LITTLE_ENDIAN);
        this.tableOfContents.fileSize = byteCount;
    }

    /**
     * Creates a new dex buffer of the dex in {@code in}, and closes {@code in}.
     */
    public Dex(InputStream in) throws IOException {
        loadFrom(in);
    }

    public Dex(InputStream in, int initSize) throws IOException {
        loadFrom(in, initSize);
    }

    /**
     * Creates a new dex buffer from the dex file {@code file}.
     */
    public Dex(File file) throws IOException {
        if (file == null) {
            throw new IllegalArgumentException("file is null.");
        }

        if (FileUtils.hasArchiveSuffix(file.getName())) {
            ZipFile zipFile = null;
            try {
                zipFile = new ZipFile(file);
                ZipEntry entry = zipFile.getEntry(DexFormat.DEX_IN_JAR_NAME);
                if (entry != null) {
                    InputStream inputStream = null;
                    try {
                        inputStream = zipFile.getInputStream(entry);
                        loadFrom(inputStream, (int) entry.getSize());
                    } finally {
                        if (inputStream != null) {
                            inputStream.close();
                        }
                    }
                } else {
                    throw new DexException("Expected " + DexFormat.DEX_IN_JAR_NAME + " in " + file);
                }
            } finally {
                if (zipFile != null) {
                    try {
                        zipFile.close();
                    } catch (Exception e) {
                        // ignored.
                    }
                }
            }
        } else if (file.getName().endsWith(".dex")) {
            InputStream in = null;
            try {
                in = new BufferedInputStream(new FileInputStream(file));
                loadFrom(in, (int) file.length());
            } catch (Exception e) {
                throw new DexException(e);
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (Exception e) {
                        // ignored.
                    }
                }
            }
        } else {
            throw new DexException("unknown output extension: " + file);
        }
    }

    private static void checkBounds(int index, int length) {
        if (index < 0 || index >= length) {
            throw new IndexOutOfBoundsException("index:" + index + ", length=" + length);
        }
    }

    private void loadFrom(InputStream in) throws IOException {
        loadFrom(in, 0);
    }

    private void loadFrom(InputStream in, int initSize) throws IOException {
        byte[] rawData = FileUtils.readStream(in, initSize);
        this.data = ByteBuffer.wrap(rawData);
        this.data.order(ByteOrder.LITTLE_ENDIAN);
        this.tableOfContents.readFrom(this);
    }

    public void writeTo(OutputStream out) throws IOException {
        byte[] rawData = data.array();
        out.write(rawData);
        out.flush();
    }

    public void writeTo(File dexOut) throws IOException {
        OutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream(dexOut));
            writeTo(out);
        } catch (Exception e) {
            throw new DexException(e);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    // ignored.
                }
            }
        }
    }

    public TableOfContents getTableOfContents() {
        return tableOfContents;
    }

    /**
     *  <b>IMPORTANT</b> To open a dex section by {@code TableOfContents.Section},
     *  please use {@code openSection(TableOfContents.Section tocSec)} instead of
     *  passing tocSec.off to this method.
     *
     *  <b>Because dex section returned by this method never checks
     *  tocSec's bound when reading or writing data.</b>
     */
    public Section openSection(int position) {
        if (position < 0 || position >= data.capacity()) {
            throw new IllegalArgumentException(
                    "position=" + position + " length=" + data.capacity()
            );
        }
        ByteBuffer sectionData = data.duplicate();
        sectionData.order(ByteOrder.LITTLE_ENDIAN); // necessary?
        sectionData.position(position);
        sectionData.limit(data.capacity());
        return new Section("temp-section", sectionData);
    }

    public Section openSection(TableOfContents.Section tocSec) {
        int position = tocSec.off;
        if (position < 0 || position >= data.capacity()) {
            throw new IllegalArgumentException(
                    "position=" + position + " length=" + data.capacity()
            );
        }
        ByteBuffer sectionData = data.duplicate();
        sectionData.order(ByteOrder.LITTLE_ENDIAN); // necessary?
        sectionData.position(position);
        sectionData.limit(position + tocSec.byteCount);
        return new Section("section", sectionData);
    }

    public Section appendSection(int maxByteCount, String name) {
        int limit = nextSectionStart + maxByteCount;
        ByteBuffer sectionData = data.duplicate();
        sectionData.order(ByteOrder.LITTLE_ENDIAN); // necessary?
        sectionData.position(nextSectionStart);
        sectionData.limit(limit);
        Section result = new Section(name, sectionData);
        nextSectionStart = limit;
        return result;
    }

    public int getLength() {
        return data.capacity();
    }

    public int getNextSectionStart() {
        return nextSectionStart;
    }

    /**
     * Returns a copy of the the bytes of this dex.
     */
    public byte[] getBytes() {
        ByteBuffer data = this.data.duplicate(); // positioned ByteBuffers aren't thread safe
        byte[] result = new byte[data.capacity()];
        data.position(0);
        data.get(result);
        return result;
    }

    public List<String> strings() {
        return strings;
    }

    public List<Integer> typeIds() {
        return typeIds;
    }

    public List<String> typeNames() {
        return typeNames;
    }

    public List<ProtoId> protoIds() {
        return protoIds;
    }

    public List<FieldId> fieldIds() {
        return fieldIds;
    }

    public List<MethodId> methodIds() {
        return methodIds;
    }

    public List<CallSiteId> callsiteIds() {
        return callsiteIds;
    }

    public List<MethodHandle> methodHandles() {
        return methodHandles;
    }

    public List<ClassDef> classDefs() {
        return classDefs;
    }

    public Iterable<ClassDef> classDefIterable() {
        return new ClassDefIterable();
    }

    public ClassData readClassData(ClassDef classDef) {
        int offset = classDef.classDataOffset;
        if (offset == 0) {
            throw new IllegalArgumentException("offset == 0");
        }
        return openSection(offset).readClassData();
    }

    public Code readCode(ClassData.Method method) {
        int offset = method.codeOffset;
        if (offset == 0) {
            throw new IllegalArgumentException("offset == 0");
        }
        return openSection(offset).readCode();
    }

    /**
     * Returns the signature of all but the first 32 bytes of this dex. The
     * first 32 bytes of dex files are not specified to be included in the
     * signature.
     */
    public byte[] computeSignature(boolean forceRecompute) {
        if (this.signature != null) {
            if (!forceRecompute) {
                return this.signature;
            }
        }
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("SHA-1");
        } catch (NoSuchAlgorithmException e) {
            throw new AssertionError();
        }
        byte[] buffer = new byte[8192];
        ByteBuffer data = this.data.duplicate(); // positioned ByteBuffers aren't thread safe
        data.limit(data.capacity());
        data.position(SIGNATURE_OFFSET + SizeOf.SIGNATURE);
        while (data.hasRemaining()) {
            int count = Math.min(buffer.length, data.remaining());
            data.get(buffer, 0, count);
            digest.update(buffer, 0, count);
        }
        return (this.signature = digest.digest());
    }

    private String bytesToHexString(byte[] bytes) {
        StringBuilder strBuilder = new StringBuilder(bytes.length << 1);
        for (byte b : bytes) {
            strBuilder.append(Hex.u1(b));
        }
        return strBuilder.toString();
    }

    /**
     * Returns the checksum of all but the first 12 bytes of {@code dex}.
     */
    public int computeChecksum() throws IOException {
        Adler32 adler32 = new Adler32();
        byte[] buffer = new byte[8192];
        ByteBuffer data = this.data.duplicate(); // positioned ByteBuffers aren't thread safe
        data.limit(data.capacity());
        data.position(CHECKSUM_OFFSET + SizeOf.CHECKSUM);
        while (data.hasRemaining()) {
            int count = Math.min(buffer.length, data.remaining());
            data.get(buffer, 0, count);
            adler32.update(buffer, 0, count);
        }
        return (int) adler32.getValue();
    }

    /**
     * Generates the signature and checksum of the dex file {@code out} and
     * writes them to the file.
     */
    public void writeHashes() throws IOException {
        openSection(SIGNATURE_OFFSET).write(computeSignature(true));
        openSection(CHECKSUM_OFFSET).writeInt(computeChecksum());
    }

    /**
     * Look up a field id name index from a field index. Cheaper than:
     * {@code fieldIds().get(fieldDexIndex).getNameIndex();}
     */
    public int nameIndexFromFieldIndex(int fieldIndex) {
        checkBounds(fieldIndex, tableOfContents.fieldIds.size);
        int position = tableOfContents.fieldIds.off + (SizeOf.MEMBER_ID_ITEM * fieldIndex);
        position += SizeOf.USHORT;  // declaringClassIndex
        position += SizeOf.USHORT;  // typeIndex
        return data.getInt(position);  // nameIndex
    }

    public int findStringIndex(String s) {
        return Collections.binarySearch(strings, s);
    }

    public int findTypeIndex(String descriptor) {
        return Collections.binarySearch(typeNames, descriptor);
    }

    public int findFieldIndex(FieldId fieldId) {
        return Collections.binarySearch(fieldIds, fieldId);
    }

    public int findMethodIndex(MethodId methodId) {
        return Collections.binarySearch(methodIds, methodId);
    }

    public int findClassDefIndexFromTypeIndex(int typeIndex) {
        checkBounds(typeIndex, tableOfContents.typeIds.size);
        if (!tableOfContents.classDefs.exists()) {
            return -1;
        }
        for (int i = 0; i < tableOfContents.classDefs.size; i++) {
            if (typeIndexFromClassDefIndex(i) == typeIndex) {
                return i;
            }
        }
        return -1;
    }

    /**
     * Look up a field id type index from a field index. Cheaper than:
     * {@code fieldIds().get(fieldDexIndex).getTypeIndex();}
     */
    public int typeIndexFromFieldIndex(int fieldIndex) {
        checkBounds(fieldIndex, tableOfContents.fieldIds.size);
        int position = tableOfContents.fieldIds.off + (SizeOf.MEMBER_ID_ITEM * fieldIndex);
        position += SizeOf.USHORT;  // declaringClassIndex
        return data.getShort(position) & 0xFFFF;  // typeIndex
    }

    /**
     * Look up a method id declaring class index from a method index. Cheaper than:
     * {@code methodIds().get(methodIndex).getDeclaringClassIndex();}
     */
    public int declaringClassIndexFromMethodIndex(int methodIndex) {
        checkBounds(methodIndex, tableOfContents.methodIds.size);
        int position = tableOfContents.methodIds.off + (SizeOf.MEMBER_ID_ITEM * methodIndex);
        return data.getShort(position) & 0xFFFF;  // declaringClassIndex
    }

    /**
     * Look up a method id name index from a method index. Cheaper than:
     * {@code methodIds().get(methodIndex).getNameIndex();}
     */
    public int nameIndexFromMethodIndex(int methodIndex) {
        checkBounds(methodIndex, tableOfContents.methodIds.size);
        int position = tableOfContents.methodIds.off + (SizeOf.MEMBER_ID_ITEM * methodIndex);
        position += SizeOf.USHORT;  // declaringClassIndex
        position += SizeOf.USHORT;  // protoIndex
        return data.getInt(position);  // nameIndex
    }

    /**
     * Look up a parameter type ids from a method index. Cheaper than:
     * {@code readTypeList(protoIds.get(methodIds().get(methodDexIndex).getProtoIndex()).getParametersOffset()).getTypes();}
     */
    public short[] parameterTypeIndicesFromMethodIndex(int methodIndex) {
        checkBounds(methodIndex, tableOfContents.methodIds.size);
        int position = tableOfContents.methodIds.off + (SizeOf.MEMBER_ID_ITEM * methodIndex);
        position += SizeOf.USHORT;  // declaringClassIndex
        int protoIndex = data.getShort(position) & 0xFFFF;
        checkBounds(protoIndex, tableOfContents.protoIds.size);
        position = tableOfContents.protoIds.off + (SizeOf.PROTO_ID_ITEM * protoIndex);
        position += SizeOf.UINT;  // shortyIndex
        position += SizeOf.UINT;  // returnTypeIndex
        int parametersOffset = data.getInt(position);
        if (parametersOffset == 0) {
            return EMPTY_SHORT_ARRAY;
        }
        position = parametersOffset;
        int size = data.getInt(position);
        if (size <= 0) {
            throw new AssertionError("Unexpected parameter type list size: " + size);
        }
        position += SizeOf.UINT;
        short[] types = new short[size];
        for (int i = 0; i < size; i++) {
            types[i] = data.getShort(position);
            position += SizeOf.USHORT;
        }
        return types;
    }

    /**
     * Look up a parameter type ids from a methodId. Cheaper than:
     * {@code readTypeList(protoIds.get(methodIds().get(methodDexIndex).getProtoIndex()).getParametersOffset()).getTypes();}
     */
    public short[] parameterTypeIndicesFromMethodId(MethodId methodId) {
        int protoIndex = methodId.protoIndex & 0xFFFF;
        checkBounds(protoIndex, tableOfContents.protoIds.size);
        int position = tableOfContents.protoIds.off + (SizeOf.PROTO_ID_ITEM * protoIndex);
        position += SizeOf.UINT;  // shortyIndex
        position += SizeOf.UINT;  // returnTypeIndex
        int parametersOffset = data.getInt(position);
        if (parametersOffset == 0) {
            return EMPTY_SHORT_ARRAY;
        }
        position = parametersOffset;
        int size = data.getInt(position);
        if (size <= 0) {
            throw new AssertionError("Unexpected parameter type list size: " + size);
        }
        position += SizeOf.UINT;
        short[] types = new short[size];
        for (int i = 0; i < size; i++) {
            types[i] = data.getShort(position);
            position += SizeOf.USHORT;
        }
        return types;
    }

    /**
     * Look up a method id return type index from a method index. Cheaper than:
     * {@code protoIds().get(methodIds().get(methodDexIndex).getProtoIndex()).getReturnTypeIndex();}
     */
    public int returnTypeIndexFromMethodIndex(int methodIndex) {
        checkBounds(methodIndex, tableOfContents.methodIds.size);
        int position = tableOfContents.methodIds.off + (SizeOf.MEMBER_ID_ITEM * methodIndex);
        position += SizeOf.USHORT;  // declaringClassIndex
        int protoIndex = data.getShort(position) & 0xFFFF;
        checkBounds(protoIndex, tableOfContents.protoIds.size);
        position = tableOfContents.protoIds.off + (SizeOf.PROTO_ID_ITEM * protoIndex);
        position += SizeOf.UINT;  // shortyIndex
        return data.getInt(position);  // returnTypeIndex
    }

    /**
     * Look up a descriptor index from a type index. Cheaper than:
     * {@code openSection(tableOfContents.typeIds.off + (index * SizeOf.TYPE_ID_ITEM)).readInt();}
     */
    public int descriptorIndexFromTypeIndex(int typeIndex) {
       checkBounds(typeIndex, tableOfContents.typeIds.size);
       int position = tableOfContents.typeIds.off + (SizeOf.TYPE_ID_ITEM * typeIndex);
       return data.getInt(position);
    }

    /**
     * Look up a type index index from a class def index.
     */
    public int typeIndexFromClassDefIndex(int classDefIndex) {
        checkBounds(classDefIndex, tableOfContents.classDefs.size);
        int position = tableOfContents.classDefs.off + (SizeOf.CLASS_DEF_ITEM * classDefIndex);
        return data.getInt(position);
    }

    /**
     * Look up an annotation directory offset from a class def index.
     */
    public int annotationDirectoryOffsetFromClassDefIndex(int classDefIndex) {
        checkBounds(classDefIndex, tableOfContents.classDefs.size);
        int position = tableOfContents.classDefs.off + (SizeOf.CLASS_DEF_ITEM * classDefIndex);
        position += SizeOf.UINT;  // type
        position += SizeOf.UINT;  // accessFlags
        position += SizeOf.UINT;  // superType
        position += SizeOf.UINT;  // interfacesOffset
        position += SizeOf.UINT;  // sourceFileIndex
        return data.getInt(position);
    }

    /**
     * Look up interface types indices from a  return type index from a method index. Cheaper than:
     * {@code ...getClassDef(classDefIndex).getInterfaces();}
     */
    public short[] interfaceTypeIndicesFromClassDefIndex(int classDefIndex) {
        checkBounds(classDefIndex, tableOfContents.classDefs.size);
        int position = tableOfContents.classDefs.off + (SizeOf.CLASS_DEF_ITEM * classDefIndex);
        position += SizeOf.UINT;  // type
        position += SizeOf.UINT;  // accessFlags
        position += SizeOf.UINT;  // superType
        int interfacesOffset = data.getInt(position);
        if (interfacesOffset == 0) {
            return EMPTY_SHORT_ARRAY;
        }
        position = interfacesOffset;
        int size = data.getInt(position);
        if (size <= 0) {
            throw new AssertionError("Unexpected interfaces list size: " + size);
        }
        position += SizeOf.UINT;
        short[] types = new short[size];
        for (int i = 0; i < size; i++) {
            types[i] = data.getShort(position);
            position += SizeOf.USHORT;
        }
        return types;
    }

    public short[] interfaceTypeIndicesFromClassDef(ClassDef classDef) {
        int interfacesOffset = classDef.interfacesOffset;
        if (interfacesOffset == 0) {
            return EMPTY_SHORT_ARRAY;
        }
        int position = interfacesOffset;
        int size = data.getInt(position);
        if (size <= 0) {
            throw new AssertionError("Unexpected interfaces list size: " + size);
        }
        position += SizeOf.UINT;
        short[] types = new short[size];
        for (int i = 0; i < size; i++) {
            types[i] = data.getShort(position);
            position += SizeOf.USHORT;
        }
        return types;
    }

    public final class Section extends DexDataBuffer {
        private final String name;

        private Section(String name, ByteBuffer data) {
            super(data);
            this.name = name;
        }

        /**
         * @inheritDoc
         */
        @Override
        public StringData readStringData() {
            ensureFourBytesAligned(tableOfContents.stringDatas, false);
            return super.readStringData();
        }

        /**
         * @inheritDoc
         */
        @Override
        public TypeList readTypeList() {
            ensureFourBytesAligned(tableOfContents.typeLists, false);
            return super.readTypeList();
        }

        /**
         * @inheritDoc
         */
        @Override
        public FieldId readFieldId() {
            ensureFourBytesAligned(tableOfContents.fieldIds, false);
            return super.readFieldId();
        }

        /**
         * @inheritDoc
         */
        @Override
        public MethodId readMethodId() {
            ensureFourBytesAligned(tableOfContents.methodIds, false);
            return super.readMethodId();
        }

        /**
         * @inheritDoc
         */
        @Override
        public ProtoId readProtoId() {
            ensureFourBytesAligned(tableOfContents.protoIds, false);
            return super.readProtoId();
        }

        /**
         * @inheritDoc
         */
        @Override
        public ClassDef readClassDef() {
            ensureFourBytesAligned(tableOfContents.classDefs, false);
            return super.readClassDef();
        }

        /**
         * @inheritDoc
         */
        @Override
        public Code readCode() {
            ensureFourBytesAligned(tableOfContents.codes, false);
            return super.readCode();
        }

        /**
         * @inheritDoc
         */
        @Override
        public DebugInfoItem readDebugInfoItem() {
            ensureFourBytesAligned(tableOfContents.debugInfos, false);
            return super.readDebugInfoItem();
        }

        /**
         * @inheritDoc
         */
        @Override
        public ClassData readClassData() {
            ensureFourBytesAligned(tableOfContents.classDatas, false);
            return super.readClassData();
        }

        /**
         * @inheritDoc
         */
        @Override
        public Annotation readAnnotation() {
            ensureFourBytesAligned(tableOfContents.annotations, false);
            return super.readAnnotation();
        }

        /**
         * @inheritDoc
         */
        @Override
        public AnnotationSet readAnnotationSet() {
            ensureFourBytesAligned(tableOfContents.annotationSets, false);
            return super.readAnnotationSet();
        }

        /**
         * @inheritDoc
         */
        @Override
        public AnnotationSetRefList readAnnotationSetRefList() {
            ensureFourBytesAligned(tableOfContents.annotationSetRefLists, false);
            return super.readAnnotationSetRefList();
        }

        /**
         * @inheritDoc
         */
        @Override
        public AnnotationsDirectory readAnnotationsDirectory() {
            ensureFourBytesAligned(tableOfContents.annotationsDirectories, false);
            return super.readAnnotationsDirectory();
        }

        /**
         * @inheritDoc
         */
        @Override
        public EncodedValue readEncodedArray() {
            ensureFourBytesAligned(tableOfContents.encodedArrays, false);
            return super.readEncodedArray();
        }

        private void ensureFourBytesAligned(TableOfContents.Section tocSec, boolean isFillWithZero) {
            if (tocSec.isElementFourByteAligned) {
                if (isFillWithZero) {
                    alignToFourBytesWithZeroFill();
                } else {
                    alignToFourBytes();
                }
            }
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeStringData(StringData stringData) {
            ensureFourBytesAligned(tableOfContents.stringDatas, true);
            return super.writeStringData(stringData);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeTypeList(TypeList typeList) {
            ensureFourBytesAligned(tableOfContents.typeLists, true);
            return super.writeTypeList(typeList);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeFieldId(FieldId fieldId) {
            ensureFourBytesAligned(tableOfContents.fieldIds, true);
            return super.writeFieldId(fieldId);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeMethodId(MethodId methodId) {
            ensureFourBytesAligned(tableOfContents.methodIds, true);
            return super.writeMethodId(methodId);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeProtoId(ProtoId protoId) {
            ensureFourBytesAligned(tableOfContents.protoIds, true);
            return super.writeProtoId(protoId);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeClassDef(ClassDef classDef) {
            ensureFourBytesAligned(tableOfContents.classDefs, true);
            return super.writeClassDef(classDef);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeCode(Code code) {
            ensureFourBytesAligned(tableOfContents.codes, true);
            return super.writeCode(code);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeDebugInfoItem(DebugInfoItem debugInfoItem) {
            ensureFourBytesAligned(tableOfContents.debugInfos, true);
            return super.writeDebugInfoItem(debugInfoItem);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeClassData(ClassData classData) {
            ensureFourBytesAligned(tableOfContents.classDatas, true);
            return super.writeClassData(classData);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeAnnotation(Annotation annotation) {
            ensureFourBytesAligned(tableOfContents.annotations, true);
            return super.writeAnnotation(annotation);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeAnnotationSet(AnnotationSet annotationSet) {
            ensureFourBytesAligned(tableOfContents.annotationSets, true);
            return super.writeAnnotationSet(annotationSet);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeAnnotationSetRefList(AnnotationSetRefList annotationSetRefList) {
            ensureFourBytesAligned(tableOfContents.annotationSetRefLists, true);
            return super.writeAnnotationSetRefList(annotationSetRefList);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeAnnotationsDirectory(AnnotationsDirectory annotationsDirectory) {
            ensureFourBytesAligned(tableOfContents.annotationsDirectories, true);
            return super.writeAnnotationsDirectory(annotationsDirectory);
        }

        /**
         * @inheritDoc
         */
        @Override
        public int writeEncodedArray(EncodedValue encodedValue) {
            ensureFourBytesAligned(tableOfContents.encodedArrays, true);
            return super.writeEncodedArray(encodedValue);
        }
    }

    private final class StringTable extends AbstractList<String> implements RandomAccess {
        @Override public String get(int index) {
            checkBounds(index, tableOfContents.stringIds.size);
            int stringOff = openSection(tableOfContents.stringIds.off + (index * SizeOf.STRING_ID_ITEM)).readInt();
            return openSection(stringOff).readStringData().value;
        }
        @Override public int size() {
            return tableOfContents.stringIds.size;
        }
    }

    private final class TypeIndexToDescriptorIndexTable extends AbstractList<Integer>
            implements RandomAccess {
        @Override public Integer get(int index) {
            return descriptorIndexFromTypeIndex(index);
        }
        @Override public int size() {
            return tableOfContents.typeIds.size;
        }
    }

    private final class TypeIndexToDescriptorTable extends AbstractList<String>
            implements RandomAccess {
        @Override public String get(int index) {
            return strings.get(descriptorIndexFromTypeIndex(index));
        }
        @Override public int size() {
            return tableOfContents.typeIds.size;
        }
    }

    private final class ProtoIdTable extends AbstractList<ProtoId> implements RandomAccess {
        @Override public ProtoId get(int index) {
            checkBounds(index, tableOfContents.protoIds.size);
            return openSection(tableOfContents.protoIds.off + (SizeOf.PROTO_ID_ITEM * index))
                    .readProtoId();
        }
        @Override public int size() {
            return tableOfContents.protoIds.size;
        }
    }

    private final class FieldIdTable extends AbstractList<FieldId> implements RandomAccess {
        @Override public FieldId get(int index) {
            checkBounds(index, tableOfContents.fieldIds.size);
            return openSection(tableOfContents.fieldIds.off + (SizeOf.MEMBER_ID_ITEM * index))
                    .readFieldId();
        }
        @Override public int size() {
            return tableOfContents.fieldIds.size;
        }
    }

    private final class MethodIdTable extends AbstractList<MethodId> implements RandomAccess {
        @Override public MethodId get(int index) {
            checkBounds(index, tableOfContents.methodIds.size);
            return openSection(tableOfContents.methodIds.off + (SizeOf.MEMBER_ID_ITEM * index))
                    .readMethodId();
        }
        @Override public int size() {
            return tableOfContents.methodIds.size;
        }
    }

    private final class CallSiteIdTable extends AbstractList<CallSiteId> implements RandomAccess {
        @Override
        public CallSiteId get(int index) {
            checkBounds(index, tableOfContents.callSiteIds.size);
            return openSection(tableOfContents.callSiteIds.off + (SizeOf.CALLSITE_ID_ITEM * index))
                    .readCallSiteId();
        }

        @Override
        public int size() {
            return tableOfContents.callSiteIds.size;
        }
    }

    private final class MethodHandleTable extends AbstractList<MethodHandle> implements RandomAccess {
        @Override
        public MethodHandle get(int index) {
            checkBounds(index, tableOfContents.methodHandles.size);
            return openSection(tableOfContents.methodHandles.off + (SizeOf.METHOD_HANDLE_ITEM * index))
                    .readMethodHandle();
        }

        @Override
        public int size() {
            return tableOfContents.methodHandles.size;
        }
    }

    private final class ClassDefTable extends AbstractList<ClassDef> implements RandomAccess {
        @Override
        public ClassDef get(int index) {
            checkBounds(index, tableOfContents.classDefs.size);
            return openSection(tableOfContents.classDefs.off + (SizeOf.CLASS_DEF_ITEM * index))
                    .readClassDef();
        }

        @Override
        public int size() {
            return tableOfContents.classDefs.size;
        }
    }

    private final class ClassDefIterator implements Iterator<ClassDef> {
        private final Section in = openSection(tableOfContents.classDefs);
        private int count = 0;

        @Override
        public boolean hasNext() {
            return count < tableOfContents.classDefs.size;
        }
        @Override
        public ClassDef next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            count++;
            return in.readClassDef();
        }
        @Override
            public void remove() {
            throw new UnsupportedOperationException();
        }
    }

    private final class ClassDefIterable implements Iterable<ClassDef> {
        public Iterator<ClassDef> iterator() {
            return !tableOfContents.classDefs.exists()
               ? Collections.<ClassDef>emptySet().iterator()
               : new ClassDefIterator();
        }
    }
}


================================================
FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java
===========================
Download .txt
gitextract_2owebcte/

├── .github/
│   └── ISSUE_TEMPLATE.md
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── build.gradle
├── checkstyle.xml
├── findbugs-exclude.xml
├── gradle/
│   ├── PublishArtifact.gradle
│   ├── WeChatPublish.gradle
│   ├── check.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── pmd-ruleset.xml
├── settings.gradle
├── suppressions.xml
├── third-party/
│   ├── aosp-dexutils/
│   │   ├── .gitignore
│   │   ├── NOTICE
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── android/
│   │                               ├── dex/
│   │                               │   ├── Annotation.java
│   │                               │   ├── AnnotationSet.java
│   │                               │   ├── AnnotationSetRefList.java
│   │                               │   ├── AnnotationsDirectory.java
│   │                               │   ├── CallSiteId.java
│   │                               │   ├── ClassData.java
│   │                               │   ├── ClassDef.java
│   │                               │   ├── Code.java
│   │                               │   ├── DebugInfoItem.java
│   │                               │   ├── Dex.java
│   │                               │   ├── DexException.java
│   │                               │   ├── DexFormat.java
│   │                               │   ├── EncodedValue.java
│   │                               │   ├── EncodedValueCodec.java
│   │                               │   ├── EncodedValueReader.java
│   │                               │   ├── FieldId.java
│   │                               │   ├── Leb128.java
│   │                               │   ├── MethodHandle.java
│   │                               │   ├── MethodId.java
│   │                               │   ├── Mutf8.java
│   │                               │   ├── ProtoId.java
│   │                               │   ├── SizeOf.java
│   │                               │   ├── StringData.java
│   │                               │   ├── TableOfContents.java
│   │                               │   ├── TypeList.java
│   │                               │   ├── io/
│   │                               │   │   └── DexDataBuffer.java
│   │                               │   └── util/
│   │                               │       ├── ByteInput.java
│   │                               │       ├── ByteOutput.java
│   │                               │       ├── CompareUtils.java
│   │                               │       ├── FileUtils.java
│   │                               │       └── HashCodeHelper.java
│   │                               ├── dx/
│   │                               │   ├── instruction/
│   │                               │   │   ├── CodeCursor.java
│   │                               │   │   ├── InstructionCodec.java
│   │                               │   │   ├── InstructionComparator.java
│   │                               │   │   ├── InstructionPromoter.java
│   │                               │   │   ├── InstructionReader.java
│   │                               │   │   ├── InstructionVisitor.java
│   │                               │   │   ├── InstructionWriter.java
│   │                               │   │   ├── Opcodes.java
│   │                               │   │   ├── ShortArrayCodeInput.java
│   │                               │   │   └── ShortArrayCodeOutput.java
│   │                               │   └── util/
│   │                               │       └── Hex.java
│   │                               └── utils/
│   │                                   ├── SparseBoolArray.java
│   │                                   └── SparseIntArray.java
│   ├── bsdiff-util/
│   │   ├── .gitignore
│   │   ├── LICENSE.txt
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── bsdiff/
│   │                               ├── BSDiff.java
│   │                               ├── BSPatch.java
│   │                               └── BSUtil.java
│   └── tinker-ziputils/
│       ├── .gitignore
│       ├── NOTICE.txt
│       ├── build.gradle
│       ├── gradle.properties
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── tencent/
│                           └── tinker/
│                               └── ziputils/
│                                   └── ziputil/
│                                       ├── AlignedZipOutputStream.java
│                                       ├── Arrays.java
│                                       ├── BufferIterator.java
│                                       ├── HeapBufferIterator.java
│                                       ├── Memory.java
│                                       ├── SizeOf.java
│                                       ├── StandardCharsets.java
│                                       ├── Streams.java
│                                       ├── TinkerZipEntry.java
│                                       ├── TinkerZipFile.java
│                                       ├── TinkerZipOutputStream.java
│                                       ├── TinkerZipUtil.java
│                                       └── ZipConstants.java
├── tinker-android/
│   ├── consumer-proguard.txt
│   ├── tinker-android-anno/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       ├── main/
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   └── services/
│   │       │       │       └── javax.annotation.processing.Processor
│   │       │       └── TinkerAnnoApplication.tmpl
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── anno/
│   │                               └── test/
│   │                                   └── TestLifeCycle.java
│   ├── tinker-android-anno-support/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── anno/
│   │                               ├── AnnotationProcessor.java
│   │                               ├── DefaultLifeCycle.java
│   │                               └── Keep.java
│   ├── tinker-android-lib/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   └── lib/
│   │       │                       └── patch/
│   │       │                           └── ApplicationTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── aidl/
│   │       │   │   └── com/
│   │       │   │       └── tencent/
│   │       │   │           └── tinker/
│   │       │   │               └── lib/
│   │       │   │                   └── IForeService.aidl
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   ├── entry/
│   │       │                   │   ├── ApplicationLifeCycle.java
│   │       │                   │   ├── ApplicationLike.java
│   │       │                   │   ├── DefaultApplicationLike.java
│   │       │                   │   └── TinkerApplicationInlineFence.java
│   │       │                   └── lib/
│   │       │                       ├── filepatch/
│   │       │                       │   ├── AbstractFilePatch.java
│   │       │                       │   ├── BsFilePatch.java
│   │       │                       │   └── FilePatchFactory.java
│   │       │                       ├── library/
│   │       │                       │   └── TinkerLoadLibrary.java
│   │       │                       ├── listener/
│   │       │                       │   ├── DefaultPatchListener.java
│   │       │                       │   └── PatchListener.java
│   │       │                       ├── patch/
│   │       │                       │   ├── AbstractPatch.java
│   │       │                       │   ├── ArkHotDiffPatchInternal.java
│   │       │                       │   ├── BasePatchInternal.java
│   │       │                       │   ├── DexDiffPatchInternal.java
│   │       │                       │   ├── ResDiffPatchInternal.java
│   │       │                       │   ├── SoDiffPatchInternal.java
│   │       │                       │   └── UpgradePatch.java
│   │       │                       ├── reporter/
│   │       │                       │   ├── DefaultLoadReporter.java
│   │       │                       │   ├── DefaultPatchReporter.java
│   │       │                       │   ├── LoadReporter.java
│   │       │                       │   └── PatchReporter.java
│   │       │                       ├── service/
│   │       │                       │   ├── AbstractResultService.java
│   │       │                       │   ├── DefaultTinkerResultService.java
│   │       │                       │   ├── PatchResult.java
│   │       │                       │   ├── TinkerPatchForeService.java
│   │       │                       │   └── TinkerPatchService.java
│   │       │                       ├── tinker/
│   │       │                       │   ├── Tinker.java
│   │       │                       │   ├── TinkerApplicationHelper.java
│   │       │                       │   ├── TinkerInstaller.java
│   │       │                       │   └── TinkerLoadResult.java
│   │       │                       └── util/
│   │       │                           ├── TinkerLog.java
│   │       │                           ├── TinkerServiceInternals.java
│   │       │                           └── UpgradePatchRetry.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── recover/
│   │                               └── ExampleUnitTest.java
│   ├── tinker-android-lib-no-op/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   └── lib/
│   │       │                       └── patch/
│   │       │                           └── ApplicationTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── tencent/
│   │       │               └── tinker/
│   │       │                   └── lib/
│   │       │                       ├── library/
│   │       │                       │   └── TinkerLoadLibrary.java
│   │       │                       ├── listener/
│   │       │                       │   ├── DefaultPatchListener.java
│   │       │                       │   └── PatchListener.java
│   │       │                       ├── patch/
│   │       │                       │   ├── AbstractPatch.java
│   │       │                       │   └── UpgradePatch.java
│   │       │                       ├── reporter/
│   │       │                       │   ├── DefaultLoadReporter.java
│   │       │                       │   ├── DefaultPatchReporter.java
│   │       │                       │   ├── LoadReporter.java
│   │       │                       │   └── PatchReporter.java
│   │       │                       ├── service/
│   │       │                       │   ├── AbstractResultService.java
│   │       │                       │   ├── DefaultTinkerResultService.java
│   │       │                       │   └── PatchResult.java
│   │       │                       ├── tinker/
│   │       │                       │   ├── Tinker.java
│   │       │                       │   ├── TinkerApplicationHelper.java
│   │       │                       │   ├── TinkerInstaller.java
│   │       │                       │   └── TinkerLoadResult.java
│   │       │                       └── util/
│   │       │                           ├── TinkerLog.java
│   │       │                           ├── TinkerServiceInternals.java
│   │       │                           └── UpgradePatchRetry.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── tencent/
│   │                       └── tinker/
│   │                           └── recover/
│   │                               └── ExampleUnitTest.java
│   ├── tinker-android-loader/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   ├── proguard-rules.pro
│   │   ├── src/
│   │   │   ├── androidTest/
│   │   │   │   └── java/
│   │   │   │       └── com/
│   │   │   │           └── tencent/
│   │   │   │               └── tinker/
│   │   │   │                   └── loader/
│   │   │   │                       └── ApplicationTest.java
│   │   │   ├── main/
│   │   │   │   ├── AndroidManifest.xml
│   │   │   │   └── java/
│   │   │   │       └── com/
│   │   │   │           └── tencent/
│   │   │   │               └── tinker/
│   │   │   │                   └── loader/
│   │   │   │                       ├── AbstractTinkerLoader.java
│   │   │   │                       ├── AppInfoChangedBlocker.java
│   │   │   │                       ├── NewClassLoaderInjector.java
│   │   │   │                       ├── SystemClassLoaderAdder.java
│   │   │   │                       ├── TinkerArkHotLoader.java
│   │   │   │                       ├── TinkerClassLoader.java
│   │   │   │                       ├── TinkerDexLoader.java
│   │   │   │                       ├── TinkerDexOptimizer.java
│   │   │   │                       ├── TinkerLoader.java
│   │   │   │                       ├── TinkerResourceLoader.java
│   │   │   │                       ├── TinkerResourcePatcher.java
│   │   │   │                       ├── TinkerResourcesKey.java
│   │   │   │                       ├── TinkerRuntimeException.java
│   │   │   │                       ├── TinkerSoLoader.java
│   │   │   │                       ├── TinkerTestDexLoad.java
│   │   │   │                       ├── TinkerUncaughtHandler.java
│   │   │   │                       ├── app/
│   │   │   │                       │   ├── TinkerApplication.java
│   │   │   │                       │   └── TinkerInlineFenceAction.java
│   │   │   │                       ├── hotplug/
│   │   │   │                       │   ├── ActivityStubManager.java
│   │   │   │                       │   ├── ActivityStubs.java
│   │   │   │                       │   ├── ComponentHotplug.java
│   │   │   │                       │   ├── EnvConsts.java
│   │   │   │                       │   ├── IncrementComponentManager.java
│   │   │   │                       │   ├── UnsupportedEnvironmentException.java
│   │   │   │                       │   ├── handler/
│   │   │   │                       │   │   ├── AMSInterceptHandler.java
│   │   │   │                       │   │   ├── MHMessageHandler.java
│   │   │   │                       │   │   └── PMSInterceptHandler.java
│   │   │   │                       │   └── interceptor/
│   │   │   │                       │       ├── HandlerMessageInterceptor.java
│   │   │   │                       │       ├── InterceptFailedException.java
│   │   │   │                       │       ├── Interceptor.java
│   │   │   │                       │       ├── ServiceBinderInterceptor.java
│   │   │   │                       │       └── TinkerHackInstrumentation.java
│   │   │   │                       └── shareutil/
│   │   │   │                           ├── Guard.java
│   │   │   │                           ├── ShareArkHotDiffPatchInfo.java
│   │   │   │                           ├── ShareBsDiffPatchInfo.java
│   │   │   │                           ├── ShareConstants.java
│   │   │   │                           ├── ShareDexDiffPatchInfo.java
│   │   │   │                           ├── ShareElfFile.java
│   │   │   │                           ├── ShareFileLockHelper.java
│   │   │   │                           ├── ShareIntentUtil.java
│   │   │   │                           ├── ShareOatUtil.java
│   │   │   │                           ├── SharePatchFileUtil.java
│   │   │   │                           ├── SharePatchInfo.java
│   │   │   │                           ├── ShareReflectUtil.java
│   │   │   │                           ├── ShareResPatchInfo.java
│   │   │   │                           ├── ShareSecurityCheck.java
│   │   │   │                           ├── ShareTinkerInternals.java
│   │   │   │                           ├── ShareTinkerLog.java
│   │   │   │                           └── TinkerLogInlineFence.java
│   │   │   └── test/
│   │   │       └── java/
│   │   │           └── com/
│   │   │               └── tencent/
│   │   │                   └── tinker/
│   │   │                       └── loader/
│   │   │                           ├── ExampleUnitTest.java
│   │   │                           └── shareutil/
│   │   │                               └── GuardTest.java
│   │   └── stubs/
│   │       └── sysapi-access-stub.jar
│   └── tinker-android-loader-no-op/
│       ├── .gitignore
│       ├── build.gradle
│       ├── gradle.properties
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── tencent/
│           │               └── tinker/
│           │                   └── loader/
│           │                       └── ApplicationTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   └── java/
│           │       └── com/
│           │           └── tencent/
│           │               └── tinker/
│           │                   ├── entry/
│           │                   │   ├── ApplicationLifeCycle.java
│           │                   │   ├── ApplicationLike.java
│           │                   │   └── DefaultApplicationLike.java
│           │                   └── loader/
│           │                       ├── TinkerRuntimeException.java
│           │                       ├── app/
│           │                       │   └── TinkerApplication.java
│           │                       └── shareutil/
│           │                           ├── ShareArkHotDiffPatchInfo.java
│           │                           ├── ShareBsDiffPatchInfo.java
│           │                           ├── ShareConstants.java
│           │                           ├── ShareDexDiffPatchInfo.java
│           │                           ├── ShareElfFile.java
│           │                           ├── ShareFileLockHelper.java
│           │                           ├── ShareIntentUtil.java
│           │                           ├── ShareOatUtil.java
│           │                           ├── SharePatchFileUtil.java
│           │                           ├── SharePatchInfo.java
│           │                           ├── ShareReflectUtil.java
│           │                           ├── ShareResPatchInfo.java
│           │                           ├── ShareSecurityCheck.java
│           │                           ├── ShareTinkerInternals.java
│           │                           ├── ShareTinkerLog.java
│           │                           └── TinkerLogInlineFence.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── tencent/
│                           └── tinker/
│                               └── loader/
│                                   └── ExampleUnitTest.java
├── tinker-build/
│   ├── tinker-patch-cli/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── src/
│   │   │   └── main/
│   │   │       └── java/
│   │   │           └── com/
│   │   │               └── tencent/
│   │   │                   └── tinker/
│   │   │                       └── patch/
│   │   │                           ├── CliMain.java
│   │   │                           └── Test.java
│   │   ├── tool_maple/
│   │   │   ├── DexCmp.jar
│   │   │   └── build_patch_dexdiff.sh
│   │   └── tool_output/
│   │       ├── merge_mapping.py
│   │       ├── proguard_warning.py
│   │       ├── release.keystore
│   │       ├── tinker_config.xml
│   │       ├── tinker_multidexkeep.pro
│   │       └── tinker_proguard.pro
│   ├── tinker-patch-gradle-plugin/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           ├── groovy/
│   │           │   └── com/
│   │           │       └── tencent/
│   │           │           └── tinker/
│   │           │               └── build/
│   │           │                   └── gradle/
│   │           │                       ├── Compatibilities.groovy
│   │           │                       ├── TinkerPatchPlugin.groovy
│   │           │                       ├── common/
│   │           │                       │   └── TinkerBuildPath.groovy
│   │           │                       ├── extension/
│   │           │                       │   ├── TinkerArkHotExtension.groovy
│   │           │                       │   ├── TinkerBuildConfigExtension.groovy
│   │           │                       │   ├── TinkerDexExtension.groovy
│   │           │                       │   ├── TinkerLibExtension.groovy
│   │           │                       │   ├── TinkerPackageConfigExtension.groovy
│   │           │                       │   ├── TinkerPatchExtension.groovy
│   │           │                       │   ├── TinkerResourceExtension.groovy
│   │           │                       │   └── TinkerSevenZipExtension.groovy
│   │           │                       ├── task/
│   │           │                       │   ├── TinkerManifestAction.groovy
│   │           │                       │   ├── TinkerMultidexConfigTask.groovy
│   │           │                       │   ├── TinkerPatchSchemaTask.groovy
│   │           │                       │   ├── TinkerProguardConfigAction.groovy
│   │           │                       │   └── TinkerResourceIdTask.groovy
│   │           │                       └── transform/
│   │           │                           └── ImmutableDexTransform.groovy
│   │           └── resources/
│   │               └── META-INF/
│   │                   └── gradle-plugins/
│   │                       └── com.tencent.tinker.patch.properties
│   └── tinker-patch-lib/
│       ├── .gitignore
│       ├── build.gradle
│       ├── gradle.properties
│       └── src/
│           └── main/
│               ├── java/
│               │   ├── com/
│               │   │   └── tencent/
│               │   │       └── tinker/
│               │   │           └── build/
│               │   │               ├── aapt/
│               │   │               │   ├── AaptResourceCollector.java
│               │   │               │   ├── AaptUtil.java
│               │   │               │   ├── Constant.java
│               │   │               │   ├── FakeRDotTxtEntry.java
│               │   │               │   ├── FileCopyException.java
│               │   │               │   ├── FileUtil.java
│               │   │               │   ├── Generator.java
│               │   │               │   ├── JavaXmlUtil.java
│               │   │               │   ├── ObjectUtil.java
│               │   │               │   ├── PatchUtil.java
│               │   │               │   ├── RDotTxtEntry.java
│               │   │               │   ├── ResourceDirectory.java
│               │   │               │   ├── ResourceEntry.java
│               │   │               │   └── StringUtil.java
│               │   │               ├── apkparser/
│               │   │               │   └── AndroidParser.java
│               │   │               ├── builder/
│               │   │               │   └── PatchBuilder.java
│               │   │               ├── decoder/
│               │   │               │   ├── ApkDecoder.java
│               │   │               │   ├── ArkHotDecoder.java
│               │   │               │   ├── BaseDecoder.java
│               │   │               │   ├── DexDiffDecoder.java
│               │   │               │   ├── ManifestDecoder.java
│               │   │               │   ├── ResDiffDecoder.java
│               │   │               │   ├── SoDiffDecoder.java
│               │   │               │   └── UniqueDexDiffDecoder.java
│               │   │               ├── dexpatcher/
│               │   │               │   ├── DexPatchGenerator.java
│               │   │               │   ├── algorithms/
│               │   │               │   │   └── diff/
│               │   │               │   │       ├── AnnotationSectionDiffAlgorithm.java
│               │   │               │   │       ├── AnnotationSetRefListSectionDiffAlgorithm.java
│               │   │               │   │       ├── AnnotationSetSectionDiffAlgorithm.java
│               │   │               │   │       ├── AnnotationsDirectorySectionDiffAlgorithm.java
│               │   │               │   │       ├── CallSiteIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── ClassDataSectionDiffAlgorithm.java
│               │   │               │   │       ├── ClassDefSectionDiffAlgorithm.java
│               │   │               │   │       ├── CodeSectionDiffAlgorithm.java
│               │   │               │   │       ├── DebugInfoItemSectionDiffAlgorithm.java
│               │   │               │   │       ├── DexSectionDiffAlgorithm.java
│               │   │               │   │       ├── FieldIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── MethodHandleSectionDiffAlgorithm.java
│               │   │               │   │       ├── MethodIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── ProtoIdSectionDiffAlgorithm.java
│               │   │               │   │       ├── StaticValueSectionDiffAlgorithm.java
│               │   │               │   │       ├── StringDataSectionDiffAlgorithm.java
│               │   │               │   │       ├── TypeIdSectionDiffAlgorithm.java
│               │   │               │   │       └── TypeListSectionDiffAlgorithm.java
│               │   │               │   └── util/
│               │   │               │       ├── ChangedClassesDexClassInfoCollector.java
│               │   │               │       └── PatternUtils.java
│               │   │               ├── immutable/
│               │   │               │   ├── ClassSimDef.java
│               │   │               │   └── DexRefData.java
│               │   │               ├── info/
│               │   │               │   ├── InfoWriter.java
│               │   │               │   ├── PatchInfo.java
│               │   │               │   └── PatchInfoGen.java
│               │   │               ├── patch/
│               │   │               │   ├── Configuration.java
│               │   │               │   ├── InputParam.java
│               │   │               │   └── Runner.java
│               │   │               └── util/
│               │   │                   ├── CustomDiff.java
│               │   │                   ├── DexClassesComparator.java
│               │   │                   ├── DiffFactory.java
│               │   │                   ├── ExcludedClassModifiedChecker.java
│               │   │                   ├── FileOperation.java
│               │   │                   ├── Logger.java
│               │   │                   ├── MD5.java
│               │   │                   ├── TinkerPatchException.java
│               │   │                   ├── TypedValue.java
│               │   │                   └── Utils.java
│               │   └── org/
│               │       └── jf/
│               │           └── dexlib2/
│               │               └── builder/
│               │                   └── BuilderMutableMethodImplementation.java
│               └── resources/
│                   ├── only_use_to_test_tinker_resource.txt
│                   └── test.dex
├── tinker-commons/
│   ├── .gitignore
│   ├── NOTICE.txt
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── tencent/
│                       └── tinker/
│                           └── commons/
│                               ├── dexpatcher/
│                               │   ├── DexPatchApplier.java
│                               │   ├── DexPatcherLogger.java
│                               │   ├── algorithms/
│                               │   │   └── patch/
│                               │   │       ├── AnnotationSectionPatchAlgorithm.java
│                               │   │       ├── AnnotationSetRefListSectionPatchAlgorithm.java
│                               │   │       ├── AnnotationSetSectionPatchAlgorithm.java
│                               │   │       ├── AnnotationsDirectorySectionPatchAlgorithm.java
│                               │   │       ├── CallSiteIdSectionPatchAlgorithm.java
│                               │   │       ├── ClassDataSectionPatchAlgorithm.java
│                               │   │       ├── ClassDefSectionPatchAlgorithm.java
│                               │   │       ├── CodeSectionPatchAlgorithm.java
│                               │   │       ├── DebugInfoItemSectionPatchAlgorithm.java
│                               │   │       ├── DexSectionPatchAlgorithm.java
│                               │   │       ├── FieldIdSectionPatchAlgorithm.java
│                               │   │       ├── MethodHandleSectionPatchAlgorithm.java
│                               │   │       ├── MethodIdSectionPatchAlgorithm.java
│                               │   │       ├── ProtoIdSectionPatchAlgorithm.java
│                               │   │       ├── StaticValueSectionPatchAlgorithm.java
│                               │   │       ├── StringDataSectionPatchAlgorithm.java
│                               │   │       ├── TypeIdSectionPatchAlgorithm.java
│                               │   │       └── TypeListSectionPatchAlgorithm.java
│                               │   ├── struct/
│                               │   │   ├── DexPatchFile.java
│                               │   │   └── PatchOperation.java
│                               │   └── util/
│                               │       ├── AbstractIndexMap.java
│                               │       ├── InstructionTransformer.java
│                               │       └── SparseIndexMap.java
│                               └── util/
│                                   ├── DigestUtil.java
│                                   └── IOHelper.java
└── tinker-sample-android/
    ├── .gitignore
    ├── app/
    │   ├── .gitignore
    │   ├── build.gradle
    │   ├── keystore/
    │   │   ├── debug.keystore
    │   │   └── release.keystore
    │   ├── proguard-rules.pro
    │   ├── src/
    │   │   ├── main/
    │   │   │   ├── AndroidManifest.xml
    │   │   │   ├── java/
    │   │   │   │   └── tinker/
    │   │   │   │       └── sample/
    │   │   │   │           └── android/
    │   │   │   │               ├── Log/
    │   │   │   │               │   └── MyLogImp.java
    │   │   │   │               ├── app/
    │   │   │   │               │   ├── BaseBuildInfo.java
    │   │   │   │               │   ├── BuildInfo.java
    │   │   │   │               │   ├── MainActivity.java
    │   │   │   │               │   └── SampleApplicationLike.java
    │   │   │   │               ├── crash/
    │   │   │   │               │   └── SampleUncaughtExceptionHandler.java
    │   │   │   │               ├── reporter/
    │   │   │   │               │   ├── SampleLoadReporter.java
    │   │   │   │               │   ├── SamplePatchListener.java
    │   │   │   │               │   ├── SamplePatchReporter.java
    │   │   │   │               │   └── SampleTinkerReport.java
    │   │   │   │               ├── service/
    │   │   │   │               │   └── SampleResultService.java
    │   │   │   │               └── util/
    │   │   │   │                   ├── SampleApplicationContext.java
    │   │   │   │                   ├── TinkerManager.java
    │   │   │   │                   └── Utils.java
    │   │   │   └── res/
    │   │   │       ├── layout/
    │   │   │       │   └── activity_main.xml
    │   │   │       ├── values/
    │   │   │       │   ├── colors.xml
    │   │   │       │   ├── dimens.xml
    │   │   │       │   ├── strings.xml
    │   │   │       │   └── styles.xml
    │   │   │       └── values-w820dp/
    │   │   │           └── dimens.xml
    │   │   └── test/
    │   │       └── java/
    │   │           └── tinker/
    │   │               └── sample/
    │   │                   └── android/
    │   │                       └── ExampleUnitTest.java
    │   └── tinker_multidexkeep.pro
    ├── build.gradle
    ├── gradle/
    │   └── wrapper/
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── updateTinkerLib.sh
Download .txt
Showing preview only (308K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3259 symbols across 302 files)

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java
  class Annotation (line 28) | public final class Annotation extends Item<Annotation> {
    method Annotation (line 32) | public Annotation(int off, byte visibility, EncodedValue encodedAnnota...
    method getReader (line 38) | public EncodedValueReader getReader() {
    method getTypeIndex (line 42) | public int getTypeIndex() {
    method compareTo (line 48) | @Override public int compareTo(Annotation other) {
    method hashCode (line 54) | @Override
    method equals (line 59) | @Override
    method byteCountInDex (line 67) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java
  class AnnotationSet (line 29) | public class AnnotationSet extends Section.Item<AnnotationSet> {
    method AnnotationSet (line 32) | public AnnotationSet(int off, int[] annotationOffsets) {
    method compareTo (line 37) | @Override
    method hashCode (line 55) | @Override
    method equals (line 60) | @Override
    method byteCountInDex (line 68) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java
  class AnnotationSetRefList (line 29) | public class AnnotationSetRefList extends Section.Item<AnnotationSetRefL...
    method AnnotationSetRefList (line 32) | public AnnotationSetRefList(int off, int[] annotationSetRefItems) {
    method compareTo (line 37) | @Override
    method hashCode (line 55) | @Override
    method equals (line 60) | @Override
    method byteCountInDex (line 68) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java
  class AnnotationsDirectory (line 28) | public class AnnotationsDirectory extends Section.Item<AnnotationsDirect...
    method AnnotationsDirectory (line 49) | public AnnotationsDirectory(
    method compareTo (line 61) | @Override
    method hashCode (line 134) | @Override
    method equals (line 140) | @Override
    method byteCountInDex (line 148) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/CallSiteId.java
  class CallSiteId (line 22) | public class CallSiteId extends Item<CallSiteId> {
    method CallSiteId (line 25) | public CallSiteId(int off, int offset) {
    method writeTo (line 30) | public void writeTo(Dex.Section out) {
    method byteCountInDex (line 34) | @Override
    method compareTo (line 39) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java
  class ClassData (line 23) | public final class ClassData extends Item<ClassData> {
    method ClassData (line 29) | public ClassData(int off, Field[] staticFields, Field[] instanceFields,
    method compareTo (line 39) | @Override
    method hashCode (line 56) | @Override
    method equals (line 61) | @Override
    method byteCountInDex (line 69) | @Override
    method calcFieldsSize (line 82) | private int calcFieldsSize(Field[] fields) {
    method calcMethodsSize (line 93) | private int calcMethodsSize(Method[] methods) {
    class Field (line 106) | public static class Field implements Comparable<Field> {
      method Field (line 110) | public Field(int fieldIndex, int accessFlags) {
      method compareTo (line 115) | @Override
      method equals (line 124) | @Override
      method hashCode (line 132) | @Override
    class Method (line 138) | public static class Method implements Comparable<Method> {
      method Method (line 143) | public Method(int methodIndex, int accessFlags, int codeOffset) {
      method compareTo (line 149) | @Override
      method equals (line 162) | @Override
      method hashCode (line 170) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java
  class ClassDef (line 25) | public final class ClassDef extends TableOfContents.Section.Item<ClassDe...
    method ClassDef (line 38) | public ClassDef(int off, int typeIndex, int accessFlags,
    method compareTo (line 52) | @Override
    method hashCode (line 85) | @Override
    method equals (line 91) | @Override
    method byteCountInDex (line 99) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java
  class Code (line 23) | public final class Code extends Item<Code> {
    method Code (line 32) | public Code(int off, int registersSize, int insSize, int outsSize, int...
    method compareTo (line 44) | @Override
    method hashCode (line 73) | @Override
    method equals (line 79) | @Override
    method byteCountInDex (line 87) | @Override
    class Try (line 118) | public static class Try implements Comparable<Try> {
      method Try (line 123) | public Try(int startAddress, int instructionCount, int catchHandlerI...
      method compareTo (line 129) | @Override
    class CatchHandler (line 143) | public static class CatchHandler implements Comparable<CatchHandler> {
      method CatchHandler (line 149) | public CatchHandler(int[] typeIndexes, int[] addresses, int catchAll...
      method compareTo (line 156) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java
  class DebugInfoItem (line 28) | public class DebugInfoItem extends Item<DebugInfoItem> {
    method DebugInfoItem (line 45) | public DebugInfoItem(int off, int lineStart, int[] parameterNames, byt...
    method compareTo (line 52) | @Override
    method hashCode (line 67) | @Override
    method equals (line 72) | @Override
    method byteCountInDex (line 80) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java
  class Dex (line 49) | public final class Dex {
    method Dex (line 94) | public Dex(byte[] data) throws IOException {
    method Dex (line 98) | private Dex(ByteBuffer data) throws IOException {
    method Dex (line 107) | public Dex(int byteCount) {
    method Dex (line 116) | public Dex(InputStream in) throws IOException {
    method Dex (line 120) | public Dex(InputStream in, int initSize) throws IOException {
    method Dex (line 127) | public Dex(File file) throws IOException {
    method checkBounds (line 180) | private static void checkBounds(int index, int length) {
    method loadFrom (line 186) | private void loadFrom(InputStream in) throws IOException {
    method loadFrom (line 190) | private void loadFrom(InputStream in, int initSize) throws IOException {
    method writeTo (line 197) | public void writeTo(OutputStream out) throws IOException {
    method writeTo (line 203) | public void writeTo(File dexOut) throws IOException {
    method getTableOfContents (line 221) | public TableOfContents getTableOfContents() {
    method openSection (line 233) | public Section openSection(int position) {
    method openSection (line 246) | public Section openSection(TableOfContents.Section tocSec) {
    method appendSection (line 260) | public Section appendSection(int maxByteCount, String name) {
    method getLength (line 271) | public int getLength() {
    method getNextSectionStart (line 275) | public int getNextSectionStart() {
    method getBytes (line 282) | public byte[] getBytes() {
    method strings (line 290) | public List<String> strings() {
    method typeIds (line 294) | public List<Integer> typeIds() {
    method typeNames (line 298) | public List<String> typeNames() {
    method protoIds (line 302) | public List<ProtoId> protoIds() {
    method fieldIds (line 306) | public List<FieldId> fieldIds() {
    method methodIds (line 310) | public List<MethodId> methodIds() {
    method callsiteIds (line 314) | public List<CallSiteId> callsiteIds() {
    method methodHandles (line 318) | public List<MethodHandle> methodHandles() {
    method classDefs (line 322) | public List<ClassDef> classDefs() {
    method classDefIterable (line 326) | public Iterable<ClassDef> classDefIterable() {
    method readClassData (line 330) | public ClassData readClassData(ClassDef classDef) {
    method readCode (line 338) | public Code readCode(ClassData.Method method) {
    method computeSignature (line 351) | public byte[] computeSignature(boolean forceRecompute) {
    method bytesToHexString (line 375) | private String bytesToHexString(byte[] bytes) {
    method computeChecksum (line 386) | public int computeChecksum() throws IOException {
    method writeHashes (line 404) | public void writeHashes() throws IOException {
    method nameIndexFromFieldIndex (line 413) | public int nameIndexFromFieldIndex(int fieldIndex) {
    method findStringIndex (line 421) | public int findStringIndex(String s) {
    method findTypeIndex (line 425) | public int findTypeIndex(String descriptor) {
    method findFieldIndex (line 429) | public int findFieldIndex(FieldId fieldId) {
    method findMethodIndex (line 433) | public int findMethodIndex(MethodId methodId) {
    method findClassDefIndexFromTypeIndex (line 437) | public int findClassDefIndexFromTypeIndex(int typeIndex) {
    method typeIndexFromFieldIndex (line 454) | public int typeIndexFromFieldIndex(int fieldIndex) {
    method declaringClassIndexFromMethodIndex (line 465) | public int declaringClassIndexFromMethodIndex(int methodIndex) {
    method nameIndexFromMethodIndex (line 475) | public int nameIndexFromMethodIndex(int methodIndex) {
    method parameterTypeIndicesFromMethodIndex (line 487) | public short[] parameterTypeIndicesFromMethodIndex(int methodIndex) {
    method parameterTypeIndicesFromMethodId (line 518) | public short[] parameterTypeIndicesFromMethodId(MethodId methodId) {
    method returnTypeIndexFromMethodIndex (line 546) | public int returnTypeIndexFromMethodIndex(int methodIndex) {
    method descriptorIndexFromTypeIndex (line 561) | public int descriptorIndexFromTypeIndex(int typeIndex) {
    method typeIndexFromClassDefIndex (line 570) | public int typeIndexFromClassDefIndex(int classDefIndex) {
    method annotationDirectoryOffsetFromClassDefIndex (line 579) | public int annotationDirectoryOffsetFromClassDefIndex(int classDefInde...
    method interfaceTypeIndicesFromClassDefIndex (line 594) | public short[] interfaceTypeIndicesFromClassDefIndex(int classDefIndex) {
    method interfaceTypeIndicesFromClassDef (line 618) | public short[] interfaceTypeIndicesFromClassDef(ClassDef classDef) {
    class Section (line 637) | public final class Section extends DexDataBuffer {
      method Section (line 640) | private Section(String name, ByteBuffer data) {
      method readStringData (line 648) | @Override
      method readTypeList (line 657) | @Override
      method readFieldId (line 666) | @Override
      method readMethodId (line 675) | @Override
      method readProtoId (line 684) | @Override
      method readClassDef (line 693) | @Override
      method readCode (line 702) | @Override
      method readDebugInfoItem (line 711) | @Override
      method readClassData (line 720) | @Override
      method readAnnotation (line 729) | @Override
      method readAnnotationSet (line 738) | @Override
      method readAnnotationSetRefList (line 747) | @Override
      method readAnnotationsDirectory (line 756) | @Override
      method readEncodedArray (line 765) | @Override
      method ensureFourBytesAligned (line 771) | private void ensureFourBytesAligned(TableOfContents.Section tocSec, ...
      method writeStringData (line 784) | @Override
      method writeTypeList (line 793) | @Override
      method writeFieldId (line 802) | @Override
      method writeMethodId (line 811) | @Override
      method writeProtoId (line 820) | @Override
      method writeClassDef (line 829) | @Override
      method writeCode (line 838) | @Override
      method writeDebugInfoItem (line 847) | @Override
      method writeClassData (line 856) | @Override
      method writeAnnotation (line 865) | @Override
      method writeAnnotationSet (line 874) | @Override
      method writeAnnotationSetRefList (line 883) | @Override
      method writeAnnotationsDirectory (line 892) | @Override
      method writeEncodedArray (line 901) | @Override
    class StringTable (line 908) | private final class StringTable extends AbstractList<String> implement...
      method get (line 909) | @Override public String get(int index) {
      method size (line 914) | @Override public int size() {
    class TypeIndexToDescriptorIndexTable (line 919) | private final class TypeIndexToDescriptorIndexTable extends AbstractLi...
      method get (line 921) | @Override public Integer get(int index) {
      method size (line 924) | @Override public int size() {
    class TypeIndexToDescriptorTable (line 929) | private final class TypeIndexToDescriptorTable extends AbstractList<St...
      method get (line 931) | @Override public String get(int index) {
      method size (line 934) | @Override public int size() {
    class ProtoIdTable (line 939) | private final class ProtoIdTable extends AbstractList<ProtoId> impleme...
      method get (line 940) | @Override public ProtoId get(int index) {
      method size (line 945) | @Override public int size() {
    class FieldIdTable (line 950) | private final class FieldIdTable extends AbstractList<FieldId> impleme...
      method get (line 951) | @Override public FieldId get(int index) {
      method size (line 956) | @Override public int size() {
    class MethodIdTable (line 961) | private final class MethodIdTable extends AbstractList<MethodId> imple...
      method get (line 962) | @Override public MethodId get(int index) {
      method size (line 967) | @Override public int size() {
    class CallSiteIdTable (line 972) | private final class CallSiteIdTable extends AbstractList<CallSiteId> i...
      method get (line 973) | @Override
      method size (line 980) | @Override
    class MethodHandleTable (line 986) | private final class MethodHandleTable extends AbstractList<MethodHandl...
      method get (line 987) | @Override
      method size (line 994) | @Override
    class ClassDefTable (line 1000) | private final class ClassDefTable extends AbstractList<ClassDef> imple...
      method get (line 1001) | @Override
      method size (line 1008) | @Override
    class ClassDefIterator (line 1014) | private final class ClassDefIterator implements Iterator<ClassDef> {
      method hasNext (line 1018) | @Override
      method next (line 1022) | @Override
      method remove (line 1030) | @Override
    class ClassDefIterable (line 1036) | private final class ClassDefIterable implements Iterable<ClassDef> {
      method iterator (line 1037) | public Iterator<ClassDef> iterator() {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java
  class DexException (line 23) | public class DexException extends RuntimeException {
    method DexException (line 26) | public DexException(String message) {
    method DexException (line 30) | public DexException(Throwable cause) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexFormat.java
  class DexFormat (line 23) | public final class DexFormat {
    method DexFormat (line 24) | private DexFormat() {}
    method magicToApi (line 116) | public static int magicToApi(byte[] magic) {
    method apiToMagic (line 151) | public static String apiToMagic(int targetApiLevel) {
    method isSupportedDexMagic (line 176) | public static boolean isSupportedDexMagic(byte[] magic) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValue.java
  class EncodedValue (line 29) | public final class EncodedValue extends Item<EncodedValue> {
    method EncodedValue (line 32) | public EncodedValue(int off, byte[] data) {
    method asByteInput (line 37) | public ByteInput asByteInput() {
    method compareTo (line 48) | @Override public int compareTo(EncodedValue other) {
    method hashCode (line 52) | @Override
    method equals (line 57) | @Override
    method byteCountInDex (line 65) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueCodec.java
  class EncodedValueCodec (line 25) | public final class EncodedValueCodec {
    method EncodedValueCodec (line 26) | private EncodedValueCodec() {
    method writeSignedIntegralValue (line 32) | public static void writeSignedIntegralValue(ByteOutput out, int type, ...
    method writeUnsignedIntegralValue (line 64) | public static void writeUnsignedIntegralValue(ByteOutput out, int type...
    method writeRightZeroExtendedValue (line 91) | public static void writeRightZeroExtendedValue(ByteOutput out, int typ...
    method readSignedInt (line 123) | public static int readSignedInt(ByteInput in, int zwidth) {
    method readUnsignedInt (line 138) | public static int readUnsignedInt(ByteInput in, int zwidth, boolean fi...
    method readSignedLong (line 158) | public static long readSignedLong(ByteInput in, int zwidth) {
    method readUnsignedLong (line 173) | public static long readUnsignedLong(ByteInput in, int zwidth, boolean ...

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueReader.java
  class EncodedValueReader (line 24) | public final class EncodedValueReader {
    method EncodedValueReader (line 52) | public EncodedValueReader(ByteInput in) {
    method EncodedValueReader (line 56) | public EncodedValueReader(EncodedValue in) {
    method EncodedValueReader (line 66) | public EncodedValueReader(ByteInput in, int knownType) {
    method EncodedValueReader (line 71) | public EncodedValueReader(EncodedValue in, int knownType) {
    method peek (line 78) | public int peek() {
    method readArray (line 97) | public int readArray() {
    method readAnnotation (line 116) | public int readAnnotation() {
    method getAnnotationType (line 128) | public int getAnnotationType() {
    method readAnnotationName (line 132) | public int readAnnotationName() {
    method readByte (line 136) | public byte readByte() {
    method readShort (line 142) | public short readShort() {
    method readChar (line 148) | public char readChar() {
    method readInt (line 154) | public int readInt() {
    method readLong (line 160) | public long readLong() {
    method readFloat (line 166) | public float readFloat() {
    method readDouble (line 172) | public double readDouble() {
    method readMethodType (line 178) | public int readMethodType() {
    method readMethodHandle (line 184) | public int readMethodHandle() {
    method readString (line 190) | public int readString() {
    method readType (line 196) | public int readType() {
    method readField (line 202) | public int readField() {
    method readEnum (line 208) | public int readEnum() {
    method readMethod (line 214) | public int readMethod() {
    method readNull (line 220) | public void readNull() {
    method readBoolean (line 225) | public boolean readBoolean() {
    method skipValue (line 235) | public void skipValue() {
    method checkType (line 301) | private void checkType(int expected) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/FieldId.java
  class FieldId (line 23) | public final class FieldId extends Item<FieldId> {
    method FieldId (line 28) | public FieldId(int off, int declaringClassIndex, int typeIndex, int na...
    method compareTo (line 35) | public int compareTo(FieldId other) {
    method hashCode (line 45) | @Override
    method equals (line 50) | @Override
    method byteCountInDex (line 58) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Leb128.java
  class Leb128 (line 26) | public final class Leb128 {
    method Leb128 (line 27) | private Leb128() {
    method unsignedLeb128Size (line 37) | public static int unsignedLeb128Size(int value) {
    method unsignedLeb128p1Size (line 51) | public static int unsignedLeb128p1Size(int value) {
    method signedLeb128Size (line 62) | public static int signedLeb128Size(int value) {
    method readSignedLeb128 (line 85) | public static int readSignedLeb128(ByteInput in) {
    method readUnsignedLeb128 (line 113) | public static int readUnsignedLeb128(ByteInput in) {
    method readUnsignedLeb128p1 (line 134) | public static int readUnsignedLeb128p1(ByteInput in) {
    method writeUnsignedLeb128 (line 142) | public static int writeUnsignedLeb128(ByteOutput out, int value) {
    method writeUnsignedLeb128p1 (line 162) | public static int writeUnsignedLeb128p1(ByteOutput out, int value) {
    method writeSignedLeb128 (line 170) | public static int writeSignedLeb128(ByteOutput out, int value) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodHandle.java
  class MethodHandle (line 22) | public class MethodHandle extends Item<MethodHandle> {
    type MethodHandleType (line 23) | public enum MethodHandleType {
      method MethodHandleType (line 36) | MethodHandleType(int value) {
      method fromValue (line 40) | public static MethodHandleType fromValue(int value) {
      method isField (line 49) | public boolean isField() {
    method MethodHandle (line 67) | public MethodHandle(int off,
    method byteCountInDex (line 79) | @Override
    method compareTo (line 84) | @Override
    method writeTo (line 92) | public void writeTo(Dex.Section out) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodId.java
  class MethodId (line 23) | public final class MethodId extends Item<MethodId> {
    method MethodId (line 28) | public MethodId(int off, int declaringClassIndex, int protoIndex, int ...
    method compareTo (line 35) | public int compareTo(MethodId other) {
    method hashCode (line 45) | @Override
    method equals (line 50) | @Override
    method byteCountInDex (line 58) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Mutf8.java
  class Mutf8 (line 27) | public final class Mutf8 {
    method Mutf8 (line 28) | private Mutf8() { }
    method decode (line 34) | public static String decode(ByteInput in, char[] out) throws UTFDataFo...
    method countBytes (line 66) | public static long countBytes(String s, boolean shortLength) throws UT...
    method encode (line 89) | public static void encode(byte[] dst, int offset, String s) {
    method encode (line 109) | public static byte[] encode(String s) throws UTFDataFormatException {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ProtoId.java
  class ProtoId (line 22) | public final class ProtoId extends TableOfContents.Section.Item<ProtoId> {
    method ProtoId (line 27) | public ProtoId(int off, int shortyIndex, int returnTypeIndex, int para...
    method compareTo (line 34) | public int compareTo(ProtoId other) {
    method hashCode (line 47) | @Override
    method equals (line 52) | @Override
    method byteCountInDex (line 60) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/SizeOf.java
  class SizeOf (line 19) | public final class SizeOf {
    method SizeOf (line 111) | private SizeOf() { }
    method roundToTimesOfFour (line 113) | public static int roundToTimesOfFour(int value) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/StringData.java
  class StringData (line 28) | public class StringData extends Item<StringData> {
    method StringData (line 31) | public StringData(int offset, String value) {
    method compareTo (line 36) | @Override
    method hashCode (line 41) | @Override
    method equals (line 46) | @Override
    method byteCountInDex (line 54) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TableOfContents.java
  class TableOfContents (line 26) | public final class TableOfContents {
    method TableOfContents (line 83) | public TableOfContents() {
    method getSectionByType (line 87) | public Section getSectionByType(int type) {
    method readFrom (line 155) | public void readFrom(Dex dex) throws IOException {
    method readHeader (line 165) | private void readHeader(Dex.Section headerIn) throws UnsupportedEncodi...
    method readMap (line 206) | private void readMap(Dex.Section in) throws IOException {
    method computeSizesFromOffsets (line 243) | public void computeSizesFromOffsets() {
    method getSection (line 268) | private Section getSection(short type) {
    method writeHeader (line 277) | public void writeHeader(Dex.Section out) throws IOException {
    method writeMap (line 303) | public void writeMap(Dex.Section out) throws IOException {
    class Section (line 322) | public static class Section implements Comparable<Section> {
      method Section (line 331) | public Section(int type, boolean isElementFourByteAligned) {
      method exists (line 344) | public boolean exists() {
      method remapTypeOrderId (line 348) | private int remapTypeOrderId(int type) {
      method compareTo (line 416) | public int compareTo(Section section) {
      method toString (line 431) | @Override
      class Item (line 436) | public static abstract class Item<T> implements Comparable<T> {
        method Item (line 439) | public Item(int off) {
        method hashCode (line 443) | @Override
        method equals (line 448) | @Override
        method byteCountInDex (line 454) | public abstract int byteCountInDex();

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TypeList.java
  class TypeList (line 24) | public final class TypeList extends Item<TypeList> {
    method TypeList (line 29) | public TypeList(int off, short[] types) {
    method compareTo (line 34) | @Override public int compareTo(TypeList other) {
    method hashCode (line 38) | @Override
    method equals (line 43) | @Override
    method byteCountInDex (line 51) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/io/DexDataBuffer.java
  class DexDataBuffer (line 53) | public class DexDataBuffer implements ByteInput, ByteOutput {
    method DexDataBuffer (line 64) | public DexDataBuffer() {
    method DexDataBuffer (line 72) | public DexDataBuffer(ByteBuffer data) {
    method DexDataBuffer (line 79) | public DexDataBuffer(ByteBuffer data, boolean isResizeAllowed) {
    method position (line 86) | public int position() {
    method position (line 90) | public void position(int pos) {
    method available (line 94) | public int available() {
    method ensureBufferSize (line 98) | private void ensureBufferSize(int bytes) {
    method array (line 113) | public byte[] array() {
    method readByte (line 120) | @Override
    method readUnsignedByte (line 125) | public int readUnsignedByte() {
    method readShort (line 129) | public short readShort() {
    method readUnsignedShort (line 133) | public int readUnsignedShort() {
    method readInt (line 137) | public int readInt() {
    method readByteArray (line 141) | public byte[] readByteArray(int length) {
    method readShortArray (line 147) | public short[] readShortArray(int length) {
    method readUleb128 (line 158) | public int readUleb128() {
    method readUleb128p1 (line 162) | public int readUleb128p1() {
    method readSleb128 (line 166) | public int readSleb128() {
    method readStringData (line 170) | public StringData readStringData() {
    method readTypeList (line 185) | public TypeList readTypeList() {
    method readFieldId (line 192) | public FieldId readFieldId() {
    method readMethodId (line 200) | public MethodId readMethodId() {
    method readProtoId (line 208) | public ProtoId readProtoId() {
    method readCallSiteId (line 216) | public CallSiteId readCallSiteId() {
    method readMethodHandle (line 222) | public MethodHandle readMethodHandle() {
    method readClassDef (line 231) | public ClassDef readClassDef() {
    method readCode (line 246) | public Code readCode() {
    method readCatchHandlers (line 282) | private Code.CatchHandler[] readCatchHandlers() {
    method readTries (line 293) | private Code.Try[] readTries(int triesSize, Code.CatchHandler[] catchH...
    method findCatchHandlerIndex (line 305) | private int findCatchHandlerIndex(Code.CatchHandler[] catchHandlers, i...
    method readCatchHandler (line 315) | private Code.CatchHandler readCatchHandler(int offset) {
    method readDebugInfoItem (line 328) | public DebugInfoItem readDebugInfoItem() {
    method readClassData (line 416) | public ClassData readClassData() {
    method readFields (line 429) | private ClassData.Field[] readFields(int count) {
    method readMethods (line 440) | private ClassData.Method[] readMethods(int count) {
    method getBytesFrom (line 456) | private byte[] getBytesFrom(int start) {
    method readAnnotation (line 464) | public Annotation readAnnotation() {
    method readAnnotationSet (line 472) | public AnnotationSet readAnnotationSet() {
    method readAnnotationSetRefList (line 482) | public AnnotationSetRefList readAnnotationSetRefList() {
    method readAnnotationsDirectory (line 492) | public AnnotationsDirectory readAnnotationsDirectory() {
    method readEncodedArray (line 526) | public EncodedValue readEncodedArray() {
    method skip (line 532) | public void skip(int count) {
    method skipWithAutoExpand (line 539) | public void skipWithAutoExpand(int count) {
    method alignToFourBytes (line 547) | public void alignToFourBytes() {
    method alignToFourBytesWithZeroFill (line 554) | public void alignToFourBytesWithZeroFill() {
    method writeByte (line 565) | @Override
    method writeShort (line 574) | public void writeShort(short i) {
    method writeUnsignedShort (line 582) | public void writeUnsignedShort(int i) {
    method writeInt (line 590) | public void writeInt(int i) {
    method write (line 598) | public void write(byte[] bytes) {
    method write (line 606) | public void write(short[] shorts) {
    method writeUleb128 (line 616) | public void writeUleb128(int i) {
    method writeUleb128p1 (line 620) | public void writeUleb128p1(int i) {
    method writeSleb128 (line 624) | public void writeSleb128(int i) {
    method writeStringData (line 633) | public int writeStringData(StringData stringData) {
    method writeTypeList (line 651) | public int writeTypeList(TypeList typeList) {
    method writeFieldId (line 666) | public int writeFieldId(FieldId fieldId) {
    method writeMethodId (line 679) | public int writeMethodId(MethodId methodId) {
    method writeProtoId (line 692) | public int writeProtoId(ProtoId protoId) {
    method writeCallSiteId (line 705) | public int writeCallSiteId(CallSiteId callSiteId) {
    method writeMethodHandle (line 716) | public int writeMethodHandle(MethodHandle methodHandle) {
    method writeClassDef (line 730) | public int writeClassDef(ClassDef classDef) {
    method writeCode (line 748) | public int writeCode(Code code) {
    method writeCatchHandlers (line 779) | private int[] writeCatchHandlers(Code.CatchHandler[] catchHandlers) {
    method writeCatchHandler (line 790) | private void writeCatchHandler(Code.CatchHandler catchHandler) {
    method writeTries (line 811) | private void writeTries(Code.Try[] tries, int[] catchHandlerOffsets) {
    method writeDebugInfoItem (line 824) | public int writeDebugInfoItem(DebugInfoItem debugInfoItem) {
    method writeClassData (line 847) | public int writeClassData(ClassData classData) {
    method writeFields (line 860) | private void writeFields(ClassData.Field[] fields) {
    method writeMethods (line 869) | private void writeMethods(ClassData.Method[] methods) {
    method writeAnnotation (line 884) | public int writeAnnotation(Annotation annotation) {
    method writeAnnotationSet (line 896) | public int writeAnnotationSet(AnnotationSet annotationSet) {
    method writeAnnotationSetRefList (line 910) | public int writeAnnotationSetRefList(AnnotationSetRefList annotationSe...
    method writeAnnotationsDirectory (line 924) | public int writeAnnotationsDirectory(AnnotationsDirectory annotationsD...
    method writeEncodedArray (line 953) | public int writeEncodedArray(EncodedValue encodedValue) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteInput.java
  type ByteInput (line 22) | public interface ByteInput {
    method readByte (line 29) | byte readByte();

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteOutput.java
  type ByteOutput (line 22) | public interface ByteOutput {
    method writeByte (line 29) | void writeByte(int i);

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/CompareUtils.java
  class CompareUtils (line 25) | public final class CompareUtils {
    method CompareUtils (line 26) | private CompareUtils() { }
    method uCompare (line 28) | public static int uCompare(byte ubyteA, byte ubyteB) {
    method uCompare (line 37) | public static int uCompare(short ushortA, short ushortB) {
    method uCompare (line 46) | public static int uCompare(int uintA, int uintB) {
    method uArrCompare (line 55) | public static int uArrCompare(byte[] ubyteArrA, byte[] ubyteArrB) {
    method uArrCompare (line 74) | public static int uArrCompare(short[] ushortArrA, short[] ushortArrB) {
    method uArrCompare (line 93) | public static int uArrCompare(int[] uintArrA, int[] uintArrB) {
    method sCompare (line 112) | public static int sCompare(byte sbyteA, byte sbyteB) {
    method sCompare (line 119) | public static int sCompare(short sshortA, short sshortB) {
    method sCompare (line 126) | public static int sCompare(int sintA, int sintB) {
    method sCompare (line 133) | public static int sCompare(long slongA, long slongB) {
    method sArrCompare (line 140) | public static int sArrCompare(byte[] sbyteArrA, byte[] sbyteArrB) {
    method sArrCompare (line 159) | public static int sArrCompare(short[] sshortArrA, short[] sshortArrB) {
    method sArrCompare (line 178) | public static int sArrCompare(int[] sintArrA, int[] sintArrB) {
    method sArrCompare (line 197) | public static int sArrCompare(long[] slongArrA, long[] slongArrB) {
    method aArrCompare (line 216) | public static <T extends Comparable<T>> int aArrCompare(T[] aArrA, T[]...
    method aArrCompare (line 235) | public static <T> int aArrCompare(T[] aArrA, T[] aArrB, Comparator<T> ...

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/FileUtils.java
  class FileUtils (line 30) | public final class FileUtils {
    method FileUtils (line 31) | private FileUtils() {
    method readFile (line 41) | public static byte[] readFile(String fileName) throws IOException {
    method readFile (line 54) | public static byte[] readFile(File file) throws IOException {
    method readStream (line 96) | public static byte[] readStream(InputStream is) throws IOException {
    method readStream (line 100) | public static byte[] readStream(InputStream is, int initSize) throws I...
    method hasArchiveSuffix (line 116) | public static boolean hasArchiveSuffix(String fileName) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/HashCodeHelper.java
  class HashCodeHelper (line 6) | public final class HashCodeHelper {
    method hash (line 7) | public static int hash(Object... values) {
    method HashCodeHelper (line 47) | private HashCodeHelper() {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/CodeCursor.java
  class CodeCursor (line 24) | public abstract class CodeCursor {
    method CodeCursor (line 34) | public CodeCursor() {
    method cursor (line 45) | public final int cursor() {
    method baseAddressForCursor (line 57) | public final int baseAddressForCursor() {
    method setBaseAddress (line 71) | public final void setBaseAddress(int targetAddress, int baseAddress) {
    method reset (line 78) | public void reset() {
    method advance (line 86) | protected final void advance(int amount) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionCodec.java
  class InstructionCodec (line 30) | public final class InstructionCodec {
    method InstructionCodec (line 107) | private InstructionCodec() {
    method decode (line 111) | public static void decode(ShortArrayCodeInput in, InstructionVisitor i...
    method encode (line 456) | public static void encode(ShortArrayCodeOutput out, InstructionWriter ...
    method codeUnit (line 639) | public static short codeUnit(int lowByte, int highByte) {
    method codeUnit (line 651) | public static short codeUnit(int nibble0, int nibble1, int nibble2,
    method makeByte (line 673) | public static int makeByte(int lowNibble, int highNibble) {
    method asUnsignedUnit (line 685) | public static short asUnsignedUnit(int value) {
    method unit0 (line 693) | public static short unit0(int value) {
    method unit1 (line 697) | public static short unit1(int value) {
    method unit0 (line 701) | public static short unit0(long value) {
    method unit1 (line 705) | public static short unit1(long value) {
    method unit2 (line 709) | public static short unit2(long value) {
    method unit3 (line 713) | public static short unit3(long value) {
    method byte0 (line 717) | private static int byte0(int value) {
    method byte1 (line 721) | private static int byte1(int value) {
    method nibble0 (line 725) | private static int nibble0(int value) {
    method nibble1 (line 729) | private static int nibble1(int value) {
    method nibble2 (line 733) | private static int nibble2(int value) {
    method nibble3 (line 737) | private static int nibble3(int value) {
    method getTargetByte (line 741) | public static int getTargetByte(int target, int baseAddress) {
    method getTargetUnit (line 755) | public static short getTargetUnit(int target, int baseAddress) {
    method getTarget (line 769) | public static int getTarget(int target, int baseAddress) {
    method getLiteralByte (line 773) | public static int getLiteralByte(long literal) {
    method getLiteralUnit (line 781) | public static short getLiteralUnit(long literal) {
    method getLiteralInt (line 789) | public static int getLiteralInt(long literal) {
    method getLiteralNibble (line 797) | public static int getLiteralNibble(long literal) {
    method getAUnit (line 809) | public static short getAUnit(int a) {
    method getBUnit (line 821) | public static short getBUnit(int b) {
    method getCUnit (line 833) | public static short getCUnit(int c) {
    method getInstructionIndexType (line 841) | public static int getInstructionIndexType(int opcode) {
    method getInstructionFormat (line 1095) | public static int getInstructionFormat(int opcode) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionComparator.java
  class InstructionComparator (line 33) | public abstract class InstructionComparator {
    method InstructionComparator (line 40) | public InstructionComparator(short[] insns1, short[] insns2) {
    method readInstructionsIntoHolders (line 59) | private InstructionHolder[] readInstructionsIntoHolders(ShortArrayCode...
    method compare (line 229) | public final boolean compare() {
    method getPromotedOpCodeOnDemand (line 282) | private int getPromotedOpCodeOnDemand(InstructionHolder insn) {
    method isSameInstruction (line 292) | public boolean isSameInstruction(int insnAddress1, int insnAddress2) {
    method isSameInstruction (line 298) | public boolean isSameInstruction(InstructionHolder insnHolder1, Instru...
    method compareIndex (line 463) | private boolean compareIndex(int opcode, int index1, int index2) {
    method compareString (line 493) | protected abstract boolean compareString(int stringIndex1, int stringI...
    method compareType (line 495) | protected abstract boolean compareType(int typeIndex1, int typeIndex2);
    method compareField (line 497) | protected abstract boolean compareField(int fieldIndex1, int fieldInde...
    method compareMethod (line 499) | protected abstract boolean compareMethod(int methodIndex1, int methodI...
    method compareCallSite (line 501) | protected abstract boolean compareCallSite(int callsiteIndex1, int cal...
    method compareMethodHandle (line 503) | protected abstract boolean compareMethodHandle(int methodHandleIndex1,...
    method compareProto (line 505) | protected abstract boolean compareProto(int protoIndex1, int protoInde...
    class InstructionHolder (line 507) | private static class InstructionHolder {
    class SparseSwitchPayloadInsntructionHolder (line 524) | private static class SparseSwitchPayloadInsntructionHolder extends Ins...
    class PackedSwitchPayloadInsntructionHolder (line 529) | private static class PackedSwitchPayloadInsntructionHolder extends Ins...
    class FillArrayDataPayloadInstructionHolder (line 534) | private static class FillArrayDataPayloadInstructionHolder extends Ins...

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionPromoter.java
  class InstructionPromoter (line 28) | public final class InstructionPromoter extends InstructionVisitor {
    method InstructionPromoter (line 35) | public InstructionPromoter() {
    method mapAddressIfNeeded (line 39) | private void mapAddressIfNeeded(int currentAddress) {
    method getPromotedAddress (line 45) | public int getPromotedAddress(int currentAddress) {
    method getPromotedAddressCount (line 54) | public int getPromotedAddressCount() {
    method visitZeroRegisterInsn (line 58) | @Override
    method visitOneRegisterInsn (line 109) | @Override
    method visitTwoRegisterInsn (line 195) | @Override
    method visitThreeRegisterInsn (line 327) | @Override
    method visitFourRegisterInsn (line 400) | @Override
    method visitFiveRegisterInsn (line 419) | @Override
    method visitRegisterRangeInsn (line 439) | @Override
    method visitInvokePolymorphicInstruction (line 459) | public void visitInvokePolymorphicInstruction(int currentAddress, int ...
    method visitInvokePolymorphicRangeInstruction (line 467) | public void visitInvokePolymorphicRangeInstruction(int currentAddress,...
    method visitSparseSwitchPayloadInsn (line 475) | @Override
    method visitPackedSwitchPayloadInsn (line 486) | @Override
    method visitFillArrayDataPayloadInsn (line 495) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionReader.java
  class InstructionReader (line 26) | public final class InstructionReader {
    method InstructionReader (line 29) | public InstructionReader(ShortArrayCodeInput in) {
    method accept (line 33) | public void accept(InstructionVisitor iv) throws EOFException {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionVisitor.java
  class InstructionVisitor (line 24) | public class InstructionVisitor {
    method InstructionVisitor (line 27) | public InstructionVisitor(InstructionVisitor iv) {
    method visitZeroRegisterInsn (line 31) | public void visitZeroRegisterInsn(int currentAddress, int opcode, int ...
    method visitOneRegisterInsn (line 37) | public void visitOneRegisterInsn(int currentAddress, int opcode, int i...
    method visitTwoRegisterInsn (line 43) | public void visitTwoRegisterInsn(int currentAddress, int opcode, int i...
    method visitThreeRegisterInsn (line 49) | public void visitThreeRegisterInsn(int currentAddress, int opcode, int...
    method visitFourRegisterInsn (line 55) | public void visitFourRegisterInsn(int currentAddress, int opcode, int ...
    method visitFiveRegisterInsn (line 61) | public void visitFiveRegisterInsn(int currentAddress, int opcode, int ...
    method visitRegisterRangeInsn (line 67) | public void visitRegisterRangeInsn(int currentAddress, int opcode, int...
    method visitInvokePolymorphicInstruction (line 73) | public void visitInvokePolymorphicInstruction(int currentAddress, int ...
    method visitInvokePolymorphicRangeInstruction (line 79) | public void visitInvokePolymorphicRangeInstruction(int currentAddress,...
    method visitSparseSwitchPayloadInsn (line 85) | public void visitSparseSwitchPayloadInsn(int currentAddress, int opcod...
    method visitPackedSwitchPayloadInsn (line 91) | public void visitPackedSwitchPayloadInsn(int currentAddress, int opcod...
    method visitFillArrayDataPayloadInsn (line 97) | public void visitFillArrayDataPayloadInsn(int currentAddress, int opco...

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionWriter.java
  class InstructionWriter (line 29) | public final class InstructionWriter extends InstructionVisitor {
    method InstructionWriter (line 56) | public InstructionWriter(ShortArrayCodeOutput codeOut, InstructionProm...
    method visitZeroRegisterInsn (line 63) | public void visitZeroRegisterInsn(int currentAddress, int opcode, int ...
    method visitOneRegisterInsn (line 107) | public void visitOneRegisterInsn(int currentAddress, int opcode, int i...
    method visitTwoRegisterInsn (line 141) | public void visitTwoRegisterInsn(int currentAddress, int opcode, int i...
    method visitThreeRegisterInsn (line 162) | public void visitThreeRegisterInsn(int currentAddress, int opcode, int...
    method visitFourRegisterInsn (line 179) | public void visitFourRegisterInsn(int currentAddress, int opcode, int ...
    method visitFiveRegisterInsn (line 196) | public void visitFiveRegisterInsn(int currentAddress, int opcode, int ...
    method visitRegisterRangeInsn (line 213) | public void visitRegisterRangeInsn(int currentAddress, int opcode, int...
    method visitInvokePolymorphicInstruction (line 230) | @Override
    method visitInvokePolymorphicRangeInstruction (line 247) | @Override
    method visitSparseSwitchPayloadInsn (line 264) | public void visitSparseSwitchPayloadInsn(int currentAddress, int opcod...
    method visitPackedSwitchPayloadInsn (line 287) | public void visitPackedSwitchPayloadInsn(int currentAddress, int opcod...
    method visitFillArrayDataPayloadInsn (line 310) | public void visitFillArrayDataPayloadInsn(int currentAddress, int opco...

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/Opcodes.java
  class Opcodes (line 23) | public final class Opcodes {
    method Opcodes (line 279) | private Opcodes() {
    method extractOpcodeFromUnit (line 290) | public static int extractOpcodeFromUnit(int opcodeUnit) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeInput.java
  class ShortArrayCodeInput (line 24) | public final class ShortArrayCodeInput extends CodeCursor {
    method ShortArrayCodeInput (line 31) | public ShortArrayCodeInput(short[] array) {
    method hasMore (line 43) | public boolean hasMore() {
    method read (line 50) | public int read() throws EOFException {
    method readInt (line 63) | public int readInt() throws EOFException {
    method readLong (line 73) | public long readLong() throws EOFException {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeOutput.java
  class ShortArrayCodeOutput (line 22) | public final class ShortArrayCodeOutput extends CodeCursor {
    method ShortArrayCodeOutput (line 31) | public ShortArrayCodeOutput(int initSize) {
    method ShortArrayCodeOutput (line 43) | public ShortArrayCodeOutput(short[] array) {
    method getArray (line 54) | public short[] getArray() {
    method write (line 69) | public void write(short codeUnit) {
    method write (line 78) | public void write(short u0, short u1) {
    method write (line 86) | public void write(short u0, short u1, short u2) {
    method write (line 95) | public void write(short u0, short u1, short u2, short u3) {
    method write (line 105) | public void write(short u0, short u1, short u2, short u3, short u4) {
    method writeInt (line 116) | public void writeInt(int value) {
    method writeLong (line 124) | public void writeLong(long value) {
    method write (line 134) | public void write(byte[] data) {
    method write (line 156) | public void write(short[] data) {
    method write (line 165) | public void write(int[] data) {
    method write (line 174) | public void write(long[] data) {
    method ensureArrayLength (line 180) | private void ensureArrayLength(int shortCountToWrite) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/Hex.java
  class Hex (line 22) | public final class Hex {
    method Hex (line 26) | private Hex() {
    method u8 (line 36) | public static String u8(long v) {
    method u4 (line 52) | public static String u4(int v) {
    method u3 (line 68) | public static String u3(int v) {
    method u2 (line 84) | public static String u2(int v) {
    method u2or4 (line 102) | public static String u2or4(int v) {
    method u1 (line 116) | public static String u1(int v) {
    method uNibble (line 132) | public static String uNibble(int v) {
    method s8 (line 145) | public static String s8(long v) {
    method s4 (line 169) | public static String s4(int v) {
    method s2 (line 193) | public static String s2(int v) {
    method s1 (line 217) | public static String s1(int v) {
    method dump (line 249) | public static String dump(byte[] arr, int offset, int length,
    method toHexString (line 303) | public static String toHexString(byte[] ubytes) {

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseBoolArray.java
  class SparseBoolArray (line 40) | public class SparseBoolArray implements Cloneable {
    class KeyNotFoundException (line 47) | public static class KeyNotFoundException extends Exception {
      method KeyNotFoundException (line 48) | public KeyNotFoundException() {
      method KeyNotFoundException (line 52) | public KeyNotFoundException(String msg) {
    method SparseBoolArray (line 60) | public SparseBoolArray() {
    method SparseBoolArray (line 71) | public SparseBoolArray(int initialCapacity) {
    method growSize (line 87) | private static int growSize(int currentSize) {
    method clone (line 91) | @Override
    method get (line 108) | public boolean get(int key) throws KeyNotFoundException {
    method delete (line 121) | public void delete(int key) {
    method removeAt (line 132) | public void removeAt(int index) {
    method put (line 143) | public void put(int key, boolean value) {
    method size (line 160) | public int size() {
    method keyAt (line 174) | public int keyAt(int index) {
    method valueAt (line 189) | public boolean valueAt(int index) {
    method indexOfKey (line 198) | public int indexOfKey(int key) {
    method containsKey (line 205) | public boolean containsKey(int key) {
    method indexOfValue (line 217) | public int indexOfValue(boolean value) {
    method clear (line 229) | public void clear() {
    method append (line 237) | public void append(int key, boolean value) {
    method binarySearch (line 248) | private int binarySearch(int[] array, int size, int value) {
    method appendElementIntoIntArray (line 267) | private int[] appendElementIntoIntArray(int[] array, int currentSize, ...
    method appendElementIntoBoolArray (line 280) | private boolean[] appendElementIntoBoolArray(boolean[] array, int curr...
    method insertElementIntoIntArray (line 293) | private int[] insertElementIntoIntArray(int[] array, int currentSize, ...
    method insertElementIntoBoolArray (line 311) | private boolean[] insertElementIntoBoolArray(boolean[] array, int curr...
    method toString (line 334) | @Override

FILE: third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseIntArray.java
  class SparseIntArray (line 40) | public class SparseIntArray implements Cloneable {
    method SparseIntArray (line 49) | public SparseIntArray() {
    method SparseIntArray (line 60) | public SparseIntArray(int initialCapacity) {
    method growSize (line 76) | public static int growSize(int currentSize) {
    method clone (line 80) | @Override
    method get (line 97) | public int get(int key) {
    method get (line 105) | public int get(int key, int valueIfKeyNotFound) {
    method delete (line 118) | public void delete(int key) {
    method removeAt (line 129) | public void removeAt(int index) {
    method put (line 140) | public void put(int key, int value) {
    method size (line 157) | public int size() {
    method keyAt (line 171) | public int keyAt(int index) {
    method valueAt (line 186) | public int valueAt(int index) {
    method indexOfKey (line 195) | public int indexOfKey(int key) {
    method containsKey (line 202) | public boolean containsKey(int key) {
    method indexOfValue (line 214) | public int indexOfValue(int value) {
    method clear (line 226) | public void clear() {
    method append (line 234) | public void append(int key, int value) {
    method binarySearch (line 245) | private int binarySearch(int[] array, int size, int value) {
    method appendElementIntoIntArray (line 264) | private int[] appendElementIntoIntArray(int[] array, int currentSize, ...
    method insertElementIntoIntArray (line 277) | private int[] insertElementIntoIntArray(int[] array, int currentSize, ...
    method toString (line 300) | @Override

FILE: third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSDiff.java
  class BSDiff (line 47) | public class BSDiff {
    method split (line 55) | private static void split(int[] arrayI, int[] arrayV, int start, int l...
    method qsufsort (line 305) | private static void qsufsort(int[] arrayI, int[] arrayV, byte[] oldBuf...
    method search (line 382) | private static int search(int[] arrayI, byte[] oldBuf, int oldSize, by...
    method matchlen (line 410) | private static int matchlen(byte[] oldBuf, int oldSize, int oldOffset,...
    method memcmp (line 426) | private static int memcmp(byte[] s1, int s1Size, int s1offset, byte[] ...
    method bsdiff (line 444) | public static void bsdiff(File oldFile, File newFile, File diffFile) t...
    method bsdiff (line 457) | public static byte[] bsdiff(InputStream oldInputStream, int oldsize, I...
    method bsdiff (line 472) | public static byte[] bsdiff(byte[] oldBuf, int oldsize, byte[] newBuf,...
    method main (line 695) | public static void main(String[] args) throws IOException {
    class IntByRef (line 702) | private static class IntByRef {

FILE: third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSPatch.java
  class BSPatch (line 48) | public class BSPatch {
    method patchLessMemory (line 75) | public static int patchLessMemory(RandomAccessFile oldFile, File newFi...
    method patchLessMemory (line 101) | public static int patchLessMemory(RandomAccessFile oldFile, int oldsiz...
    method patchFast (line 216) | public static int patchFast(File oldFile, File newFile, File diffFile,...
    method patchFast (line 252) | public static int patchFast(InputStream oldInputStream, InputStream di...
    method patchFast (line 277) | public static byte[] patchFast(InputStream oldInputStream, InputStream...
    method patchFast (line 297) | public static byte[] patchFast(InputStream oldInputStream, int oldsize...
    method patchFast (line 310) | public static byte[] patchFast(byte[] oldBuf, int oldsize, byte[] diff...

FILE: third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSUtil.java
  class BSUtil (line 35) | public class BSUtil {
    method readFromStream (line 52) | public static final boolean readFromStream(InputStream in, byte[] buf,...
    method inputStreamToByte (line 71) | public static byte[] inputStreamToByte(InputStream in) throws IOExcept...

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/AlignedZipOutputStream.java
  class AlignedZipOutputStream (line 17) | public class AlignedZipOutputStream extends DeflaterOutputStream {
    method AlignedZipOutputStream (line 104) | public AlignedZipOutputStream(OutputStream os) {
    method AlignedZipOutputStream (line 112) | public AlignedZipOutputStream(OutputStream os, int alignBytes) {
    method close (line 124) | @Override
    method closeEntry (line 143) | public void closeEntry() throws IOException {
    method finish (line 237) | @Override
    method getPaddingByteCount (line 268) | private int getPaddingByteCount(ZipEntry entry, int entryFileOffset) {
    method makePaddingToStream (line 275) | private void makePaddingToStream(OutputStream os, int padding) throws ...
    method putNextEntry (line 296) | public void putNextEntry(ZipEntry ze) throws IOException {
    method setComment (line 389) | public void setComment(String comment) {
    method setLevel (line 406) | public void setLevel(int level) {
    method setMethod (line 417) | public void setMethod(int method) {
    method writeLong (line 424) | private long writeLong(OutputStream os, long i) throws IOException {
    method writeShort (line 433) | private int writeShort(OutputStream os, int i) throws IOException {
    method write (line 442) | @Override
    method write (line 456) | @Override
    method checkOffsetAndCount (line 472) | private void checkOffsetAndCount(int arrayLength, int offset, int coun...
    method checkOpen (line 479) | private void checkOpen() throws IOException {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/Arrays.java
  class Arrays (line 22) | public class Arrays {
    method checkOffsetAndCount (line 23) | public static void checkOffsetAndCount(int arrayLength, int offset, in...

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/BufferIterator.java
  class BufferIterator (line 22) | public abstract class BufferIterator {
    method seek (line 26) | public abstract void seek(int offset);
    method skip (line 30) | public abstract void skip(int byteCount);
    method readInt (line 32) | public abstract int readInt();
    method readShort (line 34) | public abstract short readShort();

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/HeapBufferIterator.java
  class HeapBufferIterator (line 26) | public final class HeapBufferIterator extends BufferIterator {
    method HeapBufferIterator (line 32) | HeapBufferIterator(byte[] buffer, int offset, int byteCount, ByteOrder...
    method iterator (line 43) | public static BufferIterator iterator(byte[] buffer, int offset, int b...
    method seek (line 47) | public void seek(int offset) {
    method skip (line 51) | public void skip(int byteCount) {
    method readByteArray (line 55) | public void readByteArray(byte[] dst, int dstOffset, int byteCount) {
    method readByte (line 60) | public byte readByte() {
    method readInt (line 66) | public int readInt() {
    method readShort (line 72) | public short readShort() {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/Memory.java
  class Memory (line 24) | public final class Memory {
    method Memory (line 25) | private Memory() { }
    method peekInt (line 27) | public static int peekInt(byte[] src, int offset, ByteOrder order) {
    method peekLong (line 40) | public static long peekLong(byte[] src, int offset, ByteOrder order) {
    method peekShort (line 63) | public static short peekShort(byte[] src, int offset, ByteOrder order) {
    method pokeInt (line 70) | public static void pokeInt(byte[] dst, int offset, int value, ByteOrde...
    method pokeLong (line 83) | public static void pokeLong(byte[] dst, int offset, long value, ByteOr...
    method pokeShort (line 108) | public static void pokeShort(byte[] dst, int offset, short value, Byte...

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/SizeOf.java
  class SizeOf (line 22) | public final class SizeOf {
    method SizeOf (line 29) | private SizeOf() {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/StandardCharsets.java
  class StandardCharsets (line 24) | public final class StandardCharsets {
    method StandardCharsets (line 27) | private StandardCharsets() {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/Streams.java
  class Streams (line 33) | public final class Streams {
    method Streams (line 35) | private Streams() {
    method readSingleByte (line 42) | public static int readSingleByte(InputStream in) throws IOException {
    method writeSingleByte (line 52) | public static void writeSingleByte(OutputStream out, int b) throws IOE...
    method readFully (line 60) | public static void readFully(InputStream in, byte[] dst) throws IOExce...
    method readFully (line 70) | public static void readFully(InputStream in, byte[] dst, int offset, i...
    method readFully (line 93) | public static byte[] readFully(InputStream in) throws IOException {
    method readFullyNoClose (line 103) | public static byte[] readFullyNoClose(InputStream in) throws IOExcepti...
    method readFully (line 115) | public static String readFully(Reader reader) throws IOException {
    method skipAll (line 128) | public static void skipAll(InputStream in) throws IOException {
    method skipByReading (line 145) | public static long skipByReading(InputStream in, long byteCount) throw...
    method copy (line 171) | public static int copy(InputStream in, OutputStream out) throws IOExce...
    method readAsciiLine (line 188) | public static String readAsciiLine(InputStream in) throws IOException {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipEntry.java
  class TinkerZipEntry (line 39) | public class TinkerZipEntry implements ZipConstants, Cloneable {
    method TinkerZipEntry (line 60) | public TinkerZipEntry(String name, String comment, long crc, long comp...
    method TinkerZipEntry (line 82) | public TinkerZipEntry(String name) {
    method TinkerZipEntry (line 96) | public TinkerZipEntry(TinkerZipEntry ze) {
    method TinkerZipEntry (line 110) | public TinkerZipEntry(TinkerZipEntry ze, String name) {
    method TinkerZipEntry (line 133) | TinkerZipEntry(byte[] cdeHdrBuf, InputStream cdStream, Charset default...
    method containsNulByte (line 185) | private static boolean containsNulByte(byte[] bytes) {
    method validateStringLength (line 194) | private static void validateStringLength(String argument, String strin...
    method getComment (line 208) | public String getComment() {
    method setComment (line 216) | public void setComment(String comment) {
    method getCompressedSize (line 231) | public long getCompressedSize() {
    method setCompressedSize (line 241) | public void setCompressedSize(long value) {
    method getCrc (line 250) | public long getCrc() {
    method setCrc (line 262) | public void setCrc(long value) {
    method getExtra (line 276) | public byte[] getExtra() {
    method setExtra (line 285) | public void setExtra(byte[] data) {
    method getMethod (line 298) | public int getMethod() {
    method setMethod (line 312) | public void setMethod(int value) {
    method getName (line 329) | public String getName() {
    method getSize (line 339) | public long getSize() {
    method setSize (line 349) | public void setSize(long value) {
    method getTime (line 362) | public long getTime() {
    method setTime (line 381) | public void setTime(long value) {
    method isDirectory (line 404) | public boolean isDirectory() {
    method getDataOffset (line 409) | public long getDataOffset() {
    method setDataOffset (line 414) | public void setDataOffset(long value) {
    method toString (line 423) | @Override
    method clone (line 443) | @Override public Object clone() {
    method hashCode (line 458) | @Override
    method equals (line 463) | @Override

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipFile.java
  class TinkerZipFile (line 50) | public class TinkerZipFile implements Closeable, ZipConstants {
    method TinkerZipFile (line 106) | public TinkerZipFile(File file) throws ZipException, IOException {
    method TinkerZipFile (line 116) | public TinkerZipFile(String name) throws IOException {
    method TinkerZipFile (line 131) | public TinkerZipFile(File file, int mode) throws IOException {
    method isEmpty (line 153) | public static boolean isEmpty(CharSequence str) {
    method equals (line 181) | public static boolean equals(CharSequence a, CharSequence b) {
    method parseEocdRecord (line 197) | private static EocdRecord parseEocdRecord(RandomAccessFile raf, long o...
    method throwZipException (line 231) | static void throwZipException(String filename, long fileSize, String e...
    method close (line 248) | public void close() throws IOException {
    method checkNotClosed (line 263) | private void checkNotClosed() {
    method entries (line 279) | public Enumeration<? extends TinkerZipEntry> entries() {
    method getComment (line 301) | public String getComment() {
    method getEntry (line 311) | public TinkerZipEntry getEntry(String entryName) {
    method getInputStream (line 333) | public InputStream getInputStream(TinkerZipEntry entry) throws IOExcep...
    method getName (line 387) | public String getName() {
    method size (line 397) | public int size() {
    method readCentralDir (line 415) | private void readCentralDir() throws IOException {
    class EocdRecord (line 495) | static class EocdRecord {
      method EocdRecord (line 499) | EocdRecord(long numEntries, long centralDirOffset, int commentLength) {
    class RAFStream (line 516) | public static class RAFStream extends InputStream {
      method RAFStream (line 520) | public RAFStream(RandomAccessFile raf, long initialOffset, long endO...
      method RAFStream (line 525) | public RAFStream(RandomAccessFile raf, long initialOffset) throws IO...
      method available (line 528) | @Override public int available() throws IOException {
      method read (line 531) | @Override public int read() throws IOException {
      method read (line 534) | @Override public int read(byte[] buffer, int byteOffset, int byteCou...
      method skip (line 550) | @Override public long skip(long byteCount) throws IOException {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipOutputStream.java
  class TinkerZipOutputStream (line 73) | public class TinkerZipOutputStream extends FilterOutputStream implements...
    method TinkerZipOutputStream (line 132) | public TinkerZipOutputStream(OutputStream os) {
    method TinkerZipOutputStream (line 138) | public TinkerZipOutputStream(OutputStream os, boolean forceZip64) {
    method TinkerZipOutputStream (line 142) | public TinkerZipOutputStream(OutputStream os, boolean forceZip64, int ...
    method writeLongAsUint32 (line 158) | static long writeLongAsUint32(OutputStream os, long i) throws IOExcept...
    method writeLongAsUint64 (line 167) | static long writeLongAsUint64(OutputStream os, long i) throws IOExcept...
    method writeIntAsUint16 (line 181) | static int writeIntAsUint16(OutputStream os, int i) throws IOException {
    method close (line 194) | @Override
    method closeEntry (line 239) | public void closeEntry() throws IOException {
    method finish (line 372) | public void finish() throws IOException {
    method getPaddingByteCount (line 416) | private int getPaddingByteCount(TinkerZipEntry entry, long entryFileOf...
    method makePaddingToStream (line 423) | private void makePaddingToStream(OutputStream os, long padding) throws...
    method putNextEntry (line 444) | public void putNextEntry(TinkerZipEntry ze) throws IOException {
    method setComment (line 556) | public void setComment(String comment) {
    method write (line 572) | @Override
    method checkOpen (line 591) | private void checkOpen() throws IOException {
    method checkSizeIsWithinShort (line 596) | private void checkSizeIsWithinShort(String property, byte[] bytes) {

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipUtil.java
  class TinkerZipUtil (line 28) | public class TinkerZipUtil {
    method extractTinkerEntry (line 31) | public static void extractTinkerEntry(TinkerZipFile apk, TinkerZipEntr...
    method extractLargeModifyFile (line 49) | public static void extractLargeModifyFile(TinkerZipEntry sourceArscEnt...
    method validateZipEntryName (line 73) | public static boolean validateZipEntryName(File destDir, String entryN...

FILE: third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/ZipConstants.java
  type ZipConstants (line 26) | interface ZipConstants {

FILE: tinker-android/tinker-android-anno-support/src/main/java/com/tencent/tinker/anno/AnnotationProcessor.java
  class AnnotationProcessor (line 42) | @SupportedSourceVersion(SourceVersion.RELEASE_7)
    method getSupportedAnnotationTypes (line 48) | @Override
    method process (line 57) | @Override
    method processDefaultLifeCycle (line 64) | private void processDefaultLifeCycle(Set<? extends Element> elements) {

FILE: tinker-android/tinker-android-lib-no-op/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java
  class ApplicationTest (line 25) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 26) | public ApplicationTest() {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/library/TinkerLoadLibrary.java
  class TinkerLoadLibrary (line 29) | public class TinkerLoadLibrary {
    method loadArmLibrary (line 30) | public static void loadArmLibrary(Context context, String libName) {
    method loadArmLibraryWithoutTinkerInstalled (line 37) | public static void loadArmLibraryWithoutTinkerInstalled(ApplicationLik...
    method loadArmV7Library (line 44) | public static void loadArmV7Library(Context context, String libName) {
    method loadArmV7LibraryWithoutTinkerInstalled (line 51) | public static void loadArmV7LibraryWithoutTinkerInstalled(ApplicationL...
    method loadLibraryFromTinker (line 58) | public static boolean loadLibraryFromTinker(Context context, String re...
    method installNavitveLibraryABI (line 62) | public static boolean installNavitveLibraryABI(Context context, String...
    method installNativeLibraryABIWithoutTinkerInstalled (line 66) | public static boolean installNativeLibraryABIWithoutTinkerInstalled(Ap...

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java
  class DefaultPatchListener (line 29) | public class DefaultPatchListener implements PatchListener {
    method DefaultPatchListener (line 32) | public DefaultPatchListener(Context context) {
    method onPatchReceived (line 36) | @Override
    method checkPackageAndRunPatchService (line 41) | protected int checkPackageAndRunPatchService(String path, boolean useE...
    method patchCheck (line 47) | protected int patchCheck(String path, String patchMd5) {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java
  type PatchListener (line 22) | public interface PatchListener {
    method onPatchReceived (line 23) | int onPatchReceived(String path);

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java
  class AbstractPatch (line 26) | public abstract class AbstractPatch {
    method tryPatch (line 28) | public abstract boolean tryPatch(Context context, String tempPatchPath...

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java
  class UpgradePatch (line 30) | public class UpgradePatch extends AbstractPatch {
    method tryPatch (line 33) | @Override

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java
  class DefaultLoadReporter (line 30) | public class DefaultLoadReporter implements LoadReporter {
    method DefaultLoadReporter (line 33) | public DefaultLoadReporter(Context context) {
    method onLoadPatchListenerReceiveFail (line 38) | @Override
    method onLoadPatchVersionChanged (line 43) | @Override
    method onLoadInterpret (line 48) | @Override
    method onLoadFileNotFound (line 53) | @Override
    method onLoadFileMd5Mismatch (line 58) | @Override
    method onLoadPatchInfoCorrupted (line 63) | @Override
    method onLoadResult (line 68) | @Override
    method onLoadException (line 73) | @Override
    method onLoadPackageCheckFail (line 78) | @Override
    method checkAndCleanPatch (line 83) | public void checkAndCleanPatch() {
    method retryPatch (line 87) | public boolean retryPatch() {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java
  class DefaultPatchReporter (line 31) | public class DefaultPatchReporter implements PatchReporter {
    method DefaultPatchReporter (line 34) | public DefaultPatchReporter(Context context) {
    method onPatchServiceStart (line 39) | @Override
    method onPatchPackageCheckFail (line 44) | @Override
    method onPatchVersionCheckFail (line 49) | @Override
    method onPatchTypeExtractFail (line 54) | @Override
    method onPatchDexOptFail (line 59) | @Override
    method onPatchResult (line 64) | @Override
    method onPatchInfoCorrupted (line 69) | @Override
    method onPatchException (line 74) | @Override

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java
  type LoadReporter (line 24) | public interface LoadReporter {
    method onLoadPatchListenerReceiveFail (line 25) | void onLoadPatchListenerReceiveFail(File patchFile, int errorCode);
    method onLoadPatchVersionChanged (line 27) | void onLoadPatchVersionChanged(String oldVersion, String newVersion, F...
    method onLoadInterpret (line 29) | void onLoadInterpret(int type, Throwable e);
    method onLoadResult (line 31) | void onLoadResult(File patchDirectory, int loadCode, long cost);
    method onLoadException (line 33) | void onLoadException(Throwable e, int errorCode);
    method onLoadFileNotFound (line 35) | void onLoadFileNotFound(File file, int fileType, boolean isDirectory);
    method onLoadFileMd5Mismatch (line 37) | void onLoadFileMd5Mismatch(File file, int fileType);
    method onLoadPatchInfoCorrupted (line 39) | void onLoadPatchInfoCorrupted(String oldVersion, String newVersion, Fi...
    method onLoadPackageCheckFail (line 41) | void onLoadPackageCheckFail(File patchFile, int errorCode);

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java
  type PatchReporter (line 35) | public interface PatchReporter {
    method onPatchServiceStart (line 36) | void onPatchServiceStart(Intent intent);
    method onPatchPackageCheckFail (line 38) | void onPatchPackageCheckFail(File patchFile, int errorCode);
    method onPatchVersionCheckFail (line 40) | void onPatchVersionCheckFail(File patchFile, SharePatchInfo oldPatchIn...
    method onPatchTypeExtractFail (line 42) | void onPatchTypeExtractFail(File patchFile, File extractTo, String fil...
    method onPatchDexOptFail (line 44) | void onPatchDexOptFail(File patchFile, List<File> dexFiles, Throwable t);
    method onPatchResult (line 46) | void onPatchResult(File patchFile, boolean success, long cost);
    method onPatchException (line 48) | void onPatchException(File patchFile, Throwable e);
    method onPatchInfoCorrupted (line 50) | void onPatchInfoCorrupted(File patchFile, String oldVersion, String ne...

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java
  class AbstractResultService (line 28) | public abstract class AbstractResultService extends IntentService {
    method AbstractResultService (line 31) | public AbstractResultService() {
    method runResultService (line 35) | public static void runResultService(Context context, PatchResult resul...
    method onHandleIntent (line 39) | @Override
    method onPatchResult (line 44) | public abstract void onPatchResult(PatchResult result);

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java
  class DefaultTinkerResultService (line 27) | public class DefaultTinkerResultService extends AbstractResultService {
    method onPatchResult (line 30) | @Override
    method deleteRawPatchFile (line 35) | public void deleteRawPatchFile(File rawFile) {
    method checkIfNeedKill (line 39) | public boolean checkIfNeedKill(PatchResult result) {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/service/PatchResult.java
  class PatchResult (line 24) | public class PatchResult implements Serializable {
    method toString (line 40) | @Override

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java
  class Tinker (line 43) | public class Tinker {
    method Tinker (line 76) | private Tinker(Context context, int tinkerFlags, LoadReporter loadRepo...
    method with (line 99) | public static Tinker with(Context context) {
    method create (line 117) | public static void create(Tinker tinker) {
    method isTinkerInstalled (line 124) | public static boolean isTinkerInstalled() {
    method install (line 135) | public void install(Intent intentResult, Class<? extends AbstractResul...
    method setPatchServiceNotificationId (line 146) | public void setPatchServiceNotificationId(int id) {
    method getTinkerLoadResultIfPresent (line 153) | public TinkerLoadResult getTinkerLoadResultIfPresent() {
    method install (line 157) | public void install(Intent intentResult) {
    method getContext (line 161) | public Context getContext() {
    method isMainProcess (line 165) | public boolean isMainProcess() {
    method isPatchProcess (line 169) | public boolean isPatchProcess() {
    method setTinkerDisable (line 173) | public void setTinkerDisable() {
    method getLoadReporter (line 177) | public LoadReporter getLoadReporter() {
    method getPatchReporter (line 181) | public PatchReporter getPatchReporter() {
    method isTinkerEnabled (line 185) | public boolean isTinkerEnabled() {
    method isTinkerLoaded (line 189) | public boolean isTinkerLoaded() {
    method setTinkerLoaded (line 193) | public void setTinkerLoaded(boolean isLoaded) {
    method isTinkerLoadVerify (line 197) | public boolean isTinkerLoadVerify() {
    method isEnabledForDex (line 201) | public boolean isEnabledForDex() {
    method isEnabledForNativeLib (line 205) | public boolean isEnabledForNativeLib() {
    method isEnabledForResource (line 209) | public boolean isEnabledForResource() {
    method getPatchDirectory (line 213) | public File getPatchDirectory() {
    method getPatchInfoFile (line 217) | public File getPatchInfoFile() {
    method getPatchInfoLockFile (line 221) | public File getPatchInfoLockFile() {
    method getPatchListener (line 225) | public PatchListener getPatchListener() {
    method getTinkerFlags (line 230) | public int getTinkerFlags() {
    method cleanPatch (line 237) | public void cleanPatch() {
    method rollbackPatch (line 244) | public void rollbackPatch() {
    method cleanPatchByVersion (line 252) | public void cleanPatchByVersion(String versionName) {
    method getTinkerRomSpace (line 261) | public long getTinkerRomSpace() {
    method cleanPatchByPatchApk (line 271) | public void cleanPatchByPatchApk(File patchApk) {
    class Builder (line 280) | public static class Builder {
      method Builder (line 297) | public Builder(Context context) {
      method tinkerFlags (line 314) | public Builder tinkerFlags(int tinkerFlags) {
      method tinkerLoadVerifyFlag (line 322) | public Builder tinkerLoadVerifyFlag(Boolean verifyMd5WhenLoad) {
      method loadReport (line 333) | public Builder loadReport(LoadReporter loadReporter) {
      method patchReporter (line 344) | public Builder patchReporter(PatchReporter patchReporter) {
      method listener (line 355) | public Builder listener(PatchListener listener) {
      method build (line 366) | public Tinker build() {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java
  class TinkerApplicationHelper (line 31) | public class TinkerApplicationHelper {
    method isTinkerEnableAll (line 34) | public static boolean isTinkerEnableAll(ApplicationLike applicationLik...
    method isTinkerEnableForDex (line 38) | public static boolean isTinkerEnableForDex(ApplicationLike application...
    method isTinkerEnableForNativeLib (line 42) | public static boolean isTinkerEnableForNativeLib(ApplicationLike appli...
    method isTinkerEnableForResource (line 46) | public static boolean isTinkerEnableForResource(ApplicationLike applic...
    method getTinkerPatchDirectory (line 50) | public static File getTinkerPatchDirectory(ApplicationLike application...
    method isTinkerLoadSuccess (line 54) | public static boolean isTinkerLoadSuccess(ApplicationLike applicationL...
    method getLoadDexesAndMd5 (line 58) | public static HashMap<String, String> getLoadDexesAndMd5(ApplicationLi...
    method getLoadLibraryAndMd5 (line 62) | public static HashMap<String, String> getLoadLibraryAndMd5(Application...
    method getPackageConfigs (line 66) | public static HashMap<String, String> getPackageConfigs(ApplicationLik...
    method getCurrentVersion (line 70) | public static String getCurrentVersion(ApplicationLike applicationLike) {
    method cleanPatch (line 74) | public static void cleanPatch(ApplicationLike applicationLike) {
    method loadArmV7aLibrary (line 78) | public static void loadArmV7aLibrary(ApplicationLike applicationLike, ...
    method loadArmLibrary (line 82) | public static void loadArmLibrary(ApplicationLike applicationLike, Str...
    method loadLibraryFromTinker (line 90) | public static boolean loadLibraryFromTinker(ApplicationLike applicatio...

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java
  class TinkerInstaller (line 33) | public class TinkerInstaller {
    method install (line 42) | public static Tinker install(ApplicationLike applicationLike) {
    method install (line 60) | public static Tinker install(ApplicationLike applicationLike, LoadRepo...
    method cleanPatch (line 76) | public static void cleanPatch(Context context) {
    method onReceiveUpgradePatch (line 80) | public static void onReceiveUpgradePatch(Context context, String patch...
    method setLogIml (line 89) | public static void setLogIml(ShareTinkerLog.TinkerLogImp imp) {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java
  class TinkerLoadResult (line 37) | public class TinkerLoadResult {
    method parseTinkerResult (line 75) | public boolean parseTinkerResult(Context context, Intent intentResult) {
    method getPackageConfigByName (line 346) | public String getPackageConfigByName(String name) {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java
  class TinkerLog (line 26) | @Deprecated
    method setTinkerLogImp (line 30) | public static void setTinkerLogImp(TinkerLogImp imp) {
    method getImpl (line 34) | public static ShareTinkerLog.TinkerLogImp getImpl() {
    method v (line 38) | public static void v(final String tag, final String msg, final Object....
    method e (line 42) | public static void e(final String tag, final String msg, final Object....
    method w (line 46) | public static void w(final String tag, final String msg, final Object....
    method i (line 50) | public static void i(final String tag, final String msg, final Object....
    method d (line 54) | public static void d(final String tag, final String msg, final Object....
    method printErrStackTrace (line 58) | public static void printErrStackTrace(String tag, Throwable tr, final ...
    method printPendingLogs (line 62) | public static void printPendingLogs() {
    type TinkerLogImp (line 66) | public interface TinkerLogImp extends ShareTinkerLog.TinkerLogImp {}

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java
  class TinkerServiceInternals (line 27) | public class TinkerServiceInternals extends ShareTinkerInternals {
    method killTinkerPatchServiceProcess (line 30) | public static void killTinkerPatchServiceProcess(Context context) {
    method isTinkerPatchServiceRunning (line 34) | public static boolean isTinkerPatchServiceRunning(Context context) {
    method getTinkerPatchServiceName (line 39) | public static String getTinkerPatchServiceName(final Context context) {
    method isInTinkerPatchServiceProcess (line 43) | public static boolean isInTinkerPatchServiceProcess(Context context) {

FILE: tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/util/UpgradePatchRetry.java
  class UpgradePatchRetry (line 27) | public class UpgradePatchRetry {
    method UpgradePatchRetry (line 32) | public UpgradePatchRetry(Context context) {
    method getInstance (line 36) | public static UpgradePatchRetry getInstance(Context context) {
    method setRetryEnable (line 43) | public void setRetryEnable(boolean enable) {
    method setMaxRetryCount (line 47) | public void setMaxRetryCount(int count) {
    method onPatchRetryLoad (line 51) | public boolean onPatchRetryLoad() {
    method onPatchServiceStart (line 56) | public void onPatchServiceStart(Intent intent) {
    method onPatchListenerCheck (line 60) | public boolean onPatchListenerCheck(String md5) {
    method onPatchResetMaxCheck (line 64) | public boolean onPatchResetMaxCheck(String md5) {
    method onPatchServiceResult (line 68) | public void onPatchServiceResult() {

FILE: tinker-android/tinker-android-lib-no-op/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java
  class ExampleUnitTest (line 26) | public class ExampleUnitTest {
    method addition_isCorrect (line 27) | @Test

FILE: tinker-android/tinker-android-lib/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java
  class ApplicationTest (line 25) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 26) | public ApplicationTest() {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/ApplicationLifeCycle.java
  type ApplicationLifeCycle (line 34) | public interface ApplicationLifeCycle {
    method onCreate (line 39) | void onCreate();
    method onLowMemory (line 44) | void onLowMemory();
    method onTrimMemory (line 50) | void onTrimMemory(int level);
    method onTerminate (line 55) | void onTerminate();
    method onConfigurationChanged (line 60) | void onConfigurationChanged(Configuration newConfig);
    method onBaseContextAttached (line 65) | void onBaseContextAttached(Context base);

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/ApplicationLike.java
  class ApplicationLike (line 32) | @Keep
    method ApplicationLike (line 42) | public ApplicationLike(Application application, int tinkerFlags, boole...
    method getApplication (line 52) | public Application getApplication() {
    method getTinkerResultIntent (line 56) | public final Intent getTinkerResultIntent() {
    method getTinkerFlags (line 60) | public final int getTinkerFlags() {
    method getTinkerLoadVerifyFlag (line 64) | public final boolean getTinkerLoadVerifyFlag() {
    method getApplicationStartElapsedTime (line 68) | public long getApplicationStartElapsedTime() {
    method getApplicationStartMillisTime (line 72) | public long getApplicationStartMillisTime() {
    method onCreate (line 76) | @Override
    method onLowMemory (line 81) | @Override
    method onTrimMemory (line 86) | @Override
    method onTerminate (line 91) | @Override
    method onConfigurationChanged (line 96) | @Override
    method onBaseContextAttached (line 101) | @Override
    method getResources (line 106) | @Keep
    method getClassLoader (line 111) | @Keep
    method getAssets (line 116) | @Keep
    method getSystemService (line 121) | @Keep
    method getBaseContext (line 126) | @Keep
    method getTheme (line 131) | @Keep
    method mzNightModeUseOf (line 134) | @Keep

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/DefaultApplicationLike.java
  class DefaultApplicationLike (line 35) | @Keep
    method DefaultApplicationLike (line 39) | public DefaultApplicationLike(Application application, int tinkerFlags...
    method onCreate (line 44) | @Override
    method onLowMemory (line 49) | @Override
    method onTrimMemory (line 54) | @Override
    method onTerminate (line 59) | @Override
    method onConfigurationChanged (line 64) | @Override
    method onBaseContextAttached (line 69) | @Override

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/TinkerApplicationInlineFence.java
  class TinkerApplicationInlineFence (line 45) | @Keep
    method TinkerApplicationInlineFence (line 49) | public TinkerApplicationInlineFence(ApplicationLike appLike) {
    method handleMessage (line 53) | @Override
    method handleMessage_$noinline$ (line 58) | private void handleMessage_$noinline$(Message msg) {
    method dispatchMessage (line 66) | @Override
    method handleMessageImpl (line 71) | private void handleMessageImpl(Message msg) {
    method dummyThrowExceptionMethod (line 132) | private static void dummyThrowExceptionMethod() {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/filepatch/AbstractFilePatch.java
  class AbstractFilePatch (line 7) | public abstract class AbstractFilePatch {
    method patchFast (line 9) | public abstract int patchFast(InputStream oldInputStream, InputStream ...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/filepatch/BsFilePatch.java
  class BsFilePatch (line 9) | public class BsFilePatch extends AbstractFilePatch{
    method patchFast (line 11) | @Override

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/filepatch/FilePatchFactory.java
  class FilePatchFactory (line 8) | public class FilePatchFactory {
    method getFilePatcher (line 12) | public static AbstractFilePatch getFilePatcher(Context context, boolea...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/library/TinkerLoadLibrary.java
  class TinkerLoadLibrary (line 47) | public class TinkerLoadLibrary {
    method loadArmLibrary (line 56) | public static void loadArmLibrary(Context context, String libName) {
    method loadArmLibraryWithoutTinkerInstalled (line 77) | public static void loadArmLibraryWithoutTinkerInstalled(ApplicationLik...
    method loadArmV7Library (line 95) | public static void loadArmV7Library(Context context, String libName) {
    method loadArmV7LibraryWithoutTinkerInstalled (line 116) | public static void loadArmV7LibraryWithoutTinkerInstalled(ApplicationL...
    method loadLibraryFromTinker (line 137) | public static boolean loadLibraryFromTinker(Context context, String re...
    method installNavitveLibraryABI (line 180) | public static boolean installNavitveLibraryABI(Context context, String...
    method installNativeLibraryABIWithoutTinkerInstalled (line 221) | public static boolean installNativeLibraryABIWithoutTinkerInstalled(Ap...
    method installNativeLibraryPath (line 275) | private static void installNativeLibraryPath(ClassLoader classLoader, ...
    class V4 (line 311) | private static final class V4 {
      method install (line 312) | private static void install(ClassLoader classLoader, File folder)  t...
    class V14 (line 342) | private static final class V14 {
      method install (line 343) | private static void install(ClassLoader classLoader, File folder)  t...
    class V23 (line 361) | private static final class V23 {
      method install (line 362) | private static void install(ClassLoader classLoader, File folder)  t...
    class V25 (line 403) | private static final class V25 {
      method install (line 404) | private static void install(ClassLoader classLoader, File folder)  t...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java
  class DefaultPatchListener (line 44) | public class DefaultPatchListener implements PatchListener {
    method DefaultPatchListener (line 48) | public DefaultPatchListener(Context context) {
    method onPatchReceived (line 59) | @Override
    method checkPackageAndRunPatchService (line 76) | protected int checkPackageAndRunPatchService(String path, boolean useE...
    method runForgService (line 89) | private void runForgService() {
    method patchCheck (line 119) | protected int patchCheck(String path, String patchMd5) {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java
  type PatchListener (line 22) | public interface PatchListener {
    method onPatchReceived (line 23) | int onPatchReceived(String path);

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java
  class AbstractPatch (line 26) | public abstract class AbstractPatch {
    method tryPatch (line 28) | public abstract boolean tryPatch(Context context, String tempPatchPath...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ArkHotDiffPatchInternal.java
  class ArkHotDiffPatchInternal (line 31) | public class ArkHotDiffPatchInternal extends BasePatchInternal {
    method tryRecoverArkHotLibrary (line 35) | protected static boolean tryRecoverArkHotLibrary(Tinker manager, Share...
    method extractArkHotLibrary (line 47) | private static boolean extractArkHotLibrary(Context context, String di...
    method patchArkHotLibraryExtract (line 96) | private static boolean patchArkHotLibraryExtract(Context context, Stri...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BasePatchInternal.java
  class BasePatchInternal (line 38) | public class BasePatchInternal {
    method extract (line 57) | public static boolean extract(ZipFile zipFile, ZipEntry entryFile, Fil...
    method getMetaCorruptedCode (line 108) | public static int getMetaCorruptedCode(int type) {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java
  class DexDiffPatchInternal (line 60) | public class DexDiffPatchInternal extends BasePatchInternal {
    method tryRecoverDexFiles (line 73) | protected static boolean tryRecoverDexFiles(Tinker manager, ShareSecur...
    method waitAndCheckDexOptFile (line 96) | protected static boolean waitAndCheckDexOptFile(File patchFile, Tinker...
    method patchDexExtractViaDexDiff (line 171) | private static boolean patchDexExtractViaDexDiff(Context context, Stri...
    method checkClassNDexFiles (line 205) | private static boolean checkClassNDexFiles(final String dexFilePath) {
    method makeStoredZipEntry (line 256) | private static ZipEntry makeStoredZipEntry(ZipEntry originalEntry, Str...
    method mergeClassNDexFiles (line 265) | private static boolean mergeClassNDexFiles(final Context context, fina...
    method dexOptimizeDexFiles (line 360) | private static boolean dexOptimizeDexFiles(Context context, List<File>...
    method checkAllDexOptFile (line 449) | private static boolean checkAllDexOptFile(ArrayList<File> files, int c...
    method extractDexDiffInternals (line 462) | private static boolean extractDexDiffInternals(Context context, String...
    method extractDexToJar (line 644) | private static boolean extractDexToJar(ZipFile zipFile, ZipEntry entry...
    method extractDexFile (line 703) | private static boolean extractDexFile(ZipFile zipFile, ZipEntry entryF...
    method patchDexFile (line 727) | private static void patchDexFile(

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ResDiffPatchInternal.java
  class ResDiffPatchInternal (line 51) | public class ResDiffPatchInternal extends BasePatchInternal {
    method tryRecoverResourceFiles (line 55) | protected static boolean tryRecoverResourceFiles(Tinker manager, Share...
    method patchResourceExtractViaResourceDiff (line 77) | private static boolean patchResourceExtractViaResourceDiff(Context con...
    method extractResourceDiffInternals (line 88) | private static boolean extractResourceDiffInternals(Context context, S...
    method checkAndExtractResourceLargeFile (line 247) | private static boolean checkAndExtractResourceLargeFile(Context contex...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/SoDiffPatchInternal.java
  class SoDiffPatchInternal (line 44) | public class SoDiffPatchInternal extends BasePatchInternal {
    method tryRecoverLibraryFiles (line 47) | protected static boolean tryRecoverLibraryFiles(Tinker manager, ShareS...
    method patchLibraryExtractViaBsDiff (line 69) | private static boolean patchLibraryExtractViaBsDiff(Context context, S...
    method extractBsDiffInternals (line 74) | private static boolean extractBsDiffInternals(Context context, String ...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java
  class UpgradePatch (line 41) | public class UpgradePatch extends AbstractPatch {
    method tryPatch (line 44) | @Override

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java
  class DefaultLoadReporter (line 39) | public class DefaultLoadReporter implements LoadReporter {
    method DefaultLoadReporter (line 43) | public DefaultLoadReporter(Context context) {
    method onLoadPatchListenerReceiveFail (line 59) | @Override
    method onLoadPatchVersionChanged (line 77) | @Override
    method onLoadInterpret (line 111) | @Override
    method onLoadFileNotFound (line 146) | @Override
    method onLoadFileMd5Mismatch (line 172) | @Override
    method onLoadPatchInfoCorrupted (line 188) | @Override
    method onLoadResult (line 204) | @Override
    method onLoadException (line 223) | @Override
    method onLoadPackageCheckFail (line 287) | @Override
    method checkAndCleanPatch (line 294) | public void checkAndCleanPatch() {
    method retryPatch (line 299) | public boolean retryPatch() {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java
  class DefaultPatchReporter (line 41) | public class DefaultPatchReporter implements PatchReporter {
    method DefaultPatchReporter (line 46) | public DefaultPatchReporter(Context context) {
    method onPatchServiceStart (line 57) | @Override
    method onPatchPackageCheckFail (line 81) | @Override
    method onPatchVersionCheckFail (line 102) | @Override
    method onPatchTypeExtractFail (line 122) | @Override
    method onPatchDexOptFail (line 137) | @Override
    method onPatchResult (line 161) | @Override
    method onPatchInfoCorrupted (line 179) | @Override
    method onPatchException (line 195) | @Override
    method deleteOptFiles (line 211) | private void deleteOptFiles(List<File> dexFiles) {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java
  type LoadReporter (line 26) | public interface LoadReporter {
    method onLoadPatchListenerReceiveFail (line 40) | void onLoadPatchListenerReceiveFail(File patchFile, int errorCode);
    method onLoadPatchVersionChanged (line 53) | void onLoadPatchVersionChanged(String oldVersion, String newVersion, F...
    method onLoadInterpret (line 63) | void onLoadInterpret(int type, Throwable e);
    method onLoadResult (line 72) | void onLoadResult(File patchDirectory, int loadCode, long cost);
    method onLoadException (line 87) | void onLoadException(Throwable e, int errorCode);
    method onLoadFileNotFound (line 104) | void onLoadFileNotFound(File file, int fileType, boolean isDirectory);
    method onLoadFileMd5Mismatch (line 118) | void onLoadFileMd5Mismatch(File file, int fileType);
    method onLoadPatchInfoCorrupted (line 129) | void onLoadPatchInfoCorrupted(String oldVersion, String newVersion, Fi...
    method onLoadPackageCheckFail (line 147) | void onLoadPackageCheckFail(File patchFile, int errorCode);

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java
  type PatchReporter (line 35) | public interface PatchReporter {
    method onPatchServiceStart (line 43) | void onPatchServiceStart(Intent intent);
    method onPatchPackageCheckFail (line 60) | void onPatchPackageCheckFail(File patchFile, int errorCode);
    method onPatchVersionCheckFail (line 70) | void onPatchVersionCheckFail(File patchFile, SharePatchInfo oldPatchIn...
    method onPatchTypeExtractFail (line 86) | void onPatchTypeExtractFail(File patchFile, File extractTo, String fil...
    method onPatchDexOptFail (line 96) | void onPatchDexOptFail(File patchFile, List<File> dexFiles, Throwable t);
    method onPatchResult (line 106) | void onPatchResult(File patchFile, boolean success, long cost);
    method onPatchException (line 116) | void onPatchException(File patchFile, Throwable e);
    method onPatchInfoCorrupted (line 126) | void onPatchInfoCorrupted(File patchFile, String oldVersion, String ne...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java
  class AbstractResultService (line 30) | public abstract class AbstractResultService extends IntentService {
    method AbstractResultService (line 35) | public AbstractResultService() {
    method runResultService (line 39) | public static void runResultService(Context context, PatchResult resul...
    method onHandleIntent (line 53) | @Override
    method onPatchResult (line 64) | public abstract void onPatchResult(PatchResult result);

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java
  class DefaultTinkerResultService (line 32) | public class DefaultTinkerResultService extends AbstractResultService {
    method onPatchResult (line 40) | @Override
    method deleteRawPatchFile (line 67) | public void deleteRawPatchFile(File rawFile) {
    method checkIfNeedKill (line 91) | public boolean checkIfNeedKill(PatchResult result) {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/PatchResult.java
  class PatchResult (line 24) | public class PatchResult implements Serializable {
    method toString (line 54) | @Override

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchForeService.java
  class TinkerPatchForeService (line 10) | public class TinkerPatchForeService extends Service {
    method TinkerPatchForeService (line 11) | public TinkerPatchForeService() {
    method onStartCommand (line 14) | @Override
    method onBind (line 22) | @Override

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java
  class TinkerPatchService (line 46) | public class TinkerPatchService extends IntentService {
    method TinkerPatchService (line 57) | public TinkerPatchService() {
    method runPatchService (line 62) | public static void runPatchService(final Context context, final String...
    method runPatchService (line 66) | public static void runPatchService(final Context context, final String...
    method setPatchProcessor (line 79) | public static void setPatchProcessor(AbstractPatch upgradePatch, Class...
    method getPatchPathExtra (line 90) | public static String getPatchPathExtra(Intent intent) {
    method getPatchUseEmergencyMode (line 97) | public static boolean getPatchUseEmergencyMode(Intent intent) {
    method getPatchResultExtra (line 104) | public static String getPatchResultExtra(Intent intent) {
    method onHandleIntent (line 111) | @Override
    method setTinkerNotificationId (line 121) | public static void setTinkerNotificationId(int id) {
    method isRunning (line 131) | public static boolean isRunning(Context context) {
    method markRunning (line 163) | static void markRunning(Context context) {
    method unmarkRunning (line 190) | static void unmarkRunning(Context context) {
    method doApplyPatch (line 201) | private static void doApplyPatch(Context context, Intent intent) {
    method increasingPriority (line 266) | private void increasingPriority() {
    class InnerService (line 297) | public static class InnerService extends Service {
      method onCreate (line 298) | @Override
      method onStartCommand (line 309) | @Override
      method onDestroy (line 317) | @Override
      method onBind (line 323) | @Override

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java
  class Tinker (line 47) | public class Tinker {
    method Tinker (line 81) | private Tinker(Context context, int tinkerFlags, LoadReporter loadRepo...
    method with (line 105) | public static Tinker with(Context context) {
    method create (line 123) | public static void create(Tinker tinker) {
    method isTinkerInstalled (line 130) | public static boolean isTinkerInstalled() {
    method install (line 141) | public void install(Intent intentResult, Class<? extends AbstractResul...
    method setPatchServiceNotificationId (line 170) | public void setPatchServiceNotificationId(int id) {
    method getTinkerLoadResultIfPresent (line 177) | public TinkerLoadResult getTinkerLoadResultIfPresent() {
    method install (line 181) | public void install(Intent intentResult) {
    method getContext (line 185) | public Context getContext() {
    method isMainProcess (line 189) | public boolean isMainProcess() {
    method isPatchProcess (line 193) | public boolean isPatchProcess() {
    method setTinkerDisable (line 197) | public void setTinkerDisable() {
    method getLoadReporter (line 201) | public LoadReporter getLoadReporter() {
    method getPatchReporter (line 205) | public PatchReporter getPatchReporter() {
    method isTinkerEnabled (line 209) | public boolean isTinkerEnabled() {
    method isTinkerLoaded (line 213) | public boolean isTinkerLoaded() {
    method setTinkerLoaded (line 217) | public void setTinkerLoaded(boolean isLoaded) {
    method isTinkerLoadVerify (line 221) | public boolean isTinkerLoadVerify() {
    method isEnabledForDex (line 225) | public boolean isEnabledForDex() {
    method isEnabledForNativeLib (line 229) | public boolean isEnabledForNativeLib() {
    method isEnabledForResource (line 233) | public boolean isEnabledForResource() {
    method getPatchDirectory (line 237) | public File getPatchDirectory() {
    method getPatchInfoFile (line 241) | public File getPatchInfoFile() {
    method getPatchInfoLockFile (line 245) | public File getPatchInfoLockFile() {
    method getCustomPatcher (line 249) | public AbstractFilePatch getCustomPatcher() {
    method getPatchListener (line 253) | public PatchListener getPatchListener() {
    method getTinkerFlags (line 258) | public int getTinkerFlags() {
    method cleanPatch (line 265) | public void cleanPatch() {
    method rollbackPatch (line 272) | public void rollbackPatch() {
    method cleanPatchByVersion (line 291) | @Deprecated
    method getTinkerRomSpace (line 305) | public long getTinkerRomSpace() {
    method cleanPatchByPatchApk (line 320) | @Deprecated
    class Builder (line 330) | public static class Builder {
      method Builder (line 348) | public Builder(Context context) {
      method tinkerFlags (line 365) | public Builder tinkerFlags(int tinkerFlags) {
      method tinkerLoadVerifyFlag (line 373) | public Builder tinkerLoadVerifyFlag(Boolean verifyMd5WhenLoad) {
      method loadReport (line 384) | public Builder loadReport(LoadReporter loadReporter) {
      method patchReporter (line 395) | public Builder patchReporter(PatchReporter patchReporter) {
      method listener (line 406) | public Builder listener(PatchListener listener) {
      method customPatcher (line 417) | public Builder customPatcher(AbstractFilePatch patcher) {
      method build (line 422) | public Tinker build() {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java
  class TinkerApplicationHelper (line 39) | public class TinkerApplicationHelper {
    method isTinkerEnableAll (line 48) | public static boolean isTinkerEnableAll(ApplicationLike applicationLik...
    method isTinkerEnableForDex (line 62) | public static boolean isTinkerEnableForDex(ApplicationLike application...
    method isTinkerEnableForNativeLib (line 76) | public static boolean isTinkerEnableForNativeLib(ApplicationLike appli...
    method isTinkerEnableForResource (line 90) | public static boolean isTinkerEnableForResource(ApplicationLike applic...
    method getTinkerPatchDirectory (line 104) | public static File getTinkerPatchDirectory(ApplicationLike application...
    method isTinkerLoadSuccess (line 119) | public static boolean isTinkerLoadSuccess(ApplicationLike applicationL...
    method getLoadDexesAndMd5 (line 140) | public static HashMap<String, String> getLoadDexesAndMd5(ApplicationLi...
    method getLoadLibraryAndMd5 (line 165) | public static HashMap<String, String> getLoadLibraryAndMd5(Application...
    method getPackageConfigs (line 189) | public static HashMap<String, String> getPackageConfigs(ApplicationLik...
    method getCurrentVersion (line 212) | public static String getCurrentVersion(ApplicationLike applicationLike) {
    method cleanPatch (line 241) | public static void cleanPatch(ApplicationLike applicationLike) {
    method loadArmV7aLibrary (line 254) | public static void loadArmV7aLibrary(ApplicationLike applicationLike, ...
    method loadArmLibrary (line 274) | public static void loadArmLibrary(ApplicationLike applicationLike, Str...
    method loadLibraryFromTinker (line 298) | public static boolean loadLibraryFromTinker(ApplicationLike applicatio...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java
  class TinkerInstaller (line 34) | public class TinkerInstaller {
    method install (line 43) | public static Tinker install(ApplicationLike applicationLike) {
    method install (line 61) | public static Tinker install(ApplicationLike applicationLike, LoadRepo...
    method install (line 77) | public static Tinker install(ApplicationLike applicationLike, LoadRepo...
    method cleanPatch (line 99) | public static void cleanPatch(Context context) {
    method onReceiveUpgradePatch (line 109) | public static void onReceiveUpgradePatch(Context context, String patch...
    method setLogIml (line 118) | public static void setLogIml(ShareTinkerLog.TinkerLogImp imp) {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java
  class TinkerLoadResult (line 37) | public class TinkerLoadResult {
    method parseTinkerResult (line 75) | public boolean parseTinkerResult(Context context, Intent intentResult) {
    method getPackageConfigByName (line 353) | public String getPackageConfigByName(String name) {

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java
  class TinkerLog (line 26) | @Deprecated
    method setTinkerLogImp (line 30) | public static void setTinkerLogImp(TinkerLogImp imp) {
    method getImpl (line 34) | public static ShareTinkerLog.TinkerLogImp getImpl() {
    method v (line 38) | public static void v(final String tag, final String msg, final Object....
    method e (line 42) | public static void e(final String tag, final String msg, final Object....
    method w (line 46) | public static void w(final String tag, final String msg, final Object....
    method i (line 50) | public static void i(final String tag, final String msg, final Object....
    method d (line 54) | public static void d(final String tag, final String msg, final Object....
    method printErrStackTrace (line 58) | public static void printErrStackTrace(String tag, Throwable tr, final ...
    method printPendingLogs (line 62) | public static void printPendingLogs() {
    type TinkerLogImp (line 66) | public interface TinkerLogImp extends ShareTinkerLog.TinkerLogImp {}

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java
  class TinkerServiceInternals (line 34) | public class TinkerServiceInternals extends ShareTinkerInternals {
    method killTinkerPatchServiceProcess (line 42) | public static void killTinkerPatchServiceProcess(Context context) {
    method isTinkerPatchServiceRunning (line 64) | public static boolean isTinkerPatchServiceRunning(Context context) {
    method getTinkerPatchServiceName (line 69) | public static String getTinkerPatchServiceName(final Context context) {
    method isInTinkerPatchServiceProcess (line 88) | public static boolean isInTinkerPatchServiceProcess(Context context) {
    method getServiceProcessName (line 98) | private static String getServiceProcessName(Context context, Class<? e...

FILE: tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/UpgradePatchRetry.java
  class UpgradePatchRetry (line 42) | public class UpgradePatchRetry {
    method UpgradePatchRetry (line 63) | public UpgradePatchRetry(Context context) {
    method getInstance (line 69) | public static UpgradePatchRetry getInstance(Context context) {
    method setRetryEnable (line 76) | public void setRetryEnable(boolean enable) {
    method setMaxRetryCount (line 80) | public void setMaxRetryCount(int count) {
    method onPatchRetryLoad (line 88) | public boolean onPatchRetryLoad() {
    method onPatchServiceStart (line 120) | public void onPatchServiceStart(Intent intent) {
    method onPatchListenerCheck (line 172) | public boolean onPatchListenerCheck(String md5) {
    method onPatchResetMaxCheck (line 197) | public boolean onPatchResetMaxCheck(String md5) {
    method onPatchServiceResult (line 222) | public void onPatchServiceResult() {
    method copyToTempFile (line 235) | private void copyToTempFile(File patchFile) {
    class RetryInfo (line 248) | static class RetryInfo {
      method RetryInfo (line 252) | RetryInfo(String md5, String times) {
      method readRetryProperty (line 257) | static RetryInfo readRetryProperty(File infoFile) {
      method writeRetryProperty (line 277) | static void writeRetryProperty(File infoFile, RetryInfo info) {

FILE: tinker-android/tinker-android-lib/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java
  class ExampleUnitTest (line 26) | public class ExampleUnitTest {
    method addition_isCorrect (line 27) | @Test

FILE: tinker-android/tinker-android-loader-no-op/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java
  class ApplicationTest (line 25) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 26) | public ApplicationTest() {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/entry/ApplicationLifeCycle.java
  type ApplicationLifeCycle (line 34) | public interface ApplicationLifeCycle {
    method onCreate (line 39) | void onCreate();
    method onLowMemory (line 44) | void onLowMemory();
    method onTrimMemory (line 50) | void onTrimMemory(int level);
    method onTerminate (line 55) | void onTerminate();
    method onConfigurationChanged (line 60) | void onConfigurationChanged(Configuration newConfig);
    method onBaseContextAttached (line 65) | void onBaseContextAttached(Context base);

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/entry/ApplicationLike.java
  class ApplicationLike (line 32) | @Keep
    method ApplicationLike (line 42) | public ApplicationLike(Application application, int tinkerFlags, boole...
    method getApplication (line 52) | public Application getApplication() {
    method getTinkerResultIntent (line 56) | public final Intent getTinkerResultIntent() {
    method getTinkerFlags (line 60) | public final int getTinkerFlags() {
    method getTinkerLoadVerifyFlag (line 64) | public final boolean getTinkerLoadVerifyFlag() {
    method getApplicationStartElapsedTime (line 68) | public long getApplicationStartElapsedTime() {
    method getApplicationStartMillisTime (line 72) | public long getApplicationStartMillisTime() {
    method onCreate (line 76) | @Override
    method onLowMemory (line 81) | @Override
    method onTrimMemory (line 86) | @Override
    method onTerminate (line 91) | @Override
    method onConfigurationChanged (line 96) | @Override
    method onBaseContextAttached (line 101) | @Override
    method getResources (line 106) | @Keep
    method getClassLoader (line 111) | @Keep
    method getAssets (line 116) | @Keep
    method getSystemService (line 121) | @Keep
    method getBaseContext (line 126) | @Keep
    method getTheme (line 131) | @Keep
    method mzNightModeUseOf (line 134) | @Keep

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/entry/DefaultApplicationLike.java
  class DefaultApplicationLike (line 35) | @Keep
    method DefaultApplicationLike (line 39) | public DefaultApplicationLike(Application application, int tinkerFlags...
    method onCreate (line 44) | @Override
    method onLowMemory (line 49) | @Override
    method onTrimMemory (line 54) | @Override
    method onTerminate (line 59) | @Override
    method onConfigurationChanged (line 64) | @Override
    method onBaseContextAttached (line 69) | @Override

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java
  class TinkerRuntimeException (line 22) | public class TinkerRuntimeException extends RuntimeException {
    method TinkerRuntimeException (line 26) | public TinkerRuntimeException(String detailMessage) {
    method TinkerRuntimeException (line 30) | public TinkerRuntimeException(String detailMessage, Throwable throwabl...

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java
  class TinkerApplication (line 40) | public abstract class TinkerApplication extends Application {
    method TinkerApplication (line 56) | protected TinkerApplication(int tinkerFlags) {
    method TinkerApplication (line 60) | protected TinkerApplication(int tinkerFlags, String delegateClassName) {
    method TinkerApplication (line 64) | protected TinkerApplication(int tinkerFlags, String delegateClassName,
    method getInstance (line 77) | public static TinkerApplication getInstance() {
    method createDelegate (line 86) | private ApplicationLike createDelegate(Application app,
    method onBaseContextAttached (line 106) | protected void onBaseContextAttached(Context base, long applicationSta...
    method attachBaseContext (line 122) | @Override
    method onCreate (line 130) | @Override
    method onTerminate (line 138) | @Override
    method onLowMemory (line 146) | @Override
    method onTrimMemory (line 154) | @TargetApi(14)
    method onConfigurationChanged (line 163) | @Override
    method getResources (line 171) | @Override
    method getClassLoader (line 181) | @Override
    method getAssets (line 191) | @Override
    method getSystemService (line 201) | @Override
    method getBaseContext (line 211) | @Override
    method getTheme (line 221) | @Override
    method mzNightModeUseOf (line 230) | @Keep
    method setUseSafeMode (line 240) | public void setUseSafeMode(boolean useSafeMode) {
    method isTinkerLoadVerifyFlag (line 244) | public boolean isTinkerLoadVerifyFlag() {
    method getTinkerFlags (line 248) | public int getTinkerFlags() {
    method isUseDelegateLastClassLoader (line 252) | public boolean isUseDelegateLastClassLoader() {
    method isUseInterpretModeOnSupported32BitSystem (line 256) | public boolean isUseInterpretModeOnSupported32BitSystem() {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareArkHotDiffPatchInfo.java
  class ShareArkHotDiffPatchInfo (line 17) | public class ShareArkHotDiffPatchInfo {
    method ShareArkHotDiffPatchInfo (line 22) | public ShareArkHotDiffPatchInfo(String path, String name, String md5) {
    method parseDiffPatchInfo (line 28) | public static void parseDiffPatchInfo(String meta, ArrayList<ShareArkH...
    method checkDiffPatchInfo (line 53) | public static boolean checkDiffPatchInfo(ShareArkHotDiffPatchInfo info) {
    method toString (line 65) | @Override

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareBsDiffPatchInfo.java
  class ShareBsDiffPatchInfo (line 25) | public class ShareBsDiffPatchInfo {
    method ShareBsDiffPatchInfo (line 33) | public ShareBsDiffPatchInfo(String name, String md5, String path, Stri...
    method parseDiffPatchInfo (line 42) | public static void parseDiffPatchInfo(String meta, ArrayList<ShareBsDi...
    method checkDiffPatchInfo (line 68) | public static boolean checkDiffPatchInfo(ShareBsDiffPatchInfo info) {
    method toString (line 81) | @Override

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareConstants.java
  class ShareConstants (line 26) | public class ShareConstants {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareDexDiffPatchInfo.java
  class ShareDexDiffPatchInfo (line 26) | public class ShareDexDiffPatchInfo {
    method ShareDexDiffPatchInfo (line 47) | public ShareDexDiffPatchInfo(String name, String path, String destMd5I...
    method parseDexDiffPatchInfo (line 73) | public static void parseDexDiffPatchInfo(String meta, ArrayList<ShareD...
    method checkDexDiffPatchInfo (line 105) | public static boolean checkDexDiffPatchInfo(ShareDexDiffPatchInfo info) {
    method toString (line 117) | @Override

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareElfFile.java
  class ShareElfFile (line 35) | public class ShareElfFile implements Closeable {
    method ShareElfFile (line 46) | public ShareElfFile(File file) throws IOException {
    method assertInRange (line 82) | private static void assertInRange(int b, int lb, int ub, String errMsg...
    method getFileTypeByMagic (line 88) | public static int getFileTypeByMagic(File file) throws IOException {
    method readUntilLimit (line 112) | public static void readUntilLimit(FileChannel channel, ByteBuffer buff...
    method readCString (line 123) | public static String readCString(ByteBuffer buffer) {
    method getChannel (line 134) | public FileChannel getChannel() {
    method is32BitElf (line 138) | public boolean is32BitElf() {
    method getDataOrder (line 142) | public ByteOrder getDataOrder() {
    method getSectionHeaderByName (line 146) | public SectionHeader getSectionHeaderByName(String name) {
    method getSection (line 150) | public ByteBuffer getSection(SectionHeader sectionHeader) throws IOExc...
    method getSegment (line 157) | public ByteBuffer getSegment(ProgramHeader programHeader) throws IOExc...
    method close (line 164) | @Override
    class ElfHeader (line 172) | public static class ElfHeader {
      method ElfHeader (line 209) | private ElfHeader(FileChannel channel) throws IOException {
    class ProgramHeader (line 253) | public static class ProgramHeader {
      method ProgramHeader (line 279) | private ProgramHeader(ByteBuffer buffer, int elfClass) throws IOExce...
    class SectionHeader (line 307) | public static class SectionHeader {
      method SectionHeader (line 353) | private SectionHeader(ByteBuffer buffer, int elfClass) throws IOExce...

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareFileLockHelper.java
  class ShareFileLockHelper (line 28) | public class ShareFileLockHelper implements Closeable {
    method ShareFileLockHelper (line 35) | private ShareFileLockHelper(File lockFile) throws IOException {
    method getFileLock (line 71) | public static ShareFileLockHelper getFileLock(File lockFile) throws IO...
    method close (line 75) | @Override

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareIntentUtil.java
  class ShareIntentUtil (line 28) | public class ShareIntentUtil {
    method setIntentReturnCode (line 51) | public static void setIntentReturnCode(Intent intent, int code) {
    method getIntentReturnCode (line 55) | public static int getIntentReturnCode(Intent intent) {
    method setIntentPatchCostTime (line 59) | public static void setIntentPatchCostTime(Intent intent, long cost) {
    method getIntentPatchCostTime (line 63) | public static long getIntentPatchCostTime(Intent intent) {
    method getIntentPatchException (line 67) | public static Throwable getIntentPatchException(Intent intent) {
    method getIntentInterpretException (line 75) | public static Throwable getIntentInterpretException(Intent intent) {
    method getIntentPatchDexPaths (line 83) | public static HashMap<String, String> getIntentPatchDexPaths(Intent in...
    method getIntentPatchLibsPaths (line 91) | public static HashMap<String, String> getIntentPatchLibsPaths(Intent i...
    method getIntentPackageConfig (line 99) | public static HashMap<String, String> getIntentPackageConfig(Intent in...
    method getStringArrayListExtra (line 108) | public static ArrayList<String> getStringArrayListExtra(Intent intent,...
    method getStringExtra (line 123) | public static String getStringExtra(Intent intent, String name) {
    method getSerializableExtra (line 137) | public static Serializable getSerializableExtra(Intent intent, String ...
    method getIntExtra (line 151) | public static int getIntExtra(Intent intent, String name, int defaultV...
    method getBooleanExtra (line 166) | public static boolean getBooleanExtra(Intent intent, String name, bool...
    method getLongExtra (line 180) | public static long getLongExtra(Intent intent, String name, long defau...
    method fixIntentClassLoader (line 194) | public static void fixIntentClassLoader(Intent intent, ClassLoader cl) {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareOatUtil.java
  class ShareOatUtil (line 29) | public final class ShareOatUtil {
    method ShareOatUtil (line 32) | private ShareOatUtil() {
    method getOatFileInstructionSet (line 48) | public static String getOatFileInstructionSet(File oatFile) throws Thr...
    type InstructionSet (line 141) | private enum InstructionSet {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchFileUtil.java
  class SharePatchFileUtil (line 42) | public class SharePatchFileUtil {
    method getPatchDirectory (line 52) | public static File getPatchDirectory(Context context) {
    method getPatchTempDirectory (line 63) | public static File getPatchTempDirectory(Context context) {
    method getPatchLastCrashFile (line 73) | public static File getPatchLastCrashFile(Context context) {
    method getPatchInfoFile (line 81) | public static File getPatchInfoFile(String patchDirectory) {
    method getPatchInfoLockFile (line 85) | public static File getPatchInfoLockFile(String patchDirectory) {
    method getPatchVersionDirectory (line 89) | public static String getPatchVersionDirectory(String version) {
    method getPatchVersionFile (line 97) | public static String getPatchVersionFile(String version) {
    method checkIfMd5Valid (line 105) | public static boolean checkIfMd5Valid(final String object) {
    method checkTinkerLastUncaughtCrash (line 112) | public static String checkTinkerLastUncaughtCrash(Context context) {
    method closeQuietly (line 140) | @SuppressLint("NewApi")
    method isLegalFile (line 166) | public static final boolean isLegalFile(File file) {
    method shouldAcceptEvenIfIllegal (line 179) | public static final boolean shouldAcceptEvenIfIllegal(File file) {
    method getFileOrDirectorySize (line 200) | public static long getFileOrDirectorySize(File directory) {
    method safeDeleteFile (line 221) | public static final boolean safeDeleteFile(File file) {
    method deleteDir (line 239) | public static final boolean deleteDir(String dir) {
    method deleteDir (line 247) | public static final boolean deleteDir(File file) {
    method verifyFileMd5 (line 269) | public static boolean verifyFileMd5(File file, String md5) {
    method isRawDexFile (line 282) | public static boolean isRawDexFile(String fileName) {
    method verifyDexFileMd5 (line 293) | public static boolean verifyDexFileMd5(File file, String md5) {
    method verifyDexFileMd5 (line 297) | public static boolean verifyDexFileMd5(File file, String entryName, St...
    method copyFileUsingStream (line 336) | public static void copyFileUsingStream(File source, File dest) throws ...
    method loadDigestes (line 369) | public static String loadDigestes(JarFile jarFile, JarEntry je) throws...
    method getMD5 (line 393) | public final static String getMD5(final InputStream is) {
    method getMD5 (line 419) | public static String getMD5(byte[] buffer) {
    method getMD5 (line 443) | public static String getMD5(final File file) {
    method optimizedPathFor (line 469) | public static String optimizedPathFor(File path, File optimizedDirecto...
    method closeZip (line 510) | public static void closeZip(ZipFile zipFile) {
    method checkResourceArscMd5 (line 520) | public static boolean checkResourceArscMd5(File resOutput, String dest...
    method ensureFileDirectory (line 549) | public static void ensureFileDirectory(File file) {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchInfo.java
  class SharePatchInfo (line 32) | public class SharePatchInfo {
    method SharePatchInfo (line 52) | public SharePatchInfo(String oldVer, String newVer, boolean isProtecte...
    method readAndCheckPropertyWithLock (line 63) | public static SharePatchInfo readAndCheckPropertyWithLock(File pathInf...
    method rewritePatchInfoFileWithLock (line 92) | public static boolean rewritePatchInfoFileWithLock(File pathInfoFile, ...
    method readAndCheckProperty (line 120) | private static SharePatchInfo readAndCheckProperty(File pathInfoFile) {
    method rewritePatchInfoFile (line 173) | private static boolean rewritePatchInfoFile(File pathInfoFile, SharePa...

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareReflectUtil.java
  class ShareReflectUtil (line 30) | public class ShareReflectUtil {
    method findField (line 40) | public static Field findField(Object instance, String name) throws NoS...
    method findField (line 58) | public static Field findField(Class<?> originClazz, String name) throw...
    method findMethod (line 85) | public static Method findMethod(Object instance, String name, Class<?>...
    method findMethod (line 117) | public static Method findMethod(Class<?> clazz, String name, Class<?>....
    method findConstructor (line 148) | public static Constructor<?> findConstructor(Object instance, Class<?>...
    method expandFieldArray (line 178) | public static void expandFieldArray(Object instance, String fieldName,...
    method reduceFieldArray (line 200) | public static void reduceFieldArray(Object instance, String fieldName,...
    method getActivityThread (line 222) | public static Object getActivityThread(Context context,
    method getValueOfStaticIntField (line 255) | public static int getValueOfStaticIntField(Class<?> clazz, String fiel...

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareResPatchInfo.java
  class ShareResPatchInfo (line 31) | public class ShareResPatchInfo {
    method parseAllResPatchInfo (line 46) | public static void parseAllResPatchInfo(String meta, ShareResPatchInfo...
    method checkFileInPattern (line 114) | public static boolean checkFileInPattern(HashSet<Pattern> patterns, St...
    method checkResPatchInfo (line 126) | public static boolean checkResPatchInfo(ShareResPatchInfo info) {
    method convertToPatternString (line 137) | private static Pattern convertToPatternString(String input) {
    method parseResPatchInfoFirstLine (line 154) | public static void parseResPatchInfoFirstLine(String meta, ShareResPat...
    method toString (line 168) | @Override
    class LargeModeInfo (line 195) | public static class LargeModeInfo {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java
  class ShareSecurityCheck (line 38) | public class ShareSecurityCheck {
    method ShareSecurityCheck (line 50) | public ShareSecurityCheck(Context context) {
    method getMetaContentMap (line 59) | public HashMap<String, String> getMetaContentMap() {
    method getPackagePropertiesIfPresent (line 68) | public HashMap<String, String> getPackagePropertiesIfPresent() {
    method verifyPatchMetaSignature (line 98) | public boolean verifyPatchMetaSignature(File path) {
    method check (line 146) | private boolean check(File path, Certificate[] certs) {
    method init (line 161) | @SuppressLint("PackageManagerGetSignatures")

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java
  class ShareTinkerInternals (line 53) | public class ShareTinkerInternals {
    method isVmArt (line 68) | public static boolean isVmArt() {
    method isVmJit (line 72) | public static boolean isVmJit() {
    method isArkHotRuning (line 76) | public static boolean isArkHotRuning() {
    method isAfterAndroidO (line 105) | public static boolean isAfterAndroidO() {
    method getCurrentInstructionSet (line 109) | public static String getCurrentInstructionSet() {
    method isSystemOTA (line 148) | public static boolean isSystemOTA(String lastFingerPrint) {
    method changeTestDexToClassN (line 164) | public static ShareDexDiffPatchInfo changeTestDexToClassN(ShareDexDiff...
    method isNullOrNil (line 179) | public static boolean isNullOrNil(final String object) {
    method checkTinkerPackage (line 195) | public static int checkTinkerPackage(Context context, int tinkerFlag, ...
    method checkSignatureAndTinkerID (line 211) | public static int checkSignatureAndTinkerID(Context context, File patc...
    method checkPackageAndTinkerFlag (line 239) | public static int checkPackageAndTinkerFlag(ShareSecurityCheck securit...
    method fastGetPatchPackageMeta (line 270) | public static Properties fastGetPatchPackageMeta(File patchFile) {
    method getManifestTinkerID (line 300) | public static String getManifestTinkerID(Context context) {
    method isTinkerEnabledForDex (line 322) | public static boolean isTinkerEnabledForDex(int flag) {
    method isTinkerEnabledForNativeLib (line 326) | public static boolean isTinkerEnabledForNativeLib(int flag) {
    method isTinkerEnabledForResource (line 330) | public static boolean isTinkerEnabledForResource(int flag) {
    method isTinkerEnabledForArkHot (line 335) | public static boolean isTinkerEnabledForArkHot(int flag) {
    method getTypeString (line 339) | public static String getTypeString(int type) {
    method setTinkerDisableWithSharedPreferences (line 363) | public static void setTinkerDisableWithSharedPreferences(Context conte...
    method isTinkerEnableWithSharedPreferences (line 375) | public static boolean isTinkerEnableWithSharedPreferences(Context cont...
    method getTinkerSwitchSPKey (line 384) | private static String getTinkerSwitchSPKey(Context context) {
    method getSafeModeCount (line 392) | public static int getSafeModeCount(Context context) {
    method setSafeModeCount (line 401) | public static void setSafeModeCount(Context context, int count) {
    method isTinkerEnabled (line 409) | public static boolean isTinkerEnabled(int flag) {
    method isTinkerEnabledAll (line 413) | public static boolean isTinkerEnabledAll(int flag) {
    method isInMainProcess (line 417) | public static boolean isInMainProcess(Context context) {
    method isInPatchProcess (line 434) | public static boolean isInPatchProcess(Context context) {
    method getCurrentOatMode (line 443) | public static String getCurrentOatMode(Context context, String current) {
    method killAllOtherProcess (line 454) | public static void killAllOtherProcess(Context context) {
    method killProcessExceptMain (line 476) | public static void killProcessExceptMain(Context context) {
    method getProcessName (line 503) | public static String getProcessName(Context context) {
    method getProcessNameInternal (line 514) | @SuppressLint("NewApi")
    method isNewerOrEqualThanVersion (line 577) | private static boolean isNewerOrEqualThanVersion(int apiLevel, boolean...
    method isVmArt (line 591) | private static boolean isVmArt(String versionString) {
    method isVmJitInternal (line 610) | private static boolean isVmJitInternal() {
    method getExceptionCauseString (line 628) | public static String getExceptionCauseString(final Throwable ex) {
    method toVisualString (line 651) | public static String toVisualString(String src) {

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerLog.java
  class ShareTinkerLog (line 28) | public class ShareTinkerLog {
    method v (line 38) | @Override
    method i (line 44) | @Override
    method d (line 51) | @Override
    method w (line 57) | @Override
    method e (line 63) | @Override
    method printErrStackTrace (line 69) | @Override
    method getInlineFence (line 96) | private static Handler getInlineFence() {
    method getDefaultImpl (line 102) | public static TinkerLogImp getDefaultImpl() {
    method setTinkerLogImp (line 106) | public static void setTinkerLogImp(TinkerLogImp imp) {
    method getImpl (line 115) | public static TinkerLogImp getImpl() {
    method v (line 121) | public static void v(final String tag, final String fmt, final Object....
    method d (line 125) | public static void d(final String tag, final String fmt, final Object....
    method i (line 129) | public static void i(final String tag, final String fmt, final Object....
    method w (line 133) | public static void w(final String tag, final String fmt, final Object....
    method e (line 137) | public static void e(final String tag, final String fmt, final Object....
    method printErrStackTrace (line 141) | public static void printErrStackTrace(String tag, Throwable thr, final...
    method printPendingLogs (line 145) | public static void printPendingLogs() {
    method printLog (line 154) | private static void printLog(int priority, String tag, String fmt, Obj...
    method printLog (line 167) | private static void printLog(String tag, Throwable thr, String fmt, Ob...
    type TinkerLogImp (line 180) | public interface TinkerLogImp {
      method v (line 182) | void v(final String tag, final String fmt, final Object... values);
      method d (line 184) | void d(final String tag, final String fmt, final Object... values);
      method i (line 186) | void i(final String tag, final String fmt, final Object... values);
      method w (line 188) | void w(final String tag, final String fmt, final Object... values);
      method e (line 190) | void e(final String tag, final String fmt, final Object... values);
      method printErrStackTrace (line 192) | void printErrStackTrace(String tag, Throwable tr, final String forma...

FILE: tinker-android/tinker-android-loader-no-op/src/main/java/com/tencent/tinker/loader/shareutil/TinkerLogInlineFence.java
  class TinkerLogInlineFence (line 25) | @Keep
    method handleMessage (line 32) | @Override
    method handleMessage_$noinline$ (line 37) | private void handleMessage_$noinline$(Message msg) {
    method handleMessageImpl (line 45) | private void handleMessageImpl(Message msg) {
    method printPendingLogs (line 132) | private static void printPendingLogs(final ShareTinkerLog.TinkerLogImp...
    method dummyThrowExceptionMethod (line 189) | private static void dummyThrowExceptionMethod() {

FILE: tinker-android/tinker-android-loader-no-op/src/test/java/com/tencent/tinker/loader/ExampleUnitTest.java
  class ExampleUnitTest (line 26) | public class ExampleUnitTest {
    method addition_isCorrect (line 27) | @Test

FILE: tinker-android/tinker-android-loader/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java
  class ApplicationTest (line 25) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 26) | public ApplicationTest() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AbstractTinkerLoader.java
  class AbstractTinkerLoader (line 27) | public abstract class AbstractTinkerLoader {
    method tryLoad (line 28) | abstract public Intent tryLoad(TinkerApplication app);

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AppInfoChangedBlocker.java
  class AppInfoChangedBlocker (line 29) | public final class AppInfoChangedBlocker {
    method tryStart (line 32) | public static boolean tryStart(Application app) {
    method fetchMHObject (line 48) | private static Handler fetchMHObject(Context context) throws Exception {
    method interceptHandler (line 54) | private static void interceptHandler(Handler mH) throws Exception {
    class HackerCallback (line 65) | private static class HackerCallback implements Handler.Callback {
      method HackerCallback (line 71) | HackerCallback(Handler.Callback ori, Class $H) {
      method handleMessage (line 82) | @Override
      method hackMessage (line 93) | private boolean hackMessage(Message msg) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/NewClassLoaderInjector.java
  class NewClassLoaderInjector (line 37) | final class NewClassLoaderInjector {
    method inject (line 38) | public static ClassLoader inject(Application app, ClassLoader oldClass...
    method triggerDex2Oat (line 50) | public static ClassLoader triggerDex2Oat(Context context, File dexOptD...
    method createNewClassLoader (line 55) | @SuppressLint("NewApi")
    method doInject (line 127) | private static void doInject(Application app, ClassLoader classLoader)...
    method findField (line 158) | private static Field findField(Class<?> clazz, String name) throws Thr...
    method NewClassLoaderInjector (line 176) | private NewClassLoaderInjector() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/SystemClassLoaderAdder.java
  class SystemClassLoaderAdder (line 48) | public class SystemClassLoaderAdder {
    method installDexes (line 54) | public static void installDexes(Application application, ClassLoader l...
    method injectDexesInternal (line 78) | static void injectDexesInternal(ClassLoader cl, List<File> dexFiles, F...
    method installApk (line 90) | public static void installApk(PathClassLoader loader, List<File> files...
    method uninstallPatchDex (line 106) | public static void uninstallPatchDex(ClassLoader classLoader) throws T...
    method checkDexInstall (line 126) | private static boolean checkDexInstall(ClassLoader classLoader) throws...
    method createSortedAdditionalPathEntries (line 134) | private static List<File> createSortedAdditionalPathEntries(List<File>...
    class ArkHot (line 194) | private static final class ArkHot {
      method install (line 195) | private static void install(ClassLoader loader, List<File> additiona...
    class V23 (line 215) | private static final class V23 {
      method install (line 217) | private static void install(ClassLoader loader, List<File> additiona...
      method makePathElements (line 245) | private static Object[] makePathElements(
    class V19 (line 277) | private static final class V19 {
      method install (line 279) | private static void install(ClassLoader loader, List<File> additiona...
      method makeDexElements (line 306) | private static Object[] makeDexElements(
    class V14 (line 332) | private static final class V14 {
      method install (line 334) | private static void install(ClassLoader loader, List<File> additiona...
      method makeDexElements (line 353) | private static Object[] makeDexElements(
    class V4 (line 367) | private static final class V4 {
      method install (line 368) | private static void install(ClassLoader loader, List<File> additiona...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerArkHotLoader.java
  class TinkerArkHotLoader (line 42) | public class TinkerArkHotLoader {
    method TinkerArkHotLoader (line 53) | private TinkerArkHotLoader() {
    method loadTinkerArkHot (line 62) | @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    method checkComplete (line 109) | public static boolean checkComplete(String directory, ShareSecurityChe...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerClassLoader.java
  class TinkerClassLoader (line 21) | @Keep
    method TinkerClassLoader (line 26) | TinkerClassLoader(String dexPath, File optimizedDir, String libraryPat...
    method findClass (line 32) | @Override
    method getResource (line 47) | @Override
    method getResources (line 63) | @Override
    method injectDexPath (line 74) | private static void injectDexPath(ClassLoader cl, String dexPath, File...
    class CompoundEnumeration (line 91) | @Keep
      method CompoundEnumeration (line 96) | public CompoundEnumeration(Enumeration<E>[] enums) {
      method hasMoreElements (line 100) | @Override
      method nextElement (line 111) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java
  class TinkerDexLoader (line 40) | public class TinkerDexLoader {
    method TinkerDexLoader (line 57) | private TinkerDexLoader() {
    method loadTinkerJars (line 66) | public static boolean loadTinkerJars(final TinkerApplication applicati...
    method checkComplete (line 208) | public static boolean checkComplete(String directory, ShareSecurityChe...
    method getInfoMd5 (line 297) | private static String getInfoMd5(ShareDexDiffPatchInfo info) {
    method deleteOutOfDateOATFile (line 301) | private static void deleteOutOfDateOATFile(String directory) {
    method isJustArtSupportDex (line 311) | private static boolean isJustArtSupportDex(ShareDexDiffPatchInfo dexDi...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexOptimizer.java
  class TinkerDexOptimizer (line 68) | public final class TinkerDexOptimizer {
    method optimizeAll (line 81) | public static boolean optimizeAll(Context context, Collection<File> de...
    method optimizeAll (line 87) | public static boolean optimizeAll(Context context, Collection<File> de...
    type ResultCallback (line 116) | public interface ResultCallback {
      method onStart (line 117) | void onStart(File dexFile, File optimizedDir);
      method onSuccess (line 119) | void onSuccess(File dexFile, File optimizedDir, File optimizedFile);
      method onFailed (line 121) | void onFailed(File dexFile, File optimizedDir, Throwable thr);
    class OptimizeWorker (line 124) | private static class OptimizeWorker {
      method OptimizeWorker (line 135) | OptimizeWorker(Context context, File dexFile, File optimizedDir, boo...
      method run (line 147) | boolean run() {
    method createFakeODexPathStructureOnDemand (line 236) | private static void createFakeODexPathStructureOnDemand(String odexPat...
    method triggerPMDexOptOnDemand (line 255) | private static void triggerPMDexOptOnDemand(Context context, String de...
    method triggerSecondaryDexOpt (line 302) | private static boolean triggerSecondaryDexOpt(Context context, File de...
    method performDexOptSecondary (line 334) | private static void performDexOptSecondary(Context context) throws Ill...
    method performBgDexOptJob (line 351) | private static void performBgDexOptJob(Context context) throws Illegal...
    method performDexOptSecondaryByTransactionCode (line 361) | private static void performDexOptSecondaryByTransactionCode(Context co...
    method getPMSBinderProxy (line 425) | private static IBinder getPMSBinderProxy(Context context) throws Illeg...
    method executePMSShellCommand (line 454) | private static void executePMSShellCommand(Context context, String[] a...
    method registerDexModule (line 485) | private static void registerDexModule(Context context, String dexPath)...
    method getSynchronizedPackageManager (line 506) | private static final PackageManager getSynchronizedPackageManager(Cont...
    method waitUntilFileGeneratedOrTimeout (line 556) | private static boolean waitUntilFileGeneratedOrTimeout(Context context...
    method interpretDex2Oat (line 574) | private static void interpretDex2Oat(String dexFilePath, String oatFil...
    class StreamConsumer (line 628) | private static class StreamConsumer {
      method consumeInputStream (line 631) | static void consumeInputStream(final InputStream is) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerLoader.java
  class TinkerLoader (line 41) | public class TinkerLoader extends AbstractTinkerLoader {
    method tryLoad (line 50) | @Override
    method tryLoadPatchFilesInternal (line 75) | private void tryLoadPatchFilesInternal(TinkerApplication app, Intent r...
    method tryCleanObsoletePatches (line 421) | private void tryCleanObsoletePatches(TinkerApplication app) {
    method checkSafeModeCount (line 432) | private boolean checkSafeModeCount(TinkerApplication application) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourceLoader.java
  class TinkerResourceLoader (line 35) | public class TinkerResourceLoader {
    method TinkerResourceLoader (line 42) | private TinkerResourceLoader() {
    method loadTinkerResources (line 48) | public static boolean loadTinkerResources(TinkerApplication applicatio...
    method checkComplete (line 89) | public static boolean checkComplete(Context context, String directory,...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcePatcher.java
  class TinkerResourcePatcher (line 55) | class TinkerResourcePatcher {
    method isResourceCanPatch (line 87) | @SuppressWarnings("unchecked")
    method monkeyPatchExistingResources (line 198) | public static void monkeyPatchExistingResources(Context context, Strin...
    method installResourceInsuranceHacks (line 338) | private static void installResourceInsuranceHacks(Context context, Str...
    class ResourceInsuranceHandlerCallback (line 357) | private static final class ResourceInsuranceHandlerCallback implements...
      method ResourceInsuranceHandlerCallback (line 371) | ResourceInsuranceHandlerCallback(Context context, String patchResApk...
      method fetchMessageId (line 386) | private int fetchMessageId(Class<?> hClazz, String name, int defVal) {
      method handleMessage (line 396) | @Override
      method hackMessage (line 407) | @SuppressWarnings("unchecked")
    method isPatchedResModifiedAfterLastLoad (line 460) | private static boolean isPatchedResModifiedAfterLastLoad(String patche...
    method recordCurrentPatchedResModifiedTime (line 477) | private static void recordCurrentPatchedResModifiedTime(String patched...
    method clearPreloadTypedArrayIssue (line 491) | private static void clearPreloadTypedArrayIssue(Resources resources) {
    method checkResUpdate (line 513) | private static boolean checkResUpdate(Context context) {
    method shouldAddSharedLibraryAssets (line 527) | private static boolean shouldAddSharedLibraryAssets(ApplicationInfo ap...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcesKey.java
  class TinkerResourcesKey (line 26) | public class TinkerResourcesKey {
    class V24 (line 28) | private static final class V24 {
    class V19 (line 33) | private static final class V19 {
    class V17 (line 37) | private static final class V17 {
    class V7 (line 41) | private static final class V7 {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java
  class TinkerRuntimeException (line 22) | public class TinkerRuntimeException extends RuntimeException {
    method TinkerRuntimeException (line 26) | public TinkerRuntimeException(String detailMessage) {
    method TinkerRuntimeException (line 30) | public TinkerRuntimeException(String detailMessage, Throwable throwabl...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerSoLoader.java
  class TinkerSoLoader (line 41) | public class TinkerSoLoader {
    method checkComplete (line 53) | public static boolean checkComplete(String directory, ShareSecurityChe...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerTestDexLoad.java
  class TinkerTestDexLoad (line 24) | @Keep

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerUncaughtHandler.java
  class TinkerUncaughtHandler (line 35) | public class TinkerUncaughtHandler implements Thread.UncaughtExceptionHa...
    method TinkerUncaughtHandler (line 43) | public TinkerUncaughtHandler(Context context) {
    method uncaughtException (line 49) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java
  class TinkerApplication (line 44) | public abstract class TinkerApplication extends Application {
    method TinkerApplication (line 79) | protected TinkerApplication(int tinkerFlags) {
    method TinkerApplication (line 83) | protected TinkerApplication(int tinkerFlags, String delegateClassName) {
    method TinkerApplication (line 87) | protected TinkerApplication(int tinkerFlags, String delegateClassName,
    method TinkerApplication (line 92) | protected TinkerApplication(int tinkerFlags, String delegateClassName,
    method TinkerApplication (line 97) | protected TinkerApplication(int tinkerFlags, String delegateClassName,
    method getInstance (line 111) | public static TinkerApplication getInstance() {
    method loadTinker (line 120) | private void loadTinker() {
    method createInlineFence (line 135) | private Handler createInlineFence(Application app,
    method onBaseContextAttached (line 162) | protected void onBaseContextAttached(Context base, long applicationSta...
    method attachBaseContext (line 181) | @Override
    method onCreate (line 190) | @Override
    method onTerminate (line 199) | @Override
    method onLowMemory (line 208) | @Override
    method onTrimMemory (line 217) | @TargetApi(14)
    method onConfigurationChanged (line 227) | @Override
    method getResources (line 236) | @Override
    method getClassLoader (line 245) | @Override
    method getAssets (line 254) | @Override
    method getSystemService (line 263) | @Override
    method getBaseContext (line 272) | @Override
    method getTheme (line 281) | @Override
    method mzNightModeUseOf (line 290) | @Keep
    method setUseSafeMode (line 299) | public void setUseSafeMode(boolean useSafeMode) {
    method isTinkerLoadVerifyFlag (line 303) | public boolean isTinkerLoadVerifyFlag() {
    method getTinkerFlags (line 307) | public int getTinkerFlags() {
    method isUseDelegateLastClassLoader (line 311) | public boolean isUseDelegateLastClassLoader() {
    method isUseInterpretModeOnSupported32BitSystem (line 315) | public boolean isUseInterpretModeOnSupported32BitSystem() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerInlineFenceAction.java
  class TinkerInlineFenceAction (line 30) | public final class TinkerInlineFenceAction {
    method callOnBaseContextAttached (line 45) | static void callOnBaseContextAttached(Handler inlineFence, Context con...
    method callOnCreate (line 55) | static void callOnCreate(Handler inlineFence) {
    method callOnConfigurationChanged (line 65) | static void callOnConfigurationChanged(Handler inlineFence, Configurat...
    method callOnTrimMemory (line 75) | static void callOnTrimMemory(Handler inlineFence, int level) {
    method callOnLowMemory (line 85) | static void callOnLowMemory(Handler inlineFence) {
    method callOnTerminate (line 95) | static void callOnTerminate(Handler inlineFence) {
    method callGetClassLoader (line 105) | static ClassLoader callGetClassLoader(Handler inlineFence, ClassLoader...
    method callGetBaseContext (line 116) | static Context callGetBaseContext(Handler inlineFence, Context base) {
    method callGetAssets (line 127) | static AssetManager callGetAssets(Handler inlineFence, AssetManager as...
    method callGetResources (line 138) | static Resources callGetResources(Handler inlineFence, Resources res) {
    method callGetSystemService (line 149) | static Object callGetSystemService(Handler inlineFence, String name, O...
    method callGetTheme (line 160) | static Theme callGetTheme(Handler inlineFence, Theme theme) {
    method callMZNightModeUseOf (line 171) | static int callMZNightModeUseOf(Handler inlineFence) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/ActivityStubManager.java
  class ActivityStubManager (line 12) | public class ActivityStubManager {
    method assignStub (line 34) | public static String assignStub(String targetClassName, int launchMode...
    method ActivityStubManager (line 89) | private ActivityStubManager() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/ActivityStubs.java
  class ActivityStubs (line 9) | final class ActivityStubs {
    class STDStub_00 (line 32) | public static final class STDStub_00 extends Activity { }
    class STDStub_01 (line 33) | public static final class STDStub_01 extends Activity { }
    class STDStub_02 (line 34) | public static final class STDStub_02 extends Activity { }
    class STDStub_03 (line 35) | public static final class STDStub_03 extends Activity { }
    class STDStub_04 (line 36) | public static final class STDStub_04 extends Activity { }
    class STDStub_05 (line 37) | public static final class STDStub_05 extends Activity { }
    class STDStub_06 (line 38) | public static final class STDStub_06 extends Activity { }
    class STDStub_07 (line 39) | public static final class STDStub_07 extends Activity { }
    class STDStub_08 (line 40) | public static final class STDStub_08 extends Activity { }
    class STDStub_09 (line 41) | public static final class STDStub_09 extends Activity { }
    class STDStub_00_T (line 43) | public static final class STDStub_00_T extends Activity { }
    class STDStub_01_T (line 44) | public static final class STDStub_01_T extends Activity { }
    class STDStub_02_T (line 45) | public static final class STDStub_02_T extends Activity { }
    class SGTStub_00 (line 47) | public static final class SGTStub_00 extends Activity { }
    class SGTStub_01 (line 48) | public static final class SGTStub_01 extends Activity { }
    class SGTStub_02 (line 49) | public static final class SGTStub_02 extends Activity { }
    class SGTStub_03 (line 50) | public static final class SGTStub_03 extends Activity { }
    class SGTStub_04 (line 51) | public static final class SGTStub_04 extends Activity { }
    class SGTStub_05 (line 52) | public static final class SGTStub_05 extends Activity { }
    class SGTStub_06 (line 53) | public static final class SGTStub_06 extends Activity { }
    class SGTStub_07 (line 54) | public static final class SGTStub_07 extends Activity { }
    class SGTStub_08 (line 55) | public static final class SGTStub_08 extends Activity { }
    class SGTStub_09 (line 56) | public static final class SGTStub_09 extends Activity { }
    class SGTStub_00_T (line 58) | public static final class SGTStub_00_T extends Activity { }
    class SGTStub_01_T (line 59) | public static final class SGTStub_01_T extends Activity { }
    class SGTStub_02_T (line 60) | public static final class SGTStub_02_T extends Activity { }
    class SGTKStub_00 (line 62) | public static final class SGTKStub_00 extends Activity { }
    class SGTKStub_01 (line 63) | public static final class SGTKStub_01 extends Activity { }
    class SGTKStub_02 (line 64) | public static final class SGTKStub_02 extends Activity { }
    class SGTKStub_03 (line 65) | public static final class SGTKStub_03 extends Activity { }
    class SGTKStub_04 (line 66) | public static final class SGTKStub_04 extends Activity { }
    class SGTKStub_05 (line 67) | public static final class SGTKStub_05 extends Activity { }
    class SGTKStub_06 (line 68) | public static final class SGTKStub_06 extends Activity { }
    class SGTKStub_07 (line 69) | public static final class SGTKStub_07 extends Activity { }
    class SGTKStub_08 (line 70) | public static final class SGTKStub_08 extends Activity { }
    class SGTKStub_09 (line 71) | public static final class SGTKStub_09 extends Activity { }
    class SGTKStub_00_T (line 73) | public static final class SGTKStub_00_T extends Activity { }
    class SGTKStub_01_T (line 74) | public static final class SGTKStub_01_T extends Activity { }
    class SGTKStub_02_T (line 75) | public static final class SGTKStub_02_T extends Activity { }
    class SIStub_00 (line 77) | public static final class SIStub_00 extends Activity { }
    class SIStub_01 (line 78) | public static final class SIStub_01 extends Activity { }
    class SIStub_02 (line 79) | public static final class SIStub_02 extends Activity { }
    class SIStub_03 (line 80) | public static final class SIStub_03 extends Activity { }
    class SIStub_04 (line 81) | public static final class SIStub_04 extends Activity { }
    class SIStub_05 (line 82) | public static final class SIStub_05 extends Activity { }
    class SIStub_06 (line 83) | public static final class SIStub_06 extends Activity { }
    class SIStub_07 (line 84) | public static final class SIStub_07 extends Activity { }
    class SIStub_08 (line 85) | public static final class SIStub_08 extends Activity { }
    class SIStub_09 (line 86) | public static final class SIStub_09 extends Activity { }
    class SIStub_00_T (line 88) | public static final class SIStub_00_T extends Activity { }
    class SIStub_01_T (line 89) | public static final class SIStub_01_T extends Activity { }
    class SIStub_02_T (line 90) | public static final class SIStub_02_T extends Activity { }
    method ActivityStubs (line 92) | private ActivityStubs() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/ComponentHotplug.java
  class ComponentHotplug (line 24) | public final class ComponentHotplug {
    method install (line 33) | public synchronized static void install(TinkerApplication app, ShareSe...
    method ensureComponentHotplugInstalled (line 62) | public synchronized static void ensureComponentHotplugInstalled(Tinker...
    method fetchMHInstance (line 83) | private static Handler fetchMHInstance(Context context) {
    method uninstall (line 97) | public synchronized static void uninstall()  {
    method ComponentHotplug (line 115) | private ComponentHotplug() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/EnvConsts.java
  class EnvConsts (line 9) | public final class EnvConsts {
    method EnvConsts (line 18) | private EnvConsts() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/IncrementComponentManager.java
  class IncrementComponentManager (line 37) | public final class IncrementComponentManager {
    class AttrTranslator (line 52) | private static abstract class AttrTranslator<T_RESULT> {
      method translate (line 53) | final void translate(Context context, int tagType, XmlPullParser par...
      method onInit (line 68) | void onInit(Context context, int tagType, XmlPullParser parser) {
      method onTranslate (line 72) | abstract void onTranslate(Context context, int tagType, String attrN...
    method onInit (line 77) | @Override
    method onTranslate (line 90) | @Override
    method parseLaunchMode (line 288) | private int parseLaunchMode(String attrValue) {
    method parseScreenOrientation (line 303) | private int parseScreenOrientation(String attrValue) {
    method init (line 342) | public static synchronized boolean init(Context context, ShareSecurity...
    method parseActivity (line 399) | @SuppressWarnings("unchecked")
    method parseIntentFilter (line 447) | private static synchronized void parseIntentFilter(Context context, St...
    method parseMetaData (line 539) | private static synchronized void parseMetaData(Context context, Activi...
    method skipCurrentTag (line 552) | private static void skipCurrentTag(XmlPullParser parser) throws IOExce...
    method ensureInitialized (line 561) | private static synchronized void ensureInitialized() {
    method isIncrementActivity (line 567) | public static boolean isIncrementActivity(String className) {
    method queryActivityInfo (line 572) | public static ActivityInfo queryActivityInfo(String className) {
    method resolveIntent (line 578) | public static ResolveInfo resolveIntent(Intent intent) {
    method IncrementComponentManager (line 627) | private IncrementComponentManager() {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/UnsupportedEnvironmentException.java
  class UnsupportedEnvironmentException (line 7) | public class UnsupportedEnvironmentException extends UnsupportedOperatio...
    method UnsupportedEnvironmentException (line 9) | public UnsupportedEnvironmentException(String msg) {
    method UnsupportedEnvironmentException (line 13) | public UnsupportedEnvironmentException(Throwable thr) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/handler/AMSInterceptHandler.java
  class AMSInterceptHandler (line 27) | public class AMSInterceptHandler implements BinderInvocationHandler {
    method AMSInterceptHandler (line 49) | public AMSInterceptHandler(Context context) {
    method invoke (line 60) | @Override
    method handleStartActivity (line 79) | private Object handleStartActivity(Object target, Method method, Objec...
    method handleStartActivities (line 95) | private Object handleStartActivities(Object target, Method method, Obj...
    method handleGetIntentSender (line 114) | private Object handleGetIntentSender(Object target, Method method, Obj...
    method processActivityIntent (line 136) | private void processActivityIntent(Intent intent) {
    method storeAndReplaceOriginalComponentName (line 160) | private void storeAndReplaceOriginalComponentName(Intent intent, Strin...
    method hasTransparentTheme (line 168) | private boolean hasTransparentTheme(ActivityInfo activityInfo) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/handler/MHMessageHandler.java
  class MHMessageHandler (line 28) | public class MHMessageHandler implements MessageHandler {
    method MHMessageHandler (line 50) | public MHMessageHandler(Context context) {
    method handleMessage (line 61) | @Override
    method fixStubActivityInfo (line 108) | private void fixStubActivityInfo(ActivityInfo stubAInfo, ActivityInfo ...
    method copyInstanceFields (line 112) | private <T> void copyInstanceFields(T srcObj, T destObj) {
    method fixActivityScreenOrientation (line 140) | private void fixActivityScreenOrientation(Object activityClientRecord,...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/handler/PMSInterceptHandler.java
  class PMSInterceptHandler (line 17) | public class PMSInterceptHandler implements ServiceBinderInterceptor.Bin...
    method invoke (line 20) | @Override
    method handleGetActivityInfo (line 32) | private Object handleGetActivityInfo(Object target, Method method, Obj...
    method handleResolveIntent (line 71) | private Object handleResolveIntent(Object target, Method method, Objec...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/interceptor/HandlerMessageInterceptor.java
  class HandlerMessageInterceptor (line 14) | public class HandlerMessageInterceptor extends Interceptor<Handler.Callb...
    method HandlerMessageInterceptor (line 32) | public HandlerMessageInterceptor(Handler target, MessageHandler messag...
    method fetchTarget (line 37) | @Override
    method decorate (line 42) | @Override
    method inject (line 52) | @Override
    type MessageHandler (line 57) | public interface MessageHandler {
      method handleMessage (line 58) | boolean handleMessage(Message msg);
    class CallbackWrapper (line 61) | private static class CallbackWrapper implements Handler.Callback, ITin...
      method CallbackWrapper (line 66) | CallbackWrapper(MessageHandler messageHandler, Handler.Callback orig...
      method handleMessage (line 72) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/interceptor/InterceptFailedException.java
  class InterceptFailedException (line 7) | public class InterceptFailedException extends Exception {
    method InterceptFailedException (line 9) | public InterceptFailedException(Throwable thr) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/interceptor/Interceptor.java
  class Interceptor (line 11) | public abstract class Interceptor<T_TARGET> {
    method fetchTarget (line 17) | protected abstract T_TARGET fetchTarget() throws Throwable;
    method decorate (line 19) | protected T_TARGET decorate(T_TARGET target) throws Throwable {
    method inject (line 23) | protected abstract void inject(T_TARGET decorated) throws Throwable;
    method install (line 25) | public synchronized void install() throws InterceptFailedException {
    method uninstall (line 42) | public synchronized void uninstall() throws InterceptFailedException {
    type ITinkerHotplugProxy (line 54) | protected interface ITinkerHotplugProxy {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/interceptor/ServiceBinderInterceptor.java
  class ServiceBinderInterceptor (line 27) | public class ServiceBinderInterceptor extends Interceptor<IBinder> {
    method ServiceBinderInterceptor (line 52) | public ServiceBinderInterceptor(Context context, String serviceName, B...
    method fetchTarget (line 61) | @Override
    method decorate (line 66) | @Override
    method inject (line 80) | @SuppressWarnings("unchecked")
    method fixAMSBinderCache (line 92) | private static void fixAMSBinderCache(IBinder fakeBinder) throws Throw...
    method fixPMSBinderCache (line 118) | private static void fixPMSBinderCache(Context context, IBinder fakeBin...
    method createProxy (line 143) | @SuppressWarnings("unchecked")
    method getAllInterfacesThroughDeriveChain (line 188) | private static Class<?>[] getAllInterfacesThroughDeriveChain(Class<?> ...
    type BinderInvocationHandler (line 200) | public interface BinderInvocationHandler {
      method invoke (line 201) | Object invoke(Object target, Method method, Object[] args) throws Th...
    class FakeClientBinderHandler (line 204) | private static class FakeClientBinderHandler implements InvocationHand...
      method FakeClientBinderHandler (line 208) | FakeClientBinderHandler(IBinder originalClientBinder, BinderInvocati...
      method invoke (line 213) | @Override
    class FakeInterfaceHandler (line 240) | private static class FakeInterfaceHandler implements InvocationHandler {
      method FakeInterfaceHandler (line 245) | FakeInterfaceHandler(IInterface originalInterface, IBinder originalC...
      method invoke (line 252) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation.java
  class TinkerHackInstrumentation (line 26) | public class TinkerHackInstrumentation extends Instrumentation {
    method create (line 33) | public static TinkerHackInstrumentation create(Context context) {
    method install (line 47) | public void install() throws IllegalAccessException {
    method uninstall (line 55) | public void uninstall() throws IllegalAccessException {
    method TinkerHackInstrumentation (line 59) | private TinkerHackInstrumentation(Instrumentation original, Object act...
    method newActivity (line 70) | @Override
    method newActivity (line 76) | @Override
    method callActivityOnCreate (line 85) | @Override
    method callActivityOnCreate (line 96) | @Override
    method callActivityOnNewIntent (line 107) | @Override
    method processIntent (line 115) | private boolean processIntent(ClassLoader cl, Intent intent) {
    method fixActivityParams (line 137) | private void fixActivityParams(Activity target, ActivityInfo targetAIn...
    method copyAllFields (line 148) | private void copyAllFields(Instrumentation src) throws IllegalAccessEx...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/Guard.java
  class Guard (line 28) | public class Guard implements Closeable {
    method releaseSilence (line 32) | private static void releaseSilence(FileLock lock) {
    method closeSilence (line 43) | private static void closeSilence(Closeable stream) {
    method Guard (line 57) | private Guard(Closeable stream, FileLock lock) {
    method close (line 68) | @Override
    method acquireUse (line 81) | public static Guard acquireUse(File guardLockFile) {
    method acquireClean (line 126) | public static Guard acquireClean(File guardLockFile) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareArkHotDiffPatchInfo.java
  class ShareArkHotDiffPatchInfo (line 17) | public class ShareArkHotDiffPatchInfo {
    method ShareArkHotDiffPatchInfo (line 22) | public ShareArkHotDiffPatchInfo(String path, String name, String md5) {
    method parseDiffPatchInfo (line 28) | public static void parseDiffPatchInfo(String meta, ArrayList<ShareArkH...
    method checkDiffPatchInfo (line 53) | public static boolean checkDiffPatchInfo(ShareArkHotDiffPatchInfo info) {
    method toString (line 65) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareBsDiffPatchInfo.java
  class ShareBsDiffPatchInfo (line 25) | public class ShareBsDiffPatchInfo {
    method ShareBsDiffPatchInfo (line 33) | public ShareBsDiffPatchInfo(String name, String md5, String path, Stri...
    method parseDiffPatchInfo (line 42) | public static void parseDiffPatchInfo(String meta, ArrayList<ShareBsDi...
    method checkDiffPatchInfo (line 68) | public static boolean checkDiffPatchInfo(ShareBsDiffPatchInfo info) {
    method toString (line 81) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareConstants.java
  class ShareConstants (line 26) | public class ShareConstants {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareDexDiffPatchInfo.java
  class ShareDexDiffPatchInfo (line 26) | public class ShareDexDiffPatchInfo {
    method ShareDexDiffPatchInfo (line 47) | public ShareDexDiffPatchInfo(String name, String path, String destMd5I...
    method parseDexDiffPatchInfo (line 73) | public static void parseDexDiffPatchInfo(String meta, ArrayList<ShareD...
    method checkDexDiffPatchInfo (line 105) | public static boolean checkDexDiffPatchInfo(ShareDexDiffPatchInfo info) {
    method toString (line 117) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareElfFile.java
  class ShareElfFile (line 35) | public class ShareElfFile implements Closeable {
    method ShareElfFile (line 46) | public ShareElfFile(File file) throws IOException {
    method assertInRange (line 82) | private static void assertInRange(int b, int lb, int ub, String errMsg...
    method getFileTypeByMagic (line 88) | public static int getFileTypeByMagic(File file) throws IOException {
    method readUntilLimit (line 112) | public static void readUntilLimit(FileChannel channel, ByteBuffer buff...
    method readCString (line 123) | public static String readCString(ByteBuffer buffer) {
    method getChannel (line 134) | public FileChannel getChannel() {
    method is32BitElf (line 138) | public boolean is32BitElf() {
    method getDataOrder (line 142) | public ByteOrder getDataOrder() {
    method getSectionHeaderByName (line 146) | public SectionHeader getSectionHeaderByName(String name) {
    method getSection (line 150) | public ByteBuffer getSection(SectionHeader sectionHeader) throws IOExc...
    method getSegment (line 157) | public ByteBuffer getSegment(ProgramHeader programHeader) throws IOExc...
    method close (line 164) | @Override
    class ElfHeader (line 172) | public static class ElfHeader {
      method ElfHeader (line 209) | private ElfHeader(FileChannel channel) throws IOException {
    class ProgramHeader (line 253) | public static class ProgramHeader {
      method ProgramHeader (line 279) | private ProgramHeader(ByteBuffer buffer, int elfClass) throws IOExce...
    class SectionHeader (line 307) | public static class SectionHeader {
      method SectionHeader (line 353) | private SectionHeader(ByteBuffer buffer, int elfClass) throws IOExce...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareFileLockHelper.java
  class ShareFileLockHelper (line 28) | public class ShareFileLockHelper implements Closeable {
    method ShareFileLockHelper (line 35) | private ShareFileLockHelper(File lockFile) throws IOException {
    method getFileLock (line 71) | public static ShareFileLockHelper getFileLock(File lockFile) throws IO...
    method close (line 75) | @Override

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareIntentUtil.java
  class ShareIntentUtil (line 28) | public class ShareIntentUtil {
    method setIntentReturnCode (line 52) | public static void setIntentReturnCode(Intent intent, int code) {
    method getIntentReturnCode (line 56) | public static int getIntentReturnCode(Intent intent) {
    method setIntentPatchCostTime (line 60) | public static void setIntentPatchCostTime(Intent intent, long cost) {
    method getIntentPatchCostTime (line 64) | public static long getIntentPatchCostTime(Intent intent) {
    method getIntentPatchException (line 68) | public static Throwable getIntentPatchException(Intent intent) {
    method getIntentInterpretException (line 76) | public static Throwable getIntentInterpretException(Intent intent) {
    method getIntentPatchDexPaths (line 84) | public static HashMap<String, String> getIntentPatchDexPaths(Intent in...
    method getIntentPatchLibsPaths (line 92) | public static HashMap<String, String> getIntentPatchLibsPaths(Intent i...
    method getIntentPackageConfig (line 100) | public static HashMap<String, String> getIntentPackageConfig(Intent in...
    method getStringArrayListExtra (line 109) | public static ArrayList<String> getStringArrayListExtra(Intent intent,...
    method getStringExtra (line 124) | public static String getStringExtra(Intent intent, String name) {
    method getSerializableExtra (line 138) | public static Serializable getSerializableExtra(Intent intent, String ...
    method getIntExtra (line 152) | public static int getIntExtra(Intent intent, String name, int defaultV...
    method getBooleanExtra (line 167) | public static boolean getBooleanExtra(Intent intent, String name, bool...
    method getLongExtra (line 181) | public static long getLongExtra(Intent intent, String name, long defau...
    method fixIntentClassLoader (line 195) | public static void fixIntentClassLoader(Intent intent, ClassLoader cl) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareOatUtil.java
  class ShareOatUtil (line 29) | public final class ShareOatUtil {
    method ShareOatUtil (line 32) | private ShareOatUtil() {
    method getOatFileInstructionSet (line 48) | public static String getOatFileInstructionSet(File oatFile) throws Thr...
    type InstructionSet (line 141) | private enum InstructionSet {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchFileUtil.java
  class SharePatchFileUtil (line 42) | public class SharePatchFileUtil {
    method getPatchDirectory (line 52) | public static File getPatchDirectory(Context context) {
    method getPatchTempDirectory (line 63) | public static File getPatchTempDirectory(Context context) {
    method getPatchLastCrashFile (line 73) | public static File getPatchLastCrashFile(Context context) {
    method getPatchInfoFile (line 81) | public static File getPatchInfoFile(String patchDirectory) {
    method getPatchInfoLockFile (line 85) | public static File getPatchInfoLockFile(String patchDirectory) {
    method getPatchVersionDirectory (line 89) | public static String getPatchVersionDirectory(String version) {
    method getPatchVersionFile (line 97) | public static String getPatchVersionFile(String version) {
    method getGuardDirectory (line 105) | public static File getGuardDirectory(String patchDirectory) {
    method checkIfMd5Valid (line 109) | public static boolean checkIfMd5Valid(final String object) {
    method checkTinkerLastUncaughtCrash (line 116) | public static String checkTinkerLastUncaughtCrash(Context context) {
    method closeQuietly (line 144) | @SuppressLint("NewApi")
    method isLegalFile (line 170) | public static final boolean isLegalFile(File file) {
    method shouldAcceptEvenIfIllegal (line 183) | public static final boolean shouldAcceptEvenIfIllegal(File file) {
    method getFileOrDirectorySize (line 204) | public static long getFileOrDirectorySize(File directory) {
    method safeDeleteFile (line 225) | public static final boolean safeDeleteFile(File file) {
    method deleteDir (line 243) | public static final boolean deleteDir(String dir) {
    method deleteDir (line 250) | public static final boolean deleteDir(File file) {
    method deleteDirAsync (line 268) | public static void deleteDirAsync(String path) {
    method deleteDirAsync (line 272) | public static void deleteDirAsync(File file) {
    method verifyFileMd5 (line 289) | public static boolean verifyFileMd5(File file, String md5) {
    method isRawDexFile (line 302) | public static boolean isRawDexFile(String fileName) {
    method verifyDexFileMd5 (line 313) | public static boolean verifyDexFileMd5(File file, String md5) {
    method verifyDexFileMd5 (line 317) | public static boolean verifyDexFileMd5(File file, String entryName, St...
    method copyFileUsingStream (line 356) | public static void copyFileUsingStream(File source, File dest) throws ...
    method loadDigestes (line 389) | public static String loadDigestes(JarFile jarFile, JarEntry je) throws...
    method getMD5 (line 413) | public final static String getMD5(final InputStream is) {
    method getMD5 (line 439) | public static String getMD5(byte[] buffer) {
    method getMD5 (line 463) | public static String getMD5(final File file) {
    method optimizedPathFor (line 489) | public static String optimizedPathFor(File path, File optimizedDirecto...
    method closeZip (line 530) | public static void closeZip(ZipFile zipFile) {
    method checkResourceArscMd5 (line 540) | public static boolean checkResourceArscMd5(File resOutput, String dest...
    method ensureFileDirectory (line 569) | public static void ensureFileDirectory(File file) {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchInfo.java
  class SharePatchInfo (line 32) | public class SharePatchInfo {
    method SharePatchInfo (line 66) | public SharePatchInfo(String oldVer, String newVer, boolean isProtecte...
    method readAndCheckPropertyWithLock (line 77) | public static SharePatchInfo readAndCheckPropertyWithLock(File pathInf...
    method rewritePatchInfoFileWithLock (line 106) | public static boolean rewritePatchInfoFileWithLock(File pathInfoFile, ...
    method readAndCheckProperty (line 134) | private static SharePatchInfo readAndCheckProperty(File pathInfoFile) {
    method rewritePatchInfoFile (line 189) | private static boolean rewritePatchInfoFile(File pathInfoFile, SharePa...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareReflectUtil.java
  class ShareReflectUtil (line 30) | public class ShareReflectUtil {
    method findField (line 40) | public static Field findField(Object instance, String name) throws NoS...
    method findField (line 58) | public static Field findField(Class<?> originClazz, String name) throw...
    method findMethod (line 85) | public static Method findMethod(Object instance, String name, Class<?>...
    method findMethod (line 117) | public static Method findMethod(Class<?> clazz, String name, Class<?>....
    method findConstructor (line 148) | public static Constructor<?> findConstructor(Object instance, Class<?>...
    method findConstructor (line 161) | public static Constructor<?> findConstructor(Class<?> clazz, Class<?>....
    method expandFieldArray (line 191) | public static void expandFieldArray(Object instance, String fieldName,...
    method reduceFieldArray (line 213) | public static void reduceFieldArray(Object instance, String fieldName,...
    method getActivityThread (line 235) | public static Object getActivityThread(Context context,
    method getValueOfStaticIntField (line 268) | public static int getValueOfStaticIntField(Class<?> clazz, String fiel...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareResPatchInfo.java
  class ShareResPatchInfo (line 31) | public class ShareResPatchInfo {
    method parseAllResPatchInfo (line 46) | public static void parseAllResPatchInfo(String meta, ShareResPatchInfo...
    method checkFileInPattern (line 114) | public static boolean checkFileInPattern(HashSet<Pattern> patterns, St...
    method checkResPatchInfo (line 126) | public static boolean checkResPatchInfo(ShareResPatchInfo info) {
    method convertToPatternString (line 137) | private static Pattern convertToPatternString(String input) {
    method parseResPatchInfoFirstLine (line 154) | public static void parseResPatchInfoFirstLine(String meta, ShareResPat...
    method toString (line 168) | @Override
    class LargeModeInfo (line 195) | public static class LargeModeInfo {

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java
  class ShareSecurityCheck (line 38) | public class ShareSecurityCheck {
    method ShareSecurityCheck (line 50) | public ShareSecurityCheck(Context context) {
    method getMetaContentMap (line 59) | public HashMap<String, String> getMetaContentMap() {
    method getPackagePropertiesIfPresent (line 68) | public HashMap<String, String> getPackagePropertiesIfPresent() {
    method verifyPatchMetaSignature (line 98) | public boolean verifyPatchMetaSignature(File path) {
    method check (line 146) | private boolean check(File path, Certificate[] certs) {
    method init (line 161) | @SuppressLint("PackageManagerGetSignatures")

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java
  class ShareTinkerInternals (line 59) | public class ShareTinkerInternals {
    method isVmArt (line 74) | public static boolean isVmArt() {
    method isVmJit (line 78) | public static boolean isVmJit() {
    method isArkHotRuning (line 82) | public static boolean isArkHotRuning() {
    method isAfterAndroidO (line 111) | public static boolean isAfterAndroidO() {
    method getCurrentInstructionSet (line 115) | public static String getCurrentInstructionSet() {
    method is32BitEnv (line 154) | public static boolean is32BitEnv() {
    method isSystemOTA (line 159) | public static boolean isSystemOTA(String lastFingerPrint) {
    method changeTestDexToClassN (line 178) | public static ShareDexDiffPatchInfo changeTestDexToClassN(ShareDexDiff...
    method isNullOrNil (line 193) | public static boolean isNullOrNil(final String object) {
    method checkTinkerPackage (line 209) | public static int checkTinkerPackage(Context context, int tinkerFlag, ...
    method checkSignatureAndTinkerID (line 225) | public static int checkSignatureAndTinkerID(Context context, File patc...
    method checkPackageAndTinkerFlag (line 254) | public static int checkPackageAndTinkerFlag(ShareSecurityCheck securit...
    method fastGetPatchPackageMeta (line 285) | public static Properties fastGetPatchPackageMeta(File patchFile) {
    method getManifestTinkerID (line 315) | public static String getManifestTinkerID(Context context) {
    method isTinkerEnabledForDex (line 337) | public static boolean isTinkerEnabledForDex(int flag) {
    method isTinkerEnabledForNativeLib (line 341) | public static boolean isTinkerEnabledForNativeLib(int flag) {
    method isTinkerEnabledForResource (line 345) | public static boolean isTinkerEnabledForResource(int flag) {
    method isTinkerEnabledForArkHot (line 350) | public static boolean isTinkerEnabledForArkHot(int flag) {
    method getTypeString (line 354) | public static String getTypeString(int type) {
    method setTinkerDisableWithSharedPreferences (line 378) | public static void setTinkerDisableWithSharedPreferences(Context conte...
    method isTinkerEnableWithSharedPreferences (line 390) | public static boolean isTinkerEnableWithSharedPreferences(Context cont...
    method getTinkerSwitchSPKey (line 399) | private static String getTinkerSwitchSPKey(Context context) {
    method getSafeModeCount (line 409) | public static int getSafeModeCount(Context context) {
    method setSafeModeCount (line 433) | public static void setSafeModeCount(Context context, int count) {
    method isTinkerEnabled (line 454) | public static boolean isTinkerEnabled(int flag) {
    method isTinkerEnabledAll (line 458) | public static boolean isTinkerEnabledAll(int flag) {
    method isInMainProcess (line 462) | public static boolean isInMainProcess(Context context) {
    method isInPatchProcess (line 479) | public static boolean isInPatchProcess(Context context) {
    method getCurrentOatMode (line 488) | public static String getCurrentOatMode(Context context, String current) {
    method killAllOtherProcess (line 499) | public static void killAllOtherProcess(Context context) {
    method killProcessExceptMain (line 521) | public static void killProcessExceptMain(Context context) {
    method getProcessName (line 548) | public static String getProcessName(Context context) {
    method getProcessNameInternal (line 559) | @SuppressLint("NewApi")
    method isVmArt (line 627) | private static boolean isVmArt(String versionString) {
    method isVmJitInternal (line 646) | private static boolean isVmJitInternal() {
    method isNewerOrEqualThanVersion (line 664) | public static boolean isNewerOrEqualThanVersion(int apiLevel, boolean ...
    method isOlderOrEqualThanVersion (line 673) | public static boolean isOlderOrEqualThanVersion(int apiLevel, boolean ...
    method isVersionInRange (line 685) | public static boolean isVersionInRange(int lowApiLevel, int hiApiLevel...
    method getExceptionCauseString (line 690) | public static String getExceptionCauseString(final Throwable ex) {
    method toVisualString (line 713) | public static String toVisualString(String src) {
    method cleanPatch (line 738) | public static void cleanPatch(Context context) {
    method cleanPatchDirectoryWithGuard (line 772) | public static void cleanPatchDirectoryWithGuard(File patchDirectory, S...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerLog.java
  class ShareTinkerLog (line 28) | public class ShareTinkerLog {
    method v (line 38) | @Override
    method i (line 44) | @Override
    method d (line 51) | @Override
    method w (line 57) | @Override
    method e (line 63) | @Override
    method printErrStackTrace (line 69) | @Override
    method getInlineFence (line 96) | private static Handler getInlineFence() {
    method getDefaultImpl (line 102) | public static TinkerLogImp getDefaultImpl() {
    method setTinkerLogImp (line 106) | public static void setTinkerLogImp(TinkerLogImp imp) {
    method getImpl (line 115) | public static TinkerLogImp getImpl() {
    method v (line 121) | public static void v(final String tag, final String fmt, final Object....
    method d (line 125) | public static void d(final String tag, final String fmt, final Object....
    method i (line 129) | public static void i(final String tag, final String fmt, final Object....
    method w (line 133) | public static void w(final String tag, final String fmt, final Object....
    method e (line 137) | public static void e(final String tag, final String fmt, final Object....
    method printErrStackTrace (line 141) | public static void printErrStackTrace(String tag, Throwable thr, final...
    method printPendingLogs (line 145) | public static void printPendingLogs() {
    method printLog (line 154) | private static void printLog(int priority, String tag, String fmt, Obj...
    method printLog (line 167) | private static void printLog(String tag, Throwable thr, String fmt, Ob...
    type TinkerLogImp (line 180) | public interface TinkerLogImp {
      method v (line 182) | void v(final String tag, final String fmt, final Object... values);
      method d (line 184) | void d(final String tag, final String fmt, final Object... values);
      method i (line 186) | void i(final String tag, final String fmt, final Object... values);
      method w (line 188) | void w(final String tag, final String fmt, final Object... values);
      method e (line 190) | void e(final String tag, final String fmt, final Object... values);
      method printErrStackTrace (line 192) | void printErrStackTrace(String tag, Throwable tr, final String forma...

FILE: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/TinkerLogInlineFence.java
  class TinkerLogInlineFence (line 25) | @Keep
    method handleMessage (line 32) | @Override
    method handleMessage_$noinline$ (line 37) | private void handleMessage_$noinline$(Message msg) {
    method handleMessageImpl (line 45) | private void handleMessageImpl(Message msg) {
    method printPendingLogs (line 132) | private static void printPendingLogs(final ShareTinkerLog.TinkerLogImp...
    method dummyThrowExceptionMethod (line 189) | private static void dummyThrowExceptionMethod() {

FILE: tinker-android/tinker-android-loader/src/test/java/com/tencent/tinker/loader/ExampleUnitTest.java
  class ExampleUnitTest (line 26) | public class ExampleUnitTest {
    method addition_isCorrect (line 27) | @Test

FILE: tinker-android/tinker-android-loader/src/test/java/com/tencent/tinker/loader/shareutil/GuardTest.java
  class GuardTest (line 11) | public class GuardTest {
    method testAcquireClean (line 13) | @Test
    method testAcquireUse (line 61) | @Test

FILE: tinker-build/tinker-patch-cli/src/main/java/com/tencent/tinker/patch/CliMain.java
  class CliMain (line 40) | public class CliMain extends Runner {
    method CliMain (line 50) | private CliMain(boolean isGradleMode) {
    method main (line 54) | public static void main(String[] args) {
    method setRunningLocation (line 61) | private static void setRunningLocation(CliMain m) {
    method printUsage (line 75) | private static void printUsage(PrintStream out) {
    method run (line 84) | private void run(String[] args) {
    method loadConfigFromXml (line 120) | private void loadConfigFromXml(File configFile, File outputFile, File ...
    class ReadArgs (line 138) | private class ReadArgs {
      method ReadArgs (line 146) | ReadArgs(String[] args) {
      method getConfigFile (line 150) | public File getConfigFile() {
      method getOutputFile (line 154) | public File getOutputFile() {
      method getOldApkFile (line 158) | public File getOldApkFile() {
      method getNewApkFile (line 162) | public File getNewApkFile() {
      method getCustomDiffCmd (line 166) | public String getCustomDiffCmd() {
      method invoke (line 170) | public ReadArgs invoke() {

FILE: tinker-build/tinker-patch-cli/src/main/java/com/tencent/tinker/patch/Test.java
  class Test (line 9) | public class Test {
    method main (line 10) | public static void main(String[] args) throws Throwable {

FILE: tinker-build/tinker-patch-cli/tool_output/merge_mapping.py
  function print_usage (line 27) | def print_usage():
  class MappingData (line 35) | class MappingData:
    method __init__ (line 36) | def __init__(self):
  class DealWithProguardWarning (line 42) | class DealWithProguardWarning:
    method __init__ (line 43) | def __init__(self):
    method read_mapping_file (line 50) | def read_mapping_file(classes, class_list, mapping):
    method remove_warning_mapping (line 72) | def remove_warning_mapping(self, old_mapping, current_mapping):
    method exe (line 78) | def exe(self, args):
    method do_merge (line 92) | def do_merge(self):
    method find_same_methods (line 114) | def find_same_methods(self, line, data):
    method get_name_and_complete_name_and_new_name (line 130) | def get_name_and_complete_name_and_new_name(line):
    method print_new_mapping (line 153) | def print_new_mapping(self):

FILE: tinker-build/tinker-patch-cli/tool_output/proguard_warning.py
  function print_usage (line 8) | def print_usage():
  class MappingData (line 16) | class MappingData:
    method __init__ (line 21) | def __init__(self):
  class RemoveProguardWarning (line 26) | class RemoveProguardWarning:
    method __init__ (line 27) | def __init__(self):
    method read_mapping_file (line 31) | def read_mapping_file(self, mapping):
    method remove_warning (line 51) | def remove_warning(self, warning):
    method remove_warning_mapping (line 88) | def remove_warning_mapping(self, mapping, warning):
    method do_command (line 92) | def do_command(self, args):

FILE: tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptResourceCollector.java
  class AaptResourceCollector (line 31) | public class AaptResourceCollector {
    method AaptResourceCollector (line 45) | public AaptResourceCollector() {
    method AaptResourceCollector (line 60) | public AaptResourceCollector(Map<RType, Set<RDotTxtEntry>> rTypeResour...
    method addIntResourceIfNotPresent (line 94) | public void addIntResourceIfNotPresent(RType rType, String name) { //,...
    method addIntArrayResourceIfNotPresent (line 117) | public void addIntArrayResourceIfNotPresent(RType rType, String name, ...
    method addResource (line 133) | public void addResource(RType rType, IdType idType, String name, Strin...
    method isContainResource (line 199) | public boolean isContainResource(RType rType, IdType idType, String na...
    method addRTypeResourceName (line 217) | void addRTypeResourceName(RType rType, String resourceName, String res...
    method putSanitizeName (line 263) | void putSanitizeName(RType rType, String sanitizeName, String rawName) {
    method getRawName (line 282) | public String getRawName(RType rType, String sanitizeName) {
    method getRTypeResourceMap (line 294) | public Map<RType, Set<RDotTxtEntry>> getRTypeResourceMap() {
    method getDuplicateResourceMap (l
Condensed preview — 427 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,697K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 745,
    "preview": "## Issue/提问须知\n**在提交issue之前,我们应该先查询是否已经有相关的issue以及[常见问题](https://github.com/Tencent/tinker/wiki/Tinker-%E5%B8%B8%E8%A7%81"
  },
  {
    "path": ".gitignore",
    "chars": 503,
    "preview": "/build\n\n# Ignore Gradle GUI config\ngradle-app.setting\n\n# Avoid ignoring Gradle wrapper jar file (.jar files are usually "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2889,
    "preview": "# Contributing to Tinker\nWelcome to [report Issues](https://github.com/Tencent/tinker/issues) or [pull requests](https:/"
  },
  {
    "path": "LICENSE",
    "chars": 41511,
    "preview": "Tencent is pleased to support the open source community by making Tinker available.\n\nCopyright (C) 2016 THL A29 Limited,"
  },
  {
    "path": "README.md",
    "chars": 6033,
    "preview": "## Tinker\n[![license](http://img.shields.io/badge/license-BSD3-brightgreen.svg?style=flat)](https://github.com/Tencent/t"
  },
  {
    "path": "build.gradle",
    "chars": 1449,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    re"
  },
  {
    "path": "checkstyle.xml",
    "chars": 18451,
    "preview": "<?xml version=\"1.0\"?>\n<!DOCTYPE module PUBLIC\n    \"-//Puppy Crawl//DTD Check Configuration 1.3//EN\"\n    \"http://checksty"
  },
  {
    "path": "findbugs-exclude.xml",
    "chars": 160,
    "preview": "<FindBugsFilter>\n\n    <Match>\n        <Class name=\"~.*R\\$.*\" />\n    </Match>\n    <Match>\n        <Class name=\"~.*Manifes"
  },
  {
    "path": "gradle/PublishArtifact.gradle",
    "chars": 894,
    "preview": "apply from: rootProject.file('gradle/WeChatPublish.gradle')\n\ndef checkAndGetOption(name) {\n    if (!project.hasProperty("
  },
  {
    "path": "gradle/WeChatPublish.gradle",
    "chars": 22171,
    "preview": "\ndef extensionClass\n\n// Detect supported plugin modules\nif (plugins.hasPlugin('com.android.library')) {\n    // Android l"
  },
  {
    "path": "gradle/check.gradle",
    "chars": 4014,
    "preview": "if (project == rootProject) {\n    task('checkAll') {\n        group 'verification'\n        doFirst {\n            logger.l"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 202,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 881,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "gradlew.bat",
    "chars": 2260,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "pmd-ruleset.xml",
    "chars": 1783,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n<ruleset name=\"PMD.rul\" xmlns=\"http://pmd.sourceforge.net/rulese"
  },
  {
    "path": "settings.gradle",
    "chars": 568,
    "preview": "include ':tinker-commons'\ninclude ':tinker-android:tinker-android-loader'\ninclude ':tinker-android:tinker-android-loader"
  },
  {
    "path": "suppressions.xml",
    "chars": 6421,
    "preview": "<?xml version=\"1.0\"?>\n\n<!DOCTYPE suppressions PUBLIC\n    \"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN\"\n  "
  },
  {
    "path": "third-party/aosp-dexutils/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "third-party/aosp-dexutils/NOTICE",
    "chars": 10780,
    "preview": "   Original work Copyright (c) 2005-2008, The Android Open Source Project\n   Modified work Copyright (C) 2016 THL A29 Li"
  },
  {
    "path": "third-party/aosp-dexutils/build.gradle",
    "chars": 571,
    "preview": "apply plugin: 'java-library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\n[compileJava, compileTes"
  },
  {
    "path": "third-party/aosp-dexutils/gradle.properties",
    "chars": 80,
    "preview": "POM_ARTIFACT_ID=aosp-dexutils\nPOM_NAME=Dex Utils Lib From AOSP\nPOM_PACKAGING=jar"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java",
    "chars": 2257,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java",
    "chars": 2087,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java",
    "chars": 2184,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java",
    "chars": 5440,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/CallSiteId.java",
    "chars": 1247,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java",
    "chars": 5785,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java",
    "chars": 3442,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java",
    "chars": 5911,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java",
    "chars": 3015,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java",
    "chars": 36041,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java",
    "chars": 1012,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexFormat.java",
    "chars": 6607,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValue.java",
    "chars": 1850,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueCodec.java",
    "chars": 6010,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueReader.java",
    "chars": 9132,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/FieldId.java",
    "chars": 2063,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Leb128.java",
    "chars": 5224,
    "preview": "/*\n * Copyright (C) 2008 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodHandle.java",
    "chars": 3291,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodId.java",
    "chars": 2054,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Mutf8.java",
    "chars": 4205,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ProtoId.java",
    "chars": 2014,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/SizeOf.java",
    "chars": 3204,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/StringData.java",
    "chars": 1727,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TableOfContents.java",
    "chars": 16810,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TypeList.java",
    "chars": 1592,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/io/DexDataBuffer.java",
    "chars": 33192,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteInput.java",
    "chars": 862,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteOutput.java",
    "chars": 869,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/CompareUtils.java",
    "chars": 7016,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/FileUtils.java",
    "chars": 3747,
    "preview": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/HashCodeHelper.java",
    "chars": 1790,
    "preview": "package com.tencent.tinker.android.dex.util;\n\nimport java.lang.reflect.Array;\nimport java.util.Arrays;\n\npublic final cla"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/CodeCursor.java",
    "chars": 2660,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionCodec.java",
    "chars": 55222,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionComparator.java",
    "chars": 24655,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionPromoter.java",
    "chars": 19105,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionReader.java",
    "chars": 1094,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionVisitor.java",
    "chars": 4460,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionWriter.java",
    "chars": 10692,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/Opcodes.java",
    "chars": 13214,
    "preview": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeInput.java",
    "chars": 2228,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeOutput.java",
    "chars": 4540,
    "preview": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/Hex.java",
    "chars": 8505,
    "preview": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseBoolArray.java",
    "chars": 12168,
    "preview": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseIntArray.java",
    "chars": 10595,
    "preview": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "third-party/bsdiff-util/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "third-party/bsdiff-util/LICENSE.txt",
    "chars": 1395,
    "preview": "BSD License\n\nCopyright (C) 2016 THL A29 Limited, a Tencent company.\nCopyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail"
  },
  {
    "path": "third-party/bsdiff-util/build.gradle",
    "chars": 571,
    "preview": "apply plugin: 'java-library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\n[compileJava, compileTes"
  },
  {
    "path": "third-party/bsdiff-util/gradle.properties",
    "chars": 66,
    "preview": "POM_ARTIFACT_ID=bsdiff-util\nPOM_NAME=BsDiff Util\nPOM_PACKAGING=jar"
  },
  {
    "path": "third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSDiff.java",
    "chars": 26028,
    "preview": "/*\n * Copyright (C) 2016 THL A29 Limited, a Tencent company.\n * Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com"
  },
  {
    "path": "third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSPatch.java",
    "chars": 13762,
    "preview": "/*\n * Copyright (C) 2016 THL A29 Limited, a Tencent company.\n * Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com"
  },
  {
    "path": "third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSUtil.java",
    "chars": 2944,
    "preview": "/*\n * Copyright (C) 2016 THL A29 Limited, a Tencent company.\n * Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com"
  },
  {
    "path": "third-party/tinker-ziputils/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "third-party/tinker-ziputils/NOTICE.txt",
    "chars": 10780,
    "preview": "   Original work Copyright (c) 2005-2008, The Android Open Source Project\n   Modified work Copyright (C) 2016 THL A29 Li"
  },
  {
    "path": "third-party/tinker-ziputils/build.gradle",
    "chars": 571,
    "preview": "apply plugin: 'java-library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\n[compileJava, compileTes"
  },
  {
    "path": "third-party/tinker-ziputils/gradle.properties",
    "chars": 779,
    "preview": "#\n# Tencent is pleased to support the open source community by making Tinker available.\n#\n# Copyright (C) 2016 THL A29 L"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/AlignedZipOutputStream.java",
    "chars": 17077,
    "preview": "package com.tencent.tinker.ziputils.ziputil;\r\n\r\nimport java.io.ByteArrayOutputStream;\r\nimport java.io.IOException;\r\nimpo"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/Arrays.java",
    "chars": 1194,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/BufferIterator.java",
    "chars": 1223,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/HeapBufferIterator.java",
    "chars": 2560,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/Memory.java",
    "chars": 5127,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/SizeOf.java",
    "chars": 1101,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/StandardCharsets.java",
    "chars": 991,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/Streams.java",
    "chars": 7443,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipEntry.java",
    "chars": 16404,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipFile.java",
    "chars": 24425,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipOutputStream.java",
    "chars": 25512,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/TinkerZipUtil.java",
    "chars": 3241,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "third-party/tinker-ziputils/src/main/java/com/tencent/tinker/ziputils/ziputil/ZipConstants.java",
    "chars": 1657,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/consumer-proguard.txt",
    "chars": 773,
    "preview": "# Understand the Tinker @Keep annotation.\n-keep class com.tencent.tinker.anno.Keep\n\n-keep @com.tencent.tinker.anno.Keep "
  },
  {
    "path": "tinker-android/tinker-android-anno/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "tinker-android/tinker-android-anno/build.gradle",
    "chars": 889,
    "preview": "apply plugin: 'java-library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\n[compileJava, compileTes"
  },
  {
    "path": "tinker-android/tinker-android-anno/gradle.properties",
    "chars": 82,
    "preview": "POM_ARTIFACT_ID=tinker-android-anno\nPOM_NAME=Tinker Android Anno\nPOM_PACKAGING=jar"
  },
  {
    "path": "tinker-android/tinker-android-anno/src/main/resources/META-INF/services/javax.annotation.processing.Processor",
    "chars": 44,
    "preview": "com.tencent.tinker.anno.AnnotationProcessor\n"
  },
  {
    "path": "tinker-android/tinker-android-anno/src/main/resources/TinkerAnnoApplication.tmpl",
    "chars": 415,
    "preview": "package %PACKAGE%;\n\nimport com.tencent.tinker.loader.app.TinkerApplication;\n\n/**\n *\n * Generated application for tinker "
  },
  {
    "path": "tinker-android/tinker-android-anno/src/test/java/com/tencent/tinker/anno/test/TestLifeCycle.java",
    "chars": 1046,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-anno-support/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "tinker-android/tinker-android-anno-support/build.gradle",
    "chars": 408,
    "preview": "apply plugin: 'java-library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\n[compileJava, compileTes"
  },
  {
    "path": "tinker-android/tinker-android-anno-support/gradle.properties",
    "chars": 104,
    "preview": "POM_ARTIFACT_ID=tinker-android-anno-support\nPOM_NAME=Tinker Android Annotation Support\nPOM_PACKAGING=jar"
  },
  {
    "path": "tinker-android/tinker-android-anno-support/src/main/java/com/tencent/tinker/anno/AnnotationProcessor.java",
    "chars": 5022,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-anno-support/src/main/java/com/tencent/tinker/anno/DefaultLifeCycle.java",
    "chars": 1419,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-anno-support/src/main/java/com/tencent/tinker/anno/Keep.java",
    "chars": 449,
    "preview": "package com.tencent.tinker.anno;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport"
  },
  {
    "path": "tinker-android/tinker-android-lib/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "tinker-android/tinker-android-lib/build.gradle",
    "chars": 1461,
    "preview": "apply plugin: 'com.android.library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\nandroid {\n    com"
  },
  {
    "path": "tinker-android/tinker-android-lib/gradle.properties",
    "chars": 63,
    "preview": "POM_ARTIFACT_ID=tinker-android-lib\nPOM_NAME=Tinker Android Lib\n"
  },
  {
    "path": "tinker-android/tinker-android-lib/proguard-rules.pro",
    "chars": 670,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java",
    "chars": 1079,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/AndroidManifest.xml",
    "chars": 1314,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/aidl/com/tencent/tinker/lib/IForeService.aidl",
    "chars": 102,
    "preview": "// IForeService.aidl\npackage com.tencent.tinker.lib;\n\n\ninterface IForeService {\n    void startme();\n}\n"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/ApplicationLifeCycle.java",
    "chars": 1857,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/ApplicationLike.java",
    "chars": 3744,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/DefaultApplicationLike.java",
    "chars": 2354,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/entry/TinkerApplicationInlineFence.java",
    "chars": 5245,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/filepatch/AbstractFilePatch.java",
    "chars": 292,
    "preview": "package com.tencent.tinker.lib.filepatch;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\n"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/filepatch/BsFilePatch.java",
    "chars": 432,
    "preview": "package com.tencent.tinker.lib.filepatch;\n\nimport com.tencent.tinker.bsdiff.BSPatch;\n\nimport java.io.File;\nimport java.i"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/filepatch/FilePatchFactory.java",
    "chars": 617,
    "preview": "package com.tencent.tinker.lib.filepatch;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport com.tencent."
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/library/TinkerLoadLibrary.java",
    "chars": 19407,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java",
    "chars": 7060,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java",
    "chars": 882,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java",
    "chars": 1060,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ArkHotDiffPatchInternal.java",
    "chars": 4299,
    "preview": "/*\n * Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved.\n *\n * This program is free software; you ca"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BasePatchInternal.java",
    "chars": 5160,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java",
    "chars": 35929,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ResDiffPatchInternal.java",
    "chars": 19227,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/SoDiffPatchInternal.java",
    "chars": 10176,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java",
    "chars": 11675,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java",
    "chars": 16311,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java",
    "chars": 10409,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java",
    "chars": 8230,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java",
    "chars": 5616,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java",
    "chars": 2381,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java",
    "chars": 4040,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/PatchResult.java",
    "chars": 2204,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchForeService.java",
    "chars": 889,
    "preview": "package com.tencent.tinker.lib.service;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.os.IB"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java",
    "chars": 12385,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java",
    "chars": 14617,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java",
    "chars": 13410,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java",
    "chars": 4696,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java",
    "chars": 19002,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java",
    "chars": 2245,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java",
    "chars": 3886,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/UpgradePatchRetry.java",
    "chars": 10945,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java",
    "chars": 1050,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/build.gradle",
    "chars": 1467,
    "preview": "apply plugin: 'com.android.library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\nandroid {\n    com"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/gradle.properties",
    "chars": 69,
    "preview": "POM_ARTIFACT_ID=tinker-android-lib-no-op\nPOM_NAME=Tinker Android Lib\n"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/proguard-rules.pro",
    "chars": 670,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java",
    "chars": 1079,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/AndroidManifest.xml",
    "chars": 116,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.tencent.tinker.lib\">\n\n    <application />\n\n</manifest>"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/library/TinkerLoadLibrary.java",
    "chars": 2608,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java",
    "chars": 1690,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java",
    "chars": 882,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java",
    "chars": 1060,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java",
    "chars": 1431,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java",
    "chars": 2437,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java",
    "chars": 2178,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java",
    "chars": 1530,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java",
    "chars": 1799,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java",
    "chars": 1606,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java",
    "chars": 1429,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/service/PatchResult.java",
    "chars": 1802,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java",
    "chars": 12538,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java",
    "chars": 3230,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java",
    "chars": 3544,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java",
    "chars": 18677,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java",
    "chars": 2281,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java",
    "chars": 1573,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/main/java/com/tencent/tinker/lib/util/UpgradePatchRetry.java",
    "chars": 2298,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-lib-no-op/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java",
    "chars": 1050,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "tinker-android/tinker-android-loader/build.gradle",
    "chars": 1424,
    "preview": "apply plugin: 'com.android.library'\n\nversion rootProject.ext.VERSION_NAME\ngroup rootProject.ext.GROUP\n\nandroid {\n    com"
  },
  {
    "path": "tinker-android/tinker-android-loader/gradle.properties",
    "chars": 86,
    "preview": "POM_ARTIFACT_ID=tinker-android-loader\nPOM_NAME=Tinker Android Loader\nPOM_PACKAGING=jar"
  },
  {
    "path": "tinker-android/tinker-android-loader/proguard-rules.pro",
    "chars": 670,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java",
    "chars": 1076,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/AndroidManifest.xml",
    "chars": 5823,
    "preview": "<manifest package=\"com.tencent.tinker.loader\"\n          xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    "
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AbstractTinkerLoader.java",
    "chars": 999,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AppInfoChangedBlocker.java",
    "chars": 3926,
    "preview": "package com.tencent.tinker.loader;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.os.Bu"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/NewClassLoaderInjector.java",
    "chars": 7731,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/SystemClassLoaderAdder.java",
    "chars": 19042,
    "preview": "/*\n * Copyright (C) 2016 THL A29 Limited, a Tencent company.\n * Copyright (C) 2013 The Android Open Source Project\n *\n *"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerArkHotLoader.java",
    "chars": 6361,
    "preview": "/*\n * Copyright (C) 2019-2019. Huawei Technologies Co., Ltd. All rights reserved.\n *\n * This program is free software; y"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerClassLoader.java",
    "chars": 3607,
    "preview": "package com.tencent.tinker.loader;\n\nimport android.annotation.SuppressLint;\n\nimport com.tencent.tinker.anno.Keep;\n\nimpor"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java",
    "chars": 14183,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexOptimizer.java",
    "chars": 29463,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerLoader.java",
    "chars": 20905,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourceLoader.java",
    "chars": 5912,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcePatcher.java",
    "chars": 23642,
    "preview": "/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcesKey.java",
    "chars": 1130,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java",
    "chars": 1298,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerSoLoader.java",
    "chars": 3951,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerTestDexLoad.java",
    "chars": 925,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerUncaughtHandler.java",
    "chars": 3079,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java",
    "chars": 12177,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerInlineFenceAction.java",
    "chars": 5995,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tinker available.\n *\n * Copyright (C) 2016 THL A"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/ActivityStubManager.java",
    "chars": 3726,
    "preview": "package com.tencent.tinker.loader.hotplug;\n\nimport android.content.pm.ActivityInfo;\n\nimport java.util.HashMap;\nimport ja"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/ActivityStubs.java",
    "chars": 4698,
    "preview": "package com.tencent.tinker.loader.hotplug;\n\nimport android.app.Activity;\n\n/**\n * Created by tangyinsheng on 2017/8/3.\n *"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/ComponentHotplug.java",
    "chars": 4859,
    "preview": "package com.tencent.tinker.loader.hotplug;\n\nimport android.content.Context;\nimport android.os.Build;\nimport android.os.H"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/EnvConsts.java",
    "chars": 658,
    "preview": "package com.tencent.tinker.loader.hotplug;\n\nimport android.content.Context;\n\n/**\n * Created by tangyinsheng on 2017/8/3."
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/IncrementComponentManager.java",
    "chars": 29239,
    "preview": "package com.tencent.tinker.loader.hotplug;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport"
  },
  {
    "path": "tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/hotplug/UnsupportedEnvironmentException.java",
    "chars": 352,
    "preview": "package com.tencent.tinker.loader.hotplug;\n\n/**\n * Created by tangyinsheng on 2017/7/31.\n */\n\npublic class UnsupportedEn"
  }
]

// ... and 227 more files (download for full content)

About this extraction

This page contains the full source code of the Tencent/tinker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 427 files (2.5 MB), approximately 671.7k tokens, and a symbol index with 3259 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!