From ddd547f864903f1689091a3b3ac53f87198cfdc9 Mon Sep 17 00:00:00 2001 From: shwenzhang Date: Wed, 21 Sep 2016 21:39:35 +0800 Subject: [PATCH] init tinker repo --- .gitignore | 46 + CONTRIBUTING.md | 60 + LICENSE | 669 ++++++ README.md | 83 + assets/tinker.png | Bin 0 -> 80005 bytes build.gradle | 67 + checkstyle.xml | 156 ++ gradle.properties | 20 + gradle/android-artifacts.gradle | 49 + gradle/gradle-mvn-push.gradle | 138 ++ gradle/java-artifacts.gradle | 42 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53637 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 160 ++ gradlew.bat | 90 + settings.gradle | 10 + third-party/aosp-dexutils/.gitignore | 1 + third-party/aosp-dexutils/NOTICE | 190 ++ third-party/aosp-dexutils/build.gradle | 18 + third-party/aosp-dexutils/gradle.properties | 3 + .../tinker/android/dex/Annotation.java | 54 + .../tinker/android/dex/AnnotationSet.java | 57 + .../android/dex/AnnotationSetRefList.java | 57 + .../android/dex/AnnotationsDirectory.java | 137 ++ .../tencent/tinker/android/dex/ClassData.java | 135 ++ .../tencent/tinker/android/dex/ClassDef.java | 88 + .../com/tencent/tinker/android/dex/Code.java | 154 ++ .../tinker/android/dex/DebugInfoItem.java | 75 + .../com/tencent/tinker/android/dex/Dex.java | 988 +++++++++ .../tinker/android/dex/DexException.java | 33 + .../tencent/tinker/android/dex/DexFormat.java | 102 + .../tinker/android/dex/EncodedValue.java | 54 + .../tinker/android/dex/EncodedValueCodec.java | 187 ++ .../android/dex/EncodedValueReader.java | 287 +++ .../tencent/tinker/android/dex/FieldId.java | 48 + .../tencent/tinker/android/dex/Leb128.java | 187 ++ .../tencent/tinker/android/dex/MethodId.java | 48 + .../com/tencent/tinker/android/dex/Mutf8.java | 115 + .../tencent/tinker/android/dex/ProtoId.java | 50 + .../tencent/tinker/android/dex/SizeOf.java | 105 + .../tinker/android/dex/StringData.java | 49 + .../tinker/android/dex/TableOfContents.java | 435 ++++ .../tencent/tinker/android/dex/TypeList.java | 40 + .../tinker/android/dex/io/DexDataBuffer.java | 913 ++++++++ .../tinker/android/dex/util/ByteInput.java | 30 + .../tinker/android/dex/util/ByteOutput.java | 30 + .../tinker/android/dex/util/CompareUtils.java | 253 +++ .../tinker/android/dex/util/FileUtils.java | 121 + .../android/dx/instruction/CodeCursor.java | 89 + .../dx/instruction/InstructionCodec.java | 787 +++++++ .../dx/instruction/InstructionComparator.java | 443 ++++ .../dx/instruction/InstructionPromoter.java | 504 +++++ .../dx/instruction/InstructionReader.java | 562 +++++ .../dx/instruction/InstructionVisitor.java | 90 + .../dx/instruction/InstructionWriter.java | 706 ++++++ .../android/dx/instruction/Opcodes.java | 294 +++ .../dx/instruction/ShortArrayCodeInput.java | 81 + .../dx/instruction/ShortArrayCodeOutput.java | 188 ++ .../tencent/tinker/android/dx/util/Hex.java | 310 +++ .../tinker/android/dx/util/IndexMap.java | 738 +++++++ .../dx/util/InstructionTransformer.java | 128 ++ .../tinker/android/utils/SparseIntArray.java | 314 +++ third-party/bsdiff-util/.gitignore | 1 + third-party/bsdiff-util/LICENSE.txt | 27 + third-party/bsdiff-util/build.gradle | 18 + third-party/bsdiff-util/gradle.properties | 3 + .../com/tencent/tinker/bsdiff/BSDiff.java | 550 +++++ .../com/tencent/tinker/bsdiff/BSPatch.java | 384 ++++ .../com/tencent/tinker/bsdiff/BSUtil.java | 83 + third-party/seven-zip/.gitignore | 1 + third-party/seven-zip/License.txt | 52 + third-party/seven-zip/build.gradle | 68 + .../executable/SevenZip-linux-x86_32.exe | Bin 0 -> 1620784 bytes .../executable/SevenZip-linux-x86_64.exe | Bin 0 -> 1151496 bytes .../executable/SevenZip-osx-x86_64.exe | Bin 0 -> 1528656 bytes .../executable/SevenZip-windows-x86_32.exe | Bin 0 -> 643584 bytes .../executable/SevenZip-windows-x86_64.exe | Bin 0 -> 1062912 bytes third-party/seven-zip/gradle.properties | 2 + tinker-android/tinker-android-anno/.gitignore | 1 + .../tinker-android-anno/build.gradle | 34 + .../tinker-android-anno/gradle.properties | 3 + .../tinker/anno/AnnotationProcessor.java | 115 + .../tencent/tinker/anno/DefaultLifeCycle.java | 44 + .../javax.annotation.processing.Processor | 1 + .../main/resources/TinkerAnnoApplication.tmpl | 16 + .../tinker/anno/test/TestLifeCycle.java | 29 + tinker-android/tinker-android-lib/.gitignore | 1 + .../tinker-android-lib/build.gradle | 39 + .../tinker-android-lib/gradle.properties | 2 + .../tinker-android-lib/proguard-rules.pro | 17 + .../tinker/lib/patch/ApplicationTest.java | 29 + .../src/main/AndroidManifest.xml | 18 + .../lib/listener/DefaultPatchListener.java | 85 + .../tinker/lib/listener/PatchListener.java | 24 + .../tinker/lib/patch/AbstractPatch.java | 29 + .../tinker/lib/patch/BasePatchInternal.java | 101 + .../tinker/lib/patch/BsDiffPatchInternal.java | 211 ++ .../lib/patch/DexDiffPatchInternal.java | 418 ++++ .../tencent/tinker/lib/patch/RepairPatch.java | 121 + .../lib/patch/ResDiffPatchInternal.java | 317 +++ .../tinker/lib/patch/UpgradePatch.java | 158 ++ .../lib/reporter/DefaultLoadReporter.java | 255 +++ .../lib/reporter/DefaultPatchReporter.java | 188 ++ .../tinker/lib/reporter/LoadReporter.java | 140 ++ .../tinker/lib/reporter/PatchReporter.java | 139 ++ .../lib/service/AbstractResultService.java | 78 + .../service/DefaultTinkerResultService.java | 86 + .../tinker/lib/service/PatchResult.java | 63 + .../lib/service/TinkerPatchService.java | 193 ++ .../com/tencent/tinker/lib/tinker/Tinker.java | 409 ++++ .../lib/tinker/TinkerApplicationHelper.java | 342 +++ .../tinker/lib/tinker/TinkerInstaller.java | 205 ++ .../tinker/lib/tinker/TinkerLoadResult.java | 362 +++ .../tencent/tinker/lib/util/TinkerLog.java | 131 ++ .../lib/util/TinkerServiceInternals.java | 133 ++ .../tinker/recover/ExampleUnitTest.java | 31 + .../tinker-android-loader/.gitignore | 1 + .../tinker-android-loader/build.gradle | 34 + .../tinker-android-loader/gradle.properties | 3 + .../tinker-android-loader/proguard-rules.pro | 17 + .../tinker/loader/ApplicationTest.java | 29 + .../src/main/AndroidManifest.xml | 8 + .../tinker/loader/AbstractTinkerLoader.java | 29 + .../tinker/loader/AndroidNClassLoader.java | 103 + .../tinker/loader/SystemClassLoaderAdder.java | 287 +++ .../tinker/loader/TinkerDexLoader.java | 202 ++ .../tencent/tinker/loader/TinkerLoader.java | 258 +++ .../tinker/loader/TinkerResourceLoader.java | 124 ++ .../tinker/loader/TinkerResourcePatcher.java | 192 ++ .../tinker/loader/TinkerRuntimeException.java | 34 + .../tencent/tinker/loader/TinkerSoLoader.java | 105 + .../tinker/loader/TinkerTestDexLoad.java | 24 + .../loader/app/ApplicationLifeCycle.java | 66 + .../tinker/loader/app/ApplicationLike.java | 119 + .../loader/app/DefaultApplicationLike.java | 72 + .../tinker/loader/app/TinkerApplication.java | 269 +++ .../shareutil/ShareBsDiffPatchInfo.java | 95 + .../loader/shareutil/ShareConstants.java | 170 ++ .../shareutil/ShareDexDiffPatchInfo.java | 128 ++ .../loader/shareutil/ShareFileLockHelper.java | 85 + .../loader/shareutil/ShareIntentUtil.java | 180 ++ .../loader/shareutil/SharePatchFileUtil.java | 424 ++++ .../loader/shareutil/SharePatchInfo.java | 188 ++ .../loader/shareutil/ShareReflectUtil.java | 128 ++ .../loader/shareutil/ShareResPatchInfo.java | 189 ++ .../loader/shareutil/ShareSecurityCheck.java | 211 ++ .../shareutil/ShareTinkerInternals.java | 328 +++ .../tinker/loader/ExampleUnitTest.java | 31 + tinker-build/.gitignore | 0 tinker-build/tinker-patch-cli/.gitignore | 3 + tinker-build/tinker-patch-cli/build.gradle | 36 + .../com/tencent/tinker/patch/CliMain.java | 215 ++ .../tool_output/release.keystore | Bin 0 -> 4095 bytes .../tool_output/tinker_config.xml | 100 + .../tool_output/tinker_multidexkeep.pro | 21 + .../tool_output/tinker_proguard.pro | 31 + .../tinker-patch-gradle-plugin/.gitignore | 1 + .../tinker-patch-gradle-plugin/build.gradle | 33 + .../gradle.properties | 3 + .../build/gradle/TinkerPatchPlugin.groovy | 158 ++ .../TinkerBuildConfigExtension.groovy | 74 + .../extension/TinkerDexExtension.groovy | 67 + .../extension/TinkerLibExtension.groovy | 41 + .../TinkerPackageConfigExtension.groovy | 93 + .../extension/TinkerPatchExtension.groovy | 68 + .../extension/TinkerResourceExtension.groovy | 64 + .../extension/TinkerSevenZipExtension.groovy | 90 + .../gradle/task/TinkerManifestTask.groovy | 79 + .../task/TinkerMultidexConfigTask.groovy | 82 + .../gradle/task/TinkerPatchSchemaTask.groovy | 86 + .../task/TinkerProguardConfigTask.groovy | 102 + .../gradle/task/TinkerResourceIdTask.groovy | 78 + .../com.tencent.tinker.patch.properties | 1 + tinker-build/tinker-patch-lib/.gitignore | 1 + tinker-build/tinker-patch-lib/build.gradle | 29 + .../tinker-patch-lib/gradle.properties | 3 + .../build/aapt/AaptResourceCollector.java | 346 +++ .../tencent/tinker/build/aapt/AaptUtil.java | 489 ++++ .../tencent/tinker/build/aapt/Constant.java | 302 +++ .../build/aapt/DefaultFileCopyProcessor.java | 69 + .../tinker/build/aapt/FakeRDotTxtEntry.java | 30 + .../tinker/build/aapt/FileCopyException.java | 47 + .../tencent/tinker/build/aapt/FileUtil.java | 1286 +++++++++++ .../tencent/tinker/build/aapt/Generator.java | 76 + .../tinker/build/aapt/JavaXmlUtil.java | 136 ++ .../tencent/tinker/build/aapt/ObjectUtil.java | 118 + .../tencent/tinker/build/aapt/PatchUtil.java | 198 ++ .../tinker/build/aapt/RDotTxtEntry.java | 146 ++ .../tinker/build/aapt/ResourceDirectory.java | 46 + .../tinker/build/aapt/ResourceEntry.java | 43 + .../tencent/tinker/build/aapt/StringUtil.java | 328 +++ .../build/apkparser/AndroidManifest.java | 142 ++ .../tinker/build/builder/PatchBuilder.java | 157 ++ .../tinker/build/decoder/ApkDecoder.java | 208 ++ .../tinker/build/decoder/BaseDecoder.java | 90 + .../tinker/build/decoder/BsDiffDecoder.java | 150 ++ .../tinker/build/decoder/DexDiffDecoder.java | 685 ++++++ .../tinker/build/decoder/ManifestDecoder.java | 105 + .../tinker/build/decoder/ResDiffDecoder.java | 407 ++++ .../build/decoder/UniqueDexDiffDecoder.java | 51 + .../build/dexpatcher/DexPatchGenerator.java | 720 ++++++ .../diff/AnnotationSectionDiffAlgorithm.java | 64 + ...otationSetRefListSectionDiffAlgorithm.java | 64 + .../AnnotationSetSectionDiffAlgorithm.java | 64 + ...otationsDirectorySectionDiffAlgorithm.java | 64 + .../diff/ClassDataSectionDiffAlgorithm.java | 91 + .../diff/ClassDefSectionDiffAlgorithm.java | 73 + .../diff/CodeSectionDiffAlgorithm.java | 64 + .../DebugInfoItemSectionDiffAlgorithm.java | 64 + .../diff/DexSectionDiffAlgorithm.java | 450 ++++ .../diff/FieldIdSectionDiffAlgorithm.java | 65 + .../diff/MethodIdSectionDiffAlgorithm.java | 65 + .../diff/ProtoIdSectionDiffAlgorithm.java | 65 + .../diff/StaticValueSectionDiffAlgorithm.java | 64 + .../diff/StringDataSectionDiffAlgorithm.java | 59 + .../diff/TypeIdSectionDiffAlgorithm.java | 64 + .../diff/TypeListSectionDiffAlgorithm.java | 64 + .../util/OffsetToIndexConverter.java | 187 ++ .../build/dexpatcher/util/PatternUtils.java | 89 + .../util/SmallDexPatchGenerator.java | 1965 +++++++++++++++++ .../tencent/tinker/build/info/InfoWriter.java | 99 + .../tencent/tinker/build/info/PatchInfo.java | 45 + .../tinker/build/info/PatchInfoGen.java | 75 + .../tinker/build/patch/Configuration.java | 576 +++++ .../tinker/build/patch/InputParam.java | 295 +++ .../tencent/tinker/build/patch/Runner.java | 105 + .../build/util/DexClassesComparator.java | 1534 +++++++++++++ .../util/ExcludedClassModifiedChecker.java | 209 ++ .../tinker/build/util/FileOperation.java | 401 ++++ .../com/tencent/tinker/build/util/Logger.java | 71 + .../com/tencent/tinker/build/util/MD5.java | 299 +++ .../build/util/TinkerPatchException.java | 40 + .../tencent/tinker/build/util/TypedValue.java | 74 + .../com/tencent/tinker/build/util/Utils.java | 213 ++ .../src/main/resources/test.dex | Bin 0 -> 584 bytes tinker-commons/.gitignore | 1 + tinker-commons/NOTICE.txt | 190 ++ tinker-commons/build.gradle | 24 + tinker-commons/gradle.properties | 3 + .../commons/dexpatcher/DexPatchApplier.java | 403 ++++ .../commons/dexpatcher/DexPatcherLogger.java | 61 + .../AnnotationSectionPatchAlgorithm.java | 125 ++ ...tationSetRefListSectionPatchAlgorithm.java | 127 ++ .../AnnotationSetSectionPatchAlgorithm.java | 125 ++ ...tationsDirectorySectionPatchAlgorithm.java | 125 ++ .../patch/ClassDataSectionPatchAlgorithm.java | 125 ++ .../patch/ClassDefSectionPatchAlgorithm.java | 114 + .../patch/CodeSectionPatchAlgorithm.java | 125 ++ .../DebugInfoItemSectionPatchAlgorithm.java | 125 ++ .../patch/DexSectionPatchAlgorithm.java | 436 ++++ .../patch/FieldIdSectionPatchAlgorithm.java | 125 ++ .../patch/MethodIdSectionPatchAlgorithm.java | 125 ++ .../patch/ProtoIdSectionPatchAlgorithm.java | 125 ++ .../StaticValueSectionPatchAlgorithm.java | 125 ++ .../StringDataSectionPatchAlgorithm.java | 127 ++ .../patch/TypeIdSectionPatchAlgorithm.java | 127 ++ .../patch/TypeListSectionPatchAlgorithm.java | 125 ++ .../dexpatcher/struct/DexPatchFile.java | 302 +++ .../dexpatcher/struct/PatchOperation.java | 63 + .../struct/SmallPatchedDexItemFile.java | 412 ++++ .../tinker/commons/resutil/ResUtil.java | 75 + .../tinker/commons/ziputil/Arrays.java | 30 + .../commons/ziputil/BufferIterator.java | 35 + .../commons/ziputil/HeapBufferIterator.java | 77 + .../tinker/commons/ziputil/Memory.java | 118 + .../tinker/commons/ziputil/SizeOf.java | 31 + .../commons/ziputil/StandardCharsets.java | 29 + .../tinker/commons/ziputil/Streams.java | 206 ++ .../commons/ziputil/TinkerZipEntry.java | 449 ++++ .../tinker/commons/ziputil/TinkerZipFile.java | 605 +++++ .../ziputil/TinkerZipOutputStream.java | 579 +++++ .../tinker/commons/ziputil/ZipConstants.java | 38 + tinker-sample-android/.gitignore | 8 + tinker-sample-android/app/.gitignore | 3 + tinker-sample-android/app/build.gradle | 354 +++ .../app/keep_in_main_dex.txt | 26 + .../app/keystore/debug.keystore | Bin 0 -> 1268 bytes .../app/keystore/release.keystore | Bin 0 -> 4095 bytes .../app/libs/armeabi/libstlport_shared.so | Bin 0 -> 390456 bytes tinker-sample-android/app/proguard-rules.pro | 19 + .../sample/android/ApplicationTest.java | 29 + .../app/src/main/AndroidManifest.xml | 29 + .../tinker/sample/android/Log/MyLogImp.java | 96 + .../sample/android/app/BaseBuildInfo.java | 25 + .../tinker/sample/android/app/BuildInfo.java | 37 + .../sample/android/app/MainActivity.java | 155 ++ .../android/app/SampleApplicationLike.java | 105 + .../crash/SampleUncaughtExceptionHandler.java | 140 ++ .../android/reporter/SampleLoadReporter.java | 122 + .../android/reporter/SamplePatchListener.java | 122 + .../android/reporter/SamplePatchReporter.java | 87 + .../android/reporter/SampleTinkerReport.java | 522 +++++ .../android/service/SampleResultService.java | 143 ++ .../util/SampleApplicationContext.java | 28 + .../sample/android/util/TinkerManager.java | 106 + .../android/util/UpgradePatchRetry.java | 265 +++ .../tinker/sample/android/util/Utils.java | 156 ++ .../app/src/main/res/layout/activity_main.xml | 60 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 5 + .../app/src/main/res/values/styles.xml | 10 + .../sample/android/ExampleUnitTest.java | 31 + tinker-sample-android/build.gradle | 19 + tinker-sample-android/gradle.properties | 21 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53637 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + tinker-sample-android/gradlew | 160 ++ tinker-sample-android/gradlew.bat | 90 + tinker-sample-android/proguard-rules.pro | 17 + tinker-sample-android/settings.gradle | 1 + tinker-sample-android/updateTinkerLib.sh | 4 + 318 files changed, 46473 insertions(+) create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/tinker.png create mode 100644 build.gradle create mode 100644 checkstyle.xml create mode 100644 gradle.properties create mode 100644 gradle/android-artifacts.gradle create mode 100644 gradle/gradle-mvn-push.gradle create mode 100644 gradle/java-artifacts.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 third-party/aosp-dexutils/.gitignore create mode 100644 third-party/aosp-dexutils/NOTICE create mode 100644 third-party/aosp-dexutils/build.gradle create mode 100644 third-party/aosp-dexutils/gradle.properties create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexFormat.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValue.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueCodec.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueReader.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/FieldId.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Leb128.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodId.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Mutf8.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ProtoId.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/SizeOf.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/StringData.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TableOfContents.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TypeList.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/io/DexDataBuffer.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteInput.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteOutput.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/CompareUtils.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/FileUtils.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/CodeCursor.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionCodec.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionComparator.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionPromoter.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionReader.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionVisitor.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionWriter.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/Opcodes.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeInput.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeOutput.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/Hex.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/IndexMap.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/InstructionTransformer.java create mode 100644 third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseIntArray.java create mode 100644 third-party/bsdiff-util/.gitignore create mode 100644 third-party/bsdiff-util/LICENSE.txt create mode 100644 third-party/bsdiff-util/build.gradle create mode 100644 third-party/bsdiff-util/gradle.properties create mode 100644 third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSDiff.java create mode 100644 third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSPatch.java create mode 100644 third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSUtil.java create mode 100644 third-party/seven-zip/.gitignore create mode 100644 third-party/seven-zip/License.txt create mode 100644 third-party/seven-zip/build.gradle create mode 100755 third-party/seven-zip/executable/SevenZip-linux-x86_32.exe create mode 100644 third-party/seven-zip/executable/SevenZip-linux-x86_64.exe create mode 100644 third-party/seven-zip/executable/SevenZip-osx-x86_64.exe create mode 100644 third-party/seven-zip/executable/SevenZip-windows-x86_32.exe create mode 100644 third-party/seven-zip/executable/SevenZip-windows-x86_64.exe create mode 100644 third-party/seven-zip/gradle.properties create mode 100644 tinker-android/tinker-android-anno/.gitignore create mode 100644 tinker-android/tinker-android-anno/build.gradle create mode 100644 tinker-android/tinker-android-anno/gradle.properties create mode 100644 tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/AnnotationProcessor.java create mode 100644 tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/DefaultLifeCycle.java create mode 100644 tinker-android/tinker-android-anno/src/main/resources/META-INF/services/javax.annotation.processing.Processor create mode 100644 tinker-android/tinker-android-anno/src/main/resources/TinkerAnnoApplication.tmpl create mode 100644 tinker-android/tinker-android-anno/src/test/java/com/tencent/tinker/anno/test/TestLifeCycle.java create mode 100644 tinker-android/tinker-android-lib/.gitignore create mode 100644 tinker-android/tinker-android-lib/build.gradle create mode 100644 tinker-android/tinker-android-lib/gradle.properties create mode 100644 tinker-android/tinker-android-lib/proguard-rules.pro create mode 100644 tinker-android/tinker-android-lib/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java create mode 100644 tinker-android/tinker-android-lib/src/main/AndroidManifest.xml create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BasePatchInternal.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BsDiffPatchInternal.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/RepairPatch.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ResDiffPatchInternal.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/PatchResult.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java create mode 100644 tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java create mode 100644 tinker-android/tinker-android-lib/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java create mode 100644 tinker-android/tinker-android-loader/.gitignore create mode 100644 tinker-android/tinker-android-loader/build.gradle create mode 100644 tinker-android/tinker-android-loader/gradle.properties create mode 100644 tinker-android/tinker-android-loader/proguard-rules.pro create mode 100644 tinker-android/tinker-android-loader/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java create mode 100644 tinker-android/tinker-android-loader/src/main/AndroidManifest.xml create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AbstractTinkerLoader.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AndroidNClassLoader.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/SystemClassLoaderAdder.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerLoader.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourceLoader.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcePatcher.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerSoLoader.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerTestDexLoad.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLifeCycle.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLike.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/DefaultApplicationLike.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareBsDiffPatchInfo.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareConstants.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareDexDiffPatchInfo.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareFileLockHelper.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareIntentUtil.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchFileUtil.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchInfo.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareReflectUtil.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareResPatchInfo.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java create mode 100644 tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java create mode 100644 tinker-android/tinker-android-loader/src/test/java/com/tencent/tinker/loader/ExampleUnitTest.java create mode 100644 tinker-build/.gitignore create mode 100644 tinker-build/tinker-patch-cli/.gitignore create mode 100644 tinker-build/tinker-patch-cli/build.gradle create mode 100644 tinker-build/tinker-patch-cli/src/main/java/com/tencent/tinker/patch/CliMain.java create mode 100644 tinker-build/tinker-patch-cli/tool_output/release.keystore create mode 100644 tinker-build/tinker-patch-cli/tool_output/tinker_config.xml create mode 100644 tinker-build/tinker-patch-cli/tool_output/tinker_multidexkeep.pro create mode 100644 tinker-build/tinker-patch-cli/tool_output/tinker_proguard.pro create mode 100644 tinker-build/tinker-patch-gradle-plugin/.gitignore create mode 100644 tinker-build/tinker-patch-gradle-plugin/build.gradle create mode 100644 tinker-build/tinker-patch-gradle-plugin/gradle.properties create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerBuildConfigExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerDexExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerLibExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPackageConfigExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPatchExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerResourceExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerSevenZipExtension.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerManifestTask.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerMultidexConfigTask.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerPatchSchemaTask.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerProguardConfigTask.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerResourceIdTask.groovy create mode 100644 tinker-build/tinker-patch-gradle-plugin/src/main/resources/META-INF/gradle-plugins/com.tencent.tinker.patch.properties create mode 100644 tinker-build/tinker-patch-lib/.gitignore create mode 100644 tinker-build/tinker-patch-lib/build.gradle create mode 100644 tinker-build/tinker-patch-lib/gradle.properties create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptResourceCollector.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptUtil.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Constant.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/DefaultFileCopyProcessor.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FakeRDotTxtEntry.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileCopyException.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileUtil.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Generator.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/JavaXmlUtil.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ObjectUtil.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/PatchUtil.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/RDotTxtEntry.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceDirectory.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceEntry.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/StringUtil.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/apkparser/AndroidManifest.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/builder/PatchBuilder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ApkDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BaseDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BsDiffDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/DexDiffDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ManifestDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ResDiffDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/UniqueDexDiffDecoder.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/DexPatchGenerator.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetRefListSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationsDirectorySectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDataSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDefSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/CodeSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DebugInfoItemSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DexSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/FieldIdSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/MethodIdSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ProtoIdSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StaticValueSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StringDataSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeIdSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeListSectionDiffAlgorithm.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/OffsetToIndexConverter.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/PatternUtils.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/SmallDexPatchGenerator.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/InfoWriter.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfo.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfoGen.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Configuration.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/InputParam.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Runner.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/DexClassesComparator.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/ExcludedClassModifiedChecker.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/FileOperation.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Logger.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/MD5.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TinkerPatchException.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TypedValue.java create mode 100644 tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Utils.java create mode 100644 tinker-build/tinker-patch-lib/src/main/resources/test.dex create mode 100644 tinker-commons/.gitignore create mode 100644 tinker-commons/NOTICE.txt create mode 100644 tinker-commons/build.gradle create mode 100644 tinker-commons/gradle.properties create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatchApplier.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatcherLogger.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetRefListSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationsDirectorySectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDataSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDefSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/CodeSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DebugInfoItemSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DexSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/FieldIdSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/MethodIdSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ProtoIdSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StaticValueSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StringDataSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeIdSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeListSectionPatchAlgorithm.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/DexPatchFile.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/PatchOperation.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/SmallPatchedDexItemFile.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/resutil/ResUtil.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Arrays.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/BufferIterator.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/HeapBufferIterator.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Memory.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/SizeOf.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/StandardCharsets.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Streams.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipEntry.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipFile.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipOutputStream.java create mode 100644 tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/ZipConstants.java create mode 100644 tinker-sample-android/.gitignore create mode 100644 tinker-sample-android/app/.gitignore create mode 100644 tinker-sample-android/app/build.gradle create mode 100644 tinker-sample-android/app/keep_in_main_dex.txt create mode 100644 tinker-sample-android/app/keystore/debug.keystore create mode 100644 tinker-sample-android/app/keystore/release.keystore create mode 100755 tinker-sample-android/app/libs/armeabi/libstlport_shared.so create mode 100644 tinker-sample-android/app/proguard-rules.pro create mode 100644 tinker-sample-android/app/src/androidTest/java/tinker/sample/android/ApplicationTest.java create mode 100644 tinker-sample-android/app/src/main/AndroidManifest.xml create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/Log/MyLogImp.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/app/BaseBuildInfo.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/app/BuildInfo.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/app/MainActivity.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/crash/SampleUncaughtExceptionHandler.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchListener.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchReporter.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleTinkerReport.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/service/SampleResultService.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/util/SampleApplicationContext.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/util/TinkerManager.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java create mode 100644 tinker-sample-android/app/src/main/java/tinker/sample/android/util/Utils.java create mode 100644 tinker-sample-android/app/src/main/res/layout/activity_main.xml create mode 100644 tinker-sample-android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 tinker-sample-android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 tinker-sample-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 tinker-sample-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 tinker-sample-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 tinker-sample-android/app/src/main/res/values-w820dp/dimens.xml create mode 100644 tinker-sample-android/app/src/main/res/values/colors.xml create mode 100644 tinker-sample-android/app/src/main/res/values/dimens.xml create mode 100644 tinker-sample-android/app/src/main/res/values/strings.xml create mode 100644 tinker-sample-android/app/src/main/res/values/styles.xml create mode 100644 tinker-sample-android/app/src/test/java/tinker/sample/android/ExampleUnitTest.java create mode 100644 tinker-sample-android/build.gradle create mode 100644 tinker-sample-android/gradle.properties create mode 100644 tinker-sample-android/gradle/wrapper/gradle-wrapper.jar create mode 100644 tinker-sample-android/gradle/wrapper/gradle-wrapper.properties create mode 100755 tinker-sample-android/gradlew create mode 100644 tinker-sample-android/gradlew.bat create mode 100644 tinker-sample-android/proguard-rules.pro create mode 100644 tinker-sample-android/settings.gradle create mode 100755 tinker-sample-android/updateTinkerLib.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..399a5294 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +.gradle +/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 +/*/*.iml +.idea +/*/.idea/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +/*/.idea + +/buildSdk + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..94ff98a9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,60 @@ +# 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 Guild first to make contributing earlier. + +## issues +We use Git Issues to track public bugs and feature requests. + +### Search Known Issues First +Please search the exist issues to see if any similar issue or feature request has already been filed. You shold try to make sure your issue doesn't already exist. + +### 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 branch here: + +1. `master` branch. + 1. It is the latest (pre-)release branch. We use `master` for tag, 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 publish 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 submit on `dev` branch. After full testing, we will merge them on `master` branch for the next release. + +If you have some urgent bugfix 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 passing, 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 following is 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. Make sure 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) \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..255e042d --- /dev/null +++ b/LICENSE @@ -0,0 +1,669 @@ +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. + + + Copyright (C) + + 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. + + , 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. + diff --git a/README.md b/README.md new file mode 100644 index 00000000..51e5e319 --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +## Tinker +[![license](http://img.shields.io/badge/license-BSD3-brightgreen.svg?style=flat)](https://github.com/Tencent/tinker/blob/master/LICENSE) + +Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall 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.6.0') + } +} +``` + +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 gen the final application + compile('com.tencent.tinker:tinker-android-anno:1.6.0') + //tinker's main Android lib + compile('com.tencent.tinker:tinker-android-lib:1.6.0') +} +... +... +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, which will be 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 as follows: + +```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.SampleApplicationLike"); + } +} +``` + +Use `tinker-android-anno` to generate your `Application` is more recommended, you can just add an annotation for your [SampleApplicationLike](http://git.code.oa.com/tinker/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 change the proguard config automatic, and 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). + +## 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. \ No newline at end of file diff --git a/assets/tinker.png b/assets/tinker.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac1e02b408caf7b876e30e47a36fabff0017fc4 GIT binary patch literal 80005 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

nU;^LmGix_oGLGI!N5pnweXEr5vJ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..ef10ccf2 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,20 @@ +# 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 +VERSION_NAME_PREFIX=1.6.0 +VERSION_NAME_SUFFIX=-SNAPSHOT \ No newline at end of file diff --git a/gradle/android-artifacts.gradle b/gradle/android-artifacts.gradle new file mode 100644 index 00000000..f240c22f --- /dev/null +++ b/gradle/android-artifacts.gradle @@ -0,0 +1,49 @@ +apply plugin: 'maven-publish' + +task androidJavadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar" + classpath += files(ext.androidJar) +} + +task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { + classifier = 'javadoc' + from androidJavadocs.destinationDir +} + +task androidSourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.sourceFiles +} + +artifacts { + archives androidSourcesJar + archives androidJavadocsJar +} + + +//for local maven test +afterEvaluate { project -> + tasks.all { Task task -> + if (task.name.equalsIgnoreCase('publishTinkerPatchPublicationToMavenLocal')) { + task.dependsOn tasks.getByName('assemble') + } + } +} + +publishing { + publications { + TinkerPatch(MavenPublication) { + groupId = group + artifactId = project.getName() + version = version + // Tell maven to prepare the generated "*.aar" file for publishing + artifact("$buildDir/outputs/aar/${project.getName()}-release.aar") + artifact androidJavadocsJar + } + } +} + +task buildAndPublishLocalMaven(dependsOn: ['build', 'publishTinkerPatchPublicationToMavenLocal']) {} +//depend checkstyle +project.tasks.getByName("check").dependsOn tasks.getByName("checkstyle") diff --git a/gradle/gradle-mvn-push.gradle b/gradle/gradle-mvn-push.gradle new file mode 100644 index 00000000..9e795143 --- /dev/null +++ b/gradle/gradle-mvn-push.gradle @@ -0,0 +1,138 @@ +apply plugin: 'maven' +apply plugin: 'signing' +apply plugin: 'com.jfrog.bintray' + + +def isReleaseBuild() { + return version.contains("SNAPSHOT") == false +} + +def getReleaseRepositoryUrl() { + return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL : readPropertyFromLocalProperties('RELEASE_REPOSITORY_URL') +} + +def getSnapshotRepositoryUrl() { + return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL : readPropertyFromLocalProperties('SNAPSHOT_REPOSITORY_URL') +} + +def readPropertyFromLocalProperties(String key) { + Properties properties = new Properties() + try { + properties.load(project.rootProject.file('local.properties').newDataInputStream()) + } catch (Exception e) { + println("load local properties failed msg:${e.message}") + } + return properties.getProperty(key) +} + +def getRepositoryUsername() { + return hasProperty('REPOSITORY_USERNAME') ? REPOSITORY_USERNAME : readPropertyFromLocalProperties('REPOSITORY_USERNAME') +} + +def getRepositoryPassword() { + return hasProperty('REPOSITORY_PASSWORD') ? REPOSITORY_PASSWORD : readPropertyFromLocalProperties('REPOSITORY_PASSWORD') +} + +def getBintrayUser() { + return hasProperty('BINTRAY_USER') ? BINTRAY_USER : readPropertyFromLocalProperties('BINTRAY_USER') +} + +def getBintrayKey() { + return hasProperty('BINTRAY_APIKEY') ? BINTRAY_APIKEY : readPropertyFromLocalProperties('BINTRAY_APIKEY') +} + +uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + pom.groupId = GROUP + pom.artifactId = POM_ARTIFACT_ID + pom.version = version + + repository(url: getReleaseRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + snapshotRepository(url: getSnapshotRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + + pom.project { + name POM_NAME + packaging POM_PACKAGING + description POM_DESCRIPTION + url POM_URL + + scm { + url POM_SCM_URL + } + + licenses { + license { + name POM_LICENCE_NAME + url POM_LICENCE_URL + Distribution POM_LICENCE_DIST + } + } + + developers { + developer { + id POM_DEVELOPER_ID + name POM_DEVELOPER_NAME + } + } + } + + } + } +} + +bintray { + user = getBintrayUser() + key = getBintrayKey() + configurations = ['archives'] + + pkg { + repo = 'maven' + userOrg = BINTRAY_ORGANIZATION + name = "${GROUP}:${POM_ARTIFACT_ID}" + licenses = BINTRAY_LICENCE + vcsUrl = POM_SCM_URL + websiteUrl = POM_URL + issueTrackerUrl = POM_ISSUE_URL + publicDownloadNumbers = true + publish = true + dryRun = false + } +} + +signing { + required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } + sign configurations.archives +} + +if (JavaVersion.current().isJava8Compatible()) { + allprojects { + tasks.withType(Javadoc) { + options.addStringOption('Xdoclint:none', '-quiet') + } + } +} + +task buildAndPublishRepo(dependsOn: ['build', 'uploadArchives']) { + doLast { + println "*published to repo: ${project.group}:${project.name}:${project.version}" + } +} + +//depend checkstyle +tasks.getByName("uploadArchives").dependsOn tasks.getByName("checkstyle") +tasks.getByName("bintrayUpload").dependsOn tasks.getByName("checkstyle") + +tasks.getByName("bintrayUpload") { + it.doFirst { + if (!isReleaseBuild()) { + throw new GradleException("bintrayUpload only support release version") + } + } +} \ No newline at end of file diff --git a/gradle/java-artifacts.gradle b/gradle/java-artifacts.gradle new file mode 100644 index 00000000..0bbd9769 --- /dev/null +++ b/gradle/java-artifacts.gradle @@ -0,0 +1,42 @@ +apply plugin: 'maven-publish' + +task sourcesJar(type: Jar) { + from sourceSets.main.java.srcDirs + classifier = 'sources' +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +artifacts { + archives javadocJar + archives sourcesJar +} + + +//for local maven test +afterEvaluate { project -> + tasks.all { Task task -> + if (task.name.equalsIgnoreCase('publishTinkerPatchPublicationToMavenLocal')) { + task.dependsOn tasks.getByName('assemble') + } + } +} + +publishing { + publications { + TinkerPatch(MavenPublication) { + from components.java + groupId = group + artifactId = project.getName() + version = version + } + } +} + +task buildAndPublishLocalMaven(dependsOn: ['build', 'publishTinkerPatchPublicationToMavenLocal']) {} + +//depend checkstyle +project.tasks.getByName("check").dependsOn tasks.getByName("checkstyle") \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..05ef575b0cd0173fc735f2857ce4bd594ce4f6bd GIT binary patch literal 53637 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 t9m@SZ!E*7&jsr?!t7TL-WYI4eM@gAug8 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 \(.*\)$'` + 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 + +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" ] ; 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 + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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 Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_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=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +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 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..1ed082f9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +include ':tinker-commons' +include ':tinker-android:tinker-android-loader' +include ':tinker-android:tinker-android-lib' +include ':tinker-android:tinker-android-anno' +include ':tinker-build:tinker-patch-cli' +include ':tinker-build:tinker-patch-lib' +include ':tinker-build:tinker-patch-gradle-plugin' +include ':third-party:seven-zip' +include ':third-party:aosp-dexutils' +include ':third-party:bsdiff-util' diff --git a/third-party/aosp-dexutils/.gitignore b/third-party/aosp-dexutils/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/third-party/aosp-dexutils/.gitignore @@ -0,0 +1 @@ +/build diff --git a/third-party/aosp-dexutils/NOTICE b/third-party/aosp-dexutils/NOTICE new file mode 100644 index 00000000..a513af6c --- /dev/null +++ b/third-party/aosp-dexutils/NOTICE @@ -0,0 +1,190 @@ + 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 + diff --git a/third-party/aosp-dexutils/build.gradle b/third-party/aosp-dexutils/build.gradle new file mode 100644 index 00000000..4153cea7 --- /dev/null +++ b/third-party/aosp-dexutils/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' + +[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +task buildSdk(type: Copy, dependsOn: [build]) { + from('build/libs') { + include '*.jar' + exclude '*javadoc.jar' + exclude '*-sources.jar' + } + into(rootProject.file("buildSdk/android")) +} + +apply from: rootProject.file('gradle/java-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') \ No newline at end of file diff --git a/third-party/aosp-dexutils/gradle.properties b/third-party/aosp-dexutils/gradle.properties new file mode 100644 index 00000000..e4a05a37 --- /dev/null +++ b/third-party/aosp-dexutils/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=aosp-dexutils +POM_NAME=Dex Utils Lib From AOSP +POM_PACKAGING=jar \ No newline at end of file diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java new file mode 100644 index 00000000..59d73fe5 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Annotation.java @@ -0,0 +1,54 @@ +/* + * 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 static com.tencent.tinker.android.dex.EncodedValueReader.ENCODED_ANNOTATION; + +/** + * An annotation. + */ +public final class Annotation extends Item { + 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) { + return encodedAnnotation.compareTo(other.encodedAnnotation); + } + + @Override + public int byteCountInDex() { + return SizeOf.UBYTE + encodedAnnotation.byteCountInDex(); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java new file mode 100644 index 00000000..16faedc7 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSet.java @@ -0,0 +1,57 @@ +/* + * 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; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Structure of AnnotationSet element in Dex file. + */ +public class AnnotationSet extends Section.Item { + 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 byteCountInDex() { + return SizeOf.UINT * (1 + annotationOffsets.length); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java new file mode 100644 index 00000000..6389c510 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationSetRefList.java @@ -0,0 +1,57 @@ +/* + * 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; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Structure of AnnotationSetRefList element in Dex file. + */ +public class AnnotationSetRefList extends Section.Item { + 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 byteCountInDex() { + return SizeOf.UINT * (1 + annotationSetRefItems.length); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java new file mode 100644 index 00000000..e5bd1256 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/AnnotationsDirectory.java @@ -0,0 +1,137 @@ +/* + * 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; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Structure of AnnotationsDirectory element in Dex file. + */ +public class AnnotationsDirectory extends Section.Item { + 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 byteCountInDex() { + return SizeOf.UINT * (4 + 2 * (fieldAnnotations.length + methodAnnotations.length + parameterAnnotations.length)); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java new file mode 100644 index 00000000..4824957e --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassData.java @@ -0,0 +1,135 @@ +/* + * 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 final class ClassData extends Item { + 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 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 { + 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); + } + } + + public static class Method implements Comparable { + 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); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java new file mode 100644 index 00000000..c507324a --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ClassDef.java @@ -0,0 +1,88 @@ +/* + * 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; + +/** + * A type definition. + */ +public final class ClassDef extends TableOfContents.Section.Item { + 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 byteCountInDex() { + return SizeOf.CLASS_DEF_ITEM; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java new file mode 100644 index 00000000..4bb34b8a --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Code.java @@ -0,0 +1,154 @@ +/* + * 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 final class Code extends Item { + 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 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 { + 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 { + 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); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java new file mode 100644 index 00000000..aff6a336 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DebugInfoItem.java @@ -0,0 +1,75 @@ +/* + * 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; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Structure of DebugInfoItem element in Dex file. + */ +public class DebugInfoItem extends Item { + 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 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; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java new file mode 100644 index 00000000..f22da85a --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Dex.java @@ -0,0 +1,988 @@ +/* + * 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; + 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 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; + } + + /** + * IMPORTANT To open a dex section by {@code TableOfContents.Section}, + * please use {@code openSection(TableOfContents.Section tocSec)} instead of + * passing tocSec.off to this method. + * + * Because dex section returned by this method never checks + * tocSec's bound when reading or writing data. + */ + 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 strings() { + return strings; + } + + public List typeIds() { + return typeIds; + } + + public List typeNames() { + return typeNames; + } + + public List protoIds() { + return protoIds; + } + + public List fieldIds() { + return fieldIds; + } + + public List methodIds() { + return methodIds; + } + + public List classDefs() { + return classDefs; + } + + public Iterable 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 position = classDef.off; + 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 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 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 + 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 + 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 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 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 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 ClassDefTable extends AbstractList 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 { + 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 { + public Iterator iterator() { + return !tableOfContents.classDefs.exists() + ? Collections.emptySet().iterator() + : new ClassDefIterator(); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java new file mode 100644 index 00000000..28d9adfc --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexException.java @@ -0,0 +1,33 @@ +/* + * 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; + +/** + * Thrown when there's a format problem reading, writing, or generally + * processing a dex file. + */ +public class DexException extends RuntimeException { + static final long serialVersionUID = 1L; + + public DexException(String message) { + super(message); + } + + public DexException(Throwable cause) { + super(cause); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexFormat.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexFormat.java new file mode 100644 index 00000000..564e3784 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/DexFormat.java @@ -0,0 +1,102 @@ +/* + * 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; + +/** + * Constants that show up in and are otherwise related to {@code .dex} + * files, and helper methods for same. + */ +public final class DexFormat { + /** + * API level to target in order to produce the most modern file + * format + */ + public static final int API_CURRENT = 14; + /** API level to target in order to suppress extended opcode usage */ + public static final int API_NO_EXTENDED_OPCODES = 13; + /** + * file name of the primary {@code .dex} file inside an + * application or library {@code .jar} file + */ + public static final String DEX_IN_JAR_NAME = "classes.dex"; + /** common prefix for all dex file "magic numbers" */ + public static final String MAGIC_PREFIX = "dex\n"; + /** common suffix for all dex file "magic numbers" */ + public static final String MAGIC_SUFFIX = "\0"; + /** dex file version number for the current format variant */ + public static final String VERSION_CURRENT = "036"; + /** dex file version number for API level 13 and earlier */ + public static final String VERSION_FOR_API_13 = "035"; + /** + * value used to indicate endianness of file contents + */ + public static final int ENDIAN_TAG = 0x12345678; + /** + * Maximum addressable field or method index. + * The largest addressable member is 0xffff, in the "instruction formats" spec as field@CCCC or + * meth@CCCC. + */ + public static final int MAX_MEMBER_IDX = 0xFFFF; + /** + * Maximum addressable type index. + * The largest addressable type is 0xffff, in the "instruction formats" spec as type@CCCC. + */ + public static final int MAX_TYPE_IDX = 0xFFFF; + + private DexFormat() { } + + /** + * Returns the API level corresponding to the given magic number, + * or {@code -1} if the given array is not a well-formed dex file + * magic number. + */ + public static int magicToApi(byte[] magic) { + if (magic.length != 8) { + return -1; + } + + if ((magic[0] != 'd') || (magic[1] != 'e') || (magic[2] != 'x') || (magic[3] != '\n') + || (magic[7] != '\0')) { + return -1; + } + + String version = "" + ((char) magic[4]) + ((char) magic[5]) + ((char) magic[6]); + + if (version.equals(VERSION_CURRENT)) { + return API_CURRENT; + } else if (version.equals(VERSION_FOR_API_13)) { + return 13; + } + + return -1; + } + + /** + * Returns the magic number corresponding to the given target API level. + */ + public static String apiToMagic(int targetApiLevel) { + String version; + + if (targetApiLevel >= API_CURRENT) { + version = VERSION_CURRENT; + } else { + version = VERSION_FOR_API_13; + } + + return MAGIC_PREFIX + version + MAGIC_SUFFIX; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValue.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValue.java new file mode 100644 index 00000000..28105aca --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValue.java @@ -0,0 +1,54 @@ +/* + * 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.ByteInput; +import com.tencent.tinker.android.dex.util.CompareUtils; + +import static com.tencent.tinker.android.dex.TableOfContents.Section.Item; + +/** + * An encoded value or array. + */ +public final class EncodedValue extends Item { + public byte[] data; + + public EncodedValue(int off, byte[] data) { + super(off); + this.data = data; + } + + public ByteInput asByteInput() { + return new ByteInput() { + private int position = 0; + + @Override + public byte readByte() { + return data[position++]; + } + }; + } + + @Override public int compareTo(EncodedValue other) { + return CompareUtils.uArrCompare(data, other.data); + } + + @Override + public int byteCountInDex() { + return SizeOf.UBYTE * data.length; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueCodec.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueCodec.java new file mode 100644 index 00000000..0614c5d5 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueCodec.java @@ -0,0 +1,187 @@ +/* + * 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.ByteInput; +import com.tencent.tinker.android.dex.util.ByteOutput; + +/** + * Read and write {@code encoded_value} primitives. + */ +public final class EncodedValueCodec { + private EncodedValueCodec() { + } + + /** + * Writes a signed integral to {@code out}. + */ + public static void writeSignedIntegralValue(ByteOutput out, int type, long value) { + /* + * Figure out how many bits are needed to represent the value, + * including a sign bit: The bit count is subtracted from 65 + * and not 64 to account for the sign bit. The xor operation + * has the effect of leaving non-negative values alone and + * unary complementing negative values (so that a leading zero + * count always returns a useful number for our present + * purpose). + */ + int requiredBits = 65 - Long.numberOfLeadingZeros(value ^ (value >> 63)); + + // Round up the requiredBits to a number of bytes. + int requiredBytes = (requiredBits + 0x07) >> 3; + + /* + * Write the header byte, which includes the type and + * requiredBytes - 1. + */ + out.writeByte(type | ((requiredBytes - 1) << 5)); + + // Write the value, per se. + while (requiredBytes > 0) { + out.writeByte((byte) value); + value >>= 8; + requiredBytes--; + } + } + + /** + * Writes an unsigned integral to {@code out}. + */ + public static void writeUnsignedIntegralValue(ByteOutput out, int type, long value) { + // Figure out how many bits are needed to represent the value. + int requiredBits = 64 - Long.numberOfLeadingZeros(value); + if (requiredBits == 0) { + requiredBits = 1; + } + + // Round up the requiredBits to a number of bytes. + int requiredBytes = (requiredBits + 0x07) >> 3; + + /* + * Write the header byte, which includes the type and + * requiredBytes - 1. + */ + out.writeByte(type | ((requiredBytes - 1) << 5)); + + // Write the value, per se. + while (requiredBytes > 0) { + out.writeByte((byte) value); + value >>= 8; + requiredBytes--; + } + } + + /** + * Writes a right-zero-extended value to {@code out}. + */ + public static void writeRightZeroExtendedValue(ByteOutput out, int type, long value) { + // Figure out how many bits are needed to represent the value. + int requiredBits = 64 - Long.numberOfTrailingZeros(value); + if (requiredBits == 0) { + requiredBits = 1; + } + + // Round up the requiredBits to a number of bytes. + int requiredBytes = (requiredBits + 0x07) >> 3; + + // Scootch the first bits to be written down to the low-order bits. + value >>= 64 - (requiredBytes * 8); + + /* + * Write the header byte, which includes the type and + * requiredBytes - 1. + */ + out.writeByte(type | ((requiredBytes - 1) << 5)); + + // Write the value, per se. + while (requiredBytes > 0) { + out.writeByte((byte) value); + value >>= 8; + requiredBytes--; + } + } + + /** + * Read a signed integer. + * + * @param zwidth byte count minus one + */ + public static int readSignedInt(ByteInput in, int zwidth) { + int result = 0; + for (int i = zwidth; i >= 0; i--) { + result = (result >>> 8) | ((in.readByte() & 0xff) << 24); + } + result >>= (3 - zwidth) * 8; + return result; + } + + /** + * Read an unsigned integer. + * + * @param zwidth byte count minus one + * @param fillOnRight true to zero fill on the right; false on the left + */ + public static int readUnsignedInt(ByteInput in, int zwidth, boolean fillOnRight) { + int result = 0; + if (!fillOnRight) { + for (int i = zwidth; i >= 0; i--) { + result = (result >>> 8) | ((in.readByte() & 0xff) << 24); + } + result >>>= (3 - zwidth) * 8; + } else { + for (int i = zwidth; i >= 0; i--) { + result = (result >>> 8) | ((in.readByte() & 0xff) << 24); + } + } + return result; + } + + /** + * Read a signed long. + * + * @param zwidth byte count minus one + */ + public static long readSignedLong(ByteInput in, int zwidth) { + long result = 0; + for (int i = zwidth; i >= 0; i--) { + result = (result >>> 8) | ((in.readByte() & 0xffL) << 56); + } + result >>= (7 - zwidth) * 8; + return result; + } + + /** + * Read an unsigned long. + * + * @param zwidth byte count minus one + * @param fillOnRight true to zero fill on the right; false on the left + */ + public static long readUnsignedLong(ByteInput in, int zwidth, boolean fillOnRight) { + long result = 0; + if (!fillOnRight) { + for (int i = zwidth; i >= 0; i--) { + result = (result >>> 8) | ((in.readByte() & 0xffL) << 56); + } + result >>>= (7 - zwidth) * 8; + } else { + for (int i = zwidth; i >= 0; i--) { + result = (result >>> 8) | ((in.readByte() & 0xffL) << 56); + } + } + return result; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueReader.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueReader.java new file mode 100644 index 00000000..f6678b76 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/EncodedValueReader.java @@ -0,0 +1,287 @@ +/* + * 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.ByteInput; + +/** + * Pull parser for encoded values. + */ +public final class EncodedValueReader { + public static final int ENCODED_BYTE = 0x00; + public static final int ENCODED_SHORT = 0x02; + public static final int ENCODED_CHAR = 0x03; + public static final int ENCODED_INT = 0x04; + public static final int ENCODED_LONG = 0x06; + public static final int ENCODED_FLOAT = 0x10; + public static final int ENCODED_DOUBLE = 0x11; + public static final int ENCODED_STRING = 0x17; + public static final int ENCODED_TYPE = 0x18; + public static final int ENCODED_FIELD = 0x19; + public static final int ENCODED_ENUM = 0x1b; + public static final int ENCODED_METHOD = 0x1a; + public static final int ENCODED_ARRAY = 0x1c; + public static final int ENCODED_ANNOTATION = 0x1d; + public static final int ENCODED_NULL = 0x1e; + public static final int ENCODED_BOOLEAN = 0x1f; + + /** placeholder type if the type is not yet known */ + private static final int MUST_READ = -1; + + protected final ByteInput in; + private int type = MUST_READ; + private int annotationType; + private int arg; + + public EncodedValueReader(ByteInput in) { + this.in = in; + } + + public EncodedValueReader(EncodedValue in) { + this(in.asByteInput()); + } + + /** + * Creates a new encoded value reader whose only value is the specified + * known type. This is useful for encoded values without a type prefix, + * such as class_def_item's encoded_array or annotation_item's + * encoded_annotation. + */ + public EncodedValueReader(ByteInput in, int knownType) { + this.in = in; + this.type = knownType; + } + + public EncodedValueReader(EncodedValue in, int knownType) { + this(in.asByteInput(), knownType); + } + + /** + * Returns the type of the next value to read. + */ + public int peek() { + if (type == MUST_READ) { + int argAndType = in.readByte() & 0xff; + type = argAndType & 0x1f; + arg = (argAndType & 0xe0) >> 5; + } + return type; + } + + /** + * Begins reading the elements of an array, returning the array's size. The + * caller must follow up by calling a read method for each element in the + * array. For example, this reads a byte array:
   {@code
+     *   int arraySize = readArray();
+     *   for (int i = 0, i < arraySize; i++) {
+     *     readByte();
+     *   }
+     * }
+ */ + public int readArray() { + checkType(ENCODED_ARRAY); + type = MUST_READ; + return Leb128.readUnsignedLeb128(in); + } + + /** + * Begins reading the fields of an annotation, returning the number of + * fields. The caller must follow up by making alternating calls to {@link + * #readAnnotationName()} and another read method. For example, this reads + * an annotation whose fields are all bytes:
   {@code
+     *   int fieldCount = readAnnotation();
+     *   int annotationType = getAnnotationType();
+     *   for (int i = 0; i < fieldCount; i++) {
+     *       readAnnotationName();
+     *       readByte();
+     *   }
+     * }
+ */ + public int readAnnotation() { + checkType(ENCODED_ANNOTATION); + type = MUST_READ; + annotationType = Leb128.readUnsignedLeb128(in); + return Leb128.readUnsignedLeb128(in); + } + + /** + * Returns the type of the annotation just returned by {@link + * #readAnnotation()}. This method's value is undefined unless the most + * recent call was to {@link #readAnnotation()}. + */ + public int getAnnotationType() { + return annotationType; + } + + public int readAnnotationName() { + return Leb128.readUnsignedLeb128(in); + } + + public byte readByte() { + checkType(ENCODED_BYTE); + type = MUST_READ; + return (byte) EncodedValueCodec.readSignedInt(in, arg); + } + + public short readShort() { + checkType(ENCODED_SHORT); + type = MUST_READ; + return (short) EncodedValueCodec.readSignedInt(in, arg); + } + + public char readChar() { + checkType(ENCODED_CHAR); + type = MUST_READ; + return (char) EncodedValueCodec.readUnsignedInt(in, arg, false); + } + + public int readInt() { + checkType(ENCODED_INT); + type = MUST_READ; + return EncodedValueCodec.readSignedInt(in, arg); + } + + public long readLong() { + checkType(ENCODED_LONG); + type = MUST_READ; + return EncodedValueCodec.readSignedLong(in, arg); + } + + public float readFloat() { + checkType(ENCODED_FLOAT); + type = MUST_READ; + return Float.intBitsToFloat(EncodedValueCodec.readUnsignedInt(in, arg, true)); + } + + public double readDouble() { + checkType(ENCODED_DOUBLE); + type = MUST_READ; + return Double.longBitsToDouble(EncodedValueCodec.readUnsignedLong(in, arg, true)); + } + + public int readString() { + checkType(ENCODED_STRING); + type = MUST_READ; + return EncodedValueCodec.readUnsignedInt(in, arg, false); + } + + public int readType() { + checkType(ENCODED_TYPE); + type = MUST_READ; + return EncodedValueCodec.readUnsignedInt(in, arg, false); + } + + public int readField() { + checkType(ENCODED_FIELD); + type = MUST_READ; + return EncodedValueCodec.readUnsignedInt(in, arg, false); + } + + public int readEnum() { + checkType(ENCODED_ENUM); + type = MUST_READ; + return EncodedValueCodec.readUnsignedInt(in, arg, false); + } + + public int readMethod() { + checkType(ENCODED_METHOD); + type = MUST_READ; + return EncodedValueCodec.readUnsignedInt(in, arg, false); + } + + public void readNull() { + checkType(ENCODED_NULL); + type = MUST_READ; + } + + public boolean readBoolean() { + checkType(ENCODED_BOOLEAN); + type = MUST_READ; + return arg != 0; + } + + /** + * Skips a single value, including its nested values if it is an array or + * annotation. + */ + public void skipValue() { + switch (peek()) { + case ENCODED_BYTE: + readByte(); + break; + case ENCODED_SHORT: + readShort(); + break; + case ENCODED_CHAR: + readChar(); + break; + case ENCODED_INT: + readInt(); + break; + case ENCODED_LONG: + readLong(); + break; + case ENCODED_FLOAT: + readFloat(); + break; + case ENCODED_DOUBLE: + readDouble(); + break; + case ENCODED_STRING: + readString(); + break; + case ENCODED_TYPE: + readType(); + break; + case ENCODED_FIELD: + readField(); + break; + case ENCODED_ENUM: + readEnum(); + break; + case ENCODED_METHOD: + readMethod(); + break; + case ENCODED_ARRAY: + for (int i = 0, size = readArray(); i < size; i++) { + skipValue(); + } + break; + case ENCODED_ANNOTATION: + for (int i = 0, size = readAnnotation(); i < size; i++) { + readAnnotationName(); + skipValue(); + } + break; + case ENCODED_NULL: + readNull(); + break; + case ENCODED_BOOLEAN: + readBoolean(); + break; + default: + throw new DexException("Unexpected type: " + Integer.toHexString(type)); + } + } + + private void checkType(int expected) { + if (peek() != expected) { + throw new IllegalStateException( + String.format("Expected %x but was %x", expected, peek())); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/FieldId.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/FieldId.java new file mode 100644 index 00000000..40435348 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/FieldId.java @@ -0,0 +1,48 @@ +/* + * 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 final class FieldId extends Item { + public int declaringClassIndex; + public int typeIndex; + public int nameIndex; + + public FieldId(int off, int declaringClassIndex, int typeIndex, int nameIndex) { + super(off); + this.declaringClassIndex = declaringClassIndex; + this.typeIndex = typeIndex; + this.nameIndex = nameIndex; + } + + public int compareTo(FieldId other) { + if (declaringClassIndex != other.declaringClassIndex) { + return CompareUtils.uCompare(declaringClassIndex, other.declaringClassIndex); + } + if (nameIndex != other.nameIndex) { + return CompareUtils.uCompare(nameIndex, other.nameIndex); + } + return CompareUtils.uCompare(typeIndex, other.typeIndex); // should always be 0 + } + + @Override + public int byteCountInDex() { + return SizeOf.MEMBER_ID_ITEM; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Leb128.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Leb128.java new file mode 100644 index 00000000..13ecd9c8 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Leb128.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2008 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.ByteInput; +import com.tencent.tinker.android.dex.util.ByteOutput; + +/** + * Reads and writes DWARFv3 LEB 128 signed and unsigned integers. See DWARF v3 + * section 7.6. + */ +public final class Leb128 { + private Leb128() { + } + + /** + * Gets the number of bytes in the unsigned LEB128 encoding of the + * given value. + * + * @param value the value in question + * @return its write size, in bytes + */ + public static int unsignedLeb128Size(int value) { + // TODO: This could be much cleverer. + + int remaining = value >>> 7; + int count = 0; + + while (remaining != 0) { + remaining >>>= 7; + count++; + } + + return count + 1; + } + + public static int unsignedLeb128p1Size(int value) { + return unsignedLeb128Size(value + 1); + } + + /** + * Gets the number of bytes in the signed LEB128 encoding of the + * given value. + * + * @param value the value in question + * @return its write size, in bytes + */ + public static int signedLeb128Size(int value) { + // TODO: This could be much cleverer. + + int remaining = value >> 7; + int count = 0; + boolean hasMore = true; + int end = ((value & Integer.MIN_VALUE) == 0) ? 0 : -1; + + while (hasMore) { + hasMore = (remaining != end) + || ((remaining & 1) != ((value >> 6) & 1)); + + value = remaining; + remaining >>= 7; + count++; + } + + return count; + } + + /** + * Reads an signed integer from {@code in}. + */ + public static int readSignedLeb128(ByteInput in) { + int result = 0; + int cur; + int count = 0; + int signBits = -1; + + do { + cur = in.readByte() & 0xff; + result |= (cur & 0x7f) << (count * 7); + signBits <<= 7; + count++; + } while (((cur & 0x80) == 0x80) && count < 5); + + if ((cur & 0x80) == 0x80) { + throw new DexException("invalid LEB128 sequence"); + } + + // Sign extend if appropriate + if (((signBits >> 1) & result) != 0) { + result |= signBits; + } + + return result; + } + + /** + * Reads an unsigned leb128 integer from {@code in}. + */ + public static int readUnsignedLeb128(ByteInput in) { + int result = 0; + int cur; + int count = 0; + + do { + cur = in.readByte() & 0xff; + result |= (cur & 0x7f) << (count * 7); + count++; + } while (((cur & 0x80) == 0x80) && count < 5); + + if ((cur & 0x80) == 0x80) { + throw new DexException("invalid LEB128 sequence"); + } + + return result; + } + + /** + * Reads an unsigned leb128p1 integer from {@code in}. + */ + public static int readUnsignedLeb128p1(ByteInput in) { + return readUnsignedLeb128(in) - 1; + } + + /** + * Writes {@code value} as an unsigned leb128 integer to {@code out}, starting at + * {@code offset}. Returns the number of bytes written. + */ + public static int writeUnsignedLeb128(ByteOutput out, int value) { + int remaining = value >>> 7; + int bytesWritten = 0; + while (remaining != 0) { + out.writeByte((byte) ((value & 0x7f) | 0x80)); + ++bytesWritten; + value = remaining; + remaining >>>= 7; + } + + out.writeByte((byte) (value & 0x7f)); + ++bytesWritten; + + return bytesWritten; + } + + /** + * Writes {@code value} as an unsigned integer to {@code out}, starting at + * {@code offset}. Returns the number of bytes written. + */ + public static int writeUnsignedLeb128p1(ByteOutput out, int value) { + return writeUnsignedLeb128(out, value + 1); + } + + /** + * Writes {@code value} as a signed integer to {@code out}, starting at + * {@code offset}. Returns the number of bytes written. + */ + public static int writeSignedLeb128(ByteOutput out, int value) { + int remaining = value >> 7; + boolean hasMore = true; + int end = ((value & Integer.MIN_VALUE) == 0) ? 0 : -1; + int bytesWritten = 0; + while (hasMore) { + hasMore = (remaining != end) + || ((remaining & 1) != ((value >> 6) & 1)); + + out.writeByte((byte) ((value & 0x7f) | (hasMore ? 0x80 : 0))); + ++bytesWritten; + value = remaining; + remaining >>= 7; + } + + return bytesWritten; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodId.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodId.java new file mode 100644 index 00000000..fcb71ca9 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/MethodId.java @@ -0,0 +1,48 @@ +/* + * 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 final class MethodId extends Item { + public int declaringClassIndex; + public int protoIndex; + public int nameIndex; + + public MethodId(int off, int declaringClassIndex, int protoIndex, int nameIndex) { + super(off); + this.declaringClassIndex = declaringClassIndex; + this.protoIndex = protoIndex; + this.nameIndex = nameIndex; + } + + public int compareTo(MethodId other) { + if (declaringClassIndex != other.declaringClassIndex) { + return CompareUtils.uCompare(declaringClassIndex, other.declaringClassIndex); + } + if (nameIndex != other.nameIndex) { + return CompareUtils.uCompare(nameIndex, other.nameIndex); + } + return CompareUtils.uCompare(protoIndex, other.protoIndex); + } + + @Override + public int byteCountInDex() { + return SizeOf.MEMBER_ID_ITEM; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Mutf8.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Mutf8.java new file mode 100644 index 00000000..f600495e --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/Mutf8.java @@ -0,0 +1,115 @@ +/* + * 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.ByteInput; +import java.io.UTFDataFormatException; + +/** + * Modified UTF-8 as described in the dex file format spec. + * + *

Derived from libcore's MUTF-8 encoder at java.nio.charset.ModifiedUtf8. + */ +public final class Mutf8 { + private Mutf8() { } + + /** + * Decodes bytes from {@code in} into {@code out} until a delimiter 0x00 is + * encountered. Returns a new string containing the decoded characters. + */ + public static String decode(ByteInput in, char[] out) throws UTFDataFormatException { + int s = 0; + while (true) { + char a = (char) (in.readByte() & 0xff); + if (a == 0) { + return new String(out, 0, s); + } + out[s] = a; + if (a < '\u0080') { + s++; + } else if ((a & 0xe0) == 0xc0) { + int b = in.readByte() & 0xff; + if ((b & 0xC0) != 0x80) { + throw new UTFDataFormatException("bad second byte"); + } + out[s++] = (char) (((a & 0x1F) << 6) | (b & 0x3F)); + } else if ((a & 0xf0) == 0xe0) { + int b = in.readByte() & 0xff; + int c = in.readByte() & 0xff; + if (((b & 0xC0) != 0x80) || ((c & 0xC0) != 0x80)) { + throw new UTFDataFormatException("bad second or third byte"); + } + out[s++] = (char) (((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F)); + } else { + throw new UTFDataFormatException("bad byte"); + } + } + } + + /** + * Returns the number of bytes the modified UTF8 representation of 's' would take. + */ + public static long countBytes(String s, boolean shortLength) throws UTFDataFormatException { + long result = 0; + final int length = s.length(); + for (int i = 0; i < length; ++i) { + char ch = s.charAt(i); + if (ch != 0 && ch <= 127) { // U+0000 uses two bytes. + ++result; + } else if (ch <= 2047) { + result += 2; + } else { + result += 3; + } + if (shortLength && result > 65535) { + throw new UTFDataFormatException("String more than 65535 UTF bytes long"); + } + } + return result; + } + + /** + * Encodes the modified UTF-8 bytes corresponding to {@code s} into {@code + * dst}, starting at {@code offset}. + */ + public static void encode(byte[] dst, int offset, String s) { + final int length = s.length(); + for (int i = 0; i < length; i++) { + char ch = s.charAt(i); + if (ch != 0 && ch <= 127) { // U+0000 uses two bytes. + dst[offset++] = (byte) ch; + } else if (ch <= 2047) { + dst[offset++] = (byte) (0xc0 | (0x1f & (ch >> 6))); + dst[offset++] = (byte) (0x80 | (0x3f & ch)); + } else { + dst[offset++] = (byte) (0xe0 | (0x0f & (ch >> 12))); + dst[offset++] = (byte) (0x80 | (0x3f & (ch >> 6))); + dst[offset++] = (byte) (0x80 | (0x3f & ch)); + } + } + } + + /** + * Returns an array containing the modified UTF-8 form of {@code s}. + */ + public static byte[] encode(String s) throws UTFDataFormatException { + int utfCount = (int) countBytes(s, true); + byte[] result = new byte[utfCount]; + encode(result, 0, s); + return result; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ProtoId.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ProtoId.java new file mode 100644 index 00000000..c5a6bbe4 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/ProtoId.java @@ -0,0 +1,50 @@ +/* + * 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; + +public final class ProtoId extends TableOfContents.Section.Item { + public int shortyIndex; + public int returnTypeIndex; + public int parametersOffset; + + public ProtoId(int off, int shortyIndex, int returnTypeIndex, int parametersOffset) { + super(off); + this.shortyIndex = shortyIndex; + this.returnTypeIndex = returnTypeIndex; + this.parametersOffset = parametersOffset; + } + + public int compareTo(ProtoId other) { + int res = CompareUtils.uCompare(shortyIndex, other.shortyIndex); + if (res != 0) { + return res; + } + res = CompareUtils.uCompare(returnTypeIndex, other.returnTypeIndex); + if (res != 0) { + return res; + } + return CompareUtils.sCompare(parametersOffset, other.parametersOffset); + } + + + @Override + public int byteCountInDex() { + return SizeOf.PROTO_ID_ITEM; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/SizeOf.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/SizeOf.java new file mode 100644 index 00000000..52d6ba34 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/SizeOf.java @@ -0,0 +1,105 @@ +/* + * 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; + +public final class SizeOf { + public static final int UBYTE = 1; + public static final int USHORT = 2; + public static final int UINT = 4; + public static final int SIGNATURE = UBYTE * 20; + public static final int CHECKSUM = UBYTE * 4; + /** + * magic ubyte[8] + * checksum uint + * signature ubyte[20] + * file_size uint + * header_size uint + * endian_tag uint + * link_size uint + * link_off uint + * map_off uint + * string_ids_size uint + * string_ids_off uint + * type_ids_size uint + * type_ids_off uint + * proto_ids_size uint + * proto_ids_off uint + * field_ids_size uint + * field_ids_off uint + * method_ids_size uint + * method_ids_off uint + * class_defs_size uint + * class_defs_off uint + * data_size uint + * data_off uint + */ + public static final int HEADER_ITEM = (8 * UBYTE) + UINT + SIGNATURE + (20 * UINT); // 0x70 + /** + * string_data_off uint + */ + public static final int STRING_ID_ITEM = UINT; + /** + * descriptor_idx uint + */ + public static final int TYPE_ID_ITEM = UINT; + /** + * type_idx ushort + */ + public static final int TYPE_ITEM = USHORT; + /** + * shorty_idx uint + * return_type_idx uint + * return_type_idx uint + */ + public static final int PROTO_ID_ITEM = UINT + UINT + UINT; + /** + * class_idx ushort + * type_idx/proto_idx ushort + * name_idx uint + */ + public static final int MEMBER_ID_ITEM = USHORT + USHORT + UINT; + /** + * class_idx uint + * access_flags uint + * superclass_idx uint + * interfaces_off uint + * source_file_idx uint + * annotations_off uint + * class_data_off uint + * static_values_off uint + */ + public static final int CLASS_DEF_ITEM = 8 * UINT; + /** + * type ushort + * unused ushort + * size uint + * offset uint + */ + public static final int MAP_ITEM = USHORT + USHORT + UINT + UINT; + /** + * start_addr uint + * insn_count ushort + * handler_off ushort + */ + public static final int TRY_ITEM = UINT + USHORT + USHORT; + + private SizeOf() { } + + public static int roundToTimesOfFour(int value) { + return (value + 3) & (~3); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/StringData.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/StringData.java new file mode 100644 index 00000000..1f7848e0 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/StringData.java @@ -0,0 +1,49 @@ +/* + * 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 java.io.UTFDataFormatException; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Structure of StringData element in Dex file. + */ +public class StringData extends Item { + public String value; + + public StringData(int offset, String value) { + super(offset); + this.value = value; + } + + @Override + public int compareTo(StringData other) { + return value.compareTo(other.value); + } + + @Override + public int byteCountInDex() { + try { + return Leb128.unsignedLeb128Size(value.length()) + (int) Mutf8.countBytes(value, true) + SizeOf.UBYTE; + } catch (UTFDataFormatException e) { + throw new DexException(e); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TableOfContents.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TableOfContents.java new file mode 100644 index 00000000..7ad5e415 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TableOfContents.java @@ -0,0 +1,435 @@ +/* + * 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 java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + +/** + * The file header and map. + */ +public final class TableOfContents { + public static final short SECTION_TYPE_HEADER = 0x0000; + public static final short SECTION_TYPE_STRINGIDS = 0x0001; + public static final short SECTION_TYPE_TYPEIDS = 0x0002; + public static final short SECTION_TYPE_PROTOIDS = 0x0003; + public static final short SECTION_TYPE_FIELDIDS = 0x0004; + public static final short SECTION_TYPE_METHODIDS = 0x0005; + public static final short SECTION_TYPE_CLASSDEFS = 0x0006; + public static final short SECTION_TYPE_MAPLIST = 0x1000; + public static final short SECTION_TYPE_TYPELISTS = 0x1001; + public static final short SECTION_TYPE_ANNOTATIONSETREFLISTS = 0x1002; + public static final short SECTION_TYPE_ANNOTATIONSETS = 0x1003; + public static final short SECTION_TYPE_CLASSDATA = 0x2000; + public static final short SECTION_TYPE_CODES = 0x2001; + public static final short SECTION_TYPE_STRINGDATAS = 0x2002; + public static final short SECTION_TYPE_DEBUGINFOS = 0x2003; + public static final short SECTION_TYPE_ANNOTATIONS = 0x2004; + public static final short SECTION_TYPE_ENCODEDARRAYS = 0x2005; + public static final short SECTION_TYPE_ANNOTATIONSDIRECTORIES = 0x2006; + + public final Section header = new Section(SECTION_TYPE_HEADER, true); + public final Section stringIds = new Section(SECTION_TYPE_STRINGIDS, true); + public final Section typeIds = new Section(SECTION_TYPE_TYPEIDS, true); + public final Section protoIds = new Section(SECTION_TYPE_PROTOIDS, true); + public final Section fieldIds = new Section(SECTION_TYPE_FIELDIDS, true); + public final Section methodIds = new Section(SECTION_TYPE_METHODIDS, true); + public final Section classDefs = new Section(SECTION_TYPE_CLASSDEFS, true); + public final Section mapList = new Section(SECTION_TYPE_MAPLIST, true); + public final Section typeLists = new Section(SECTION_TYPE_TYPELISTS, true); + public final Section annotationSetRefLists = new Section(SECTION_TYPE_ANNOTATIONSETREFLISTS, true); + public final Section annotationSets = new Section(SECTION_TYPE_ANNOTATIONSETS, true); + public final Section classDatas = new Section(SECTION_TYPE_CLASSDATA, false); + public final Section codes = new Section(SECTION_TYPE_CODES, true); + public final Section stringDatas = new Section(SECTION_TYPE_STRINGDATAS, false); + public final Section debugInfos = new Section(SECTION_TYPE_DEBUGINFOS, false); + public final Section annotations = new Section(SECTION_TYPE_ANNOTATIONS, false); + public final Section encodedArrays = new Section(SECTION_TYPE_ENCODEDARRAYS, false); + public final Section annotationsDirectories = new Section(SECTION_TYPE_ANNOTATIONSDIRECTORIES, true); + public final Section[] sections = { + header, stringIds, typeIds, protoIds, fieldIds, methodIds, classDefs, mapList, + typeLists, annotationSetRefLists, annotationSets, classDatas, codes, stringDatas, + debugInfos, annotations, encodedArrays, annotationsDirectories + }; + + public int checksum; + public byte[] signature; + public int fileSize; + public int linkSize; + public int linkOff; + public int dataSize; + public int dataOff; + + public TableOfContents() { + signature = new byte[20]; + } + + public Section getSectionByType(int type) { + switch (type) { + case SECTION_TYPE_HEADER: { + return header; + } + case SECTION_TYPE_STRINGIDS: { + return stringIds; + } + case SECTION_TYPE_TYPEIDS: { + return typeIds; + } + case SECTION_TYPE_PROTOIDS: { + return protoIds; + } + case SECTION_TYPE_FIELDIDS: { + return fieldIds; + } + case SECTION_TYPE_METHODIDS: { + return methodIds; + } + case SECTION_TYPE_CLASSDEFS: { + return classDefs; + } + case SECTION_TYPE_MAPLIST: { + return mapList; + } + case SECTION_TYPE_TYPELISTS: { + return typeLists; + } + case SECTION_TYPE_ANNOTATIONSETREFLISTS: { + return annotationSetRefLists; + } + case SECTION_TYPE_ANNOTATIONSETS: { + return annotationSets; + } + case SECTION_TYPE_CLASSDATA: { + return classDatas; + } + case SECTION_TYPE_CODES: { + return codes; + } + case SECTION_TYPE_STRINGDATAS: { + return stringDatas; + } + case SECTION_TYPE_DEBUGINFOS: { + return debugInfos; + } + case SECTION_TYPE_ANNOTATIONS: { + return annotations; + } + case SECTION_TYPE_ENCODEDARRAYS: { + return encodedArrays; + } + case SECTION_TYPE_ANNOTATIONSDIRECTORIES: { + return annotationsDirectories; + } + default: { + throw new IllegalArgumentException("unknown section type: " + type); + } + } + } + + public void readFrom(Dex dex) throws IOException { + readHeader(dex.openSection(header)); + // special case, since mapList.byteCount is available only after + // computeSizesFromOffsets() was invoked, so here we can't use + // dex.openSection(mapList) to get dex section. Or + // an {@code java.nio.BufferUnderflowException} will be thrown. + readMap(dex.openSection(mapList.off)); + computeSizesFromOffsets(); + } + + private void readHeader(Dex.Section headerIn) throws UnsupportedEncodingException { + byte[] magic = headerIn.readByteArray(8); + int apiTarget = DexFormat.magicToApi(magic); + + if (apiTarget != DexFormat.API_NO_EXTENDED_OPCODES) { + throw new DexException("Unexpected magic: " + Arrays.toString(magic)); + } + + checksum = headerIn.readInt(); + signature = headerIn.readByteArray(20); + fileSize = headerIn.readInt(); + int headerSize = headerIn.readInt(); + if (headerSize != SizeOf.HEADER_ITEM) { + throw new DexException("Unexpected header: 0x" + Integer.toHexString(headerSize)); + } + int endianTag = headerIn.readInt(); + if (endianTag != DexFormat.ENDIAN_TAG) { + throw new DexException("Unexpected endian tag: 0x" + Integer.toHexString(endianTag)); + } + linkSize = headerIn.readInt(); + linkOff = headerIn.readInt(); + mapList.off = headerIn.readInt(); + if (mapList.off == 0) { + throw new DexException("Cannot merge dex files that do not contain a map"); + } + stringIds.size = headerIn.readInt(); + stringIds.off = headerIn.readInt(); + typeIds.size = headerIn.readInt(); + typeIds.off = headerIn.readInt(); + protoIds.size = headerIn.readInt(); + protoIds.off = headerIn.readInt(); + fieldIds.size = headerIn.readInt(); + fieldIds.off = headerIn.readInt(); + methodIds.size = headerIn.readInt(); + methodIds.off = headerIn.readInt(); + classDefs.size = headerIn.readInt(); + classDefs.off = headerIn.readInt(); + dataSize = headerIn.readInt(); + dataOff = headerIn.readInt(); + } + + private void readMap(Dex.Section in) throws IOException { + int mapSize = in.readInt(); + Section previous = null; + for (int i = 0; i < mapSize; i++) { + short type = in.readShort(); + in.readShort(); // unused + Section section = getSection(type); + int size = in.readInt(); + int offset = in.readInt(); + + if ((section.size != 0 && section.size != size) + || (section.off != Section.UNDEF_OFFSET && section.off != offset)) { + throw new DexException("Unexpected map value for 0x" + Integer.toHexString(type)); + } + + section.size = size; + section.off = offset; + + if (previous != null && previous.off > section.off) { + throw new DexException("Map is unsorted at " + previous + ", " + section); + } + + previous = section; + } + + header.off = 0; + + Arrays.sort(sections); + + // Skip header section, since its offset must be zero. + for (int i = 1; i < sections.length; ++i) { + if (sections[i].off == Section.UNDEF_OFFSET) { + sections[i].off = sections[i - 1].off; + } + } + } + + public void computeSizesFromOffsets() { + int end = fileSize; + for (int i = sections.length - 1; i >= 0; i--) { + Section section = sections[i]; + if (section.off == Section.UNDEF_OFFSET) { + continue; + } + if (section.off > end) { + throw new DexException("Map is unsorted at " + section); + } + section.byteCount = end - section.off; + end = section.off; + } + + dataOff = header.byteCount + + stringIds.byteCount + + typeIds.byteCount + + protoIds.byteCount + + fieldIds.byteCount + + methodIds.byteCount + + classDefs.byteCount; + + dataSize = fileSize - dataOff; + } + + private Section getSection(short type) { + for (Section section : sections) { + if (section.type == type) { + return section; + } + } + throw new IllegalArgumentException("No such map item: " + type); + } + + public void writeHeader(Dex.Section out) throws IOException { + out.write(DexFormat.apiToMagic(DexFormat.API_NO_EXTENDED_OPCODES).getBytes("UTF-8")); + out.writeInt(checksum); + out.write(signature); + out.writeInt(fileSize); + out.writeInt(SizeOf.HEADER_ITEM); + out.writeInt(DexFormat.ENDIAN_TAG); + out.writeInt(linkSize); + out.writeInt(linkOff); + out.writeInt(mapList.off); + out.writeInt(stringIds.size); + out.writeInt((stringIds.exists() ? stringIds.off : 0)); + out.writeInt(typeIds.size); + out.writeInt((typeIds.exists() ? typeIds.off : 0)); + out.writeInt(protoIds.size); + out.writeInt((protoIds.exists() ? protoIds.off : 0)); + out.writeInt(fieldIds.size); + out.writeInt((fieldIds.exists() ? fieldIds.off : 0)); + out.writeInt(methodIds.size); + out.writeInt((methodIds.exists() ? methodIds.off : 0)); + out.writeInt(classDefs.size); + out.writeInt((classDefs.exists() ? classDefs.off : 0)); + out.writeInt(dataSize); + out.writeInt(dataOff); + } + + public void writeMap(Dex.Section out) throws IOException { + int count = 0; + for (Section section : sections) { + if (section.exists()) { + count++; + } + } + + out.writeInt(count); + for (Section section : sections) { + if (section.exists()) { + out.writeShort(section.type); + out.writeShort((short) 0); + out.writeInt(section.size); + out.writeInt(section.off); + } + } + } + + public static class Section implements Comparable

{ + public static final int UNDEF_INDEX = -1; + public static final int UNDEF_OFFSET = -1; + public final short type; + public boolean isElementFourByteAligned; + public int size = 0; + public int off = UNDEF_OFFSET; + public int byteCount = 0; + + public Section(int type, boolean isElementFourByteAligned) { + this.type = (short) type; + this.isElementFourByteAligned = isElementFourByteAligned; + if (type == SECTION_TYPE_HEADER) { + off = 0; + size = 1; + byteCount = SizeOf.HEADER_ITEM; + } else + if (type == SECTION_TYPE_MAPLIST) { + size = 1; + } + } + + public boolean exists() { + return size > 0; + } + + private int remapTypeOrderId(int type) { + switch (type) { + case SECTION_TYPE_HEADER: { + return 0; + } + case SECTION_TYPE_STRINGIDS: { + return 1; + } + case SECTION_TYPE_TYPEIDS: { + return 2; + } + case SECTION_TYPE_PROTOIDS: { + return 3; + } + case SECTION_TYPE_FIELDIDS: { + return 4; + } + case SECTION_TYPE_METHODIDS: { + return 5; + } + case SECTION_TYPE_CLASSDEFS: { + return 6; + } + case SECTION_TYPE_STRINGDATAS: { + return 7; + } + case SECTION_TYPE_TYPELISTS: { + return 8; + } + case SECTION_TYPE_ANNOTATIONS: { + return 9; + } + case SECTION_TYPE_ANNOTATIONSETS: { + return 10; + } + case SECTION_TYPE_ANNOTATIONSETREFLISTS: { + return 11; + } + case SECTION_TYPE_ANNOTATIONSDIRECTORIES: { + return 12; + } + case SECTION_TYPE_DEBUGINFOS: { + return 13; + } + case SECTION_TYPE_CODES: { + return 14; + } + case SECTION_TYPE_CLASSDATA: { + return 15; + } + case SECTION_TYPE_ENCODEDARRAYS: { + return 16; + } + case SECTION_TYPE_MAPLIST: { + return 17; + } + default: { + throw new IllegalArgumentException("unknown section type: " + type); + } + } + } + + public int compareTo(Section section) { + if (off != section.off) { + return off < section.off ? -1 : 1; + } + + int remappedType = remapTypeOrderId(type); + int otherRemappedType = remapTypeOrderId(section.type); + + if (remappedType != otherRemappedType) { + return (remappedType < otherRemappedType ? -1 : 1); + } + + return 0; + } + + @Override + public String toString() { + return String.format("Section[type=%#x,off=%#x,size=%#x]", type, off, size); + } + + public static abstract class Item implements Comparable { + public int off; + + public Item(int off) { + this.off = off; + } + + @Override + @SuppressWarnings("unchecked") + public boolean equals(Object obj) { + return compareTo((T) obj) == 0; + } + + public abstract int byteCountInDex(); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TypeList.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TypeList.java new file mode 100644 index 00000000..f10d5db4 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/TypeList.java @@ -0,0 +1,40 @@ +/* + * 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 final class TypeList extends Item { + public static final TypeList EMPTY = new TypeList(0, Dex.EMPTY_SHORT_ARRAY); + + public short[] types; + + public TypeList(int off, short[] types) { + super(off); + this.types = types; + } + + @Override public int compareTo(TypeList other) { + return CompareUtils.uArrCompare(types, other.types); + } + + @Override + public int byteCountInDex() { + return SizeOf.UINT + types.length * SizeOf.USHORT; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/io/DexDataBuffer.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/io/DexDataBuffer.java new file mode 100644 index 00000000..f2e16ed6 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/io/DexDataBuffer.java @@ -0,0 +1,913 @@ +/* + * 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.io; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.EncodedValueReader; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.Leb128; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.Mutf8; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.StringData; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.util.ByteInput; +import com.tencent.tinker.android.dex.util.ByteOutput; + +import java.io.ByteArrayOutputStream; +import java.io.UTFDataFormatException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * *** This file is NOT a part of AOSP. *** + * Created by tangyinsheng on 2016/6/30. + */ +public class DexDataBuffer implements ByteInput, ByteOutput { + public static final int DEFAULT_BUFFER_SIZE = 512; + + private static final short[] EMPTY_SHORT_ARRAY = new short[0]; + + private ByteBuffer data; + private int dataBound; + private boolean isResizeAllowed; + + public DexDataBuffer() { + this.data = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE); + this.data.order(ByteOrder.LITTLE_ENDIAN); + this.dataBound = this.data.position(); + this.data.limit(this.data.capacity()); + this.isResizeAllowed = true; + } + + public DexDataBuffer(ByteBuffer data) { + this.data = data; + this.data.order(ByteOrder.LITTLE_ENDIAN); + this.dataBound = data.limit(); + this.isResizeAllowed = false; + } + + public DexDataBuffer(ByteBuffer data, boolean isResizeAllowed) { + this.data = data; + this.data.order(ByteOrder.LITTLE_ENDIAN); + this.dataBound = data.limit(); + this.isResizeAllowed = isResizeAllowed; + } + + public int position() { + return data.position(); + } + + public void position(int pos) { + data.position(pos); + } + + public int available() { + return dataBound - data.position(); + } + + private void ensureBufferSize(int bytes) { + if (this.data.position() + bytes > this.data.limit()) { + if (this.isResizeAllowed) { + byte[] array = this.data.array(); + byte[] newArray = new byte[array.length + bytes + (array.length >> 1)]; + System.arraycopy(array, 0, newArray, 0, this.data.position()); + int lastPos = this.data.position(); + this.data = ByteBuffer.wrap(newArray); + this.data.order(ByteOrder.LITTLE_ENDIAN); + this.data.position(lastPos); + this.data.limit(this.data.capacity()); + } + } + } + + public byte[] array() { + byte[] result = new byte[this.dataBound]; + byte[] dataArray = this.data.array(); + System.arraycopy(dataArray, 0, result, 0, this.dataBound); + return result; + } + + @Override + public byte readByte() { + return data.get(); + } + + public int readUnsignedByte() { + return readByte() & 0xFF; + } + + public short readShort() { + return data.getShort(); + } + + public int readUnsignedShort() { + return readShort() & 0xffff; + } + + public int readInt() { + return data.getInt(); + } + + public byte[] readByteArray(int length) { + byte[] result = new byte[length]; + data.get(result); + return result; + } + + public short[] readShortArray(int length) { + if (length == 0) { + return EMPTY_SHORT_ARRAY; + } + short[] result = new short[length]; + for (int i = 0; i < length; i++) { + result[i] = readShort(); + } + return result; + } + + public int readUleb128() { + return Leb128.readUnsignedLeb128(this); + } + + public int readUleb128p1() { + return Leb128.readUnsignedLeb128(this) - 1; + } + + public int readSleb128() { + return Leb128.readSignedLeb128(this); + } + + public StringData readStringData() { + int off = data.position(); + try { + int expectedLength = readUleb128(); + String result = Mutf8.decode(this, new char[expectedLength]); + if (result.length() != expectedLength) { + throw new DexException("Declared length " + expectedLength + + " doesn't match decoded length of " + result.length()); + } + return new StringData(off, result); + } catch (UTFDataFormatException e) { + throw new DexException(e); + } + } + + public TypeList readTypeList() { + int off = data.position(); + int size = readInt(); + short[] types = readShortArray(size); + return new TypeList(off, types); + } + + public FieldId readFieldId() { + int off = data.position(); + int declaringClassIndex = readUnsignedShort(); + int typeIndex = readUnsignedShort(); + int nameIndex = readInt(); + return new FieldId(off, declaringClassIndex, typeIndex, nameIndex); + } + + public MethodId readMethodId() { + int off = data.position(); + int declaringClassIndex = readUnsignedShort(); + int protoIndex = readUnsignedShort(); + int nameIndex = readInt(); + return new MethodId(off, declaringClassIndex, protoIndex, nameIndex); + } + + public ProtoId readProtoId() { + int off = data.position(); + int shortyIndex = readInt(); + int returnTypeIndex = readInt(); + int parametersOffset = readInt(); + return new ProtoId(off, shortyIndex, returnTypeIndex, parametersOffset); + } + + public ClassDef readClassDef() { + int off = position(); + int type = readInt(); + int accessFlags = readInt(); + int supertype = readInt(); + int interfacesOffset = readInt(); + int sourceFileIndex = readInt(); + int annotationsOffset = readInt(); + int classDataOffset = readInt(); + int staticValuesOffset = readInt(); + return new ClassDef(off, type, accessFlags, supertype, + interfacesOffset, sourceFileIndex, annotationsOffset, classDataOffset, + staticValuesOffset); + } + + public Code readCode() { + int off = data.position(); + int registersSize = readUnsignedShort(); + int insSize = readUnsignedShort(); + int outsSize = readUnsignedShort(); + int triesSize = readUnsignedShort(); + int debugInfoOffset = readInt(); + int instructionsSize = readInt(); + short[] instructions = readShortArray(instructionsSize); + Code.Try[] tries; + Code.CatchHandler[] catchHandlers; + if (triesSize > 0) { + if (instructions.length % 2 == 1) { + readShort(); // padding + } + + /* + * We can't read the tries until we've read the catch handlers. + * Unfortunately they're in the opposite order in the dex file + * so we need to read them out-of-order. + */ + int posBeforeTries = data.position(); + skip(triesSize * SizeOf.TRY_ITEM); + catchHandlers = readCatchHandlers(); + int posAfterCatchHandlers = data.position(); + data.position(posBeforeTries); + tries = readTries(triesSize, catchHandlers); + data.position(posAfterCatchHandlers); + } else { + tries = new Code.Try[0]; + catchHandlers = new Code.CatchHandler[0]; + } + return new Code(off, registersSize, insSize, outsSize, debugInfoOffset, instructions, + tries, catchHandlers); + } + + private Code.CatchHandler[] readCatchHandlers() { + int baseOffset = data.position(); + int catchHandlersSize = readUleb128(); + Code.CatchHandler[] result = new Code.CatchHandler[catchHandlersSize]; + for (int i = 0; i < catchHandlersSize; i++) { + int offset = data.position() - baseOffset; + result[i] = readCatchHandler(offset); + } + return result; + } + + private Code.Try[] readTries(int triesSize, Code.CatchHandler[] catchHandlers) { + Code.Try[] result = new Code.Try[triesSize]; + for (int i = 0; i < triesSize; i++) { + int startAddress = readInt(); + int instructionCount = readUnsignedShort(); + int handlerOffset = readUnsignedShort(); + int catchHandlerIndex = findCatchHandlerIndex(catchHandlers, handlerOffset); + result[i] = new Code.Try(startAddress, instructionCount, catchHandlerIndex); + } + return result; + } + + private int findCatchHandlerIndex(Code.CatchHandler[] catchHandlers, int offset) { + for (int i = 0; i < catchHandlers.length; i++) { + Code.CatchHandler catchHandler = catchHandlers[i]; + if (catchHandler.offset == offset) { + return i; + } + } + throw new IllegalArgumentException(); + } + + private Code.CatchHandler readCatchHandler(int offset) { + int size = readSleb128(); + int handlersCount = Math.abs(size); + int[] typeIndexes = new int[handlersCount]; + int[] addresses = new int[handlersCount]; + for (int i = 0; i < handlersCount; i++) { + typeIndexes[i] = readUleb128(); + addresses[i] = readUleb128(); + } + int catchAllAddress = size <= 0 ? readUleb128() : -1; + return new Code.CatchHandler(typeIndexes, addresses, catchAllAddress, offset); + } + + public DebugInfoItem readDebugInfoItem() { + int off = data.position(); + + int lineStart = readUleb128(); + int parametersSize = readUleb128(); + int[] parameterNames = new int[parametersSize]; + for (int i = 0; i < parametersSize; ++i) { + parameterNames[i] = readUleb128p1(); + } + + ByteArrayOutputStream baos = null; + + try { + baos = new ByteArrayOutputStream(64); + + final ByteArrayOutputStream baosRef = baos; + + ByteOutput outAdapter = new ByteOutput() { + @Override + public void writeByte(int i) { + baosRef.write(i); + } + }; + + outside_whileloop: + while (true) { + int opcode = readByte(); + baos.write(opcode); + switch (opcode) { + case DebugInfoItem.DBG_END_SEQUENCE: { + break outside_whileloop; + } + case DebugInfoItem.DBG_ADVANCE_PC: { + int addrDiff = readUleb128(); + Leb128.writeUnsignedLeb128(outAdapter, addrDiff); + break; + } + case DebugInfoItem.DBG_ADVANCE_LINE: { + int lineDiff = readSleb128(); + Leb128.writeSignedLeb128(outAdapter, lineDiff); + break; + } + case DebugInfoItem.DBG_START_LOCAL: + case DebugInfoItem.DBG_START_LOCAL_EXTENDED: { + int registerNum = readUleb128(); + Leb128.writeUnsignedLeb128(outAdapter, registerNum); + int nameIndex = readUleb128p1(); + Leb128.writeUnsignedLeb128p1(outAdapter, nameIndex); + int typeIndex = readUleb128p1(); + Leb128.writeUnsignedLeb128p1(outAdapter, typeIndex); + if (opcode == DebugInfoItem.DBG_START_LOCAL_EXTENDED) { + int sigIndex = readUleb128p1(); + Leb128.writeUnsignedLeb128p1(outAdapter, sigIndex); + } + break; + } + case DebugInfoItem.DBG_END_LOCAL: + case DebugInfoItem.DBG_RESTART_LOCAL: { + int registerNum = readUleb128(); + Leb128.writeUnsignedLeb128(outAdapter, registerNum); + break; + } + case DebugInfoItem.DBG_SET_FILE: { + int nameIndex = readUleb128p1(); + Leb128.writeUnsignedLeb128p1(outAdapter, nameIndex); + break; + } + case DebugInfoItem.DBG_SET_PROLOGUE_END: + case DebugInfoItem.DBG_SET_EPILOGUE_BEGIN: + default: { + break; + } + } + } + + byte[] infoSTM = baos.toByteArray(); + return new DebugInfoItem(off, lineStart, parameterNames, infoSTM); + } finally { + if (baos != null) { + try { + baos.close(); + } catch (Exception e) { + // Do nothing. + } + } + } + } + + public ClassData readClassData() { + int off = data.position(); + int staticFieldsSize = readUleb128(); + int instanceFieldsSize = readUleb128(); + int directMethodsSize = readUleb128(); + int virtualMethodsSize = readUleb128(); + ClassData.Field[] staticFields = readFields(staticFieldsSize); + ClassData.Field[] instanceFields = readFields(instanceFieldsSize); + ClassData.Method[] directMethods = readMethods(directMethodsSize); + ClassData.Method[] virtualMethods = readMethods(virtualMethodsSize); + return new ClassData(off, staticFields, instanceFields, directMethods, virtualMethods); + } + + private ClassData.Field[] readFields(int count) { + ClassData.Field[] result = new ClassData.Field[count]; + int fieldIndex = 0; + for (int i = 0; i < count; i++) { + fieldIndex += readUleb128(); // field index diff + int accessFlags = readUleb128(); + result[i] = new ClassData.Field(fieldIndex, accessFlags); + } + return result; + } + + private ClassData.Method[] readMethods(int count) { + ClassData.Method[] result = new ClassData.Method[count]; + int methodIndex = 0; + for (int i = 0; i < count; i++) { + methodIndex += readUleb128(); // method index diff + int accessFlags = readUleb128(); + int codeOff = readUleb128(); + result[i] = new ClassData.Method(methodIndex, accessFlags, codeOff); + } + return result; + } + + /** + * Returns a byte array containing the bytes from {@code start} to this + * section's current position. + */ + private byte[] getBytesFrom(int start) { + int end = data.position(); + byte[] result = new byte[end - start]; + data.position(start); + data.get(result); + return result; + } + + public Annotation readAnnotation() { + int off = data.position(); + byte visibility = readByte(); + int start = data.position(); + new EncodedValueReader(this, EncodedValueReader.ENCODED_ANNOTATION).skipValue(); + return new Annotation(off, visibility, new EncodedValue(start, getBytesFrom(start))); + } + + public AnnotationSet readAnnotationSet() { + int off = data.position(); + int size = readInt(); + int[] annotationOffsets = new int[size]; + for (int i = 0; i < size; ++i) { + annotationOffsets[i] = readInt(); + } + return new AnnotationSet(off, annotationOffsets); + } + + public AnnotationSetRefList readAnnotationSetRefList() { + int off = data.position(); + int size = readInt(); + int[] annotationSetRefItems = new int[size]; + for (int i = 0; i < size; ++i) { + annotationSetRefItems[i] = readInt(); + } + return new AnnotationSetRefList(off, annotationSetRefItems); + } + + public AnnotationsDirectory readAnnotationsDirectory() { + int off = data.position(); + int classAnnotationsOffset = readInt(); + int fieldsSize = readInt(); + int methodsSize = readInt(); + int parameterListSize = readInt(); + + int[][] fieldAnnotations = new int[fieldsSize][2]; + for (int i = 0; i < fieldsSize; ++i) { + // field index + fieldAnnotations[i][0] = readInt(); + // annotations offset + fieldAnnotations[i][1] = readInt(); + } + + int[][] methodAnnotations = new int[methodsSize][2]; + for (int i = 0; i < methodsSize; ++i) { + // method index + methodAnnotations[i][0] = readInt(); + // annotation set offset + methodAnnotations[i][1] = readInt(); + } + + int[][] parameterAnnotations = new int[parameterListSize][2]; + for (int i = 0; i < parameterListSize; ++i) { + // method index + parameterAnnotations[i][0] = readInt(); + // annotations offset + parameterAnnotations[i][1] = readInt(); + } + + return new AnnotationsDirectory(off, classAnnotationsOffset, fieldAnnotations, methodAnnotations, parameterAnnotations); + } + + public EncodedValue readEncodedArray() { + int start = data.position(); + new EncodedValueReader(this, EncodedValueReader.ENCODED_ARRAY).skipValue(); + return new EncodedValue(start, getBytesFrom(start)); + } + + public void skip(int count) { + if (count < 0) { + throw new IllegalArgumentException(); + } + data.position(data.position() + count); + } + + public void skipWithAutoExpand(int count) { + ensureBufferSize(SizeOf.UBYTE * count); + skip(count); + } + + /** + * Skips bytes until the position is aligned to a multiple of 4. + */ + public void alignToFourBytes() { + data.position((data.position() + 3) & ~3); + } + + /** + * Writes 0x00 until the position is aligned to a multiple of 4. + */ + public void alignToFourBytesWithZeroFill() { + int alignedPos = SizeOf.roundToTimesOfFour(data.position()); + ensureBufferSize((alignedPos - data.position()) * SizeOf.UBYTE); + while ((data.position() & 3) != 0) { + data.put((byte) 0); + } + if (this.data.position() > this.dataBound) { + this.dataBound = this.data.position(); + } + } + + @Override + public void writeByte(int b) { + ensureBufferSize(SizeOf.UBYTE); + data.put((byte) b); + if (this.data.position() > this.dataBound) { + this.dataBound = this.data.position(); + } + } + + public void writeShort(short i) { + ensureBufferSize(SizeOf.USHORT); + data.putShort(i); + if (this.data.position() > this.dataBound) { + this.dataBound = this.data.position(); + } + } + + public void writeUnsignedShort(int i) { + short s = (short) i; + if (i != (s & 0xffff)) { + throw new IllegalArgumentException("Expected an unsigned short: " + i); + } + writeShort(s); + } + + public void writeInt(int i) { + ensureBufferSize(SizeOf.UINT); + this.data.putInt(i); + if (this.data.position() > this.dataBound) { + this.dataBound = this.data.position(); + } + } + + public void write(byte[] bytes) { + ensureBufferSize(bytes.length * SizeOf.UBYTE); + this.data.put(bytes); + if (this.data.position() > this.dataBound) { + this.dataBound = this.data.position(); + } + } + + public void write(short[] shorts) { + ensureBufferSize(shorts.length * SizeOf.USHORT); + for (short s : shorts) { + writeShort(s); + } + if (this.data.position() > this.dataBound) { + this.dataBound = this.data.position(); + } + } + + public void writeUleb128(int i) { + Leb128.writeUnsignedLeb128(this, i); + } + + public void writeUleb128p1(int i) { + writeUleb128(i + 1); + } + + public void writeSleb128(int i) { + Leb128.writeSignedLeb128(this, i); + } + + /** + * Write String data into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeStringData(StringData stringData) { + int off = data.position(); + try { + int length = stringData.value.length(); + writeUleb128(length); + write(Mutf8.encode(stringData.value)); + writeByte(0); + return off; + } catch (UTFDataFormatException e) { + throw new AssertionError(e); + } + } + + /** + * Write TypeList item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeTypeList(TypeList typeList) { + int off = data.position(); + short[] types = typeList.types; + writeInt(types.length); + for (short type : types) { + writeShort(type); + } + return off; + } + + /** + * Write FieldId item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeFieldId(FieldId fieldId) { + int off = data.position(); + writeUnsignedShort(fieldId.declaringClassIndex); + writeUnsignedShort(fieldId.typeIndex); + writeInt(fieldId.nameIndex); + return off; + } + + /** + * Write MethodId item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeMethodId(MethodId methodId) { + int off = data.position(); + writeUnsignedShort(methodId.declaringClassIndex); + writeUnsignedShort(methodId.protoIndex); + writeInt(methodId.nameIndex); + return off; + } + + /** + * Write ProtoId item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeProtoId(ProtoId protoId) { + int off = data.position(); + writeInt(protoId.shortyIndex); + writeInt(protoId.returnTypeIndex); + writeInt(protoId.parametersOffset); + return off; + } + + /** + * Write ClassDef item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeClassDef(ClassDef classDef) { + int off = data.position(); + writeInt(classDef.typeIndex); + writeInt(classDef.accessFlags); + writeInt(classDef.supertypeIndex); + writeInt(classDef.interfacesOffset); + writeInt(classDef.sourceFileIndex); + writeInt(classDef.annotationsOffset); + writeInt(classDef.classDataOffset); + writeInt(classDef.staticValuesOffset); + return off; + } + + /** + * Write Code item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeCode(Code code) { + int off = data.position(); + writeUnsignedShort(code.registersSize); + writeUnsignedShort(code.insSize); + writeUnsignedShort(code.outsSize); + writeUnsignedShort(code.tries.length); + writeInt(code.debugInfoOffset); + writeInt(code.instructions.length); + write(code.instructions); + + if (code.tries.length > 0) { + if ((code.instructions.length & 1) == 1) { + writeShort((short) 0); // padding + } + + /* + * We can't write the tries until we've written the catch handlers. + * Unfortunately they're in the opposite order in the dex file so we + * need to transform them out-of-order. + */ + int posBeforeTries = data.position(); + skipWithAutoExpand(code.tries.length * SizeOf.TRY_ITEM); + int[] offsets = writeCatchHandlers(code.catchHandlers); + int posAfterCatchHandlers = data.position(); + data.position(posBeforeTries); + writeTries(code.tries, offsets); + data.position(posAfterCatchHandlers); + } + return off; + } + + private int[] writeCatchHandlers(Code.CatchHandler[] catchHandlers) { + int baseOffset = data.position(); + writeUleb128(catchHandlers.length); + int[] offsets = new int[catchHandlers.length]; + for (int i = 0; i < catchHandlers.length; i++) { + offsets[i] = data.position() - baseOffset; + writeCatchHandler(catchHandlers[i]); + } + return offsets; + } + + private void writeCatchHandler(Code.CatchHandler catchHandler) { + int catchAllAddress = catchHandler.catchAllAddress; + int[] typeIndexes = catchHandler.typeIndexes; + int[] addresses = catchHandler.addresses; + + if (catchAllAddress != -1) { + writeSleb128(-typeIndexes.length); + } else { + writeSleb128(typeIndexes.length); + } + + for (int i = 0; i < typeIndexes.length; i++) { + writeUleb128(typeIndexes[i]); + writeUleb128(addresses[i]); + } + + if (catchAllAddress != -1) { + writeUleb128(catchAllAddress); + } + } + + private void writeTries(Code.Try[] tries, int[] catchHandlerOffsets) { + for (Code.Try tryItem : tries) { + writeInt(tryItem.startAddress); + writeUnsignedShort(tryItem.instructionCount); + writeUnsignedShort(catchHandlerOffsets[tryItem.catchHandlerIndex]); + } + } + + /** + * Write DebugInfo item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeDebugInfoItem(DebugInfoItem debugInfoItem) { + int off = data.position(); + + writeUleb128(debugInfoItem.lineStart); + + int parametersSize = debugInfoItem.parameterNames.length; + writeUleb128(parametersSize); + + for (int i = 0; i < parametersSize; ++i) { + int parameterName = debugInfoItem.parameterNames[i]; + writeUleb128p1(parameterName); + } + + write(debugInfoItem.infoSTM); + + return off; + } + + /** + * Write ClassData item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeClassData(ClassData classData) { + int off = data.position(); + writeUleb128(classData.staticFields.length); + writeUleb128(classData.instanceFields.length); + writeUleb128(classData.directMethods.length); + writeUleb128(classData.virtualMethods.length); + writeFields(classData.staticFields); + writeFields(classData.instanceFields); + writeMethods(classData.directMethods); + writeMethods(classData.virtualMethods); + return off; + } + + private void writeFields(ClassData.Field[] fields) { + int lastOutFieldIndex = 0; + for (ClassData.Field field : fields) { + writeUleb128(field.fieldIndex - lastOutFieldIndex); + lastOutFieldIndex = field.fieldIndex; + writeUleb128(field.accessFlags); + } + } + + private void writeMethods(ClassData.Method[] methods) { + int lastOutMethodIndex = 0; + for (ClassData.Method method : methods) { + writeUleb128(method.methodIndex - lastOutMethodIndex); + lastOutMethodIndex = method.methodIndex; + writeUleb128(method.accessFlags); + writeUleb128(method.codeOffset); + } + } + + /** + * Write Annotation item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeAnnotation(Annotation annotation) { + int off = data.position(); + writeByte(annotation.visibility); + writeEncodedArray(annotation.encodedAnnotation); + return off; + } + + /** + * Write AnnotationSet item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeAnnotationSet(AnnotationSet annotationSet) { + int off = data.position(); + writeInt(annotationSet.annotationOffsets.length); + for (int annotationOffset : annotationSet.annotationOffsets) { + writeInt(annotationOffset); + } + return off; + } + + /** + * Write AnnotationSetRefList item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeAnnotationSetRefList(AnnotationSetRefList annotationSetRefList) { + int off = data.position(); + writeInt(annotationSetRefList.annotationSetRefItems.length); + for (int annotationSetRefItem : annotationSetRefList.annotationSetRefItems) { + writeInt(annotationSetRefItem); + } + return off; + } + + /** + * Write AnnotationDirectory item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeAnnotationsDirectory(AnnotationsDirectory annotationsDirectory) { + int off = data.position(); + writeInt(annotationsDirectory.classAnnotationsOffset); + writeInt(annotationsDirectory.fieldAnnotations.length); + writeInt(annotationsDirectory.methodAnnotations.length); + writeInt(annotationsDirectory.parameterAnnotations.length); + + for (int[] fieldAnnotation : annotationsDirectory.fieldAnnotations) { + writeInt(fieldAnnotation[0]); + writeInt(fieldAnnotation[1]); + } + + for (int[] methodAnnotation : annotationsDirectory.methodAnnotations) { + writeInt(methodAnnotation[0]); + writeInt(methodAnnotation[1]); + } + + for (int[] parameterAnnotation : annotationsDirectory.parameterAnnotations) { + writeInt(parameterAnnotation[0]); + writeInt(parameterAnnotation[1]); + } + return off; + } + + /** + * Write EncodedValue/EncodedArray item into current section. + * + * @return real offset of item we've just written in this section. + */ + public int writeEncodedArray(EncodedValue encodedValue) { + int off = data.position(); + write(encodedValue.data); + return off; + } +} \ No newline at end of file diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteInput.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteInput.java new file mode 100644 index 00000000..5c35c879 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteInput.java @@ -0,0 +1,30 @@ +/* + * 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.util; + +/** + * A byte source. + */ +public interface ByteInput { + + /** + * Returns a byte. + * + * @throws IndexOutOfBoundsException if all bytes have been read. + */ + byte readByte(); +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteOutput.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteOutput.java new file mode 100644 index 00000000..6cc20f5e --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/ByteOutput.java @@ -0,0 +1,30 @@ +/* + * 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.util; + +/** + * A byte sink. + */ +public interface ByteOutput { + + /** + * Writes a byte. + * + * @throws IndexOutOfBoundsException if all bytes have been written. + */ + void writeByte(int i); +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/CompareUtils.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/CompareUtils.java new file mode 100644 index 00000000..7290f1f3 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/CompareUtils.java @@ -0,0 +1,253 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.util; + +import java.util.Comparator; + +/** + * *** This file is NOT a part of AOSP. *** + * Created by tangyinsheng on 2016/6/28. + */ +public final class CompareUtils { + private CompareUtils() { } + + public static int uCompare(byte ubyteA, byte ubyteB) { + if (ubyteA == ubyteB) { + return 0; + } + int a = ubyteA & 0xFF; + int b = ubyteB & 0xFF; + return a < b ? -1 : 1; + } + + public static int uCompare(short ushortA, short ushortB) { + if (ushortA == ushortB) { + return 0; + } + int a = ushortA & 0xFFFF; + int b = ushortB & 0xFFFF; + return a < b ? -1 : 1; + } + + public static int uCompare(int uintA, int uintB) { + if (uintA == uintB) { + return 0; + } + long a = uintA & 0xFFFFFFFFL; + long b = uintB & 0xFFFFFFFFL; + return a < b ? -1 : 1; + } + + public static int uArrCompare(byte[] ubyteArrA, byte[] ubyteArrB) { + int lenA = ubyteArrA.length; + int lenB = ubyteArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = uCompare(ubyteArrA[i], ubyteArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int uArrCompare(short[] ushortArrA, short[] ushortArrB) { + int lenA = ushortArrA.length; + int lenB = ushortArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = uCompare(ushortArrA[i], ushortArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int uArrCompare(int[] uintArrA, int[] uintArrB) { + int lenA = uintArrA.length; + int lenB = uintArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = uCompare(uintArrA[i], uintArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int sCompare(byte sbyteA, byte sbyteB) { + if (sbyteA == sbyteB) { + return 0; + } + return sbyteA < sbyteB ? -1 : 1; + } + + public static int sCompare(short sshortA, short sshortB) { + if (sshortA == sshortB) { + return 0; + } + return sshortA < sshortB ? -1 : 1; + } + + public static int sCompare(int sintA, int sintB) { + if (sintA == sintB) { + return 0; + } + return sintA < sintB ? -1 : 1; + } + + public static int sCompare(long slongA, long slongB) { + if (slongA == slongB) { + return 0; + } + return slongA < slongB ? -1 : 1; + } + + public static int sArrCompare(byte[] sbyteArrA, byte[] sbyteArrB) { + int lenA = sbyteArrA.length; + int lenB = sbyteArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = sCompare(sbyteArrA[i], sbyteArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int sArrCompare(short[] sshortArrA, short[] sshortArrB) { + int lenA = sshortArrA.length; + int lenB = sshortArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = sCompare(sshortArrA[i], sshortArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int sArrCompare(int[] sintArrA, int[] sintArrB) { + int lenA = sintArrA.length; + int lenB = sintArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = sCompare(sintArrA[i], sintArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int sArrCompare(long[] slongArrA, long[] slongArrB) { + int lenA = slongArrA.length; + int lenB = slongArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = sCompare(slongArrA[i], slongArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static > int aArrCompare(T[] aArrA, T[] aArrB) { + int lenA = aArrA.length; + int lenB = aArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = aArrA[i].compareTo(aArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } + + public static int aArrCompare(T[] aArrA, T[] aArrB, Comparator cmptor) { + int lenA = aArrA.length; + int lenB = aArrB.length; + if (lenA < lenB) { + return -1; + } else + if (lenA > lenB) { + return 1; + } else { + for (int i = 0; i < lenA; ++i) { + int res = cmptor.compare(aArrA[i], aArrB[i]); + if (res != 0) { + return res; + } + } + return 0; + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/FileUtils.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/FileUtils.java new file mode 100644 index 00000000..1130eb86 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dex/util/FileUtils.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2007 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.util; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * *** This file is NOT a part of AOSP. *** + * File I/O utilities. + */ +public final class FileUtils { + private FileUtils() { + } + + /** + * Reads the named file, translating {@link IOException} to a + * {@link RuntimeException} of some sort. + * + * @param fileName {@code non-null;} name of the file to read + * @return {@code non-null;} contents of the file + */ + public static byte[] readFile(String fileName) throws IOException { + File file = new File(fileName); + return readFile(file); + } + + /** + * Reads the given file, translating {@link IOException} to a + * {@link RuntimeException} of some sort. + * + * @param file {@code non-null;} the file to read + * @return {@code non-null;} contents of the file + * @throws IOException + */ + public static byte[] readFile(File file) throws IOException { + if (!file.exists()) { + throw new RuntimeException(file + ": file not found"); + } + + if (!file.isFile()) { + throw new RuntimeException(file + ": not a file"); + } + + if (!file.canRead()) { + throw new RuntimeException(file + ": file not readable"); + } + + long longLength = file.length(); + int length = (int) longLength; + if (length != longLength) { + throw new RuntimeException(file + ": file too long"); + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(length); + + InputStream in = null; + try { + in = new BufferedInputStream(new FileInputStream(file)); + byte[] buffer = new byte[8192]; + int bytesRead = 0; + while ((bytesRead = in.read(buffer)) > 0) { + baos.write(buffer, 0, bytesRead); + } + } finally { + if (in != null) { + try { + in.close(); + } catch (Exception e) { + // ignored. + } + } + } + + return baos.toByteArray(); + } + + public static byte[] readStream(InputStream is) throws IOException { + return readStream(is, 32 * 1024); + } + + public static byte[] readStream(InputStream is, int initSize) throws IOException { + if (initSize <= 0) { + initSize = 32 * 1024; + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(initSize); + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = is.read(buffer)) > 0) { + baos.write(buffer, 0, bytesRead); + } + return baos.toByteArray(); + } + + /** + * Returns true if {@code fileName} names a .zip, .jar, or .apk. + */ + public static boolean hasArchiveSuffix(String fileName) { + return fileName.endsWith(".zip") + || fileName.endsWith(".jar") + || fileName.endsWith(".apk"); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/CodeCursor.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/CodeCursor.java new file mode 100644 index 00000000..8514b6b7 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/CodeCursor.java @@ -0,0 +1,89 @@ +/* + * 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.dx.instruction; + +import com.tencent.tinker.android.utils.SparseIntArray; + +/** + * Cursor over code units, for reading or writing out Dalvik bytecode. + */ +public abstract class CodeCursor { + /** base address map */ + private final SparseIntArray baseAddressMap; + + /** next index within {@link #array} to read from or write to */ + private int cursor; + + /** + * Constructs an instance. + */ + public CodeCursor() { + this.baseAddressMap = new SparseIntArray(); + this.cursor = 0; + } + + /** + * Gets the cursor. The cursor is the offset in code units from + * the start of the input of the next code unit to be read or + * written, where the input generally consists of the code for a + * single method. + */ + public final int cursor() { + return cursor; + } + + /** + * Gets the base address associated with the current cursor. This + * differs from the cursor value when explicitly set (by {@link + * #setBaseAddress}). This is used, in particular, to convey base + * addresses to switch data payload instructions, whose relative + * addresses are relative to the address of a dependant switch + * instruction. + */ + public final int baseAddressForCursor() { + int index = baseAddressMap.indexOfKey(cursor); + if (index < 0) { + return cursor; + } else { + return baseAddressMap.valueAt(index); + } + } + + /** + * Sets the base address for the given target address to be as indicated. + * + * @see #baseAddressForCursor + */ + public final void setBaseAddress(int targetAddress, int baseAddress) { + baseAddressMap.put(targetAddress, baseAddress); + } + + /** + * Reset this cursor's status. + */ + public void reset() { + this.baseAddressMap.clear(); + this.cursor = 0; + } + + /** + * Advance the cursor by the indicated amount. + */ + protected final void advance(int amount) { + cursor += amount; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionCodec.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionCodec.java new file mode 100644 index 00000000..c0234f24 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionCodec.java @@ -0,0 +1,787 @@ +/* + * 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.dx.instruction; + +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dx.util.Hex; + +/** + * Encode/Decode instruction opcode. + */ +public final class InstructionCodec { + /** "Unknown." Used for undefined opcodes. */ + public static final int INDEX_TYPE_UNKNOWN = 0; + /** no index used */ + public static final int INDEX_TYPE_NONE = 1; + /** type reference index */ + public static final int INDEX_TYPE_TYPE_REF = 2; + /** string reference index */ + public static final int INDEX_TYPE_STRING_REF = 3; + /** method reference index */ + public static final int INDEX_TYPE_METHOD_REF = 4; + /** field reference index */ + public static final int INDEX_TYPE_FIELD_REF = 5; + /** "Unknown." Used for undefined opcodes. */ + public static final int INSN_FORMAT_UNKNOWN = 0; + public static final int INSN_FORMAT_00X = 1; + public static final int INSN_FORMAT_10T = 2; + public static final int INSN_FORMAT_10X = 3; + public static final int INSN_FORMAT_11N = 4; + public static final int INSN_FORMAT_11X = 5; + public static final int INSN_FORMAT_12X = 6; + public static final int INSN_FORMAT_20T = 7; + public static final int INSN_FORMAT_21C = 8; + public static final int INSN_FORMAT_21H = 9; + public static final int INSN_FORMAT_21S = 10; + public static final int INSN_FORMAT_21T = 11; + public static final int INSN_FORMAT_22B = 12; + public static final int INSN_FORMAT_22C = 13; + public static final int INSN_FORMAT_22S = 14; + public static final int INSN_FORMAT_22T = 15; + public static final int INSN_FORMAT_22X = 16; + public static final int INSN_FORMAT_23X = 17; + public static final int INSN_FORMAT_30T = 18; + public static final int INSN_FORMAT_31C = 19; + public static final int INSN_FORMAT_31I = 20; + public static final int INSN_FORMAT_31T = 21; + public static final int INSN_FORMAT_32X = 22; + public static final int INSN_FORMAT_35C = 23; + public static final int INSN_FORMAT_3RC = 24; + public static final int INSN_FORMAT_51L = 25; + public static final int INSN_FORMAT_FILL_ARRAY_DATA_PAYLOAD = 26; + public static final int INSN_FORMAT_PACKED_SWITCH_PAYLOAD = 27; + public static final int INSN_FORMAT_SPARSE_SWITCH_PAYLOAD = 28; + private InstructionCodec() { + throw new UnsupportedOperationException(); + } + + public static short codeUnit(int lowByte, int highByte) { + if ((lowByte & ~0xff) != 0) { + throw new IllegalArgumentException("bogus lowByte"); + } + + if ((highByte & ~0xff) != 0) { + throw new IllegalArgumentException("bogus highByte"); + } + + return (short) (lowByte | (highByte << 8)); + } + + public static short codeUnit(int nibble0, int nibble1, int nibble2, + int nibble3) { + if ((nibble0 & ~0xf) != 0) { + throw new IllegalArgumentException("bogus nibble0"); + } + + if ((nibble1 & ~0xf) != 0) { + throw new IllegalArgumentException("bogus nibble1"); + } + + if ((nibble2 & ~0xf) != 0) { + throw new IllegalArgumentException("bogus nibble2"); + } + + if ((nibble3 & ~0xf) != 0) { + throw new IllegalArgumentException("bogus nibble3"); + } + + return (short) (nibble0 | (nibble1 << 4) + | (nibble2 << 8) | (nibble3 << 12)); + } + + public static int makeByte(int lowNibble, int highNibble) { + if ((lowNibble & ~0xf) != 0) { + throw new IllegalArgumentException("bogus lowNibble"); + } + + if ((highNibble & ~0xf) != 0) { + throw new IllegalArgumentException("bogus highNibble"); + } + + return lowNibble | (highNibble << 4); + } + + public static short asUnsignedUnit(int value) { + if ((value & ~0xffff) != 0) { + throw new IllegalArgumentException("bogus unsigned code unit"); + } + + return (short) value; + } + + public static short unit0(int value) { + return (short) value; + } + + public static short unit1(int value) { + return (short) (value >> 16); + } + + public static short unit0(long value) { + return (short) value; + } + + public static short unit1(long value) { + return (short) (value >> 16); + } + + public static short unit2(long value) { + return (short) (value >> 32); + } + + public static short unit3(long value) { + return (short) (value >> 48); + } + + public static int byte0(int value) { + return value & 0xff; + } + + public static int byte1(int value) { + return (value >> 8) & 0xff; + } + + public static int nibble0(int value) { + return value & 0xf; + } + + public static int nibble1(int value) { + return (value >> 4) & 0xf; + } + + public static int nibble2(int value) { + return (value >> 8) & 0xf; + } + + public static int nibble3(int value) { + return (value >> 12) & 0xf; + } + + public static int getTargetByte(int target, int baseAddress) { + int relativeTarget = getTarget(target, baseAddress); + + if (relativeTarget != (byte) relativeTarget) { + throw new DexException( + "Target out of range: " + + Hex.s4(relativeTarget) + + ", perhaps you need to enable force jumbo mode." + ); + } + + return relativeTarget & 0xff; + } + + public static short getTargetUnit(int target, int baseAddress) { + int relativeTarget = getTarget(target, baseAddress); + + if (relativeTarget != (short) relativeTarget) { + throw new DexException( + "Target out of range: " + + Hex.s4(relativeTarget) + + ", perhaps you need to enable force jumbo mode." + ); + } + + return (short) relativeTarget; + } + + public static int getTarget(int target, int baseAddress) { + return target - baseAddress; + } + + public static int getLiteralByte(long literal) { + if (literal != (byte) literal) { + throw new DexException("Literal out of range: " + Hex.u8(literal)); + } + + return (int) literal & 0xff; + } + + public static short getLiteralUnit(long literal) { + if (literal != (short) literal) { + throw new DexException("Literal out of range: " + Hex.u8(literal)); + } + + return (short) literal; + } + + public static int getLiteralInt(long literal) { + if (literal != (int) literal) { + throw new DexException("Literal out of range: " + Hex.u8(literal)); + } + + return (int) literal; + } + + public static int getLiteralNibble(long literal) { + if ((literal < -8) || (literal > 7)) { + throw new DexException("Literal out of range: " + Hex.u8(literal)); + } + + return (int) literal & 0xf; + } + + /** + * Gets the A register number, as a code unit. This will throw if the + * value is out of the range of an unsigned code unit. + */ + public static short getAUnit(int a) { + if ((a & ~0xffff) != 0) { + throw new DexException("Register A out of range: " + Hex.u8(a)); + } + + return (short) a; + } + + /** + * Gets the B register number, as a code unit. This will throw if the + * value is out of the range of an unsigned code unit. + */ + public static short getBUnit(int b) { + if ((b & ~0xffff) != 0) { + throw new DexException("Register B out of range: " + Hex.u8(b)); + } + + return (short) b; + } + + public static int getInstructionIndexType(int opcode) { + switch (opcode) { + case Opcodes.CONST_STRING: + case Opcodes.CONST_STRING_JUMBO: { + return INDEX_TYPE_STRING_REF; + } + case Opcodes.CONST_CLASS: + case Opcodes.CHECK_CAST: + case Opcodes.INSTANCE_OF: + case Opcodes.NEW_INSTANCE: + case Opcodes.NEW_ARRAY: + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.FILLED_NEW_ARRAY_RANGE: { + return INDEX_TYPE_TYPE_REF; + } + case Opcodes.IGET: + case Opcodes.IGET_WIDE: + case Opcodes.IGET_OBJECT: + case Opcodes.IGET_BOOLEAN: + case Opcodes.IGET_BYTE: + case Opcodes.IGET_CHAR: + case Opcodes.IGET_SHORT: + case Opcodes.IPUT: + case Opcodes.IPUT_WIDE: + case Opcodes.IPUT_OBJECT: + case Opcodes.IPUT_BOOLEAN: + case Opcodes.IPUT_BYTE: + case Opcodes.IPUT_CHAR: + case Opcodes.IPUT_SHORT: + case Opcodes.SGET: + case Opcodes.SGET_WIDE: + case Opcodes.SGET_OBJECT: + case Opcodes.SGET_BOOLEAN: + case Opcodes.SGET_BYTE: + case Opcodes.SGET_CHAR: + case Opcodes.SGET_SHORT: + case Opcodes.SPUT: + case Opcodes.SPUT_WIDE: + case Opcodes.SPUT_OBJECT: + case Opcodes.SPUT_BOOLEAN: + case Opcodes.SPUT_BYTE: + case Opcodes.SPUT_CHAR: + case Opcodes.SPUT_SHORT: { + return INDEX_TYPE_FIELD_REF; + } + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: + case Opcodes.INVOKE_VIRTUAL_RANGE: + case Opcodes.INVOKE_SUPER_RANGE: + case Opcodes.INVOKE_DIRECT_RANGE: + case Opcodes.INVOKE_STATIC_RANGE: + case Opcodes.INVOKE_INTERFACE_RANGE: { + return INDEX_TYPE_METHOD_REF; + } + case Opcodes.SPECIAL_FORMAT: + case Opcodes.PACKED_SWITCH_PAYLOAD: + case Opcodes.SPARSE_SWITCH_PAYLOAD: + case Opcodes.FILL_ARRAY_DATA_PAYLOAD: + case Opcodes.NOP: + case Opcodes.MOVE: + case Opcodes.MOVE_FROM16: + case Opcodes.MOVE_16: + case Opcodes.MOVE_WIDE: + case Opcodes.MOVE_WIDE_FROM16: + case Opcodes.MOVE_WIDE_16: + case Opcodes.MOVE_OBJECT: + case Opcodes.MOVE_OBJECT_FROM16: + case Opcodes.MOVE_OBJECT_16: + case Opcodes.MOVE_RESULT: + case Opcodes.MOVE_RESULT_WIDE: + case Opcodes.MOVE_RESULT_OBJECT: + case Opcodes.MOVE_EXCEPTION: + case Opcodes.RETURN_VOID: + case Opcodes.RETURN: + case Opcodes.RETURN_WIDE: + case Opcodes.RETURN_OBJECT: + case Opcodes.CONST_4: + case Opcodes.CONST_16: + case Opcodes.CONST: + case Opcodes.CONST_HIGH16: + case Opcodes.CONST_WIDE_16: + case Opcodes.CONST_WIDE_32: + case Opcodes.CONST_WIDE: + case Opcodes.CONST_WIDE_HIGH16: + case Opcodes.MONITOR_ENTER: + case Opcodes.MONITOR_EXIT: + case Opcodes.ARRAY_LENGTH: + case Opcodes.FILL_ARRAY_DATA: + case Opcodes.THROW: + case Opcodes.GOTO: + case Opcodes.GOTO_16: + case Opcodes.GOTO_32: + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: + case Opcodes.CMPL_FLOAT: + case Opcodes.CMPG_FLOAT: + case Opcodes.CMPL_DOUBLE: + case Opcodes.CMPG_DOUBLE: + case Opcodes.CMP_LONG: + case Opcodes.IF_EQ: + case Opcodes.IF_NE: + case Opcodes.IF_LT: + case Opcodes.IF_GE: + case Opcodes.IF_GT: + case Opcodes.IF_LE: + case Opcodes.IF_EQZ: + case Opcodes.IF_NEZ: + case Opcodes.IF_LTZ: + case Opcodes.IF_GEZ: + case Opcodes.IF_GTZ: + case Opcodes.IF_LEZ: + case Opcodes.AGET: + case Opcodes.AGET_WIDE: + case Opcodes.AGET_OBJECT: + case Opcodes.AGET_BOOLEAN: + case Opcodes.AGET_BYTE: + case Opcodes.AGET_CHAR: + case Opcodes.AGET_SHORT: + case Opcodes.APUT: + case Opcodes.APUT_WIDE: + case Opcodes.APUT_OBJECT: + case Opcodes.APUT_BOOLEAN: + case Opcodes.APUT_BYTE: + case Opcodes.APUT_CHAR: + case Opcodes.APUT_SHORT: + case Opcodes.NEG_INT: + case Opcodes.NOT_INT: + case Opcodes.NEG_LONG: + case Opcodes.NOT_LONG: + case Opcodes.NEG_FLOAT: + case Opcodes.NEG_DOUBLE: + case Opcodes.INT_TO_LONG: + case Opcodes.INT_TO_FLOAT: + case Opcodes.INT_TO_DOUBLE: + case Opcodes.LONG_TO_INT: + case Opcodes.LONG_TO_FLOAT: + case Opcodes.LONG_TO_DOUBLE: + case Opcodes.FLOAT_TO_INT: + case Opcodes.FLOAT_TO_LONG: + case Opcodes.FLOAT_TO_DOUBLE: + case Opcodes.DOUBLE_TO_INT: + case Opcodes.DOUBLE_TO_LONG: + case Opcodes.DOUBLE_TO_FLOAT: + case Opcodes.INT_TO_BYTE: + case Opcodes.INT_TO_CHAR: + case Opcodes.INT_TO_SHORT: + case Opcodes.ADD_INT: + case Opcodes.SUB_INT: + case Opcodes.MUL_INT: + case Opcodes.DIV_INT: + case Opcodes.REM_INT: + case Opcodes.AND_INT: + case Opcodes.OR_INT: + case Opcodes.XOR_INT: + case Opcodes.SHL_INT: + case Opcodes.SHR_INT: + case Opcodes.USHR_INT: + case Opcodes.ADD_LONG: + case Opcodes.SUB_LONG: + case Opcodes.MUL_LONG: + case Opcodes.DIV_LONG: + case Opcodes.REM_LONG: + case Opcodes.AND_LONG: + case Opcodes.OR_LONG: + case Opcodes.XOR_LONG: + case Opcodes.SHL_LONG: + case Opcodes.SHR_LONG: + case Opcodes.USHR_LONG: + case Opcodes.ADD_FLOAT: + case Opcodes.SUB_FLOAT: + case Opcodes.MUL_FLOAT: + case Opcodes.DIV_FLOAT: + case Opcodes.REM_FLOAT: + case Opcodes.ADD_DOUBLE: + case Opcodes.SUB_DOUBLE: + case Opcodes.MUL_DOUBLE: + case Opcodes.DIV_DOUBLE: + case Opcodes.REM_DOUBLE: + case Opcodes.ADD_INT_2ADDR: + case Opcodes.SUB_INT_2ADDR: + case Opcodes.MUL_INT_2ADDR: + case Opcodes.DIV_INT_2ADDR: + case Opcodes.REM_INT_2ADDR: + case Opcodes.AND_INT_2ADDR: + case Opcodes.OR_INT_2ADDR: + case Opcodes.XOR_INT_2ADDR: + case Opcodes.SHL_INT_2ADDR: + case Opcodes.SHR_INT_2ADDR: + case Opcodes.USHR_INT_2ADDR: + case Opcodes.ADD_LONG_2ADDR: + case Opcodes.SUB_LONG_2ADDR: + case Opcodes.MUL_LONG_2ADDR: + case Opcodes.DIV_LONG_2ADDR: + case Opcodes.REM_LONG_2ADDR: + case Opcodes.AND_LONG_2ADDR: + case Opcodes.OR_LONG_2ADDR: + case Opcodes.XOR_LONG_2ADDR: + case Opcodes.SHL_LONG_2ADDR: + case Opcodes.SHR_LONG_2ADDR: + case Opcodes.USHR_LONG_2ADDR: + case Opcodes.ADD_FLOAT_2ADDR: + case Opcodes.SUB_FLOAT_2ADDR: + case Opcodes.MUL_FLOAT_2ADDR: + case Opcodes.DIV_FLOAT_2ADDR: + case Opcodes.REM_FLOAT_2ADDR: + case Opcodes.ADD_DOUBLE_2ADDR: + case Opcodes.SUB_DOUBLE_2ADDR: + case Opcodes.MUL_DOUBLE_2ADDR: + case Opcodes.DIV_DOUBLE_2ADDR: + case Opcodes.REM_DOUBLE_2ADDR: + case Opcodes.ADD_INT_LIT16: + case Opcodes.RSUB_INT: + case Opcodes.MUL_INT_LIT16: + case Opcodes.DIV_INT_LIT16: + case Opcodes.REM_INT_LIT16: + case Opcodes.AND_INT_LIT16: + case Opcodes.OR_INT_LIT16: + case Opcodes.XOR_INT_LIT16: + case Opcodes.ADD_INT_LIT8: + case Opcodes.RSUB_INT_LIT8: + case Opcodes.MUL_INT_LIT8: + case Opcodes.DIV_INT_LIT8: + case Opcodes.REM_INT_LIT8: + case Opcodes.AND_INT_LIT8: + case Opcodes.OR_INT_LIT8: + case Opcodes.XOR_INT_LIT8: + case Opcodes.SHL_INT_LIT8: + case Opcodes.SHR_INT_LIT8: + case Opcodes.USHR_INT_LIT8: { + return INDEX_TYPE_NONE; + } + default: { + return INDEX_TYPE_UNKNOWN; + } + } + } + + public static int getInstructionFormat(int opcode) { + switch (opcode) { + case Opcodes.SPECIAL_FORMAT: { + return INSN_FORMAT_00X; + } + case Opcodes.GOTO: { + return INSN_FORMAT_10T; + } + case Opcodes.NOP: + case Opcodes.RETURN_VOID: { + return INSN_FORMAT_10X; + } + case Opcodes.CONST_4: { + return INSN_FORMAT_11N; + } + case Opcodes.MOVE_RESULT: + case Opcodes.MOVE_RESULT_WIDE: + case Opcodes.MOVE_RESULT_OBJECT: + case Opcodes.MOVE_EXCEPTION: + case Opcodes.RETURN: + case Opcodes.RETURN_WIDE: + case Opcodes.RETURN_OBJECT: + case Opcodes.MONITOR_ENTER: + case Opcodes.MONITOR_EXIT: + case Opcodes.THROW: { + return INSN_FORMAT_11X; + } + case Opcodes.MOVE: + case Opcodes.MOVE_WIDE: + case Opcodes.MOVE_OBJECT: + case Opcodes.ARRAY_LENGTH: + case Opcodes.NEG_INT: + case Opcodes.NOT_INT: + case Opcodes.NEG_LONG: + case Opcodes.NOT_LONG: + case Opcodes.NEG_FLOAT: + case Opcodes.NEG_DOUBLE: + case Opcodes.INT_TO_LONG: + case Opcodes.INT_TO_FLOAT: + case Opcodes.INT_TO_DOUBLE: + case Opcodes.LONG_TO_INT: + case Opcodes.LONG_TO_FLOAT: + case Opcodes.LONG_TO_DOUBLE: + case Opcodes.FLOAT_TO_INT: + case Opcodes.FLOAT_TO_LONG: + case Opcodes.FLOAT_TO_DOUBLE: + case Opcodes.DOUBLE_TO_INT: + case Opcodes.DOUBLE_TO_LONG: + case Opcodes.DOUBLE_TO_FLOAT: + case Opcodes.INT_TO_BYTE: + case Opcodes.INT_TO_CHAR: + case Opcodes.INT_TO_SHORT: + case Opcodes.ADD_INT_2ADDR: + case Opcodes.SUB_INT_2ADDR: + case Opcodes.MUL_INT_2ADDR: + case Opcodes.DIV_INT_2ADDR: + case Opcodes.REM_INT_2ADDR: + case Opcodes.AND_INT_2ADDR: + case Opcodes.OR_INT_2ADDR: + case Opcodes.XOR_INT_2ADDR: + case Opcodes.SHL_INT_2ADDR: + case Opcodes.SHR_INT_2ADDR: + case Opcodes.USHR_INT_2ADDR: + case Opcodes.ADD_LONG_2ADDR: + case Opcodes.SUB_LONG_2ADDR: + case Opcodes.MUL_LONG_2ADDR: + case Opcodes.DIV_LONG_2ADDR: + case Opcodes.REM_LONG_2ADDR: + case Opcodes.AND_LONG_2ADDR: + case Opcodes.OR_LONG_2ADDR: + case Opcodes.XOR_LONG_2ADDR: + case Opcodes.SHL_LONG_2ADDR: + case Opcodes.SHR_LONG_2ADDR: + case Opcodes.USHR_LONG_2ADDR: + case Opcodes.ADD_FLOAT_2ADDR: + case Opcodes.SUB_FLOAT_2ADDR: + case Opcodes.MUL_FLOAT_2ADDR: + case Opcodes.DIV_FLOAT_2ADDR: + case Opcodes.REM_FLOAT_2ADDR: + case Opcodes.ADD_DOUBLE_2ADDR: + case Opcodes.SUB_DOUBLE_2ADDR: + case Opcodes.MUL_DOUBLE_2ADDR: + case Opcodes.DIV_DOUBLE_2ADDR: + case Opcodes.REM_DOUBLE_2ADDR: { + return INSN_FORMAT_12X; + } + case Opcodes.GOTO_16: { + return INSN_FORMAT_20T; + } + case Opcodes.CONST_STRING: + case Opcodes.CONST_CLASS: + case Opcodes.CHECK_CAST: + case Opcodes.NEW_INSTANCE: + case Opcodes.SGET: + case Opcodes.SGET_WIDE: + case Opcodes.SGET_OBJECT: + case Opcodes.SGET_BOOLEAN: + case Opcodes.SGET_BYTE: + case Opcodes.SGET_CHAR: + case Opcodes.SGET_SHORT: + case Opcodes.SPUT: + case Opcodes.SPUT_WIDE: + case Opcodes.SPUT_OBJECT: + case Opcodes.SPUT_BOOLEAN: + case Opcodes.SPUT_BYTE: + case Opcodes.SPUT_CHAR: + case Opcodes.SPUT_SHORT: { + return INSN_FORMAT_21C; + } + case Opcodes.CONST_HIGH16: + case Opcodes.CONST_WIDE_HIGH16: { + return INSN_FORMAT_21H; + } + case Opcodes.CONST_16: + case Opcodes.CONST_WIDE_16: { + return INSN_FORMAT_21S; + } + case Opcodes.IF_EQZ: + case Opcodes.IF_NEZ: + case Opcodes.IF_LTZ: + case Opcodes.IF_GEZ: + case Opcodes.IF_GTZ: + case Opcodes.IF_LEZ: { + return INSN_FORMAT_21T; + } + case Opcodes.ADD_INT_LIT8: + case Opcodes.RSUB_INT_LIT8: + case Opcodes.MUL_INT_LIT8: + case Opcodes.DIV_INT_LIT8: + case Opcodes.REM_INT_LIT8: + case Opcodes.AND_INT_LIT8: + case Opcodes.OR_INT_LIT8: + case Opcodes.XOR_INT_LIT8: + case Opcodes.SHL_INT_LIT8: + case Opcodes.SHR_INT_LIT8: + case Opcodes.USHR_INT_LIT8: { + return INSN_FORMAT_22B; + } + case Opcodes.INSTANCE_OF: + case Opcodes.NEW_ARRAY: + case Opcodes.IGET: + case Opcodes.IGET_WIDE: + case Opcodes.IGET_OBJECT: + case Opcodes.IGET_BOOLEAN: + case Opcodes.IGET_BYTE: + case Opcodes.IGET_CHAR: + case Opcodes.IGET_SHORT: + case Opcodes.IPUT: + case Opcodes.IPUT_WIDE: + case Opcodes.IPUT_OBJECT: + case Opcodes.IPUT_BOOLEAN: + case Opcodes.IPUT_BYTE: + case Opcodes.IPUT_CHAR: + case Opcodes.IPUT_SHORT: { + return INSN_FORMAT_22C; + } + case Opcodes.ADD_INT_LIT16: + case Opcodes.RSUB_INT: + case Opcodes.MUL_INT_LIT16: + case Opcodes.DIV_INT_LIT16: + case Opcodes.REM_INT_LIT16: + case Opcodes.AND_INT_LIT16: + case Opcodes.OR_INT_LIT16: + case Opcodes.XOR_INT_LIT16: { + return INSN_FORMAT_22S; + } + case Opcodes.IF_EQ: + case Opcodes.IF_NE: + case Opcodes.IF_LT: + case Opcodes.IF_GE: + case Opcodes.IF_GT: + case Opcodes.IF_LE: { + return INSN_FORMAT_22T; + } + case Opcodes.MOVE_FROM16: + case Opcodes.MOVE_WIDE_FROM16: + case Opcodes.MOVE_OBJECT_FROM16: { + return INSN_FORMAT_22X; + } + case Opcodes.CMPL_FLOAT: + case Opcodes.CMPG_FLOAT: + case Opcodes.CMPL_DOUBLE: + case Opcodes.CMPG_DOUBLE: + case Opcodes.CMP_LONG: + case Opcodes.AGET: + case Opcodes.AGET_WIDE: + case Opcodes.AGET_OBJECT: + case Opcodes.AGET_BOOLEAN: + case Opcodes.AGET_BYTE: + case Opcodes.AGET_CHAR: + case Opcodes.AGET_SHORT: + case Opcodes.APUT: + case Opcodes.APUT_WIDE: + case Opcodes.APUT_OBJECT: + case Opcodes.APUT_BOOLEAN: + case Opcodes.APUT_BYTE: + case Opcodes.APUT_CHAR: + case Opcodes.APUT_SHORT: + case Opcodes.ADD_INT: + case Opcodes.SUB_INT: + case Opcodes.MUL_INT: + case Opcodes.DIV_INT: + case Opcodes.REM_INT: + case Opcodes.AND_INT: + case Opcodes.OR_INT: + case Opcodes.XOR_INT: + case Opcodes.SHL_INT: + case Opcodes.SHR_INT: + case Opcodes.USHR_INT: + case Opcodes.ADD_LONG: + case Opcodes.SUB_LONG: + case Opcodes.MUL_LONG: + case Opcodes.DIV_LONG: + case Opcodes.REM_LONG: + case Opcodes.AND_LONG: + case Opcodes.OR_LONG: + case Opcodes.XOR_LONG: + case Opcodes.SHL_LONG: + case Opcodes.SHR_LONG: + case Opcodes.USHR_LONG: + case Opcodes.ADD_FLOAT: + case Opcodes.SUB_FLOAT: + case Opcodes.MUL_FLOAT: + case Opcodes.DIV_FLOAT: + case Opcodes.REM_FLOAT: + case Opcodes.ADD_DOUBLE: + case Opcodes.SUB_DOUBLE: + case Opcodes.MUL_DOUBLE: + case Opcodes.DIV_DOUBLE: + case Opcodes.REM_DOUBLE: { + return INSN_FORMAT_23X; + } + case Opcodes.GOTO_32: { + return INSN_FORMAT_30T; + } + case Opcodes.CONST_STRING_JUMBO: { + return INSN_FORMAT_31C; + } + case Opcodes.CONST: + case Opcodes.CONST_WIDE_32: { + return INSN_FORMAT_31I; + } + case Opcodes.FILL_ARRAY_DATA: + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: { + return INSN_FORMAT_31T; + } + case Opcodes.MOVE_16: + case Opcodes.MOVE_WIDE_16: + case Opcodes.MOVE_OBJECT_16: { + return INSN_FORMAT_32X; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + return INSN_FORMAT_35C; + } + case Opcodes.FILLED_NEW_ARRAY_RANGE: + case Opcodes.INVOKE_VIRTUAL_RANGE: + case Opcodes.INVOKE_SUPER_RANGE: + case Opcodes.INVOKE_DIRECT_RANGE: + case Opcodes.INVOKE_STATIC_RANGE: + case Opcodes.INVOKE_INTERFACE_RANGE: { + return INSN_FORMAT_3RC; + } + case Opcodes.CONST_WIDE: { + return INSN_FORMAT_51L; + } + case Opcodes.PACKED_SWITCH_PAYLOAD: { + return INSN_FORMAT_PACKED_SWITCH_PAYLOAD; + } + case Opcodes.SPARSE_SWITCH_PAYLOAD: { + return INSN_FORMAT_SPARSE_SWITCH_PAYLOAD; + } + case Opcodes.FILL_ARRAY_DATA_PAYLOAD: { + return INSN_FORMAT_FILL_ARRAY_DATA_PAYLOAD; + } + default: { + return INSN_FORMAT_UNKNOWN; + } + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionComparator.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionComparator.java new file mode 100644 index 00000000..b90bac22 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionComparator.java @@ -0,0 +1,443 @@ +/* + * 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.dx.instruction; + +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dex.util.CompareUtils; +import com.tencent.tinker.android.dx.util.Hex; + +import java.io.EOFException; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Created by tangyinsheng on 2016/7/12. + */ +public abstract class InstructionComparator { + private final InstructionHolder[] insnHolders1; + private final InstructionHolder[] insnHolders2; + + public InstructionComparator(short[] insns1, short[] insns2) { + if (insns1 != null) { + ShortArrayCodeInput codeIn1 = new ShortArrayCodeInput(insns1); + this.insnHolders1 = readInstructionsIntoHolders(codeIn1, insns1.length); + } else { + this.insnHolders1 = null; + } + if (insns2 != null) { + ShortArrayCodeInput codeIn2 = new ShortArrayCodeInput(insns2); + this.insnHolders2 = readInstructionsIntoHolders(codeIn2, insns2.length); + } else { + this.insnHolders2 = null; + } + } + + private InstructionHolder[] readInstructionsIntoHolders(ShortArrayCodeInput in, int length) { + in.reset(); + final InstructionHolder[] result = new InstructionHolder[length]; + InstructionReader ir = new InstructionReader(in); + try { + ir.accept(new InstructionVisitor(null) { + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + result[currentAddress] = insnHolder; + } + + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + insnHolder.registerCount = 1; + insnHolder.a = a; + result[currentAddress] = insnHolder; + } + + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + insnHolder.registerCount = 2; + insnHolder.a = a; + insnHolder.b = b; + result[currentAddress] = insnHolder; + } + + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + insnHolder.registerCount = 3; + insnHolder.a = a; + insnHolder.b = b; + insnHolder.c = c; + result[currentAddress] = insnHolder; + } + + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + insnHolder.registerCount = 4; + insnHolder.a = a; + insnHolder.b = b; + insnHolder.c = c; + insnHolder.d = d; + result[currentAddress] = insnHolder; + } + + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + insnHolder.registerCount = 5; + insnHolder.a = a; + insnHolder.b = b; + insnHolder.c = c; + insnHolder.d = d; + insnHolder.e = e; + result[currentAddress] = insnHolder; + } + + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + InstructionHolder insnHolder = new InstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.index = index; + insnHolder.target = target; + insnHolder.literal = literal; + insnHolder.registerCount = registerCount; + insnHolder.a = a; + result[currentAddress] = insnHolder; + } + + public void visitSparseSwitchPayloadInsn(int currentAddress, int opcode, int[] keys, int[] targets) { + SparseSwitchPayloadInsntructionHolder insnHolder = new SparseSwitchPayloadInsntructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.keys = keys; + insnHolder.targets = targets; + result[currentAddress] = insnHolder; + } + + public void visitPackedSwitchPayloadInsn(int currentAddress, int opcode, int firstKey, int[] targets) { + PackedSwitchPayloadInsntructionHolder insnHolder = new PackedSwitchPayloadInsntructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.firstKey = firstKey; + insnHolder.targets = targets; + result[currentAddress] = insnHolder; + } + + public void visitFillArrayDataPayloadInsn(int currentAddress, int opcode, Object data, int size, int elementWidth) { + FillArrayDataPayloadInstructionHolder insnHolder = new FillArrayDataPayloadInstructionHolder(); + insnHolder.insnFormat = InstructionCodec.getInstructionFormat(opcode); + insnHolder.address = currentAddress; + insnHolder.opcode = opcode; + insnHolder.data = data; + insnHolder.size = size; + insnHolder.elementWidth = elementWidth; + result[currentAddress] = insnHolder; + } + }); + } catch (EOFException e) { + throw new RuntimeException(e); + } + return result; + } + + public final boolean compare() { + if (this.insnHolders1 == null && this.insnHolders2 == null) { + return true; + } + + if (this.insnHolders1 == null || this.insnHolders2 == null) { + return false; + } + + int currAddress1 = 0; + int currAddress2 = 0; + int insnHolderCount1 = 0; + int insnHolderCount2 = 0; + while (currAddress1 < insnHolders1.length && currAddress2 < insnHolders2.length) { + InstructionHolder insnHolder1 = null; + InstructionHolder insnHolder2 = null; + while (currAddress1 < insnHolders1.length && insnHolder1 == null) { + insnHolder1 = insnHolders1[currAddress1++]; + } + if (insnHolder1 != null) { + ++insnHolderCount1; + } else { + break; + } + while (currAddress2 < insnHolders2.length && insnHolder2 == null) { + insnHolder2 = insnHolders2[currAddress2++]; + } + if (insnHolder2 != null) { + ++insnHolderCount2; + } else { + break; + } + if (insnHolder1.opcode != insnHolder2.opcode) { + if (insnHolder1.opcode == Opcodes.CONST_STRING + && insnHolder2.opcode == Opcodes.CONST_STRING_JUMBO) { + if (!compareString(insnHolder1.index, insnHolder2.index)) { + return false; + } + } else + if (insnHolder1.opcode == Opcodes.CONST_STRING_JUMBO + && insnHolder2.opcode == Opcodes.CONST_STRING) { + if (!compareString(insnHolder1.index, insnHolder2.index)) { + return false; + } + } else { + return false; + } + } else { + if (!isSameInstruction(insnHolder1.address, insnHolder2.address)) { + return false; + } + } + } + while (currAddress1 < insnHolders1.length) { + if (insnHolders1[currAddress1++] != null) { + return false; + } + } + while (currAddress2 < insnHolders2.length) { + if (insnHolders2[currAddress2++] != null) { + return false; + } + } + return insnHolderCount1 == insnHolderCount2; + } + + public boolean isSameInstruction(int insnAddress1, int insnAddress2) { + InstructionHolder insnHolder1 = this.insnHolders1[insnAddress1]; + InstructionHolder insnHolder2 = this.insnHolders2[insnAddress2]; + if (insnHolder1 == null && insnHolder2 == null) { + return true; + } + if (insnHolder1 == null || insnHolder2 == null) { + return false; + } + if (insnHolder1.opcode != insnHolder2.opcode) { + return false; + } + int opcode = insnHolder1.opcode; + int insnFormat = insnHolder1.insnFormat; + switch (insnFormat) { + case InstructionCodec.INSN_FORMAT_10T: + case InstructionCodec.INSN_FORMAT_20T: + case InstructionCodec.INSN_FORMAT_21T: + case InstructionCodec.INSN_FORMAT_22T: + case InstructionCodec.INSN_FORMAT_30T: + case InstructionCodec.INSN_FORMAT_31T: { + return isSameInstruction(insnHolder1.target, insnHolder2.target); + } + case InstructionCodec.INSN_FORMAT_21C: + case InstructionCodec.INSN_FORMAT_22C: + case InstructionCodec.INSN_FORMAT_31C: + case InstructionCodec.INSN_FORMAT_35C: + case InstructionCodec.INSN_FORMAT_3RC: { + return compareIndex(opcode, insnHolder1.index, insnHolder2.index); + } + case InstructionCodec.INSN_FORMAT_PACKED_SWITCH_PAYLOAD: { + PackedSwitchPayloadInsntructionHolder specInsnHolder1 = (PackedSwitchPayloadInsntructionHolder) insnHolder1; + PackedSwitchPayloadInsntructionHolder specInsnHolder2 = (PackedSwitchPayloadInsntructionHolder) insnHolder2; + if (specInsnHolder1.firstKey != specInsnHolder2.firstKey) { + return false; + } + if (specInsnHolder1.targets.length != specInsnHolder2.targets.length) { + return false; + } + int targetCount = specInsnHolder1.targets.length; + for (int i = 0; i < targetCount; ++i) { + if (!isSameInstruction(specInsnHolder1.targets[i], specInsnHolder2.targets[i])) { + return false; + } + } + return true; + } + case InstructionCodec.INSN_FORMAT_SPARSE_SWITCH_PAYLOAD: { + SparseSwitchPayloadInsntructionHolder specInsnHolder1 = (SparseSwitchPayloadInsntructionHolder) insnHolder1; + SparseSwitchPayloadInsntructionHolder specInsnHolder2 = (SparseSwitchPayloadInsntructionHolder) insnHolder2; + if (CompareUtils.uArrCompare(specInsnHolder1.keys, specInsnHolder2.keys) != 0) { + return false; + } + if (specInsnHolder1.targets.length != specInsnHolder2.targets.length) { + return false; + } + int targetCount = specInsnHolder1.targets.length; + for (int i = 0; i < targetCount; ++i) { + if (!isSameInstruction(specInsnHolder1.targets[i], specInsnHolder2.targets[i])) { + return false; + } + } + return true; + } + case InstructionCodec.INSN_FORMAT_FILL_ARRAY_DATA_PAYLOAD: { + FillArrayDataPayloadInstructionHolder specInsnHolder1 = (FillArrayDataPayloadInstructionHolder) insnHolder1; + FillArrayDataPayloadInstructionHolder specInsnHolder2 = (FillArrayDataPayloadInstructionHolder) insnHolder2; + if (specInsnHolder1.elementWidth != specInsnHolder2.elementWidth) { + return false; + } + if (specInsnHolder1.size != specInsnHolder2.size) { + return false; + } + + int elementWidth = specInsnHolder1.elementWidth; + switch (elementWidth) { + case 1: { + byte[] array1 = (byte[]) specInsnHolder1.data; + byte[] array2 = (byte[]) specInsnHolder2.data; + return CompareUtils.uArrCompare(array1, array2) == 0; + } + case 2: { + short[] array1 = (short[]) specInsnHolder1.data; + short[] array2 = (short[]) specInsnHolder2.data; + return CompareUtils.uArrCompare(array1, array2) == 0; + } + case 4: { + int[] array1 = (int[]) specInsnHolder1.data; + int[] array2 = (int[]) specInsnHolder2.data; + return CompareUtils.uArrCompare(array1, array2) == 0; + } + case 8: { + long[] array1 = (long[]) specInsnHolder1.data; + long[] array2 = (long[]) specInsnHolder2.data; + return CompareUtils.sArrCompare(array1, array2) == 0; + } + default: { + throw new DexException("bogus element_width: " + Hex.u2(elementWidth)); + } + } + } + default: { + if (insnHolder1.literal != insnHolder2.literal) { + return false; + } + if (insnHolder1.registerCount != insnHolder2.registerCount) { + return false; + } + if (insnHolder1.a != insnHolder2.a) { + return false; + } + if (insnHolder1.b != insnHolder2.b) { + return false; + } + if (insnHolder1.c != insnHolder2.c) { + return false; + } + if (insnHolder1.d != insnHolder2.d) { + return false; + } + if (insnHolder1.e != insnHolder2.e) { + return false; + } + return true; + } + } + } + + private boolean compareIndex(int opcode, int index1, int index2) { + switch (InstructionCodec.getInstructionIndexType(opcode)) { + case InstructionCodec.INDEX_TYPE_STRING_REF: { + return compareString(index1, index2); + } + case InstructionCodec.INDEX_TYPE_TYPE_REF: { + return compareType(index1, index2); + } + case InstructionCodec.INDEX_TYPE_FIELD_REF: { + return compareField(index1, index2); + } + case InstructionCodec.INDEX_TYPE_METHOD_REF: { + return compareMethod(index1, index2); + } + default: { + return index1 == index2; + } + } + } + + protected abstract boolean compareString(int stringIndex1, int stringIndex2); + + protected abstract boolean compareType(int typeIndex1, int typeIndex2); + + protected abstract boolean compareField(int fieldIndex1, int fieldIndex2); + + protected abstract boolean compareMethod(int methodIndex1, int methodIndex2); + + private static class InstructionHolder { + int insnFormat = InstructionCodec.INSN_FORMAT_UNKNOWN; + int address = -1; + int opcode = -1; + int index = 0; + int target = 0; + long literal = 0L; + int registerCount = 0; + int a = 0; + int b = 0; + int c = 0; + int d = 0; + int e = 0; + } + + private static class SparseSwitchPayloadInsntructionHolder extends InstructionHolder { + int[] keys = null; + int[] targets = null; + } + + private static class PackedSwitchPayloadInsntructionHolder extends InstructionHolder { + int firstKey = 0; + int[] targets = null; + } + + private static class FillArrayDataPayloadInstructionHolder extends InstructionHolder { + Object data = null; + int size = 0; + int elementWidth = 0; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionPromoter.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionPromoter.java new file mode 100644 index 00000000..41dfaa7d --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionPromoter.java @@ -0,0 +1,504 @@ +/* + * 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.dx.instruction; + +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dx.util.Hex; +import com.tencent.tinker.android.utils.SparseIntArray; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Created by tangyinsheng on 2016/8/11. + */ +public final class InstructionPromoter extends InstructionVisitor { + private final SparseIntArray addressMap = new SparseIntArray(); + + // Notice that the unit of currentPromotedAddress is not 'byte' + // but 'short' + private int currentPromotedAddress = 0; + + public InstructionPromoter() { + super(null); + } + + private void mapAddressIfNeeded(int currentAddress) { + if (currentAddress != this.currentPromotedAddress) { + addressMap.append(currentAddress, this.currentPromotedAddress); + } + } + + public int getPromotedAddress(int currentAddress) { + int index = addressMap.indexOfKey(currentAddress); + if (index < 0) { + return currentAddress; + } else { + return addressMap.valueAt(index); + } + } + + public int getPromotedAddressCount() { + return addressMap.size(); + } + + @Override + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.SPECIAL_FORMAT: + case Opcodes.NOP: + case Opcodes.RETURN_VOID: { + this.currentPromotedAddress += 1; + break; + } + case Opcodes.GOTO: { + int relativeTarget = InstructionCodec.getTarget(target, this.currentPromotedAddress); + if (relativeTarget != (byte) relativeTarget) { + if (relativeTarget != (short) relativeTarget) { + this.currentPromotedAddress += 3; + } else { + this.currentPromotedAddress += 2; + } + } else { + this.currentPromotedAddress += 1; + } + break; + } + case Opcodes.GOTO_16: { + int relativeTarget = InstructionCodec.getTarget(target, this.currentPromotedAddress); + if (relativeTarget != (short) relativeTarget) { + this.currentPromotedAddress += 3; + } else { + this.currentPromotedAddress += 2; + } + break; + } + case Opcodes.GOTO_32: { + this.currentPromotedAddress += 3; + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + this.currentPromotedAddress += 3; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.CONST_STRING: { + if (index > 0xFFFF) { + this.currentPromotedAddress += 3; + } else { + this.currentPromotedAddress += 2; + } + break; + } + case Opcodes.CONST_STRING_JUMBO: { + this.currentPromotedAddress += 3; + break; + } + case Opcodes.CONST_4: + case Opcodes.MOVE_RESULT: + case Opcodes.MOVE_RESULT_WIDE: + case Opcodes.MOVE_RESULT_OBJECT: + case Opcodes.MOVE_EXCEPTION: + case Opcodes.RETURN: + case Opcodes.RETURN_WIDE: + case Opcodes.RETURN_OBJECT: + case Opcodes.MONITOR_ENTER: + case Opcodes.MONITOR_EXIT: + case Opcodes.THROW: { + this.currentPromotedAddress += 1; + break; + } + case Opcodes.IF_EQZ: + case Opcodes.IF_NEZ: + case Opcodes.IF_LTZ: + case Opcodes.IF_GEZ: + case Opcodes.IF_GTZ: + case Opcodes.IF_LEZ: + case Opcodes.CONST_16: + case Opcodes.CONST_WIDE_16: + case Opcodes.CONST_HIGH16: + case Opcodes.CONST_WIDE_HIGH16: + case Opcodes.CONST_CLASS: + case Opcodes.CHECK_CAST: + case Opcodes.NEW_INSTANCE: + case Opcodes.SGET: + case Opcodes.SGET_WIDE: + case Opcodes.SGET_OBJECT: + case Opcodes.SGET_BOOLEAN: + case Opcodes.SGET_BYTE: + case Opcodes.SGET_CHAR: + case Opcodes.SGET_SHORT: + case Opcodes.SPUT: + case Opcodes.SPUT_WIDE: + case Opcodes.SPUT_OBJECT: + case Opcodes.SPUT_BOOLEAN: + case Opcodes.SPUT_BYTE: + case Opcodes.SPUT_CHAR: + case Opcodes.SPUT_SHORT: { + this.currentPromotedAddress += 2; + break; + } + case Opcodes.CONST: + case Opcodes.CONST_WIDE_32: + case Opcodes.FILL_ARRAY_DATA: + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + this.currentPromotedAddress += 3; + break; + } + case Opcodes.CONST_WIDE: { + this.currentPromotedAddress += 5; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.MOVE: + case Opcodes.MOVE_WIDE: + case Opcodes.MOVE_OBJECT: + case Opcodes.ARRAY_LENGTH: + case Opcodes.NEG_INT: + case Opcodes.NOT_INT: + case Opcodes.NEG_LONG: + case Opcodes.NOT_LONG: + case Opcodes.NEG_FLOAT: + case Opcodes.NEG_DOUBLE: + case Opcodes.INT_TO_LONG: + case Opcodes.INT_TO_FLOAT: + case Opcodes.INT_TO_DOUBLE: + case Opcodes.LONG_TO_INT: + case Opcodes.LONG_TO_FLOAT: + case Opcodes.LONG_TO_DOUBLE: + case Opcodes.FLOAT_TO_INT: + case Opcodes.FLOAT_TO_LONG: + case Opcodes.FLOAT_TO_DOUBLE: + case Opcodes.DOUBLE_TO_INT: + case Opcodes.DOUBLE_TO_LONG: + case Opcodes.DOUBLE_TO_FLOAT: + case Opcodes.INT_TO_BYTE: + case Opcodes.INT_TO_CHAR: + case Opcodes.INT_TO_SHORT: + case Opcodes.ADD_INT_2ADDR: + case Opcodes.SUB_INT_2ADDR: + case Opcodes.MUL_INT_2ADDR: + case Opcodes.DIV_INT_2ADDR: + case Opcodes.REM_INT_2ADDR: + case Opcodes.AND_INT_2ADDR: + case Opcodes.OR_INT_2ADDR: + case Opcodes.XOR_INT_2ADDR: + case Opcodes.SHL_INT_2ADDR: + case Opcodes.SHR_INT_2ADDR: + case Opcodes.USHR_INT_2ADDR: + case Opcodes.ADD_LONG_2ADDR: + case Opcodes.SUB_LONG_2ADDR: + case Opcodes.MUL_LONG_2ADDR: + case Opcodes.DIV_LONG_2ADDR: + case Opcodes.REM_LONG_2ADDR: + case Opcodes.AND_LONG_2ADDR: + case Opcodes.OR_LONG_2ADDR: + case Opcodes.XOR_LONG_2ADDR: + case Opcodes.SHL_LONG_2ADDR: + case Opcodes.SHR_LONG_2ADDR: + case Opcodes.USHR_LONG_2ADDR: + case Opcodes.ADD_FLOAT_2ADDR: + case Opcodes.SUB_FLOAT_2ADDR: + case Opcodes.MUL_FLOAT_2ADDR: + case Opcodes.DIV_FLOAT_2ADDR: + case Opcodes.REM_FLOAT_2ADDR: + case Opcodes.ADD_DOUBLE_2ADDR: + case Opcodes.SUB_DOUBLE_2ADDR: + case Opcodes.MUL_DOUBLE_2ADDR: + case Opcodes.DIV_DOUBLE_2ADDR: + case Opcodes.REM_DOUBLE_2ADDR: { + this.currentPromotedAddress += 1; + break; + } + case Opcodes.MOVE_FROM16: + case Opcodes.MOVE_WIDE_FROM16: + case Opcodes.MOVE_OBJECT_FROM16: { + this.currentPromotedAddress += 2; + break; + } + case Opcodes.ADD_INT_LIT8: + case Opcodes.RSUB_INT_LIT8: + case Opcodes.MUL_INT_LIT8: + case Opcodes.DIV_INT_LIT8: + case Opcodes.REM_INT_LIT8: + case Opcodes.AND_INT_LIT8: + case Opcodes.OR_INT_LIT8: + case Opcodes.XOR_INT_LIT8: + case Opcodes.SHL_INT_LIT8: + case Opcodes.SHR_INT_LIT8: + case Opcodes.USHR_INT_LIT8: + case Opcodes.IF_EQ: + case Opcodes.IF_NE: + case Opcodes.IF_LT: + case Opcodes.IF_GE: + case Opcodes.IF_GT: + case Opcodes.IF_LE: + case Opcodes.ADD_INT_LIT16: + case Opcodes.RSUB_INT: + case Opcodes.MUL_INT_LIT16: + case Opcodes.DIV_INT_LIT16: + case Opcodes.REM_INT_LIT16: + case Opcodes.AND_INT_LIT16: + case Opcodes.OR_INT_LIT16: + case Opcodes.XOR_INT_LIT16: + case Opcodes.INSTANCE_OF: + case Opcodes.NEW_ARRAY: + case Opcodes.IGET: + case Opcodes.IGET_WIDE: + case Opcodes.IGET_OBJECT: + case Opcodes.IGET_BOOLEAN: + case Opcodes.IGET_BYTE: + case Opcodes.IGET_CHAR: + case Opcodes.IGET_SHORT: + case Opcodes.IPUT: + case Opcodes.IPUT_WIDE: + case Opcodes.IPUT_OBJECT: + case Opcodes.IPUT_BOOLEAN: + case Opcodes.IPUT_BYTE: + case Opcodes.IPUT_CHAR: + case Opcodes.IPUT_SHORT: { + this.currentPromotedAddress += 2; + break; + } + case Opcodes.MOVE_16: + case Opcodes.MOVE_WIDE_16: + case Opcodes.MOVE_OBJECT_16: + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + this.currentPromotedAddress += 3; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.CMPL_FLOAT: + case Opcodes.CMPG_FLOAT: + case Opcodes.CMPL_DOUBLE: + case Opcodes.CMPG_DOUBLE: + case Opcodes.CMP_LONG: + case Opcodes.AGET: + case Opcodes.AGET_WIDE: + case Opcodes.AGET_OBJECT: + case Opcodes.AGET_BOOLEAN: + case Opcodes.AGET_BYTE: + case Opcodes.AGET_CHAR: + case Opcodes.AGET_SHORT: + case Opcodes.APUT: + case Opcodes.APUT_WIDE: + case Opcodes.APUT_OBJECT: + case Opcodes.APUT_BOOLEAN: + case Opcodes.APUT_BYTE: + case Opcodes.APUT_CHAR: + case Opcodes.APUT_SHORT: + case Opcodes.ADD_INT: + case Opcodes.SUB_INT: + case Opcodes.MUL_INT: + case Opcodes.DIV_INT: + case Opcodes.REM_INT: + case Opcodes.AND_INT: + case Opcodes.OR_INT: + case Opcodes.XOR_INT: + case Opcodes.SHL_INT: + case Opcodes.SHR_INT: + case Opcodes.USHR_INT: + case Opcodes.ADD_LONG: + case Opcodes.SUB_LONG: + case Opcodes.MUL_LONG: + case Opcodes.DIV_LONG: + case Opcodes.REM_LONG: + case Opcodes.AND_LONG: + case Opcodes.OR_LONG: + case Opcodes.XOR_LONG: + case Opcodes.SHL_LONG: + case Opcodes.SHR_LONG: + case Opcodes.USHR_LONG: + case Opcodes.ADD_FLOAT: + case Opcodes.SUB_FLOAT: + case Opcodes.MUL_FLOAT: + case Opcodes.DIV_FLOAT: + case Opcodes.REM_FLOAT: + case Opcodes.ADD_DOUBLE: + case Opcodes.SUB_DOUBLE: + case Opcodes.MUL_DOUBLE: + case Opcodes.DIV_DOUBLE: + case Opcodes.REM_DOUBLE: { + this.currentPromotedAddress += 2; + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + this.currentPromotedAddress += 3; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + this.currentPromotedAddress += 3; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + this.currentPromotedAddress += 3; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + mapAddressIfNeeded(currentAddress); + switch (opcode) { + case Opcodes.FILLED_NEW_ARRAY_RANGE: + case Opcodes.INVOKE_VIRTUAL_RANGE: + case Opcodes.INVOKE_SUPER_RANGE: + case Opcodes.INVOKE_DIRECT_RANGE: + case Opcodes.INVOKE_STATIC_RANGE: + case Opcodes.INVOKE_INTERFACE_RANGE: { + this.currentPromotedAddress += 3; + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + @Override + public void visitSparseSwitchPayloadInsn(int currentAddress, int opcode, int[] keys, int[] targets) { + mapAddressIfNeeded(currentAddress); + + this.currentPromotedAddress += 2; + + this.currentPromotedAddress += keys.length * 2; + + this.currentPromotedAddress += targets.length * 2; + } + + @Override + public void visitPackedSwitchPayloadInsn(int currentAddress, int opcode, int firstKey, int[] targets) { + mapAddressIfNeeded(currentAddress); + + this.currentPromotedAddress += 2 + 2; + + this.currentPromotedAddress += targets.length * 2; + } + + @Override + public void visitFillArrayDataPayloadInsn(int currentAddress, int opcode, Object data, int size, int elementWidth) { + mapAddressIfNeeded(currentAddress); + + this.currentPromotedAddress += 2 + 2; + + switch (elementWidth) { + case 1: { + int length = ((byte[]) data).length; + this.currentPromotedAddress += (length >> 1) + (length & 1); + break; + } + case 2: { + this.currentPromotedAddress += ((short[]) data).length * 1; + break; + } + case 4: { + this.currentPromotedAddress += ((int[]) data).length * 2; + break; + } + case 8: { + this.currentPromotedAddress += ((long[]) data).length * 4; + break; + } + default: { + throw new DexException("bogus element_width: " + Hex.u2(elementWidth)); + } + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionReader.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionReader.java new file mode 100644 index 00000000..de8ef5aa --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionReader.java @@ -0,0 +1,562 @@ +/* + * 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.dx.instruction; + +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dx.util.Hex; + +import java.io.EOFException; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Created by tangyinsheng on 2016/5/26. + */ +public final class InstructionReader { + private final ShortArrayCodeInput codeIn; + + public InstructionReader(ShortArrayCodeInput in) { + this.codeIn = in; + } + + public void accept(InstructionVisitor iv) throws EOFException { + codeIn.reset(); + while (codeIn.hasMore()) { + int currentAddress = codeIn.cursor(); + int opcodeUnit = codeIn.read(); + int opcodeForSwitch = Opcodes.extractOpcodeFromUnit(opcodeUnit); + switch (opcodeForSwitch) { + case Opcodes.SPECIAL_FORMAT: { + iv.visitZeroRegisterInsn(currentAddress, opcodeUnit, 0, InstructionCodec.INDEX_TYPE_NONE, 0, 0L); + break; + } + case Opcodes.GOTO: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int target = (byte) InstructionCodec.byte1(opcodeUnit); // sign-extend + iv.visitZeroRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, currentAddress + target, 0L); + break; + } + case Opcodes.NOP: + case Opcodes.RETURN_VOID: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int literal = InstructionCodec.byte1(opcodeUnit); // should be zero + iv.visitZeroRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal); + break; + } + case Opcodes.CONST_4: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.nibble2(opcodeUnit); + int literal = (InstructionCodec.nibble3(opcodeUnit) << 28) >> 28; // sign-extend + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a); + break; + } + case Opcodes.MOVE_RESULT: + case Opcodes.MOVE_RESULT_WIDE: + case Opcodes.MOVE_RESULT_OBJECT: + case Opcodes.MOVE_EXCEPTION: + case Opcodes.RETURN: + case Opcodes.RETURN_WIDE: + case Opcodes.RETURN_OBJECT: + case Opcodes.MONITOR_ENTER: + case Opcodes.MONITOR_EXIT: + case Opcodes.THROW: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, 0L, a); + break; + } + case Opcodes.MOVE: + case Opcodes.MOVE_WIDE: + case Opcodes.MOVE_OBJECT: + case Opcodes.ARRAY_LENGTH: + case Opcodes.NEG_INT: + case Opcodes.NOT_INT: + case Opcodes.NEG_LONG: + case Opcodes.NOT_LONG: + case Opcodes.NEG_FLOAT: + case Opcodes.NEG_DOUBLE: + case Opcodes.INT_TO_LONG: + case Opcodes.INT_TO_FLOAT: + case Opcodes.INT_TO_DOUBLE: + case Opcodes.LONG_TO_INT: + case Opcodes.LONG_TO_FLOAT: + case Opcodes.LONG_TO_DOUBLE: + case Opcodes.FLOAT_TO_INT: + case Opcodes.FLOAT_TO_LONG: + case Opcodes.FLOAT_TO_DOUBLE: + case Opcodes.DOUBLE_TO_INT: + case Opcodes.DOUBLE_TO_LONG: + case Opcodes.DOUBLE_TO_FLOAT: + case Opcodes.INT_TO_BYTE: + case Opcodes.INT_TO_CHAR: + case Opcodes.INT_TO_SHORT: + case Opcodes.ADD_INT_2ADDR: + case Opcodes.SUB_INT_2ADDR: + case Opcodes.MUL_INT_2ADDR: + case Opcodes.DIV_INT_2ADDR: + case Opcodes.REM_INT_2ADDR: + case Opcodes.AND_INT_2ADDR: + case Opcodes.OR_INT_2ADDR: + case Opcodes.XOR_INT_2ADDR: + case Opcodes.SHL_INT_2ADDR: + case Opcodes.SHR_INT_2ADDR: + case Opcodes.USHR_INT_2ADDR: + case Opcodes.ADD_LONG_2ADDR: + case Opcodes.SUB_LONG_2ADDR: + case Opcodes.MUL_LONG_2ADDR: + case Opcodes.DIV_LONG_2ADDR: + case Opcodes.REM_LONG_2ADDR: + case Opcodes.AND_LONG_2ADDR: + case Opcodes.OR_LONG_2ADDR: + case Opcodes.XOR_LONG_2ADDR: + case Opcodes.SHL_LONG_2ADDR: + case Opcodes.SHR_LONG_2ADDR: + case Opcodes.USHR_LONG_2ADDR: + case Opcodes.ADD_FLOAT_2ADDR: + case Opcodes.SUB_FLOAT_2ADDR: + case Opcodes.MUL_FLOAT_2ADDR: + case Opcodes.DIV_FLOAT_2ADDR: + case Opcodes.REM_FLOAT_2ADDR: + case Opcodes.ADD_DOUBLE_2ADDR: + case Opcodes.SUB_DOUBLE_2ADDR: + case Opcodes.MUL_DOUBLE_2ADDR: + case Opcodes.DIV_DOUBLE_2ADDR: + case Opcodes.REM_DOUBLE_2ADDR: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.nibble2(opcodeUnit); + int b = InstructionCodec.nibble3(opcodeUnit); + iv.visitTwoRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, 0L, a, b); + break; + } + case Opcodes.GOTO_16: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int literal = InstructionCodec.byte1(opcodeUnit); // should be zero + int target = (short) codeIn.read(); // sign-extend + iv.visitZeroRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, currentAddress + target, literal); + break; + } + case Opcodes.CONST_STRING: + case Opcodes.CONST_CLASS: + case Opcodes.CHECK_CAST: + case Opcodes.NEW_INSTANCE: + case Opcodes.SGET: + case Opcodes.SGET_WIDE: + case Opcodes.SGET_OBJECT: + case Opcodes.SGET_BOOLEAN: + case Opcodes.SGET_BYTE: + case Opcodes.SGET_CHAR: + case Opcodes.SGET_SHORT: + case Opcodes.SPUT: + case Opcodes.SPUT_WIDE: + case Opcodes.SPUT_OBJECT: + case Opcodes.SPUT_BOOLEAN: + case Opcodes.SPUT_BYTE: + case Opcodes.SPUT_CHAR: + case Opcodes.SPUT_SHORT: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int index = codeIn.read(); + int indexType = InstructionCodec.getInstructionIndexType(opcode); + iv.visitOneRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a); + break; + } + case Opcodes.CONST_HIGH16: + case Opcodes.CONST_WIDE_HIGH16: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + long literal = (short) codeIn.read(); // sign-extend + + /* + * Format 21h decodes differently depending on the opcode, + * because the "signed hat" might represent either a 32- + * or 64- bit value. + */ + literal <<= (opcode == Opcodes.CONST_HIGH16) ? 16 : 48; + + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a); + + break; + } + case Opcodes.CONST_16: + case Opcodes.CONST_WIDE_16: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int literal = (short) codeIn.read(); // sign-extend + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a); + break; + } + case Opcodes.IF_EQZ: + case Opcodes.IF_NEZ: + case Opcodes.IF_LTZ: + case Opcodes.IF_GEZ: + case Opcodes.IF_GTZ: + case Opcodes.IF_LEZ: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int target = (short) codeIn.read(); // sign-extend + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, currentAddress + target, 0L, a); + break; + } + case Opcodes.ADD_INT_LIT8: + case Opcodes.RSUB_INT_LIT8: + case Opcodes.MUL_INT_LIT8: + case Opcodes.DIV_INT_LIT8: + case Opcodes.REM_INT_LIT8: + case Opcodes.AND_INT_LIT8: + case Opcodes.OR_INT_LIT8: + case Opcodes.XOR_INT_LIT8: + case Opcodes.SHL_INT_LIT8: + case Opcodes.SHR_INT_LIT8: + case Opcodes.USHR_INT_LIT8: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int bc = codeIn.read(); + int b = InstructionCodec.byte0(bc); + int literal = (byte) InstructionCodec.byte1(bc); // sign-extend + iv.visitTwoRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a, b); + break; + } + case Opcodes.INSTANCE_OF: + case Opcodes.NEW_ARRAY: + case Opcodes.IGET: + case Opcodes.IGET_WIDE: + case Opcodes.IGET_OBJECT: + case Opcodes.IGET_BOOLEAN: + case Opcodes.IGET_BYTE: + case Opcodes.IGET_CHAR: + case Opcodes.IGET_SHORT: + case Opcodes.IPUT: + case Opcodes.IPUT_WIDE: + case Opcodes.IPUT_OBJECT: + case Opcodes.IPUT_BOOLEAN: + case Opcodes.IPUT_BYTE: + case Opcodes.IPUT_CHAR: + case Opcodes.IPUT_SHORT: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.nibble2(opcodeUnit); + int b = InstructionCodec.nibble3(opcodeUnit); + int index = codeIn.read(); + int indexType = InstructionCodec.getInstructionIndexType(opcode); + iv.visitTwoRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a, b); + break; + } + case Opcodes.ADD_INT_LIT16: + case Opcodes.RSUB_INT: + case Opcodes.MUL_INT_LIT16: + case Opcodes.DIV_INT_LIT16: + case Opcodes.REM_INT_LIT16: + case Opcodes.AND_INT_LIT16: + case Opcodes.OR_INT_LIT16: + case Opcodes.XOR_INT_LIT16: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.nibble2(opcodeUnit); + int b = InstructionCodec.nibble3(opcodeUnit); + int literal = (short) codeIn.read(); // sign-extend + iv.visitTwoRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a, b); + break; + } + case Opcodes.IF_EQ: + case Opcodes.IF_NE: + case Opcodes.IF_LT: + case Opcodes.IF_GE: + case Opcodes.IF_GT: + case Opcodes.IF_LE: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.nibble2(opcodeUnit); + int b = InstructionCodec.nibble3(opcodeUnit); + int target = (short) codeIn.read(); // sign-extend + iv.visitTwoRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, currentAddress + target, 0L, a, b); + break; + } + case Opcodes.MOVE_FROM16: + case Opcodes.MOVE_WIDE_FROM16: + case Opcodes.MOVE_OBJECT_FROM16: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int b = codeIn.read(); + iv.visitTwoRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, 0L, a, b); + break; + } + case Opcodes.CMPL_FLOAT: + case Opcodes.CMPG_FLOAT: + case Opcodes.CMPL_DOUBLE: + case Opcodes.CMPG_DOUBLE: + case Opcodes.CMP_LONG: + case Opcodes.AGET: + case Opcodes.AGET_WIDE: + case Opcodes.AGET_OBJECT: + case Opcodes.AGET_BOOLEAN: + case Opcodes.AGET_BYTE: + case Opcodes.AGET_CHAR: + case Opcodes.AGET_SHORT: + case Opcodes.APUT: + case Opcodes.APUT_WIDE: + case Opcodes.APUT_OBJECT: + case Opcodes.APUT_BOOLEAN: + case Opcodes.APUT_BYTE: + case Opcodes.APUT_CHAR: + case Opcodes.APUT_SHORT: + case Opcodes.ADD_INT: + case Opcodes.SUB_INT: + case Opcodes.MUL_INT: + case Opcodes.DIV_INT: + case Opcodes.REM_INT: + case Opcodes.AND_INT: + case Opcodes.OR_INT: + case Opcodes.XOR_INT: + case Opcodes.SHL_INT: + case Opcodes.SHR_INT: + case Opcodes.USHR_INT: + case Opcodes.ADD_LONG: + case Opcodes.SUB_LONG: + case Opcodes.MUL_LONG: + case Opcodes.DIV_LONG: + case Opcodes.REM_LONG: + case Opcodes.AND_LONG: + case Opcodes.OR_LONG: + case Opcodes.XOR_LONG: + case Opcodes.SHL_LONG: + case Opcodes.SHR_LONG: + case Opcodes.USHR_LONG: + case Opcodes.ADD_FLOAT: + case Opcodes.SUB_FLOAT: + case Opcodes.MUL_FLOAT: + case Opcodes.DIV_FLOAT: + case Opcodes.REM_FLOAT: + case Opcodes.ADD_DOUBLE: + case Opcodes.SUB_DOUBLE: + case Opcodes.MUL_DOUBLE: + case Opcodes.DIV_DOUBLE: + case Opcodes.REM_DOUBLE: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int bc = codeIn.read(); + int b = InstructionCodec.byte0(bc); + int c = InstructionCodec.byte1(bc); + iv.visitThreeRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, 0L, a, b, c); + break; + } + case Opcodes.GOTO_32: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int literal = InstructionCodec.byte1(opcodeUnit); // should be zero + int target = codeIn.readInt(); + iv.visitZeroRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, currentAddress + target, literal); + break; + } + case Opcodes.CONST_STRING_JUMBO: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int index = codeIn.readInt(); + int indexType = InstructionCodec.getInstructionIndexType(opcode); + iv.visitOneRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a); + break; + } + case Opcodes.CONST: + case Opcodes.CONST_WIDE_32: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int literal = codeIn.readInt(); + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a); + break; + } + case Opcodes.FILL_ARRAY_DATA: + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + int target = currentAddress + codeIn.readInt(); + + /* + * Switch instructions need to "forward" their addresses to their + * payload target instructions. + */ + switch (opcode) { + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: { + // plus 1 means when we actually lookup the currentAddress + // by (payload insn address + 1), + codeIn.setBaseAddress(target + 1, currentAddress); + break; + } + } + + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, target, 0L, a); + break; + } + case Opcodes.MOVE_16: + case Opcodes.MOVE_WIDE_16: + case Opcodes.MOVE_OBJECT_16: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int literal = InstructionCodec.byte1(opcodeUnit); // should be zero + int a = codeIn.read(); + int b = codeIn.read(); + iv.visitTwoRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a, b); + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int e = InstructionCodec.nibble2(opcodeUnit); + int registerCount = InstructionCodec.nibble3(opcodeUnit); + int index = codeIn.read(); + int abcd = codeIn.read(); + int a = InstructionCodec.nibble0(abcd); + int b = InstructionCodec.nibble1(abcd); + int c = InstructionCodec.nibble2(abcd); + int d = InstructionCodec.nibble3(abcd); + int indexType = InstructionCodec.getInstructionIndexType(opcode); + + switch (registerCount) { + case 0: { + iv.visitZeroRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L); + break; + } + case 1: { + iv.visitOneRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a); + break; + } + case 2: { + iv.visitTwoRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a, b); + break; + } + case 3: { + iv.visitThreeRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a, b, c); + break; + } + case 4: { + iv.visitFourRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a, b, c, d); + break; + } + case 5: { + iv.visitFiveRegisterInsn(currentAddress, opcode, index, indexType, 0, 0L, a, b, c, d, e); + break; + } + default: { + throw new DexException("bogus registerCount: " + Hex.uNibble(registerCount)); + } + } + break; + } + case Opcodes.FILLED_NEW_ARRAY_RANGE: + case Opcodes.INVOKE_VIRTUAL_RANGE: + case Opcodes.INVOKE_SUPER_RANGE: + case Opcodes.INVOKE_DIRECT_RANGE: + case Opcodes.INVOKE_STATIC_RANGE: + case Opcodes.INVOKE_INTERFACE_RANGE: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int registerCount = InstructionCodec.byte1(opcodeUnit); + int index = codeIn.read(); + int a = codeIn.read(); + int indexType = InstructionCodec.getInstructionIndexType(opcode); + iv.visitRegisterRangeInsn(currentAddress, opcode, index, indexType, 0, 0L, a, registerCount); + break; + } + case Opcodes.CONST_WIDE: { + int opcode = InstructionCodec.byte0(opcodeUnit); + int a = InstructionCodec.byte1(opcodeUnit); + long literal = codeIn.readLong(); + iv.visitOneRegisterInsn(currentAddress, opcode, 0, InstructionCodec.INDEX_TYPE_NONE, 0, literal, a); + break; + } + case Opcodes.FILL_ARRAY_DATA_PAYLOAD: { + int elementWidth = codeIn.read(); + int size = codeIn.readInt(); + + switch (elementWidth) { + case 1: { + byte[] array = new byte[size]; + boolean even = true; + for (int i = 0, value = 0; i < size; ++i, even = !even) { + if (even) { + value = codeIn.read(); + } + array[i] = (byte) (value & 0xff); + value >>= 8; + } + iv.visitFillArrayDataPayloadInsn(currentAddress, opcodeUnit, array, array.length, 1); + break; + } + case 2: { + short[] array = new short[size]; + for (int i = 0; i < size; i++) { + array[i] = (short) codeIn.read(); + } + iv.visitFillArrayDataPayloadInsn(currentAddress, opcodeUnit, array, array.length, 2); + break; + } + case 4: { + int[] array = new int[size]; + for (int i = 0; i < size; i++) { + array[i] = codeIn.readInt(); + } + iv.visitFillArrayDataPayloadInsn(currentAddress, opcodeUnit, array, array.length, 4); + break; + } + case 8: { + long[] array = new long[size]; + for (int i = 0; i < size; i++) { + array[i] = codeIn.readLong(); + } + iv.visitFillArrayDataPayloadInsn(currentAddress, opcodeUnit, array, array.length, 8); + break; + } + default: { + throw new DexException("bogus element_width: " + Hex.u2(elementWidth)); + } + } + break; + } + case Opcodes.PACKED_SWITCH_PAYLOAD: { + int baseAddress = codeIn.baseAddressForCursor(); + int size = codeIn.read(); + int firstKey = codeIn.readInt(); + int[] targets = new int[size]; + + for (int i = 0; i < size; i++) { + targets[i] = baseAddress + codeIn.readInt(); + } + iv.visitPackedSwitchPayloadInsn(currentAddress, opcodeUnit, firstKey, targets); + break; + } + case Opcodes.SPARSE_SWITCH_PAYLOAD: { + int baseAddress = codeIn.baseAddressForCursor(); + int size = codeIn.read(); + int[] keys = new int[size]; + int[] targets = new int[size]; + + for (int i = 0; i < size; i++) { + keys[i] = codeIn.readInt(); + } + + for (int i = 0; i < size; i++) { + targets[i] = baseAddress + codeIn.readInt(); + } + + iv.visitSparseSwitchPayloadInsn(currentAddress, opcodeUnit, keys, targets); + break; + } + default: { + throw new IllegalStateException("Unknown opcode: " + Hex.u4(opcodeForSwitch)); + } + } + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionVisitor.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionVisitor.java new file mode 100644 index 00000000..761f6ff5 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionVisitor.java @@ -0,0 +1,90 @@ +/* + * 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.dx.instruction; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Created by tangyinsheng on 2016/5/26. + */ +public class InstructionVisitor { + private final InstructionVisitor prevIv; + + public InstructionVisitor(InstructionVisitor iv) { + this.prevIv = iv; + } + + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + if (prevIv != null) { + prevIv.visitZeroRegisterInsn(currentAddress, opcode, index, indexType, target, literal); + } + } + + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + if (prevIv != null) { + prevIv.visitOneRegisterInsn(currentAddress, opcode, index, indexType, target, literal, a); + } + } + + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + if (prevIv != null) { + prevIv.visitTwoRegisterInsn(currentAddress, opcode, index, indexType, target, literal, a, b); + } + } + + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + if (prevIv != null) { + prevIv.visitThreeRegisterInsn(currentAddress, opcode, index, indexType, target, literal, a, b, c); + } + } + + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + if (prevIv != null) { + prevIv.visitFourRegisterInsn(currentAddress, opcode, index, indexType, target, literal, a, b, c, d); + } + } + + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + if (prevIv != null) { + prevIv.visitFiveRegisterInsn(currentAddress, opcode, index, indexType, target, literal, a, b, c, d, e); + } + } + + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + if (prevIv != null) { + prevIv.visitRegisterRangeInsn(currentAddress, opcode, index, indexType, target, literal, a, registerCount); + } + } + + public void visitSparseSwitchPayloadInsn(int currentAddress, int opcode, int[] keys, int[] targets) { + if (prevIv != null) { + prevIv.visitSparseSwitchPayloadInsn(currentAddress, opcode, keys, targets); + } + } + + public void visitPackedSwitchPayloadInsn(int currentAddress, int opcode, int firstKey, int[] targets) { + if (prevIv != null) { + prevIv.visitPackedSwitchPayloadInsn(currentAddress, opcode, firstKey, targets); + } + } + + public void visitFillArrayDataPayloadInsn(int currentAddress, int opcode, Object data, int size, int elementWidth) { + if (prevIv != null) { + prevIv.visitFillArrayDataPayloadInsn(currentAddress, opcode, data, size, elementWidth); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionWriter.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionWriter.java new file mode 100644 index 00000000..ea3ee8fa --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/InstructionWriter.java @@ -0,0 +1,706 @@ +/* + * 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.dx.instruction; + +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dx.util.Hex; + +/** + * *** This file is NOT a part of AOSP. *** + * + * Created by tangyinsheng on 2016/5/27. + */ +public final class InstructionWriter extends InstructionVisitor { + private final ShortArrayCodeOutput codeOut; + private final InstructionPromoter insnPromoter; + private final boolean hasPromoter; + + public InstructionWriter(ShortArrayCodeOutput codeOut, InstructionPromoter ipmo) { + super(null); + this.codeOut = codeOut; + this.insnPromoter = ipmo; + this.hasPromoter = (ipmo != null); + } + + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + if (this.hasPromoter) { + target = this.insnPromoter.getPromotedAddress(target); + } + + switch (opcode) { + case Opcodes.SPECIAL_FORMAT: + case Opcodes.NOP: + case Opcodes.RETURN_VOID: { + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit); + break; + } + case Opcodes.GOTO: { + if (this.hasPromoter) { + int relativeTarget = InstructionCodec.getTarget(target, codeOut.cursor()); + if (relativeTarget != (byte) relativeTarget) { + if (relativeTarget != (short) relativeTarget) { + short opcodeUnit = (short) Opcodes.GOTO_32; + codeOut.write(opcodeUnit, InstructionCodec.unit0(relativeTarget), InstructionCodec.unit1(relativeTarget)); + } else { + short shortRelativeTarget = (short) relativeTarget; + short opcodeUnit = (short) Opcodes.GOTO_16; + codeOut.write(opcodeUnit, shortRelativeTarget); + } + } else { + relativeTarget &= 0xFF; + codeOut.write(InstructionCodec.codeUnit(opcode, relativeTarget)); + } + } else { + int relativeTarget = InstructionCodec.getTargetByte(target, codeOut.cursor()); + codeOut.write(InstructionCodec.codeUnit(opcode, relativeTarget)); + } + break; + } + case Opcodes.GOTO_16: { + if (this.hasPromoter) { + int relativeTarget = InstructionCodec.getTarget(target, codeOut.cursor()); + if (relativeTarget != (short) relativeTarget) { + short opcodeUnit = (short) Opcodes.GOTO_32; + codeOut.write(opcodeUnit, InstructionCodec.unit0(relativeTarget), InstructionCodec.unit1(relativeTarget)); + } else { + short shortRelativeTarget = (short) relativeTarget; + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit, shortRelativeTarget); + } + } else { + short relativeTarget = InstructionCodec.getTargetUnit(target, codeOut.cursor()); + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit, relativeTarget); + } + break; + } + case Opcodes.GOTO_32: { + int relativeTarget = InstructionCodec.getTarget(target, codeOut.cursor()); + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit, InstructionCodec.unit0(relativeTarget), InstructionCodec.unit1(relativeTarget)); + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(0, 0) + ), + indexUnit, + InstructionCodec.codeUnit(0, 0, 0, 0) + ); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + if (this.hasPromoter) { + target = this.insnPromoter.getPromotedAddress(target); + } + + switch (opcode) { + case Opcodes.CONST_4: { + short opcodeUnit = (short) opcode; + codeOut.write( + InstructionCodec.codeUnit( + opcodeUnit, + InstructionCodec.makeByte(a, InstructionCodec.getLiteralNibble(literal)) + ) + ); + break; + } + case Opcodes.MOVE_RESULT: + case Opcodes.MOVE_RESULT_WIDE: + case Opcodes.MOVE_RESULT_OBJECT: + case Opcodes.MOVE_EXCEPTION: + case Opcodes.RETURN: + case Opcodes.RETURN_WIDE: + case Opcodes.RETURN_OBJECT: + case Opcodes.MONITOR_ENTER: + case Opcodes.MONITOR_EXIT: + case Opcodes.THROW: { + codeOut.write(InstructionCodec.codeUnit(opcode, a)); + break; + } + case Opcodes.IF_EQZ: + case Opcodes.IF_NEZ: + case Opcodes.IF_LTZ: + case Opcodes.IF_GEZ: + case Opcodes.IF_GTZ: + case Opcodes.IF_LEZ: { + short relativeTarget = InstructionCodec.getTargetUnit(target, codeOut.cursor()); + codeOut.write(InstructionCodec.codeUnit(opcode, a), relativeTarget); + break; + } + case Opcodes.CONST_16: + case Opcodes.CONST_WIDE_16: { + codeOut.write(InstructionCodec.codeUnit(opcode, a), InstructionCodec.getLiteralUnit(literal)); + break; + } + case Opcodes.CONST_HIGH16: + case Opcodes.CONST_WIDE_HIGH16: { + int shift = (opcode == Opcodes.CONST_HIGH16) ? 16 : 48; + short literalShifted = (short) (literal >> shift); + codeOut.write(InstructionCodec.codeUnit(opcode, a), literalShifted); + break; + } + case Opcodes.CONST_STRING: { + if (this.hasPromoter) { + if (index > 0xFFFF) { + codeOut.write( + InstructionCodec.codeUnit(Opcodes.CONST_STRING_JUMBO, a), + InstructionCodec.unit0(index), + InstructionCodec.unit1(index) + ); + } else { + short indexUnit = (short) index; + codeOut.write(InstructionCodec.codeUnit(opcode, a), indexUnit); + } + } else { + if (index > 0xFFFF) { + throw new DexException( + "string index out of bound: " + + Hex.u4(index) + + ", perhaps you need to enable force jumbo mode." + ); + } + short indexUnit = (short) index; + codeOut.write(InstructionCodec.codeUnit(opcode, a), indexUnit); + } + break; + } + case Opcodes.CONST_CLASS: + case Opcodes.CHECK_CAST: + case Opcodes.NEW_INSTANCE: + case Opcodes.SGET: + case Opcodes.SGET_WIDE: + case Opcodes.SGET_OBJECT: + case Opcodes.SGET_BOOLEAN: + case Opcodes.SGET_BYTE: + case Opcodes.SGET_CHAR: + case Opcodes.SGET_SHORT: + case Opcodes.SPUT: + case Opcodes.SPUT_WIDE: + case Opcodes.SPUT_OBJECT: + case Opcodes.SPUT_BOOLEAN: + case Opcodes.SPUT_BYTE: + case Opcodes.SPUT_CHAR: + case Opcodes.SPUT_SHORT: { + short indexUnit = (short) index; + codeOut.write(InstructionCodec.codeUnit(opcode, a), indexUnit); + break; + } + case Opcodes.CONST: + case Opcodes.CONST_WIDE_32: { + int literalInt = InstructionCodec.getLiteralInt(literal); + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.unit0(literalInt), + InstructionCodec.unit1(literalInt) + ); + break; + } + case Opcodes.FILL_ARRAY_DATA: + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: { + /* + * Switch instructions need to "forward" their addresses to their + * payload target instructions. + */ + switch (opcode) { + case Opcodes.PACKED_SWITCH: + case Opcodes.SPARSE_SWITCH: { + codeOut.setBaseAddress(target, codeOut.cursor()); + break; + } + } + + int relativeTarget = InstructionCodec.getTarget(target, codeOut.cursor()); + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.unit0(relativeTarget), + InstructionCodec.unit1(relativeTarget) + ); + break; + } + case Opcodes.CONST_STRING_JUMBO: { + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.unit0(index), + InstructionCodec.unit1(index) + ); + break; + } + case Opcodes.CONST_WIDE: { + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.unit0(literal), + InstructionCodec.unit1(literal), + InstructionCodec.unit2(literal), + InstructionCodec.unit3(literal) + ); + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(0, 1) + ), + indexUnit, + InstructionCodec.codeUnit(a, 0, 0, 0) + ); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + if (this.hasPromoter) { + target = this.insnPromoter.getPromotedAddress(target); + } + + switch (opcode) { + case Opcodes.MOVE: + case Opcodes.MOVE_WIDE: + case Opcodes.MOVE_OBJECT: + case Opcodes.ARRAY_LENGTH: + case Opcodes.NEG_INT: + case Opcodes.NOT_INT: + case Opcodes.NEG_LONG: + case Opcodes.NOT_LONG: + case Opcodes.NEG_FLOAT: + case Opcodes.NEG_DOUBLE: + case Opcodes.INT_TO_LONG: + case Opcodes.INT_TO_FLOAT: + case Opcodes.INT_TO_DOUBLE: + case Opcodes.LONG_TO_INT: + case Opcodes.LONG_TO_FLOAT: + case Opcodes.LONG_TO_DOUBLE: + case Opcodes.FLOAT_TO_INT: + case Opcodes.FLOAT_TO_LONG: + case Opcodes.FLOAT_TO_DOUBLE: + case Opcodes.DOUBLE_TO_INT: + case Opcodes.DOUBLE_TO_LONG: + case Opcodes.DOUBLE_TO_FLOAT: + case Opcodes.INT_TO_BYTE: + case Opcodes.INT_TO_CHAR: + case Opcodes.INT_TO_SHORT: + case Opcodes.ADD_INT_2ADDR: + case Opcodes.SUB_INT_2ADDR: + case Opcodes.MUL_INT_2ADDR: + case Opcodes.DIV_INT_2ADDR: + case Opcodes.REM_INT_2ADDR: + case Opcodes.AND_INT_2ADDR: + case Opcodes.OR_INT_2ADDR: + case Opcodes.XOR_INT_2ADDR: + case Opcodes.SHL_INT_2ADDR: + case Opcodes.SHR_INT_2ADDR: + case Opcodes.USHR_INT_2ADDR: + case Opcodes.ADD_LONG_2ADDR: + case Opcodes.SUB_LONG_2ADDR: + case Opcodes.MUL_LONG_2ADDR: + case Opcodes.DIV_LONG_2ADDR: + case Opcodes.REM_LONG_2ADDR: + case Opcodes.AND_LONG_2ADDR: + case Opcodes.OR_LONG_2ADDR: + case Opcodes.XOR_LONG_2ADDR: + case Opcodes.SHL_LONG_2ADDR: + case Opcodes.SHR_LONG_2ADDR: + case Opcodes.USHR_LONG_2ADDR: + case Opcodes.ADD_FLOAT_2ADDR: + case Opcodes.SUB_FLOAT_2ADDR: + case Opcodes.MUL_FLOAT_2ADDR: + case Opcodes.DIV_FLOAT_2ADDR: + case Opcodes.REM_FLOAT_2ADDR: + case Opcodes.ADD_DOUBLE_2ADDR: + case Opcodes.SUB_DOUBLE_2ADDR: + case Opcodes.MUL_DOUBLE_2ADDR: + case Opcodes.DIV_DOUBLE_2ADDR: + case Opcodes.REM_DOUBLE_2ADDR: { + short opcodeUnit = (short) opcode; + codeOut.write( + InstructionCodec.codeUnit( + opcodeUnit, + InstructionCodec.makeByte(a, b) + ) + ); + break; + } + case Opcodes.MOVE_FROM16: + case Opcodes.MOVE_WIDE_FROM16: + case Opcodes.MOVE_OBJECT_FROM16: { + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.getBUnit(b) + ); + break; + } + case Opcodes.ADD_INT_LIT8: + case Opcodes.RSUB_INT_LIT8: + case Opcodes.MUL_INT_LIT8: + case Opcodes.DIV_INT_LIT8: + case Opcodes.REM_INT_LIT8: + case Opcodes.AND_INT_LIT8: + case Opcodes.OR_INT_LIT8: + case Opcodes.XOR_INT_LIT8: + case Opcodes.SHL_INT_LIT8: + case Opcodes.SHR_INT_LIT8: + case Opcodes.USHR_INT_LIT8: { + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.codeUnit(b, InstructionCodec.getLiteralByte(literal)) + ); + break; + } + case Opcodes.IF_EQ: + case Opcodes.IF_NE: + case Opcodes.IF_LT: + case Opcodes.IF_GE: + case Opcodes.IF_GT: + case Opcodes.IF_LE: { + short relativeTarget = InstructionCodec.getTargetUnit(target, codeOut.cursor()); + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(a, b) + ), + relativeTarget + ); + break; + } + case Opcodes.ADD_INT_LIT16: + case Opcodes.RSUB_INT: + case Opcodes.MUL_INT_LIT16: + case Opcodes.DIV_INT_LIT16: + case Opcodes.REM_INT_LIT16: + case Opcodes.AND_INT_LIT16: + case Opcodes.OR_INT_LIT16: + case Opcodes.XOR_INT_LIT16: { + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(a, b) + ), + InstructionCodec.getLiteralUnit(literal) + ); + break; + } + case Opcodes.INSTANCE_OF: + case Opcodes.NEW_ARRAY: + case Opcodes.IGET: + case Opcodes.IGET_WIDE: + case Opcodes.IGET_OBJECT: + case Opcodes.IGET_BOOLEAN: + case Opcodes.IGET_BYTE: + case Opcodes.IGET_CHAR: + case Opcodes.IGET_SHORT: + case Opcodes.IPUT: + case Opcodes.IPUT_WIDE: + case Opcodes.IPUT_OBJECT: + case Opcodes.IPUT_BOOLEAN: + case Opcodes.IPUT_BYTE: + case Opcodes.IPUT_CHAR: + case Opcodes.IPUT_SHORT: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(a, b) + ), + indexUnit + ); + break; + } + case Opcodes.MOVE_16: + case Opcodes.MOVE_WIDE_16: + case Opcodes.MOVE_OBJECT_16: { + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit, InstructionCodec.getAUnit(a), InstructionCodec.getBUnit(b)); + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(0, 2) + ), + indexUnit, + InstructionCodec.codeUnit(a, b, 0, 0) + ); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + switch (opcode) { + case Opcodes.CMPL_FLOAT: + case Opcodes.CMPG_FLOAT: + case Opcodes.CMPL_DOUBLE: + case Opcodes.CMPG_DOUBLE: + case Opcodes.CMP_LONG: + case Opcodes.AGET: + case Opcodes.AGET_WIDE: + case Opcodes.AGET_OBJECT: + case Opcodes.AGET_BOOLEAN: + case Opcodes.AGET_BYTE: + case Opcodes.AGET_CHAR: + case Opcodes.AGET_SHORT: + case Opcodes.APUT: + case Opcodes.APUT_WIDE: + case Opcodes.APUT_OBJECT: + case Opcodes.APUT_BOOLEAN: + case Opcodes.APUT_BYTE: + case Opcodes.APUT_CHAR: + case Opcodes.APUT_SHORT: + case Opcodes.ADD_INT: + case Opcodes.SUB_INT: + case Opcodes.MUL_INT: + case Opcodes.DIV_INT: + case Opcodes.REM_INT: + case Opcodes.AND_INT: + case Opcodes.OR_INT: + case Opcodes.XOR_INT: + case Opcodes.SHL_INT: + case Opcodes.SHR_INT: + case Opcodes.USHR_INT: + case Opcodes.ADD_LONG: + case Opcodes.SUB_LONG: + case Opcodes.MUL_LONG: + case Opcodes.DIV_LONG: + case Opcodes.REM_LONG: + case Opcodes.AND_LONG: + case Opcodes.OR_LONG: + case Opcodes.XOR_LONG: + case Opcodes.SHL_LONG: + case Opcodes.SHR_LONG: + case Opcodes.USHR_LONG: + case Opcodes.ADD_FLOAT: + case Opcodes.SUB_FLOAT: + case Opcodes.MUL_FLOAT: + case Opcodes.DIV_FLOAT: + case Opcodes.REM_FLOAT: + case Opcodes.ADD_DOUBLE: + case Opcodes.SUB_DOUBLE: + case Opcodes.MUL_DOUBLE: + case Opcodes.DIV_DOUBLE: + case Opcodes.REM_DOUBLE: { + codeOut.write( + InstructionCodec.codeUnit(opcode, a), + InstructionCodec.codeUnit(b, c) + ); + break; + } + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(0, 3) + ), + indexUnit, + InstructionCodec.codeUnit(a, b, c, 0) + ); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + switch (opcode) { + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(0, 4) + ), + indexUnit, + InstructionCodec.codeUnit(a, b, c, d) + ); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + switch (opcode) { + case Opcodes.FILLED_NEW_ARRAY: + case Opcodes.INVOKE_VIRTUAL: + case Opcodes.INVOKE_SUPER: + case Opcodes.INVOKE_DIRECT: + case Opcodes.INVOKE_STATIC: + case Opcodes.INVOKE_INTERFACE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit( + opcode, + InstructionCodec.makeByte(e, 5) + ), + indexUnit, + InstructionCodec.codeUnit(a, b, c, d) + ); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + switch (opcode) { + case Opcodes.FILLED_NEW_ARRAY_RANGE: + case Opcodes.INVOKE_VIRTUAL_RANGE: + case Opcodes.INVOKE_SUPER_RANGE: + case Opcodes.INVOKE_DIRECT_RANGE: + case Opcodes.INVOKE_STATIC_RANGE: + case Opcodes.INVOKE_INTERFACE_RANGE: { + short indexUnit = (short) index; + codeOut.write( + InstructionCodec.codeUnit(opcode, registerCount), + indexUnit, + InstructionCodec.getAUnit(a)); + break; + } + default: { + throw new IllegalStateException("unexpected opcode: " + Hex.u2or4(opcode)); + } + } + } + + public void visitSparseSwitchPayloadInsn(int currentAddress, int opcode, int[] keys, int[] targets) { + int baseAddress = codeOut.baseAddressForCursor(); + + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit); + codeOut.write(InstructionCodec.asUnsignedUnit(targets.length)); + + for (int key : keys) { + codeOut.writeInt(key); + } + + if (this.hasPromoter) { + for (int target : targets) { + target = this.insnPromoter.getPromotedAddress(target); + codeOut.writeInt(target - baseAddress); + } + } else { + for (int target : targets) { + codeOut.writeInt(target - baseAddress); + } + } + } + + public void visitPackedSwitchPayloadInsn(int currentAddress, int opcode, int firstKey, int[] targets) { + int baseAddress = codeOut.baseAddressForCursor(); + + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit); + codeOut.write(InstructionCodec.asUnsignedUnit(targets.length)); + codeOut.writeInt(firstKey); + + if (this.hasPromoter) { + for (int target : targets) { + target = this.insnPromoter.getPromotedAddress(target); + codeOut.writeInt(target - baseAddress); + } + } else { + for (int target : targets) { + codeOut.writeInt(target - baseAddress); + } + } + } + + public void visitFillArrayDataPayloadInsn(int currentAddress, int opcode, Object data, int size, int elementWidth) { + short opcodeUnit = (short) opcode; + codeOut.write(opcodeUnit); + + short elementWidthUnit = (short) elementWidth; + codeOut.write(elementWidthUnit); + + codeOut.writeInt(size); + + switch (elementWidth) { + case 1: { + codeOut.write((byte[]) data); + break; + } + case 2: { + codeOut.write((short[]) data); + break; + } + case 4: { + codeOut.write((int[]) data); + break; + } + case 8: { + codeOut.write((long[]) data); + break; + } + default: { + throw new DexException("bogus element_width: " + Hex.u2(elementWidth)); + } + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/Opcodes.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/Opcodes.java new file mode 100644 index 00000000..99eb8845 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/Opcodes.java @@ -0,0 +1,294 @@ +/* + * Copyright (C) 2007 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.dx.instruction; + +/** + * All the Dalvik opcode value constants. See the related spec + * document for the meaning and instruction format of each opcode. + */ +public final class Opcodes { + /** + * pseudo-opcode used for nonstandard format payload "instructions". TODO: + * Retire this concept, and start treating the payload instructions + * more like the rest. + */ + public static final int SPECIAL_FORMAT = -1; + + // BEGIN(opcodes); GENERATED AUTOMATICALLY BY opcode-gen + public static final int NOP = 0x00; + public static final int MOVE = 0x01; + public static final int MOVE_FROM16 = 0x02; + public static final int MOVE_16 = 0x03; + public static final int MOVE_WIDE = 0x04; + public static final int MOVE_WIDE_FROM16 = 0x05; + public static final int MOVE_WIDE_16 = 0x06; + public static final int MOVE_OBJECT = 0x07; + public static final int MOVE_OBJECT_FROM16 = 0x08; + public static final int MOVE_OBJECT_16 = 0x09; + public static final int MOVE_RESULT = 0x0a; + public static final int MOVE_RESULT_WIDE = 0x0b; + public static final int MOVE_RESULT_OBJECT = 0x0c; + public static final int MOVE_EXCEPTION = 0x0d; + public static final int RETURN_VOID = 0x0e; + public static final int RETURN = 0x0f; + public static final int RETURN_WIDE = 0x10; + public static final int RETURN_OBJECT = 0x11; + public static final int CONST_4 = 0x12; + public static final int CONST_16 = 0x13; + public static final int CONST = 0x14; + public static final int CONST_HIGH16 = 0x15; + public static final int CONST_WIDE_16 = 0x16; + public static final int CONST_WIDE_32 = 0x17; + public static final int CONST_WIDE = 0x18; + public static final int CONST_WIDE_HIGH16 = 0x19; + public static final int CONST_STRING = 0x1a; + public static final int CONST_STRING_JUMBO = 0x1b; + public static final int CONST_CLASS = 0x1c; + public static final int MONITOR_ENTER = 0x1d; + public static final int MONITOR_EXIT = 0x1e; + public static final int CHECK_CAST = 0x1f; + public static final int INSTANCE_OF = 0x20; + public static final int ARRAY_LENGTH = 0x21; + public static final int NEW_INSTANCE = 0x22; + public static final int NEW_ARRAY = 0x23; + public static final int FILLED_NEW_ARRAY = 0x24; + public static final int FILLED_NEW_ARRAY_RANGE = 0x25; + public static final int FILL_ARRAY_DATA = 0x26; + public static final int THROW = 0x27; + public static final int GOTO = 0x28; + public static final int GOTO_16 = 0x29; + public static final int GOTO_32 = 0x2a; + public static final int PACKED_SWITCH = 0x2b; + public static final int SPARSE_SWITCH = 0x2c; + public static final int CMPL_FLOAT = 0x2d; + public static final int CMPG_FLOAT = 0x2e; + public static final int CMPL_DOUBLE = 0x2f; + public static final int CMPG_DOUBLE = 0x30; + public static final int CMP_LONG = 0x31; + public static final int IF_EQ = 0x32; + public static final int IF_NE = 0x33; + public static final int IF_LT = 0x34; + public static final int IF_GE = 0x35; + public static final int IF_GT = 0x36; + public static final int IF_LE = 0x37; + public static final int IF_EQZ = 0x38; + public static final int IF_NEZ = 0x39; + public static final int IF_LTZ = 0x3a; + public static final int IF_GEZ = 0x3b; + public static final int IF_GTZ = 0x3c; + public static final int IF_LEZ = 0x3d; + public static final int AGET = 0x44; + public static final int AGET_WIDE = 0x45; + public static final int AGET_OBJECT = 0x46; + public static final int AGET_BOOLEAN = 0x47; + public static final int AGET_BYTE = 0x48; + public static final int AGET_CHAR = 0x49; + public static final int AGET_SHORT = 0x4a; + public static final int APUT = 0x4b; + public static final int APUT_WIDE = 0x4c; + public static final int APUT_OBJECT = 0x4d; + public static final int APUT_BOOLEAN = 0x4e; + public static final int APUT_BYTE = 0x4f; + public static final int APUT_CHAR = 0x50; + public static final int APUT_SHORT = 0x51; + public static final int IGET = 0x52; + public static final int IGET_WIDE = 0x53; + public static final int IGET_OBJECT = 0x54; + public static final int IGET_BOOLEAN = 0x55; + public static final int IGET_BYTE = 0x56; + public static final int IGET_CHAR = 0x57; + public static final int IGET_SHORT = 0x58; + public static final int IPUT = 0x59; + public static final int IPUT_WIDE = 0x5a; + public static final int IPUT_OBJECT = 0x5b; + public static final int IPUT_BOOLEAN = 0x5c; + public static final int IPUT_BYTE = 0x5d; + public static final int IPUT_CHAR = 0x5e; + public static final int IPUT_SHORT = 0x5f; + public static final int SGET = 0x60; + public static final int SGET_WIDE = 0x61; + public static final int SGET_OBJECT = 0x62; + public static final int SGET_BOOLEAN = 0x63; + public static final int SGET_BYTE = 0x64; + public static final int SGET_CHAR = 0x65; + public static final int SGET_SHORT = 0x66; + public static final int SPUT = 0x67; + public static final int SPUT_WIDE = 0x68; + public static final int SPUT_OBJECT = 0x69; + public static final int SPUT_BOOLEAN = 0x6a; + public static final int SPUT_BYTE = 0x6b; + public static final int SPUT_CHAR = 0x6c; + public static final int SPUT_SHORT = 0x6d; + public static final int INVOKE_VIRTUAL = 0x6e; + public static final int INVOKE_SUPER = 0x6f; + public static final int INVOKE_DIRECT = 0x70; + public static final int INVOKE_STATIC = 0x71; + public static final int INVOKE_INTERFACE = 0x72; + public static final int INVOKE_VIRTUAL_RANGE = 0x74; + public static final int INVOKE_SUPER_RANGE = 0x75; + public static final int INVOKE_DIRECT_RANGE = 0x76; + public static final int INVOKE_STATIC_RANGE = 0x77; + public static final int INVOKE_INTERFACE_RANGE = 0x78; + public static final int NEG_INT = 0x7b; + public static final int NOT_INT = 0x7c; + public static final int NEG_LONG = 0x7d; + public static final int NOT_LONG = 0x7e; + public static final int NEG_FLOAT = 0x7f; + public static final int NEG_DOUBLE = 0x80; + public static final int INT_TO_LONG = 0x81; + public static final int INT_TO_FLOAT = 0x82; + public static final int INT_TO_DOUBLE = 0x83; + public static final int LONG_TO_INT = 0x84; + public static final int LONG_TO_FLOAT = 0x85; + public static final int LONG_TO_DOUBLE = 0x86; + public static final int FLOAT_TO_INT = 0x87; + public static final int FLOAT_TO_LONG = 0x88; + public static final int FLOAT_TO_DOUBLE = 0x89; + public static final int DOUBLE_TO_INT = 0x8a; + public static final int DOUBLE_TO_LONG = 0x8b; + public static final int DOUBLE_TO_FLOAT = 0x8c; + public static final int INT_TO_BYTE = 0x8d; + public static final int INT_TO_CHAR = 0x8e; + public static final int INT_TO_SHORT = 0x8f; + public static final int ADD_INT = 0x90; + public static final int SUB_INT = 0x91; + public static final int MUL_INT = 0x92; + public static final int DIV_INT = 0x93; + public static final int REM_INT = 0x94; + public static final int AND_INT = 0x95; + public static final int OR_INT = 0x96; + public static final int XOR_INT = 0x97; + public static final int SHL_INT = 0x98; + public static final int SHR_INT = 0x99; + public static final int USHR_INT = 0x9a; + public static final int ADD_LONG = 0x9b; + public static final int SUB_LONG = 0x9c; + public static final int MUL_LONG = 0x9d; + public static final int DIV_LONG = 0x9e; + public static final int REM_LONG = 0x9f; + public static final int AND_LONG = 0xa0; + public static final int OR_LONG = 0xa1; + public static final int XOR_LONG = 0xa2; + public static final int SHL_LONG = 0xa3; + public static final int SHR_LONG = 0xa4; + public static final int USHR_LONG = 0xa5; + public static final int ADD_FLOAT = 0xa6; + public static final int SUB_FLOAT = 0xa7; + public static final int MUL_FLOAT = 0xa8; + public static final int DIV_FLOAT = 0xa9; + public static final int REM_FLOAT = 0xaa; + public static final int ADD_DOUBLE = 0xab; + public static final int SUB_DOUBLE = 0xac; + public static final int MUL_DOUBLE = 0xad; + public static final int DIV_DOUBLE = 0xae; + public static final int REM_DOUBLE = 0xaf; + public static final int ADD_INT_2ADDR = 0xb0; + public static final int SUB_INT_2ADDR = 0xb1; + public static final int MUL_INT_2ADDR = 0xb2; + public static final int DIV_INT_2ADDR = 0xb3; + public static final int REM_INT_2ADDR = 0xb4; + public static final int AND_INT_2ADDR = 0xb5; + public static final int OR_INT_2ADDR = 0xb6; + public static final int XOR_INT_2ADDR = 0xb7; + public static final int SHL_INT_2ADDR = 0xb8; + public static final int SHR_INT_2ADDR = 0xb9; + public static final int USHR_INT_2ADDR = 0xba; + public static final int ADD_LONG_2ADDR = 0xbb; + public static final int SUB_LONG_2ADDR = 0xbc; + public static final int MUL_LONG_2ADDR = 0xbd; + public static final int DIV_LONG_2ADDR = 0xbe; + public static final int REM_LONG_2ADDR = 0xbf; + public static final int AND_LONG_2ADDR = 0xc0; + public static final int OR_LONG_2ADDR = 0xc1; + public static final int XOR_LONG_2ADDR = 0xc2; + public static final int SHL_LONG_2ADDR = 0xc3; + public static final int SHR_LONG_2ADDR = 0xc4; + public static final int USHR_LONG_2ADDR = 0xc5; + public static final int ADD_FLOAT_2ADDR = 0xc6; + public static final int SUB_FLOAT_2ADDR = 0xc7; + public static final int MUL_FLOAT_2ADDR = 0xc8; + public static final int DIV_FLOAT_2ADDR = 0xc9; + public static final int REM_FLOAT_2ADDR = 0xca; + public static final int ADD_DOUBLE_2ADDR = 0xcb; + public static final int SUB_DOUBLE_2ADDR = 0xcc; + public static final int MUL_DOUBLE_2ADDR = 0xcd; + public static final int DIV_DOUBLE_2ADDR = 0xce; + public static final int REM_DOUBLE_2ADDR = 0xcf; + public static final int ADD_INT_LIT16 = 0xd0; + public static final int RSUB_INT = 0xd1; + public static final int MUL_INT_LIT16 = 0xd2; + public static final int DIV_INT_LIT16 = 0xd3; + public static final int REM_INT_LIT16 = 0xd4; + public static final int AND_INT_LIT16 = 0xd5; + public static final int OR_INT_LIT16 = 0xd6; + public static final int XOR_INT_LIT16 = 0xd7; + public static final int ADD_INT_LIT8 = 0xd8; + public static final int RSUB_INT_LIT8 = 0xd9; + public static final int MUL_INT_LIT8 = 0xda; + public static final int DIV_INT_LIT8 = 0xdb; + public static final int REM_INT_LIT8 = 0xdc; + public static final int AND_INT_LIT8 = 0xdd; + public static final int OR_INT_LIT8 = 0xde; + public static final int XOR_INT_LIT8 = 0xdf; + public static final int SHL_INT_LIT8 = 0xe0; + public static final int SHR_INT_LIT8 = 0xe1; + public static final int USHR_INT_LIT8 = 0xe2; + // END(opcodes) + + // TODO: Generate these payload opcodes with opcode-gen. + + /** + * special pseudo-opcode value for packed-switch data payload + * instructions + */ + public static final int PACKED_SWITCH_PAYLOAD = 0x100; + + /** special pseudo-opcode value for packed-switch data payload + * instructions + */ + public static final int SPARSE_SWITCH_PAYLOAD = 0x200; + + /** special pseudo-opcode value for fill-array-data data payload + * instructions + */ + public static final int FILL_ARRAY_DATA_PAYLOAD = 0x300; + + /** + * This class is uninstantiable. + */ + private Opcodes() { + // This space intentionally left blank. + } + + /** + * Gets the opcode out of an opcode unit, the latter of which may also + * include one or more argument values. + * + * @param opcodeUnit the opcode-containing code unit + * @return the extracted opcode + */ + public static int extractOpcodeFromUnit(int opcodeUnit) { + /* + * Note: This method bakes in knowledge that all opcodes are + * either single-byte or of the forms (byteValue << 8) or + * ((byteValue << 8) | 0xff). + */ + + int lowByte = opcodeUnit & 0xff; + return ((lowByte == 0) || (lowByte == 0xff)) ? opcodeUnit : lowByte; + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeInput.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeInput.java new file mode 100644 index 00000000..1f00ad14 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeInput.java @@ -0,0 +1,81 @@ +/* + * 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.dx.instruction; + +import java.io.EOFException; + +/** + * Reads code from a {@code short[]}. + */ +public final class ShortArrayCodeInput extends CodeCursor { + /** source array to read from */ + private final short[] array; + + /** + * Constructs an instance. + */ + public ShortArrayCodeInput(short[] array) { + if (array == null) { + throw new NullPointerException("array == null"); + } + + this.array = array; + } + + /** + * Returns whether there are any more code units to read. This + * is analogous to {@code hasNext()} on an interator. + */ + public boolean hasMore() { + return cursor() < array.length; + } + + /** + * Reads a code unit. + */ + public int read() throws EOFException { + try { + int value = array[cursor()]; + advance(1); + return value & 0xffff; + } catch (ArrayIndexOutOfBoundsException ex) { + throw new EOFException(); + } + } + + /** + * Reads two code units, treating them as a little-endian {@code int}. + */ + public int readInt() throws EOFException { + int short0 = read(); + int short1 = read(); + + return short0 | (short1 << 16); + } + + /** + * Reads four code units, treating them as a little-endian {@code long}. + */ + public long readLong() throws EOFException { + long short0 = read(); + long short1 = read(); + long short2 = read(); + long short3 = read(); + + return short0 | (short1 << 16) | (short2 << 32) | (short3 << 48); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeOutput.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeOutput.java new file mode 100644 index 00000000..e0cd2420 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/instruction/ShortArrayCodeOutput.java @@ -0,0 +1,188 @@ +/* + * 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.dx.instruction; + +/** + * Writes code to a {@code short[]}. + */ +public final class ShortArrayCodeOutput extends CodeCursor { + /** array to write to */ + private short[] array; + + /** + * Constructs an instance. + * + * @param initSize the maximum number of code units that will be written + */ + public ShortArrayCodeOutput(int initSize) { + if (initSize < 0) { + throw new IllegalArgumentException("initSize < 0"); + } + + this.array = new short[initSize]; + } + + /** + * Constructs an instance by wrapping an exist array. + * @param array the array to write. + */ + public ShortArrayCodeOutput(short[] array) { + if (array == null) { + throw new IllegalArgumentException("array is null."); + } + this.array = array; + } + + /** + * Gets the array. The returned array contains exactly the data + * written (e.g. no leftover space at the end). + */ + public short[] getArray() { + int cursor = cursor(); + + if (cursor == array.length) { + return array; + } + + short[] result = new short[cursor]; + System.arraycopy(array, 0, result, 0, cursor); + return result; + } + + /** + * Writes a code unit. + */ + public void write(short codeUnit) { + ensureArrayLength(1); + array[cursor()] = codeUnit; + advance(1); + } + + /** + * Writes two code units. + */ + public void write(short u0, short u1) { + write(u0); + write(u1); + } + + /** + * Writes three code units. + */ + public void write(short u0, short u1, short u2) { + write(u0); + write(u1); + write(u2); + } + + /** + * Writes four code units. + */ + public void write(short u0, short u1, short u2, short u3) { + write(u0); + write(u1); + write(u2); + write(u3); + } + + /** + * Writes five code units. + */ + public void write(short u0, short u1, short u2, short u3, short u4) { + write(u0); + write(u1); + write(u2); + write(u3); + write(u4); + } + + /** + * Writes an {@code int}, little-endian. + */ + public void writeInt(int value) { + write((short) value); + write((short) (value >> 16)); + } + + /** + * Writes a {@code long}, little-endian. + */ + public void writeLong(long value) { + write((short) value); + write((short) (value >> 16)); + write((short) (value >> 32)); + write((short) (value >> 48)); + } + + /** + * Writes the contents of the given array. + */ + public void write(byte[] data) { + int value = 0; + boolean even = true; + for (byte b : data) { + if (even) { + value = b & 0xff; + even = false; + } else { + value |= b << 8; + write((short) value); + even = true; + } + } + + if (!even) { + write((short) value); + } + } + + /** + * Writes the contents of the given array. + */ + public void write(short[] data) { + for (short unit : data) { + write(unit); + } + } + + /** + * Writes the contents of the given array. + */ + public void write(int[] data) { + for (int i : data) { + writeInt(i); + } + } + + /** + * Writes the contents of the given array. + */ + public void write(long[] data) { + for (long l : data) { + writeLong(l); + } + } + + private void ensureArrayLength(int shortCountToWrite) { + int currPos = cursor(); + if (array.length - currPos < shortCountToWrite) { + short[] newArray = new short[array.length + (array.length >> 1)]; + System.arraycopy(array, 0, newArray, 0, currPos); + array = newArray; + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/Hex.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/Hex.java new file mode 100644 index 00000000..95d947fd --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/Hex.java @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2007 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.dx.util; + +/** + * Utilities for formatting numbers as hexadecimal. + */ +public final class Hex { + /** + * This class is uninstantiable. + */ + private Hex() { + // This space intentionally left blank. + } + + /** + * Formats a {@code long} as an 8-byte unsigned hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String u8(long v) { + char[] result = new char[16]; + for (int i = 0; i < 16; i++) { + result[15 - i] = Character.forDigit((int) v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 4-byte unsigned hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String u4(int v) { + char[] result = new char[8]; + for (int i = 0; i < 8; i++) { + result[7 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 3-byte unsigned hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String u3(int v) { + char[] result = new char[6]; + for (int i = 0; i < 6; i++) { + result[5 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 2-byte unsigned hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String u2(int v) { + char[] result = new char[4]; + for (int i = 0; i < 4; i++) { + result[3 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as either a 2-byte unsigned hex value + * (if the value is small enough) or a 4-byte unsigned hex value (if + * not). + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String u2or4(int v) { + if (v == (char) v) { + return u2(v); + } else { + return u4(v); + } + } + + /** + * Formats an {@code int} as a 1-byte unsigned hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String u1(int v) { + char[] result = new char[2]; + for (int i = 0; i < 2; i++) { + result[1 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 4-bit unsigned hex nibble. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String uNibble(int v) { + char[] result = new char[1]; + + result[0] = Character.forDigit(v & 0x0f, 16); + return new String(result); + } + + /** + * Formats a {@code long} as an 8-byte signed hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String s8(long v) { + char[] result = new char[17]; + + if (v < 0) { + result[0] = '-'; + v = -v; + } else { + result[0] = '+'; + } + + for (int i = 0; i < 16; i++) { + result[16 - i] = Character.forDigit((int) v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 4-byte signed hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String s4(int v) { + char[] result = new char[9]; + + if (v < 0) { + result[0] = '-'; + v = -v; + } else { + result[0] = '+'; + } + + for (int i = 0; i < 8; i++) { + result[8 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 2-byte signed hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String s2(int v) { + char[] result = new char[5]; + + if (v < 0) { + result[0] = '-'; + v = -v; + } else { + result[0] = '+'; + } + + for (int i = 0; i < 4; i++) { + result[4 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats an {@code int} as a 1-byte signed hex value. + * + * @param v value to format + * @return {@code non-null;} formatted form + */ + public static String s1(int v) { + char[] result = new char[3]; + + if (v < 0) { + result[0] = '-'; + v = -v; + } else { + result[0] = '+'; + } + + for (int i = 0; i < 2; i++) { + result[2 - i] = Character.forDigit(v & 0x0f, 16); + v >>= 4; + } + + return new String(result); + } + + /** + * Formats a hex dump of a portion of a {@code byte[]}. The result + * is always newline-terminated, unless the passed-in length was zero, + * in which case the result is always the empty string ({@code ""}). + * + * @param arr {@code non-null;} array to format + * @param offset {@code >= 0;} offset to the part to dump + * @param length {@code >= 0;} number of bytes to dump + * @param outOffset {@code >= 0;} first output offset to print + * @param bpl {@code >= 0;} number of bytes of output per line + * @param addressLength {@code {2,4,6,8};} number of characters for each address + * header + * @return {@code non-null;} a string of the dump + */ + public static String dump(byte[] arr, int offset, int length, + int outOffset, int bpl, int addressLength) { + int end = offset + length; + + // twos-complement math trick: ((x < 0) || (y < 0)) <=> ((x|y) < 0) + if (((offset | length | end) < 0) || (end > arr.length)) { + throw new IndexOutOfBoundsException("arr.length " + + arr.length + "; " + + offset + "..!" + end); + } + + if (outOffset < 0) { + throw new IllegalArgumentException("outOffset < 0"); + } + + if (length == 0) { + return ""; + } + + StringBuffer sb = new StringBuffer(length * 4 + 6); + int col = 0; + + while (length > 0) { + if (col == 0) { + String astr; + switch (addressLength) { + case 2: astr = Hex.u1(outOffset); break; + case 4: astr = Hex.u2(outOffset); break; + case 6: astr = Hex.u3(outOffset); break; + default: astr = Hex.u4(outOffset); break; + } + sb.append(astr); + sb.append(": "); + } else if ((col & 1) == 0) { + sb.append(' '); + } + sb.append(Hex.u1(arr[offset])); + outOffset++; + offset++; + col++; + if (col == bpl) { + sb.append('\n'); + col = 0; + } + length--; + } + + if (col != 0) { + sb.append('\n'); + } + + return sb.toString(); + } + + public static String toHexString(byte[] ubytes) { + StringBuilder strBuilder = new StringBuilder(ubytes.length << 1); + for (byte b : ubytes) { + strBuilder.append(u1(b)); + } + return strBuilder.toString(); + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/IndexMap.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/IndexMap.java new file mode 100644 index 00000000..a9e46362 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/IndexMap.java @@ -0,0 +1,738 @@ +/* + * Copyright (C) 2007 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.dx.util; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.EncodedValueCodec; +import com.tencent.tinker.android.dex.EncodedValueReader; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.Leb128; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.util.ByteInput; +import com.tencent.tinker.android.dex.util.ByteOutput; +import com.tencent.tinker.android.utils.SparseIntArray; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.BitSet; + +/** + * Created by tangyinsheng on 2016/6/29. + */ +public class IndexMap { + private final SparseIntArray stringIdsMap = new SparseIntArray(); + private final SparseIntArray typeIdsMap = new SparseIntArray(); + private final SparseIntArray protoIdsMap = new SparseIntArray(); + private final SparseIntArray fieldIdsMap = new SparseIntArray(); + private final SparseIntArray methodIdsMap = new SparseIntArray(); + private final SparseIntArray typeListOffsetsMap = new SparseIntArray(); + private final SparseIntArray annotationOffsetsMap = new SparseIntArray(); + private final SparseIntArray annotationSetOffsetsMap = new SparseIntArray(); + private final SparseIntArray annotationSetRefListOffsetsMap = new SparseIntArray(); + private final SparseIntArray annotationsDirectoryOffsetsMap = new SparseIntArray(); + private final SparseIntArray staticValuesOffsetsMap = new SparseIntArray(); + private final SparseIntArray classDataOffsetsMap = new SparseIntArray(); + private final SparseIntArray debugInfoItemOffsetsMap = new SparseIntArray(); + private final SparseIntArray codeOffsetsMap = new SparseIntArray(); + + private final BitSet deletedStringIds = new BitSet(); + private final BitSet deletedTypeIds = new BitSet(); + private final BitSet deletedProtoIds = new BitSet(); + private final BitSet deletedFieldIds = new BitSet(); + private final BitSet deletedMethodIds = new BitSet(); + private final BitSet deletedTypeListOffsets = new BitSet(); + private final BitSet deletedAnnotationOffsets = new BitSet(); + private final BitSet deletedAnnotationSetOffsets = new BitSet(); + private final BitSet deletedAnnotationSetRefListOffsets = new BitSet(); + private final BitSet deletedAnnotationsDirectoryOffsets = new BitSet(); + private final BitSet deletedStaticValuesOffsets = new BitSet(); + private final BitSet deletedClassDataOffsets = new BitSet(); + private final BitSet deletedDebugInfoItemOffsets = new BitSet(); + private final BitSet deletedCodeOffsets = new BitSet(); + + public void mapStringIds(int oldIndex, int newIndex) { + stringIdsMap.put(oldIndex, newIndex); + } + + public void markStringIdDeleted(int index) { + if (index < 0) return; + deletedStringIds.set(index); + } + + public void mapTypeIds(int oldIndex, int newIndex) { + typeIdsMap.put(oldIndex, newIndex); + } + + public void markTypeIdDeleted(int index) { + if (index < 0) return; + deletedTypeIds.set(index); + } + + public void mapProtoIds(int oldIndex, int newIndex) { + protoIdsMap.put(oldIndex, newIndex); + } + + public void markProtoIdDeleted(int index) { + if (index < 0) return; + deletedProtoIds.set(index); + } + + public void mapFieldIds(int oldIndex, int newIndex) { + fieldIdsMap.put(oldIndex, newIndex); + } + + public void markFieldIdDeleted(int index) { + if (index < 0) return; + deletedFieldIds.set(index); + } + + public void mapMethodIds(int oldIndex, int newIndex) { + methodIdsMap.put(oldIndex, newIndex); + } + + public void markMethodIdDeleted(int index) { + if (index < 0) return; + deletedMethodIds.set(index); + } + + public void mapTypeListOffset(int oldOffset, int newOffset) { + typeListOffsetsMap.put(oldOffset, newOffset); + } + + public void markTypeListDeleted(int offset) { + if (offset < 0) return; + deletedTypeListOffsets.set(offset); + } + + public void mapAnnotationOffset(int oldOffset, int newOffset) { + annotationOffsetsMap.put(oldOffset, newOffset); + } + + public void markAnnotationDeleted(int offset) { + if (offset < 0) return; + deletedAnnotationOffsets.set(offset); + } + + public void mapAnnotationSetOffset(int oldOffset, int newOffset) { + annotationSetOffsetsMap.put(oldOffset, newOffset); + } + + public void markAnnotationSetDeleted(int offset) { + if (offset < 0) return; + deletedAnnotationSetOffsets.set(offset); + } + + public void mapAnnotationSetRefListOffset(int oldOffset, int newOffset) { + annotationSetRefListOffsetsMap.put(oldOffset, newOffset); + } + + public void markAnnotationSetRefListDeleted(int offset) { + if (offset < 0) return; + deletedAnnotationSetRefListOffsets.set(offset); + } + + public void mapAnnotationsDirectoryOffset(int oldOffset, int newOffset) { + annotationsDirectoryOffsetsMap.put(oldOffset, newOffset); + } + + public void markAnnotationsDirectoryDeleted(int offset) { + if (offset < 0) return; + deletedAnnotationsDirectoryOffsets.set(offset); + } + + public void mapStaticValuesOffset(int oldOffset, int newOffset) { + staticValuesOffsetsMap.put(oldOffset, newOffset); + } + + public void markStaticValuesDeleted(int offset) { + if (offset < 0) return; + deletedStaticValuesOffsets.set(offset); + } + + public void mapClassDataOffset(int oldOffset, int newOffset) { + classDataOffsetsMap.put(oldOffset, newOffset); + } + + public void markClassDataDeleted(int offset) { + if (offset < 0) return; + deletedClassDataOffsets.set(offset); + } + + public void mapDebugInfoItemOffset(int oldOffset, int newOffset) { + debugInfoItemOffsetsMap.put(oldOffset, newOffset); + } + + public void markDebugInfoItemDeleted(int offset) { + if (offset < 0) return; + deletedDebugInfoItemOffsets.set(offset); + } + + public void mapCodeOffset(int oldOffset, int newOffset) { + codeOffsetsMap.put(oldOffset, newOffset); + } + + public void markCodeDeleted(int offset) { + if (offset < 0) return; + deletedCodeOffsets.set(offset); + } + + public int adjustStringIndex(int stringIndex) { + int index = stringIdsMap.indexOfKey(stringIndex); + if (index < 0) { + return (stringIndex >= 0 && deletedStringIds.get(stringIndex) ? -1 : stringIndex); + } else { + return stringIdsMap.valueAt(index); + } + } + + public int adjustTypeIdIndex(int typeIdIndex) { + int index = typeIdsMap.indexOfKey(typeIdIndex); + if (index < 0) { + return (typeIdIndex >= 0 && deletedTypeIds.get(typeIdIndex) ? -1 : typeIdIndex); + } else { + return typeIdsMap.valueAt(index); + } + } + + public int adjustProtoIdIndex(int protoIndex) { + int index = protoIdsMap.indexOfKey(protoIndex); + if (index < 0) { + return (protoIndex >= 0 && deletedProtoIds.get(protoIndex) ? -1 : protoIndex); + } else { + return protoIdsMap.valueAt(index); + } + } + + public int adjustFieldIdIndex(int fieldIndex) { + int index = fieldIdsMap.indexOfKey(fieldIndex); + if (index < 0) { + return (fieldIndex >= 0 && deletedFieldIds.get(fieldIndex) ? -1 : fieldIndex); + } else { + return fieldIdsMap.valueAt(index); + } + } + + public int adjustMethodIdIndex(int methodIndex) { + int index = methodIdsMap.indexOfKey(methodIndex); + if (index < 0) { + return (methodIndex >= 0 && deletedMethodIds.get(methodIndex) ? -1 : methodIndex); + } else { + return methodIdsMap.valueAt(index); + } + } + + public int adjustTypeListOffset(int typeListOffset) { + int index = typeListOffsetsMap.indexOfKey(typeListOffset); + if (index < 0) { + return (typeListOffset >= 0 && deletedTypeListOffsets.get(typeListOffset) ? -1 : typeListOffset); + } else { + return typeListOffsetsMap.valueAt(index); + } + } + + public int adjustAnnotationOffset(int annotationOffset) { + int index = annotationOffsetsMap.indexOfKey(annotationOffset); + if (index < 0) { + return (annotationOffset >= 0 && deletedAnnotationOffsets.get(annotationOffset) ? -1 : annotationOffset); + } else { + return annotationOffsetsMap.valueAt(index); + } + } + + public int adjustAnnotationSetOffset(int annotationSetOffset) { + int index = annotationSetOffsetsMap.indexOfKey(annotationSetOffset); + if (index < 0) { + return (annotationSetOffset >= 0 && deletedAnnotationSetOffsets.get(annotationSetOffset) ? -1 : annotationSetOffset); + } else { + return annotationSetOffsetsMap.valueAt(index); + } + } + + public int adjustAnnotationSetRefListOffset(int annotationSetRefListOffset) { + int index = annotationSetRefListOffsetsMap.indexOfKey(annotationSetRefListOffset); + if (index < 0) { + return (annotationSetRefListOffset >= 0 && deletedAnnotationSetRefListOffsets.get(annotationSetRefListOffset) ? -1 : annotationSetRefListOffset); + } else { + return annotationSetRefListOffsetsMap.valueAt(index); + } + } + + public int adjustAnnotationsDirectoryOffset(int annotationsDirectoryOffset) { + int index = annotationsDirectoryOffsetsMap.indexOfKey(annotationsDirectoryOffset); + if (index < 0) { + return (annotationsDirectoryOffset >= 0 && deletedAnnotationsDirectoryOffsets.get(annotationsDirectoryOffset) ? -1 : annotationsDirectoryOffset); + } else { + return annotationsDirectoryOffsetsMap.valueAt(index); + } + } + + public int adjustStaticValuesOffset(int staticValuesOffset) { + int index = staticValuesOffsetsMap.indexOfKey(staticValuesOffset); + if (index < 0) { + return (staticValuesOffset >= 0 && deletedStaticValuesOffsets.get(staticValuesOffset) ? -1 : staticValuesOffset); + } else { + return staticValuesOffsetsMap.valueAt(index); + } + } + + public int adjustClassDataOffset(int classDataOffset) { + int index = classDataOffsetsMap.indexOfKey(classDataOffset); + if (index < 0) { + return (classDataOffset >= 0 && deletedClassDataOffsets.get(classDataOffset) ? -1 : classDataOffset); + } else { + return classDataOffsetsMap.valueAt(index); + } + } + + public int adjustDebugInfoItemOffset(int debugInfoItemOffset) { + int index = debugInfoItemOffsetsMap.indexOfKey(debugInfoItemOffset); + if (index < 0) { + return (debugInfoItemOffset >= 0 && deletedDebugInfoItemOffsets.get(debugInfoItemOffset) ? -1 : debugInfoItemOffset); + } else { + return debugInfoItemOffsetsMap.valueAt(index); + } + } + + public int adjustCodeOffset(int codeOffset) { + int index = codeOffsetsMap.indexOfKey(codeOffset); + if (index < 0) { + return (codeOffset >= 0 && deletedCodeOffsets.get(codeOffset) ? -1 : codeOffset); + } else { + return codeOffsetsMap.valueAt(index); + } + } + + public TypeList adjust(TypeList typeList) { + if (typeList == TypeList.EMPTY) { + return typeList; + } + short[] types = new short[typeList.types.length]; + for (int i = 0; i < types.length; ++i) { + types[i] = (short) adjustTypeIdIndex(typeList.types[i]); + } + return new TypeList(typeList.off, types); + } + + public MethodId adjust(MethodId methodId) { + int adjustedDeclaringClassIndex = adjustTypeIdIndex(methodId.declaringClassIndex); + int adjustedProtoIndex = adjustProtoIdIndex(methodId.protoIndex); + int adjustedNameIndex = adjustStringIndex(methodId.nameIndex); + return new MethodId( + methodId.off, adjustedDeclaringClassIndex, adjustedProtoIndex, adjustedNameIndex + ); + } + + public FieldId adjust(FieldId fieldId) { + int adjustedDeclaringClassIndex = adjustTypeIdIndex(fieldId.declaringClassIndex); + int adjustedTypeIndex = adjustTypeIdIndex(fieldId.typeIndex); + int adjustedNameIndex = adjustStringIndex(fieldId.nameIndex); + return new FieldId( + fieldId.off, adjustedDeclaringClassIndex, adjustedTypeIndex, adjustedNameIndex + ); + } + + public ProtoId adjust(ProtoId protoId) { + int adjustedShortyIndex = adjustStringIndex(protoId.shortyIndex); + int adjustedReturnTypeIndex = adjustTypeIdIndex(protoId.returnTypeIndex); + int adjustedParametersOffset = adjustTypeListOffset(protoId.parametersOffset); + return new ProtoId( + protoId.off, adjustedShortyIndex, adjustedReturnTypeIndex, adjustedParametersOffset + ); + } + + public ClassDef adjust(ClassDef classDef) { + int adjustedTypeIndex = adjustTypeIdIndex(classDef.typeIndex); + int adjustedSupertypeIndex = adjustTypeIdIndex(classDef.supertypeIndex); + int adjustedInterfacesOffset = adjustTypeListOffset(classDef.interfacesOffset); + int adjustedSourceFileIndex = adjustStringIndex(classDef.sourceFileIndex); + int adjustedAnnotationsOffset = adjustAnnotationsDirectoryOffset(classDef.annotationsOffset); + int adjustedClassDataOffset = adjustClassDataOffset(classDef.classDataOffset); + int adjustedStaticValuesOffset = adjustStaticValuesOffset(classDef.staticValuesOffset); + return new ClassDef( + classDef.off, adjustedTypeIndex, classDef.accessFlags, adjustedSupertypeIndex, + adjustedInterfacesOffset, adjustedSourceFileIndex, adjustedAnnotationsOffset, + adjustedClassDataOffset, adjustedStaticValuesOffset + ); + } + + public ClassData adjust(ClassData classData) { + ClassData.Field[] adjustedStaticFields = adjustFields(classData.staticFields); + ClassData.Field[] adjustedInstanceFields = adjustFields(classData.instanceFields); + ClassData.Method[] adjustedDirectMethods = adjustMethods(classData.directMethods); + ClassData.Method[] adjustedVirtualMethods = adjustMethods(classData.virtualMethods); + return new ClassData( + classData.off, adjustedStaticFields, adjustedInstanceFields, + adjustedDirectMethods, adjustedVirtualMethods + ); + } + + public Code adjust(Code code) { + int adjustedDebugInfoOffset = adjustDebugInfoItemOffset(code.debugInfoOffset); + short[] adjustedInstructions = adjustInstructions(code.instructions); + Code.CatchHandler[] adjustedCatchHandlers = adjustCatchHandlers(code.catchHandlers); + return new Code( + code.off, code.registersSize, code.insSize, code.outsSize, + adjustedDebugInfoOffset, adjustedInstructions, code.tries, adjustedCatchHandlers + ); + } + + private short[] adjustInstructions(short[] instructions) { + if (instructions == null || instructions.length == 0) { + return instructions; + } + InstructionTransformer insTrans = new InstructionTransformer(this); + return insTrans.transform(instructions); + } + + private Code.CatchHandler[] adjustCatchHandlers(Code.CatchHandler[] catchHandlers) { + if (catchHandlers == null || catchHandlers.length == 0) { + return catchHandlers; + } + Code.CatchHandler[] adjustedCatchHandlers = new Code.CatchHandler[catchHandlers.length]; + for (int i = 0; i < catchHandlers.length; ++i) { + Code.CatchHandler catchHandler = catchHandlers[i]; + int typeIndexesCount = catchHandler.typeIndexes.length; + int[] adjustedTypeIndexes = new int[typeIndexesCount]; + for (int j = 0; j < typeIndexesCount; ++j) { + adjustedTypeIndexes[j] = adjustTypeIdIndex(catchHandler.typeIndexes[j]); + } + adjustedCatchHandlers[i] = new Code.CatchHandler( + adjustedTypeIndexes, catchHandler.addresses, + catchHandler.catchAllAddress, catchHandler.offset + ); + } + return adjustedCatchHandlers; + } + + private ClassData.Field[] adjustFields(ClassData.Field[] fields) { + ClassData.Field[] adjustedFields = new ClassData.Field[fields.length]; + for (int i = 0; i < fields.length; ++i) { + ClassData.Field field = fields[i]; + int adjustedFieldIndex = adjustFieldIdIndex(field.fieldIndex); + adjustedFields[i] = new ClassData.Field(adjustedFieldIndex, field.accessFlags); + } + return adjustedFields; + } + + private ClassData.Method[] adjustMethods(ClassData.Method[] methods) { + ClassData.Method[] adjustedMethods = new ClassData.Method[methods.length]; + for (int i = 0; i < methods.length; ++i) { + ClassData.Method method = methods[i]; + int adjustedMethodIndex = adjustMethodIdIndex(method.methodIndex); + int adjustedCodeOffset = adjustCodeOffset(method.codeOffset); + adjustedMethods[i] = new ClassData.Method( + adjustedMethodIndex, method.accessFlags, adjustedCodeOffset + ); + } + return adjustedMethods; + } + + public DebugInfoItem adjust(DebugInfoItem debugInfoItem) { + int[] parameterNames = adjustParameterNames(debugInfoItem.parameterNames); + byte[] infoSTM = adjustDebugInfoItemSTM(debugInfoItem.infoSTM); + return new DebugInfoItem( + debugInfoItem.off, debugInfoItem.lineStart, parameterNames, infoSTM + ); + } + + private int[] adjustParameterNames(int[] parameterNames) { + int size = parameterNames.length; + int[] adjustedParameterNames = new int[size]; + for (int i = 0; i < size; ++i) { + adjustedParameterNames[i] = adjustStringIndex(parameterNames[i]); + } + return adjustedParameterNames; + } + + private byte[] adjustDebugInfoItemSTM(byte[] infoSTM) { + ByteArrayInputStream bais = new ByteArrayInputStream(infoSTM); + final ByteArrayInputStream baisRef = bais; + ByteInput inAdapter = new ByteInput() { + @Override + public byte readByte() { + return (byte) (baisRef.read() & 0xFF); + } + }; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(infoSTM.length + 512); + final ByteArrayOutputStream baosRef = baos; + ByteOutput outAdapter = new ByteOutput() { + @Override + public void writeByte(int i) { + baosRef.write(i); + } + }; + + outside_whileloop: + while (true) { + int opcode = bais.read() & 0xFF; + baos.write(opcode); + switch (opcode) { + case DebugInfoItem.DBG_END_SEQUENCE: { + break outside_whileloop; + } + case DebugInfoItem.DBG_ADVANCE_PC: { + int addrDiff = Leb128.readUnsignedLeb128(inAdapter); + Leb128.writeUnsignedLeb128(outAdapter, addrDiff); + break; + } + case DebugInfoItem.DBG_ADVANCE_LINE: { + int lineDiff = Leb128.readSignedLeb128(inAdapter); + Leb128.writeSignedLeb128(outAdapter, lineDiff); + break; + } + case DebugInfoItem.DBG_START_LOCAL: + case DebugInfoItem.DBG_START_LOCAL_EXTENDED: { + int registerNum = Leb128.readUnsignedLeb128(inAdapter); + Leb128.writeUnsignedLeb128(outAdapter, registerNum); + + int nameIndex = adjustStringIndex(Leb128.readUnsignedLeb128p1(inAdapter)); + Leb128.writeUnsignedLeb128p1(outAdapter, nameIndex); + + int typeIndex = adjustTypeIdIndex(Leb128.readUnsignedLeb128p1(inAdapter)); + Leb128.writeUnsignedLeb128p1(outAdapter, typeIndex); + + if (opcode == DebugInfoItem.DBG_START_LOCAL_EXTENDED) { + int sigIndex = adjustStringIndex(Leb128.readUnsignedLeb128p1(inAdapter)); + Leb128.writeUnsignedLeb128p1(outAdapter, sigIndex); + } + break; + } + case DebugInfoItem.DBG_END_LOCAL: + case DebugInfoItem.DBG_RESTART_LOCAL: { + int registerNum = Leb128.readUnsignedLeb128(inAdapter); + Leb128.writeUnsignedLeb128(outAdapter, registerNum); + break; + } + case DebugInfoItem.DBG_SET_FILE: { + int nameIndex = adjustStringIndex(Leb128.readUnsignedLeb128p1(inAdapter)); + Leb128.writeUnsignedLeb128p1(outAdapter, nameIndex); + break; + } + case DebugInfoItem.DBG_SET_PROLOGUE_END: + case DebugInfoItem.DBG_SET_EPILOGUE_BEGIN: + default: { + break; + } + } + } + + return baos.toByteArray(); + } + + public EncodedValue adjust(EncodedValue encodedArray) { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(encodedArray.data.length); + new EncodedValueTransformer( + new ByteOutput() { + @Override + public void writeByte(int i) { + baos.write(i); + } + } + ).transformArray( + new EncodedValueReader(encodedArray, EncodedValueReader.ENCODED_ARRAY) + ); + return new EncodedValue(encodedArray.off, baos.toByteArray()); + } + + public Annotation adjust(Annotation annotation) { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(annotation.encodedAnnotation.data.length); + new EncodedValueTransformer( + new ByteOutput() { + @Override + public void writeByte(int i) { + baos.write(i); + } + } + ).transformAnnotation(annotation.getReader()); + return new Annotation( + annotation.off, + annotation.visibility, + new EncodedValue(annotation.encodedAnnotation.off, baos.toByteArray()) + ); + } + + public AnnotationSet adjust(AnnotationSet annotationSet) { + int size = annotationSet.annotationOffsets.length; + int[] adjustedAnnotationOffsets = new int[size]; + for (int i = 0; i < size; ++i) { + adjustedAnnotationOffsets[i] + = adjustAnnotationOffset(annotationSet.annotationOffsets[i]); + } + return new AnnotationSet(annotationSet.off, adjustedAnnotationOffsets); + } + + public AnnotationSetRefList adjust(AnnotationSetRefList annotationSetRefList) { + int size = annotationSetRefList.annotationSetRefItems.length; + int[] adjustedAnnotationSetRefItems = new int[size]; + for (int i = 0; i < size; ++i) { + adjustedAnnotationSetRefItems[i] + = adjustAnnotationSetOffset(annotationSetRefList.annotationSetRefItems[i]); + } + return new AnnotationSetRefList(annotationSetRefList.off, adjustedAnnotationSetRefItems); + } + + public AnnotationsDirectory adjust(AnnotationsDirectory annotationsDirectory) { + int adjustedClassAnnotationsOffset + = adjustAnnotationSetOffset(annotationsDirectory.classAnnotationsOffset); + + int[][] adjustedFieldAnnotations + = new int[annotationsDirectory.fieldAnnotations.length][2]; + for (int i = 0; i < adjustedFieldAnnotations.length; ++i) { + adjustedFieldAnnotations[i][0] + = adjustFieldIdIndex(annotationsDirectory.fieldAnnotations[i][0]); + adjustedFieldAnnotations[i][1] + = adjustAnnotationSetOffset(annotationsDirectory.fieldAnnotations[i][1]); + } + + int[][] adjustedMethodAnnotations + = new int[annotationsDirectory.methodAnnotations.length][2]; + for (int i = 0; i < adjustedMethodAnnotations.length; ++i) { + adjustedMethodAnnotations[i][0] + = adjustMethodIdIndex(annotationsDirectory.methodAnnotations[i][0]); + adjustedMethodAnnotations[i][1] + = adjustAnnotationSetOffset(annotationsDirectory.methodAnnotations[i][1]); + } + + int[][] adjustedParameterAnnotations + = new int[annotationsDirectory.parameterAnnotations.length][2]; + for (int i = 0; i < adjustedParameterAnnotations.length; ++i) { + adjustedParameterAnnotations[i][0] + = adjustMethodIdIndex(annotationsDirectory.parameterAnnotations[i][0]); + adjustedParameterAnnotations[i][1] + = adjustAnnotationSetRefListOffset( + annotationsDirectory.parameterAnnotations[i][1] + ); + } + + return new AnnotationsDirectory( + annotationsDirectory.off, adjustedClassAnnotationsOffset, + adjustedFieldAnnotations, adjustedMethodAnnotations, adjustedParameterAnnotations + ); + } + + /** + * Adjust an encoded value or array. + */ + private final class EncodedValueTransformer { + private final ByteOutput out; + + EncodedValueTransformer(ByteOutput out) { + this.out = out; + } + + public void transform(EncodedValueReader reader) { + switch (reader.peek()) { + case EncodedValueReader.ENCODED_BYTE: + EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_BYTE, reader.readByte()); + break; + case EncodedValueReader.ENCODED_SHORT: + EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_SHORT, reader.readShort()); + break; + case EncodedValueReader.ENCODED_INT: + EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_INT, reader.readInt()); + break; + case EncodedValueReader.ENCODED_LONG: + EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_LONG, reader.readLong()); + break; + case EncodedValueReader.ENCODED_CHAR: + EncodedValueCodec.writeUnsignedIntegralValue(out, EncodedValueReader.ENCODED_CHAR, reader.readChar()); + break; + case EncodedValueReader.ENCODED_FLOAT: + // Shift value left 32 so that right-zero-extension works. + long longBits = ((long) Float.floatToIntBits(reader.readFloat())) << 32; + EncodedValueCodec.writeRightZeroExtendedValue(out, EncodedValueReader.ENCODED_FLOAT, longBits); + break; + case EncodedValueReader.ENCODED_DOUBLE: + EncodedValueCodec.writeRightZeroExtendedValue( + out, EncodedValueReader.ENCODED_DOUBLE, Double.doubleToLongBits(reader.readDouble())); + break; + case EncodedValueReader.ENCODED_STRING: + EncodedValueCodec.writeUnsignedIntegralValue( + out, EncodedValueReader.ENCODED_STRING, adjustStringIndex(reader.readString())); + break; + case EncodedValueReader.ENCODED_TYPE: + EncodedValueCodec.writeUnsignedIntegralValue( + out, EncodedValueReader.ENCODED_TYPE, adjustTypeIdIndex(reader.readType())); + break; + case EncodedValueReader.ENCODED_FIELD: + EncodedValueCodec.writeUnsignedIntegralValue( + out, EncodedValueReader.ENCODED_FIELD, adjustFieldIdIndex(reader.readField())); + break; + case EncodedValueReader.ENCODED_ENUM: + EncodedValueCodec.writeUnsignedIntegralValue( + out, EncodedValueReader.ENCODED_ENUM, adjustFieldIdIndex(reader.readEnum())); + break; + case EncodedValueReader.ENCODED_METHOD: + EncodedValueCodec.writeUnsignedIntegralValue( + out, EncodedValueReader.ENCODED_METHOD, adjustMethodIdIndex(reader.readMethod())); + break; + case EncodedValueReader.ENCODED_ARRAY: + writeTypeAndArg(EncodedValueReader.ENCODED_ARRAY, 0); + transformArray(reader); + break; + case EncodedValueReader.ENCODED_ANNOTATION: + writeTypeAndArg(EncodedValueReader.ENCODED_ANNOTATION, 0); + transformAnnotation(reader); + break; + case EncodedValueReader.ENCODED_NULL: + reader.readNull(); + writeTypeAndArg(EncodedValueReader.ENCODED_NULL, 0); + break; + case EncodedValueReader.ENCODED_BOOLEAN: + boolean value = reader.readBoolean(); + writeTypeAndArg(EncodedValueReader.ENCODED_BOOLEAN, value ? 1 : 0); + break; + default: + throw new DexException("Unexpected type: " + Integer.toHexString(reader.peek())); + } + } + + private void transformAnnotation(EncodedValueReader reader) { + int fieldCount = reader.readAnnotation(); + Leb128.writeUnsignedLeb128(out, adjustTypeIdIndex(reader.getAnnotationType())); + Leb128.writeUnsignedLeb128(out, fieldCount); + for (int i = 0; i < fieldCount; i++) { + Leb128.writeUnsignedLeb128(out, adjustStringIndex(reader.readAnnotationName())); + transform(reader); + } + } + + private void transformArray(EncodedValueReader reader) { + int size = reader.readArray(); + Leb128.writeUnsignedLeb128(out, size); + for (int i = 0; i < size; i++) { + transform(reader); + } + } + + private void writeTypeAndArg(int type, int arg) { + out.writeByte((arg << 5) | type); + } + } +} diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/InstructionTransformer.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/InstructionTransformer.java new file mode 100644 index 00000000..cc6562d2 --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/dx/util/InstructionTransformer.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2007 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.dx.util; + +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dx.instruction.InstructionCodec; +import com.tencent.tinker.android.dx.instruction.InstructionPromoter; +import com.tencent.tinker.android.dx.instruction.InstructionReader; +import com.tencent.tinker.android.dx.instruction.InstructionVisitor; +import com.tencent.tinker.android.dx.instruction.InstructionWriter; +import com.tencent.tinker.android.dx.instruction.ShortArrayCodeInput; +import com.tencent.tinker.android.dx.instruction.ShortArrayCodeOutput; + +import java.io.EOFException; + +/** + * Created by tangyinsheng on 2016/6/29. + */ +public final class InstructionTransformer { + private final com.tencent.tinker.android.dx.util.IndexMap indexMap; + + public InstructionTransformer(com.tencent.tinker.android.dx.util.IndexMap indexMap) { + this.indexMap = indexMap; + } + + public short[] transform(short[] encodedInstructions) throws DexException { + ShortArrayCodeOutput out = new ShortArrayCodeOutput(encodedInstructions.length); + InstructionPromoter ipmo = new InstructionPromoter(); + InstructionWriter iw = new InstructionWriter(out, ipmo); + InstructionReader ir = new InstructionReader(new ShortArrayCodeInput(encodedInstructions)); + + try { + // First visit, we collect mappings from original target address to promoted target address. + ir.accept(new InstructionTransformVisitor(ipmo)); + + // Then do the real transformation work. + ir.accept(new InstructionTransformVisitor(iw)); + } catch (EOFException e) { + throw new DexException(e); + } + + return out.getArray(); + } + + private final class InstructionTransformVisitor extends InstructionVisitor { + InstructionTransformVisitor(InstructionVisitor iv) { + super(iv); + } + + @Override + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitZeroRegisterInsn(currentAddress, opcode, mappedIndex, indexType, target, literal); + } + + @Override + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitOneRegisterInsn(currentAddress, opcode, mappedIndex, indexType, target, literal, a); + } + + @Override + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitTwoRegisterInsn(currentAddress, opcode, mappedIndex, indexType, target, literal, a, b); + } + + @Override + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitThreeRegisterInsn(currentAddress, opcode, mappedIndex, indexType, target, literal, a, b, c); + } + + @Override + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitFourRegisterInsn(currentAddress, opcode, mappedIndex, indexType, target, literal, a, b, c, d); + } + + @Override + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitFiveRegisterInsn(currentAddress, opcode, mappedIndex, indexType, target, literal, a, b, c, d, e); + } + + @Override + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + int mappedIndex = transformIndexIfNeeded(index, indexType); + super.visitRegisterRangeInsn(currentAddress, opcode, mappedIndex, indexType, target, literal, a, registerCount); + } + + private int transformIndexIfNeeded(int index, int indexType) { + switch (indexType) { + case InstructionCodec.INDEX_TYPE_STRING_REF: { + return indexMap.adjustStringIndex(index); + } + case InstructionCodec.INDEX_TYPE_TYPE_REF: { + return indexMap.adjustTypeIdIndex(index); + } + case InstructionCodec.INDEX_TYPE_FIELD_REF: { + return indexMap.adjustFieldIdIndex(index); + } + case InstructionCodec.INDEX_TYPE_METHOD_REF: { + return indexMap.adjustMethodIdIndex(index); + } + default: { + return index; + } + } + } + + } +} + diff --git a/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseIntArray.java b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseIntArray.java new file mode 100644 index 00000000..20bfbf4e --- /dev/null +++ b/third-party/aosp-dexutils/src/main/java/com/tencent/tinker/android/utils/SparseIntArray.java @@ -0,0 +1,314 @@ +/* + * Copyright (C) 2006 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.utils; + +/** + * SparseIntArrays map integers to integers. Unlike a normal array of integers, + * there can be gaps in the indices. It is intended to be more memory efficient + * than using a HashMap to map Integers to Integers, both because it avoids + * auto-boxing keys and values and its data structure doesn't rely on an extra entry object + * for each mapping. + * + *

Note that this container keeps its mappings in an array data structure, + * using a binary search to find keys. The implementation is not intended to be appropriate for + * data structures + * that may contain large numbers of items. It is generally slower than a traditional + * HashMap, since lookups require a binary search and adds and removes require inserting + * and deleting entries in the array. For containers holding up to hundreds of items, + * the performance difference is not significant, less than 50%.

+ * + *

It is possible to iterate over the items in this container using + * {@link #keyAt(int)} and {@link #valueAt(int)}. Iterating over the keys using + * keyAt(int) with ascending values of the index will return the + * keys in ascending order, or the values corresponding to the keys in ascending + * order in the case of valueAt(int).

+ */ +public class SparseIntArray implements Cloneable { + private static final int[] EMPTY_INT_ARRAY = new int[0]; + private int[] mKeys; + private int[] mValues; + private int mSize; + + /** + * Creates a new SparseIntArray containing no mappings. + */ + public SparseIntArray() { + this(10); + } + + /** + * Creates a new SparseIntArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. If you supply an initial capacity of 0, the + * sparse array will be initialized with a light-weight representation + * not requiring any additional array allocations. + */ + public SparseIntArray(int initialCapacity) { + if (initialCapacity == 0) { + mKeys = SparseIntArray.EMPTY_INT_ARRAY; + mValues = SparseIntArray.EMPTY_INT_ARRAY; + } else { + mKeys = new int[initialCapacity]; + mValues = new int[mKeys.length]; + } + mSize = 0; + } + + /** + * Given the current size of an array, returns an ideal size to which the array should grow. + * This is typically double the given size, but should not be relied upon to do so in the + * future. + */ + public static int growSize(int currentSize) { + return currentSize <= 4 ? 8 : currentSize + (currentSize >> 1); + } + + @Override + public SparseIntArray clone() { + SparseIntArray clone = null; + try { + clone = (SparseIntArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + /* ignore */ + } + return clone; + } + + /** + * Gets the int mapped from the specified key, or 0 + * if no such mapping has been made. + */ + public int get(int key) { + return get(key, 0); + } + + /** + * Gets the int mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public int get(int key, int valueIfKeyNotFound) { + int i = binarySearch(mKeys, mSize, key); + + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, mSize, key); + + if (i >= 0) { + removeAt(i); + } + } + + /** + * Removes the mapping at the given index. + */ + public void removeAt(int index) { + System.arraycopy(mKeys, index + 1, mKeys, index, mSize - (index + 1)); + System.arraycopy(mValues, index + 1, mValues, index, mSize - (index + 1)); + --mSize; + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, int value) { + int i = binarySearch(mKeys, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + mKeys = insertElementIntoIntArray(mKeys, mSize, i, key); + mValues = insertElementIntoIntArray(mValues, mSize, i, value); + ++mSize; + } + } + + /** + * Returns the number of key-value mappings that this SparseIntArray + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseIntArray stores. + * + *

The keys corresponding to indices in ascending order are guaranteed to + * be in ascending order, e.g., keyAt(0) will return the + * smallest key and keyAt(size()-1) will return the largest + * key.

+ */ + public int keyAt(int index) { + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseIntArray stores. + * + *

The values corresponding to indices in ascending order are guaranteed + * to be associated with keys in ascending order, e.g., + * valueAt(0) will return the value associated with the + * smallest key and valueAt(size()-1) will return the value + * associated with the largest key.

+ */ + public int valueAt(int index) { + return mValues[index]; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(int value) { + for (int i = 0; i < mSize; ++i) { + if (mValues[i] == value) { + return i; + } + } + return -1; + } + + /** + * Removes all key-value mappings from this SparseIntArray. + */ + public void clear() { + mSize = 0; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, int value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + mKeys = appendElementIntoIntArray(mKeys, mSize, key); + mValues = appendElementIntoIntArray(mValues, mSize, value); + mSize++; + } + + private int binarySearch(int[] array, int size, int value) { + int lo = 0; + int hi = size - 1; + + while (lo <= hi) { + int mid = (lo + hi) >>> 1; + int midVal = array[mid]; + + if (midVal < value) { + lo = mid + 1; + } else if (midVal > value) { + hi = mid - 1; + } else { + return mid; // value found + } + } + return ~lo; // value not present + } + + private int[] appendElementIntoIntArray(int[] array, int currentSize, int element) { + if (currentSize > array.length) { + throw new IllegalArgumentException("Bad currentSize, originalSize: " + array.length + " currentSize: " + currentSize); + } + if (currentSize + 1 > array.length) { + int[] newArray = new int[SparseIntArray.growSize(currentSize)]; + System.arraycopy(array, 0, newArray, 0, currentSize); + array = newArray; + } + array[currentSize] = element; + return array; + } + + private int[] insertElementIntoIntArray(int[] array, int currentSize, int index, int element) { + if (currentSize > array.length) { + throw new IllegalArgumentException("Bad currentSize, originalSize: " + array.length + " currentSize: " + currentSize); + } + + if (currentSize + 1 <= array.length) { + System.arraycopy(array, index, array, index + 1, currentSize - index); + array[index] = element; + return array; + } + + int[] newArray = new int[SparseIntArray.growSize(currentSize)]; + System.arraycopy(array, 0, newArray, 0, index); + newArray[index] = element; + System.arraycopy(array, index, newArray, index + 1, array.length - index); + return newArray; + } + + /** + * {@inheritDoc} + * + *

This implementation composes a string by iterating over its mappings. + */ + @Override + public String toString() { + if (size() <= 0) { + return "{}"; + } + + StringBuilder buffer = new StringBuilder(mSize * 28); + buffer.append('{'); + for (int i = 0; i < mSize; i++) { + if (i > 0) { + buffer.append(", "); + } + int key = keyAt(i); + buffer.append(key); + buffer.append('='); + int value = valueAt(i); + buffer.append(value); + } + buffer.append('}'); + return buffer.toString(); + } +} diff --git a/third-party/bsdiff-util/.gitignore b/third-party/bsdiff-util/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/third-party/bsdiff-util/.gitignore @@ -0,0 +1 @@ +/build diff --git a/third-party/bsdiff-util/LICENSE.txt b/third-party/bsdiff-util/LICENSE.txt new file mode 100644 index 00000000..650abd25 --- /dev/null +++ b/third-party/bsdiff-util/LICENSE.txt @@ -0,0 +1,27 @@ +BSD License + +Copyright (C) 2016 THL A29 Limited, a Tencent company. +Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com) +Copyright 2003-2005 Colin Percival +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted providing that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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 AUTHOR ``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 AUTHOR 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. diff --git a/third-party/bsdiff-util/build.gradle b/third-party/bsdiff-util/build.gradle new file mode 100644 index 00000000..4153cea7 --- /dev/null +++ b/third-party/bsdiff-util/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'java' + +[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +task buildSdk(type: Copy, dependsOn: [build]) { + from('build/libs') { + include '*.jar' + exclude '*javadoc.jar' + exclude '*-sources.jar' + } + into(rootProject.file("buildSdk/android")) +} + +apply from: rootProject.file('gradle/java-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') \ No newline at end of file diff --git a/third-party/bsdiff-util/gradle.properties b/third-party/bsdiff-util/gradle.properties new file mode 100644 index 00000000..7c4e5751 --- /dev/null +++ b/third-party/bsdiff-util/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=bsdiff-util +POM_NAME=BsDiff Util +POM_PACKAGING=jar \ No newline at end of file diff --git a/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSDiff.java b/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSDiff.java new file mode 100644 index 00000000..545c7664 --- /dev/null +++ b/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSDiff.java @@ -0,0 +1,550 @@ +/* + * Copyright (C) 2016 THL A29 Limited, a Tencent company. + * Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com) + * Copyright 2003-2005 Colin Percival + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted providing that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR ``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 AUTHOR 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. + */ +package com.tencent.tinker.bsdiff; + + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +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.util.zip.GZIPOutputStream; + +/** + * Java Binary Diff utility. Based on bsdiff (v4.2) by Colin Percival (see http://www.daemonology.net/bsdiff/ ) and distributed under BSD license. + * Running this on large files will probably require an increase of the default maximum heap size (use java -Xmx300m) + */ +public class BSDiff { + + //private static final String VERSION = "jbdiff-0.1.0.1"; + + // This is + private static final byte[] MAGIC_BYTES = new byte[]{0x4D, 0x69, 0x63, + 0x72, 0x6F, 0x4D, 0x73, 0x67}; + + private static void split(int[] arrayI, int[] arrayV, int start, int len, int h) { + + int i, j, k, x, tmp, jj, kk; + + if (len < 16) { + for (k = start; k < start + len; k += j) { + j = 1; + x = arrayV[arrayI[k] + h]; + for (i = 1; k + i < start + len; i++) { + if (arrayV[arrayI[k + i] + h] < x) { + x = arrayV[arrayI[k + i] + h]; + j = 0; + } + + if (arrayV[arrayI[k + i] + h] == x) { + tmp = arrayI[k + j]; + arrayI[k + j] = arrayI[k + i]; + arrayI[k + i] = tmp; + j++; + } + + } + + for (i = 0; i < j; i++) { + arrayV[arrayI[k + i]] = k + j - 1; + } + if (j == 1) { + arrayI[k] = -1; + } + } + + return; + } + + x = arrayV[arrayI[start + len / 2] + h]; + jj = 0; + kk = 0; + for (i = start; i < start + len; i++) { + if (arrayV[arrayI[i] + h] < x) { + jj++; + } + if (arrayV[arrayI[i] + h] == x) { + kk++; + } + } + + jj += start; + kk += jj; + + i = start; + j = 0; + k = 0; + while (i < jj) { + if (arrayV[arrayI[i] + h] < x) { + i++; + } else if (arrayV[arrayI[i] + h] == x) { + tmp = arrayI[i]; + arrayI[i] = arrayI[jj + j]; + arrayI[jj + j] = tmp; + j++; + } else { + tmp = arrayI[i]; + arrayI[i] = arrayI[kk + k]; + arrayI[kk + k] = tmp; + k++; + } + + } + + while (jj + j < kk) { + if (arrayV[arrayI[jj + j] + h] == x) { + j++; + } else { + tmp = arrayI[jj + j]; + arrayI[jj + j] = arrayI[kk + k]; + arrayI[kk + k] = tmp; + k++; + } + + } + + if (jj > start) { + split(arrayI, arrayV, start, jj - start, h); + } + + for (i = 0; i < kk - jj; i++) { + arrayV[arrayI[jj + i]] = kk - 1; + } + + if (jj == kk - 1) { + arrayI[jj] = -1; + } + + if (start + len > kk) { + split(arrayI, arrayV, kk, start + len - kk, h); + } + + } + + /** + * Fast suffix sporting. Larsson and Sadakane's qsufsort algorithm. See + * http://www.cs.lth.se/Research/Algorithms/Papers/jesper5.ps + */ + private static void qsufsort(int[] arrayI, int[] arrayV, byte[] oldBuf, int oldsize) { + + // int oldsize = oldBuf.length; + int[] buckets = new int[256]; + + // No need to do that in Java. + // for ( int i = 0; i < 256; i++ ) { + // buckets[i] = 0; + // } + + for (int i = 0; i < oldsize; i++) { + buckets[oldBuf[i] & 0xff]++; + } + + for (int i = 1; i < 256; i++) { + buckets[i] += buckets[i - 1]; + } + + for (int i = 255; i > 0; i--) { + buckets[i] = buckets[i - 1]; + } + + buckets[0] = 0; + + for (int i = 0; i < oldsize; i++) { + arrayI[++buckets[oldBuf[i] & 0xff]] = i; + } + + arrayI[0] = oldsize; + for (int i = 0; i < oldsize; i++) { + arrayV[i] = buckets[oldBuf[i] & 0xff]; + } + arrayV[oldsize] = 0; + + for (int i = 1; i < 256; i++) { + if (buckets[i] == buckets[i - 1] + 1) { + arrayI[buckets[i]] = -1; + } + } + + arrayI[0] = -1; + + for (int h = 1; arrayI[0] != -(oldsize + 1); h += h) { + int len = 0; + int i; + for (i = 0; i < oldsize + 1;) { + if (arrayI[i] < 0) { + len -= arrayI[i]; + i -= arrayI[i]; + } else { + // if(len) I[i-len]=-len; + if (len != 0) { + arrayI[i - len] = -len; + } + len = arrayV[arrayI[i]] + 1 - i; + split(arrayI, arrayV, i, len, h); + i += len; + len = 0; + } + + } + + if (len != 0) { + arrayI[i - len] = -len; + } + } + + for (int i = 0; i < oldsize + 1; i++) { + arrayI[arrayV[i]] = i; + } + } + + + /** + * 分别将 oldBufd[start..oldSize] 和 oldBufd[end..oldSize] 与 newBuf[newBufOffset...newSize] 进行匹配, + * 返回他们中的最长匹配长度,并且将最长匹配的开始位置记录到pos.value中。 + */ + private static int search(int[] arrayI, byte[] oldBuf, int oldSize, byte[] newBuf, int newSize, int newBufOffset, int start, int end, IntByRef pos) { + + if (end - start < 2) { + int x = matchlen(oldBuf, oldSize, arrayI[start], newBuf, newSize, newBufOffset); + int y = matchlen(oldBuf, oldSize, arrayI[end], newBuf, newSize, newBufOffset); + + if (x > y) { + pos.value = arrayI[start]; + return x; + } else { + pos.value = arrayI[end]; + return y; + } + } + + // binary search + int x = start + (end - start) / 2; + if (memcmp(oldBuf, oldSize, arrayI[x], newBuf, newSize, newBufOffset) < 0) { + return search(arrayI, oldBuf, oldSize, newBuf, newSize, newBufOffset, x, end, pos); // Calls itself recursively + } else { + return search(arrayI, oldBuf, oldSize, newBuf, newSize, newBufOffset, start, x, pos); + } + } + + + /** + * Count the number of bytes that match in oldBuf[oldOffset...oldSize] and newBuf[newOffset...newSize] + */ + private static int matchlen(byte[] oldBuf, int oldSize, int oldOffset, byte[] newBuf, int newSize, int newOffset) { + + int end = Math.min(oldSize - oldOffset, newSize - newOffset); + for (int i = 0; i < end; i++) { + if (oldBuf[oldOffset + i] != newBuf[newOffset + i]) { + return i; + } + } + return end; + } + + /** + * Compare two byte array segments to see if they are equal + * + * return 1 if s1[s1offset...s1Size] is bigger than s2[s2offset...s2Size] otherwise return -1 + */ + private static int memcmp(byte[] s1, int s1Size, int s1offset, byte[] s2, int s2Size, int s2offset) { + + int n = s1Size - s1offset; + + if (n > (s2Size - s2offset)) { + n = s2Size - s2offset; + } + + for (int i = 0; i < n; i++) { + + if (s1[i + s1offset] != s2[i + s2offset]) { + return s1[i + s1offset] < s2[i + s2offset] ? -1 : 1; + } + } + return 0; + } + + + public static void bsdiff(File oldFile, File newFile, File diffFile) throws IOException { + InputStream oldInputStream = new BufferedInputStream(new FileInputStream(oldFile)); + InputStream newInputStream = new BufferedInputStream(new FileInputStream(newFile)); + OutputStream diffOutputStream = new FileOutputStream(diffFile); + try { + byte[] diffBytes = bsdiff(oldInputStream, (int) oldFile.length(), newInputStream, (int) newFile.length()); + diffOutputStream.write(diffBytes); + } finally { + diffOutputStream.close(); + } + } + + + public static byte[] bsdiff(InputStream oldInputStream, int oldsize, InputStream newInputStream, int newsize) throws IOException { + + byte[] oldBuf = new byte[oldsize]; + + BSUtil.readFromStream(oldInputStream, oldBuf, 0, oldsize); + oldInputStream.close(); + + byte[] newBuf = new byte[newsize]; + BSUtil.readFromStream(newInputStream, newBuf, 0, newsize); + newInputStream.close(); + + return bsdiff(oldBuf, oldsize, newBuf, newsize); + } + + + public static byte[] bsdiff(byte[] oldBuf, int oldsize, byte[] newBuf, int newsize) throws IOException { + + int[] arrayI = new int[oldsize + 1]; + qsufsort(arrayI, new int[oldsize + 1], oldBuf, oldsize); + + // diff block + int diffBLockLen = 0; + byte[] diffBlock = new byte[newsize]; + + // extra block + int extraBlockLen = 0; + byte[] extraBlock = new byte[newsize]; + + /* + * Diff file is composed as follows: + * + * Header (32 bytes) Data (from offset 32 to end of file) + * + * Header: + * Offset 0, length 8 bytes: file magic "MicroMsg" + * Offset 8, length 8 bytes: length of compressed ctrl block + * Offset 16, length 8 bytes: length of compressed diff block + * Offset 24, length 8 bytes: length of new file + * + * Data: + * 32 (length ctrlBlockLen): ctrlBlock (bzip2) + * 32 + ctrlBlockLen (length diffBlockLen): diffBlock (bzip2) + * 32 + ctrlBlockLen + diffBlockLen (to end of file): extraBlock (bzip2) + * + * ctrlBlock comprises a set of records, each record 12 bytes. + * A record comprises 3 x 32 bit integers. The ctrlBlock is not compressed. + */ + + ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + DataOutputStream diffOut = new DataOutputStream(byteOut); + + // Write as much of header as we have now. Size of ctrlBlock and diffBlock must be filled in later. + diffOut.write(MAGIC_BYTES); + diffOut.writeLong(-1); // place holder for ctrlBlockLen + diffOut.writeLong(-1); // place holder for diffBlockLen + diffOut.writeLong(newsize); + diffOut.flush(); + + GZIPOutputStream bzip2Out = new GZIPOutputStream(diffOut); + DataOutputStream dataOut = new DataOutputStream(bzip2Out); + + int oldscore, scsc; + + int overlap, ss, lens; + int i; + int scan = 0; + int matchLen = 0; + int lastscan = 0; + int lastpos = 0; + int lastoffset = 0; + + IntByRef pos = new IntByRef(); + // int ctrlBlockLen = 0; + + while (scan < newsize) { + oldscore = 0; + + for (scsc = scan += matchLen; scan < newsize; scan++) { + // oldBuf[0...oldsize] newBuf[scan...newSize]. pos.value,scan + matchLen = search(arrayI, oldBuf, oldsize, newBuf, newsize, scan, 0, oldsize, pos); + + for (; scsc < scan + matchLen; scsc++) { + if ((scsc + lastoffset < oldsize) && (oldBuf[scsc + lastoffset] == newBuf[scsc])) { + oldscore++; + } + } + + if (((matchLen == oldscore) && (matchLen != 0)) || (matchLen > oldscore + 8)) { + break; + } + + if ((scan + lastoffset < oldsize) && (oldBuf[scan + lastoffset] == newBuf[scan])) { + oldscore--; + } + } + + if ((matchLen != oldscore) || (scan == newsize)) { + + int equalNum = 0; + int sf = 0; + int lenFromOld = 0; + for (i = 0; (lastscan + i < scan) && (lastpos + i < oldsize);) { + if (oldBuf[lastpos + i] == newBuf[lastscan + i]) { + equalNum++; + } + i++; + if (equalNum * 2 - i > sf * 2 - lenFromOld) { + sf = equalNum; + lenFromOld = i; + } + } + + int lenb = 0; + if (scan < newsize) { + equalNum = 0; + int sb = 0; + for (i = 1; (scan >= lastscan + i) && (pos.value >= i); i++) { + if (oldBuf[pos.value - i] == newBuf[scan - i]) { + equalNum++; + } + if (equalNum * 2 - i > sb * 2 - lenb) { + sb = equalNum; + lenb = i; + } + } + } + + if (lastscan + lenFromOld > scan - lenb) { + overlap = (lastscan + lenFromOld) - (scan - lenb); + equalNum = 0; + ss = 0; + lens = 0; + for (i = 0; i < overlap; i++) { + if (newBuf[lastscan + lenFromOld - overlap + i] == oldBuf[lastpos + lenFromOld - overlap + i]) { + equalNum++; + } + if (newBuf[scan - lenb + i] == oldBuf[pos.value - lenb + i]) { + equalNum--; + } + if (equalNum > ss) { + ss = equalNum; + lens = i + 1; + } + } + + lenFromOld += lens - overlap; + lenb -= lens; + } + + // ? byte casting introduced here -- might affect things + for (i = 0; i < lenFromOld; i++) { + diffBlock[diffBLockLen + i] = (byte) (newBuf[lastscan + i] - oldBuf[lastpos + i]); + } + + for (i = 0; i < (scan - lenb) - (lastscan + lenFromOld); i++) { + extraBlock[extraBlockLen + i] = newBuf[lastscan + lenFromOld + i]; + } + + diffBLockLen += lenFromOld; + extraBlockLen += (scan - lenb) - (lastscan + lenFromOld); + + // Write control block entry (3 x int) + dataOut.writeInt(lenFromOld); // oldBuf + dataOut.writeInt((scan - lenb) - (lastscan + lenFromOld)); // diffBufextraBlock + dataOut.writeInt((pos.value - lenb) - (lastpos + lenFromOld)); // oldBuf + + lastscan = scan - lenb; + lastpos = pos.value - lenb; + lastoffset = pos.value - scan; + } // end if + } // end while loop + + dataOut.flush(); + bzip2Out.finish(); + + // now compressed ctrlBlockLen + int ctrlBlockLen = diffOut.size() - BSUtil.HEADER_SIZE; + + // GZIPOutputStream gzOut; + + /* + * Write diff block + */ + bzip2Out = new GZIPOutputStream(diffOut); + bzip2Out.write(diffBlock, 0, diffBLockLen); + bzip2Out.finish(); + bzip2Out.flush(); + int diffBlockLen = diffOut.size() - ctrlBlockLen - BSUtil.HEADER_SIZE; + // System.err.println( "Diff: diffBlockLen=" + diffBlockLen ); + + /* + * Write extra block + */ + bzip2Out = new GZIPOutputStream(diffOut); + bzip2Out.write(extraBlock, 0, extraBlockLen); + bzip2Out.finish(); + bzip2Out.flush(); + + diffOut.close(); + + /* + * Write missing header info. + */ + ByteArrayOutputStream byteHeaderOut = new ByteArrayOutputStream(BSUtil.HEADER_SIZE); + DataOutputStream headerOut = new DataOutputStream(byteHeaderOut); + headerOut.write(MAGIC_BYTES); + headerOut.writeLong(ctrlBlockLen); // place holder for ctrlBlockLen + headerOut.writeLong(diffBlockLen); // place holder for diffBlockLen + headerOut.writeLong(newsize); + headerOut.close(); + + // Copy header information into the diff + byte[] diffBytes = byteOut.toByteArray(); + byte[] headerBytes = byteHeaderOut.toByteArray(); + + System.arraycopy(headerBytes, 0, diffBytes, 0, headerBytes.length); + + return diffBytes; + } + +// /** +// * Run JBDiff from the command line. Params: oldfile newfile difffile. diff +// * file will be created. +// */ +// public static void main(String[] arg) throws IOException { +// +// if (arg.length != 3) { +// System.err.println("usage example: java -Xmx250m JBDiff oldfile newfile patchfile\n"); +// return; +// } +// File oldFile = new File(arg[0]); +// File newFile = new File(arg[1]); +// File diffFile = new File(arg[2]); +// +// bsdiff(oldFile, newFile, diffFile); +// +// } + + private static class IntByRef { + private int value; + } +} diff --git a/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSPatch.java b/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSPatch.java new file mode 100644 index 00000000..2e8d7269 --- /dev/null +++ b/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSPatch.java @@ -0,0 +1,384 @@ +/* + * Copyright (C) 2016 THL A29 Limited, a Tencent company. + * Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com) + * Copyright 2003-2005 Colin Percival + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted providing that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR ``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 AUTHOR 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. + */ + +package com.tencent.tinker.bsdiff; + + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +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.io.RandomAccessFile; +import java.util.zip.GZIPInputStream; + + +/** + * Java Binary patcher (based on bspatch by Joe Desbonnet, joe@galway.net (JBPatch)) + */ +public class BSPatch { + + /** + * the patch process is end up successfully + */ + public static final int RETURN_SUCCESS = 1; + + /** + * diffFile is null, or the diffFile does not exist + */ + public static final int RETURN_DIFF_FILE_ERR = 2; + + /** + * oldFile is null, or the oldFile does not exist + */ + public static final int RETURN_OLD_FILE_ERR = 3; + + /** + * newFile is null, or can not create the newFile + */ + public static final int RETURN_NEW_FILE_ERR = 4; + + /** + * BSPatch using less memory size. + * Memory size = diffFile size + max block size + * + */ + public static int patchLessMemory(RandomAccessFile oldFile, File newFile, File diffFile, int extLen) throws IOException { + if (oldFile == null || oldFile.length() <= 0) { + return RETURN_OLD_FILE_ERR; + } + if (newFile == null) { + return RETURN_NEW_FILE_ERR; + } + if (diffFile == null || diffFile.length() <= 0) { + return RETURN_DIFF_FILE_ERR; + } + + byte[] diffBytes = new byte[(int) diffFile.length()]; + InputStream diffInputStream = new FileInputStream(diffFile); + try { + BSUtil.readFromStream(diffInputStream, diffBytes, 0, diffBytes.length); + } finally { + diffInputStream.close(); + } + return patchLessMemory(oldFile, (int) oldFile.length(), diffBytes, diffBytes.length, newFile, extLen); + } + + /** + * BSPatch using less memory size. + * Memory size = diffFile size + max block size + * extLen the length of the apk external info. set 0 if has no external info. + */ + public static int patchLessMemory(RandomAccessFile oldFile, int oldsize, byte[] diffBuf, int diffSize, File newFile, int extLen) throws IOException { + + if (oldFile == null || oldsize <= 0) { + return RETURN_OLD_FILE_ERR; + } + if (newFile == null) { + return RETURN_NEW_FILE_ERR; + } + if (diffBuf == null || diffSize <= 0) { + return RETURN_DIFF_FILE_ERR; + } + + int commentLenPos = oldsize - extLen - 2; + if (commentLenPos <= 2) { + return RETURN_OLD_FILE_ERR; + } + + DataInputStream diffIn = new DataInputStream(new ByteArrayInputStream(diffBuf, 0, diffSize)); + + diffIn.skip(8); // skip headerMagic at header offset 0 (length 8 bytes) + long ctrlBlockLen = diffIn.readLong(); // ctrlBlockLen after bzip2 compression at heater offset 8 (length 8 bytes) + long diffBlockLen = diffIn.readLong(); // diffBlockLen after bzip2 compression at header offset 16 (length 8 bytes) + int newsize = (int) diffIn.readLong(); // size of new file at header offset 24 (length 8 bytes) + + diffIn.close(); + + InputStream in = new ByteArrayInputStream(diffBuf, 0, diffSize); + in.skip(BSUtil.HEADER_SIZE); + DataInputStream ctrlBlockIn = new DataInputStream(new GZIPInputStream(in)); + + in = new ByteArrayInputStream(diffBuf, 0, diffSize); + in.skip(ctrlBlockLen + BSUtil.HEADER_SIZE); + InputStream diffBlockIn = new GZIPInputStream(in); + + in = new ByteArrayInputStream(diffBuf, 0, diffSize); + in.skip(diffBlockLen + ctrlBlockLen + BSUtil.HEADER_SIZE); + InputStream extraBlockIn = new GZIPInputStream(in); + + OutputStream outStream = new FileOutputStream(newFile); + try { + int oldpos = 0; + int newpos = 0; + int[] ctrl = new int[3]; + + // int nbytes; + while (newpos < newsize) { + + for (int i = 0; i <= 2; i++) { + ctrl[i] = ctrlBlockIn.readInt(); + } + + if (newpos + ctrl[0] > newsize) { + outStream.close(); + return RETURN_DIFF_FILE_ERR; + } + + // Read ctrl[0] bytes from diffBlock stream + byte[] buffer = new byte[ctrl[0]]; + if (!BSUtil.readFromStream(diffBlockIn, buffer, 0, ctrl[0])) { + outStream.close(); + return RETURN_DIFF_FILE_ERR; + } + + byte[] oldBuffer = new byte[ctrl[0]]; + if (oldFile.read(oldBuffer, 0, ctrl[0]) < ctrl[0]) { + outStream.close(); + return RETURN_DIFF_FILE_ERR; + } + for (int i = 0; i < ctrl[0]; i++) { + if (oldpos + i == commentLenPos) { + oldBuffer[i] = 0; + oldBuffer[i + 1] = 0; + } + + if ((oldpos + i >= 0) && (oldpos + i < oldsize)) { + buffer[i] += oldBuffer[i]; + } + } + outStream.write(buffer); + +// System.out.println(""+ctrl[0]+ ", " + ctrl[1]+ ", " + ctrl[2]); + + newpos += ctrl[0]; + oldpos += ctrl[0]; + + if (newpos + ctrl[1] > newsize) { + outStream.close(); + return RETURN_DIFF_FILE_ERR; + } + + buffer = new byte[ctrl[1]]; + if (!BSUtil.readFromStream(extraBlockIn, buffer, 0, ctrl[1])) { + outStream.close(); + return RETURN_DIFF_FILE_ERR; + } + outStream.write(buffer); + outStream.flush(); + + newpos += ctrl[1]; + oldpos += ctrl[2]; + oldFile.seek(oldpos); + } + ctrlBlockIn.close(); + diffBlockIn.close(); + extraBlockIn.close(); + } finally { + oldFile.close(); + outStream.close(); + } + return RETURN_SUCCESS; + } + + /** + * This patch method is fast ,but using more memory. + * Memory size = oldBuf + diffBuf + newBuf + * + */ + public static int patchFast(File oldFile, File newFile, File diffFile, int extLen) throws IOException { + if (oldFile == null || oldFile.length() <= 0) { + return RETURN_OLD_FILE_ERR; + } + if (newFile == null) { + return RETURN_NEW_FILE_ERR; + } + if (diffFile == null || diffFile.length() <= 0) { + return RETURN_DIFF_FILE_ERR; + } + + InputStream oldInputStream = new BufferedInputStream(new FileInputStream(oldFile)); + byte[] diffBytes = new byte[(int) diffFile.length()]; + InputStream diffInputStream = new FileInputStream(diffFile); + try { + BSUtil.readFromStream(diffInputStream, diffBytes, 0, diffBytes.length); + } finally { + diffInputStream.close(); + } + + byte[] newBytes = patchFast(oldInputStream, (int) oldFile.length(), diffBytes, extLen); + + OutputStream newOutputStream = new FileOutputStream(newFile); + try { + newOutputStream.write(newBytes); + } finally { + newOutputStream.close(); + } + return RETURN_SUCCESS; + } + + /** + * This patch method is fast ,but using more memory. + * Memory size = oldBuf + diffBuf + newBuf + * + */ + public static int patchFast(InputStream oldInputStream, InputStream diffInputStream, File newFile) throws IOException { + if (oldInputStream == null) { + return RETURN_OLD_FILE_ERR; + } + if (newFile == null) { + return RETURN_NEW_FILE_ERR; + } + if (diffInputStream == null) { + return RETURN_DIFF_FILE_ERR; + } + + byte[] oldBytes = BSUtil.inputStreamToByte(oldInputStream); + byte[] diffBytes = BSUtil.inputStreamToByte(diffInputStream); + + byte[] newBytes = patchFast(oldBytes, oldBytes.length, diffBytes, diffBytes.length, 0); + + OutputStream newOutputStream = new FileOutputStream(newFile); + try { + newOutputStream.write(newBytes); + } finally { + newOutputStream.close(); + } + return RETURN_SUCCESS; + } + + public static byte[] patchFast(InputStream oldInputStream, InputStream diffInputStream) throws IOException { + if (oldInputStream == null) { + return null; + } + + if (diffInputStream == null) { + return null; + } + + byte[] oldBytes = BSUtil.inputStreamToByte(oldInputStream); + byte[] diffBytes = BSUtil.inputStreamToByte(diffInputStream); + + byte[] newBytes = patchFast(oldBytes, oldBytes.length, diffBytes, diffBytes.length, 0); + return newBytes; + } + + /** + * This patch method is fast ,but using more memory. + * Memory size = oldBuf + diffBuf + newBuf + */ + public static byte[] patchFast(InputStream oldInputStream, int oldsize, byte[] diffBytes, int extLen) throws IOException { + // Read in old file (file to be patched) to oldBuf + byte[] oldBuf = new byte[oldsize]; + BSUtil.readFromStream(oldInputStream, oldBuf, 0, oldsize); + oldInputStream.close(); + + return BSPatch.patchFast(oldBuf, oldsize, diffBytes, diffBytes.length, extLen); + } + + /** + * This patch method is fast ,but using more memory. + * Memory size = oldBuf + diffBuf + newBuf + */ + public static byte[] patchFast(byte[] oldBuf, int oldsize, byte[] diffBuf, int diffSize, int extLen) throws IOException { + DataInputStream diffIn = new DataInputStream(new ByteArrayInputStream(diffBuf, 0, diffSize)); + + diffIn.skip(8); // skip headerMagic at header offset 0 (length 8 bytes) + long ctrlBlockLen = diffIn.readLong(); // ctrlBlockLen after bzip2 compression at heater offset 8 (length 8 bytes) + long diffBlockLen = diffIn.readLong(); // diffBlockLen after bzip2 compression at header offset 16 (length 8 bytes) + int newsize = (int) diffIn.readLong(); // size of new file at header offset 24 (length 8 bytes) + + diffIn.close(); + + InputStream in = new ByteArrayInputStream(diffBuf, 0, diffSize); + in.skip(BSUtil.HEADER_SIZE); + DataInputStream ctrlBlockIn = new DataInputStream(new GZIPInputStream(in)); + + in = new ByteArrayInputStream(diffBuf, 0, diffSize); + in.skip(ctrlBlockLen + BSUtil.HEADER_SIZE); + InputStream diffBlockIn = new GZIPInputStream(in); + + in = new ByteArrayInputStream(diffBuf, 0, diffSize); + in.skip(diffBlockLen + ctrlBlockLen + BSUtil.HEADER_SIZE); + InputStream extraBlockIn = new GZIPInputStream(in); + + // byte[] newBuf = new byte[newsize + 1]; + byte[] newBuf = new byte[newsize]; + + int oldpos = 0; + int newpos = 0; + int[] ctrl = new int[3]; + + // int nbytes; + while (newpos < newsize) { + + for (int i = 0; i <= 2; i++) { + ctrl[i] = ctrlBlockIn.readInt(); + } + + if (newpos + ctrl[0] > newsize) { + throw new IOException("Corrupt by wrong patch file."); + } + + // Read ctrl[0] bytes from diffBlock stream + if (!BSUtil.readFromStream(diffBlockIn, newBuf, newpos, ctrl[0])) { + throw new IOException("Corrupt by wrong patch file."); + } + + for (int i = 0; i < ctrl[0]; i++) { + if ((oldpos + i >= 0) && (oldpos + i < oldsize)) { + newBuf[newpos + i] += oldBuf[oldpos + i]; + } + } + + newpos += ctrl[0]; + oldpos += ctrl[0]; + + if (newpos + ctrl[1] > newsize) { + throw new IOException("Corrupt by wrong patch file."); + } + + if (!BSUtil.readFromStream(extraBlockIn, newBuf, newpos, ctrl[1])) { + throw new IOException("Corrupt by wrong patch file."); + } + + newpos += ctrl[1]; + oldpos += ctrl[2]; + } + ctrlBlockIn.close(); + diffBlockIn.close(); + extraBlockIn.close(); + + return newBuf; + } + +} \ No newline at end of file diff --git a/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSUtil.java b/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSUtil.java new file mode 100644 index 00000000..eec30304 --- /dev/null +++ b/third-party/bsdiff-util/src/main/java/com/tencent/tinker/bsdiff/BSUtil.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2016 THL A29 Limited, a Tencent company. + * Copyright (c) 2005, Joe Desbonnet, (jdesbonnet@gmail.com) + * Copyright 2003-2005 Colin Percival + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted providing that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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 AUTHOR ``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 AUTHOR 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. + */ + +package com.tencent.tinker.bsdiff; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class BSUtil { + + // JBDiff extensions by Stefan.Liebig@compeople.de: + // + // - introduced a HEADER_SIZE constant here + + /** + * Length of the diff file header. + */ + public static final int HEADER_SIZE = 32; + public static final int BUFFER_SIZE = 8192; + + + /** + * Read from input stream and fill the given buffer from the given offset up + * to length len. + */ + public static final boolean readFromStream(InputStream in, byte[] buf, int offset, int len) throws IOException { + + int totalBytesRead = 0; + while (totalBytesRead < len) { + int bytesRead = in.read(buf, offset + totalBytesRead, len - totalBytesRead); + if (bytesRead < 0) { + return false; + } + totalBytesRead += bytesRead; + } + return true; + } + + /** + * input stream to byte + * @param in InputStream + * @return byte[] + * @throws IOException + */ + public static byte[] inputStreamToByte(InputStream in) throws IOException { + + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] data = new byte[BUFFER_SIZE]; + int count = -1; + while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) { + outStream.write(data, 0, count); + } + + data = null; + return outStream.toByteArray(); + } +} \ No newline at end of file diff --git a/third-party/seven-zip/.gitignore b/third-party/seven-zip/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/third-party/seven-zip/.gitignore @@ -0,0 +1 @@ +/build diff --git a/third-party/seven-zip/License.txt b/third-party/seven-zip/License.txt new file mode 100644 index 00000000..2c6b3074 --- /dev/null +++ b/third-party/seven-zip/License.txt @@ -0,0 +1,52 @@ + 7-Zip source code + ~~~~~~~~~~~~~~~~~ + License for use and distribution + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + 7-Zip Copyright (C) 1999-2016 Igor Pavlov. + + Licenses for files are: + + 1) CPP/7zip/Compress/Rar* files: GNU LGPL + unRAR restriction + 2) All other files: GNU LGPL + + The GNU LGPL + unRAR restriction means that you must follow both + GNU LGPL rules and unRAR restriction rules. + + + GNU LGPL information + -------------------- + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + unRAR restriction + ----------------- + + The decompression engine for RAR archives was developed using source + code of unRAR program. + All copyrights to original unRAR code are owned by Alexander Roshal. + + The license for original unRAR code has the following restriction: + + The unRAR sources cannot be used to re-create the RAR compression algorithm, + which is proprietary. Distribution of modified unRAR sources in separate form + or as a part of other software is permitted, provided that it is clearly + stated in the documentation and source comments that the code may + not be used to develop a RAR (WinRAR) compatible archiver. + + + -- + Igor Pavlov diff --git a/third-party/seven-zip/build.gradle b/third-party/seven-zip/build.gradle new file mode 100644 index 00000000..94e1be6e --- /dev/null +++ b/third-party/seven-zip/build.gradle @@ -0,0 +1,68 @@ +apply plugin: 'maven' +apply plugin: 'maven-publish' +apply plugin: 'com.jfrog.bintray' + +//hardcode 1.0.0 +version "1.0.0" +group rootProject.ext.GROUP + + +publishing { + publications { + SevenZipPub(MavenPublication) { + artifactId project.getName() + groupId group + artifact("executable/SevenZip-linux-x86_32.exe") { + classifier "linux-x86_32" + extension "exe" + } + artifact("executable/SevenZip-linux-x86_64.exe") { + classifier "linux-x86_64" + extension "exe" + } + artifact("executable/SevenZip-windows-x86_32.exe") { + classifier "windows-x86_32" + extension "exe" + } + artifact("executable/SevenZip-windows-x86_64.exe") { + classifier "windows-x86_64" + extension "exe" + } + artifact("executable/SevenZip-osx-x86_64.exe") { + classifier "osx-x86_64" + extension "exe" + } + } + } +} + +task buildAndPublishLocalMaven(dependsOn: 'publishSevenZipPubPublicationToMavenLocal') { + +} + +artifacts { + archives(file("executable/SevenZip-linux-x86_32.exe")) { + classifier "linux-x86_32" + extension "exe" + } + archives(file("executable/SevenZip-linux-x86_64.exe")) { + classifier "linux-x86_64" + extension "exe" + } + archives(file("executable/SevenZip-windows-x86_32.exe")) { + classifier "windows-x86_32" + extension "exe" + } + archives(file("executable/SevenZip-windows-x86_64.exe")) { + classifier "windows-x86_64" + extension "exe" + } + archives(file("executable/SevenZip-osx-x86_64.exe")) { + classifier "osx-x86_64" + extension "exe" + } +} +//don't upload sevenZip default +if (hasProperty('UPLOAD_SEVEN_ZIP')) { + apply from: rootProject.file('gradle/gradle-mvn-push.gradle') +} diff --git a/third-party/seven-zip/executable/SevenZip-linux-x86_32.exe b/third-party/seven-zip/executable/SevenZip-linux-x86_32.exe new file mode 100755 index 0000000000000000000000000000000000000000..f1c18e4b7b5870194788bf52401842d7d82ceeb3 GIT binary patch literal 1620784 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

TaQE)9`tl3qxGmEKA2; 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

k%& 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

eq*ApNM~F@G%bhFWgMQ>t?>}2? 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

y;70NhD)ZVBkgBDSAITBbFM5 z{h@J7UDmR(?!K|qAYQ+XDSqR!08ahA4WDs2cvh}b`F^GOLVnjvv&rhm(+rd?ESNqa z>}&i|axJyvL?(o(B*geu9{n%O!l|ScLF_Qn{{OrF*nhs&hyDpt)C#c#h}Vdc|cEJH|uuMZK7}bV8JM%1iZiTu9OKFwjB0%xJrDKfhXol{GbN> zk!(^4PX81_=N_0BvW z^(QE`h_ND1HxEWhoMp2Dfwt;*v{n;$r0pGV! zAsJcwj7#@nDcAr966Qr-_p}}6MOg!;iFk0cpDgC7;C2*z%W^DD-R#tZ7+$ zrgbGVsigkzMBQQy#M^J7Y4@Of1bo0bjV+?0-cD?ef?eHTl{Exn?-4*YWgK4(EHCO zN}~6l2M|H@rsc1u3e)~GhUBkRv|BNK>Pakhv8^#SwP}md(2`b1TH4T8YmBwSmQI#z zNvVfHZ%Dj_GRLC7{`|UtFa7|}JuF^XUE^L)1VKe-4CKBdIT(I%VrM^UUA(Tt6$S0? zCVd|{fJSskJOhL#Mv?&5XqwVI2#P|USsV>IT|Xc%nfl)^MegH@*6kx43?8j(WIhqWElUrHnUJ5|i^T!!SQMJro+&cYmyn623b*)GB9p@@vQUKF9a(t#WoJ zD=;l(-j3uph*b3VD^~iBeB8?0nY`6X-AQsqCz3@3BD7> zHEqQ;)EnJHd6guUBT8|}T(4L8_!g%VfY%%NLx=2w`tlJ94v9CQ2%x2Etx9heQ>WhH zxFsrXxk=q3vpe{|QLtxp`6e!>%T96m+#jdDx}&;E{29$PSyykA@a3}7fLWa_FPE96 zIe524Ud=U2htWn_ikrG4@REyBGTJO1W0Z_BOUD^xD$7XG z5W*pZful=glEjot`FZF>^`(iD8nEq&Qv7x-?A7EhEQ+VxGyb`-bb3?C^o6BYHI-bo zu=MJtlB?TF7_YSL!QzB5j7dOyZHIXg*-uOXE|w7o@$L4I7)-j9k{YBoF7g-`c~@?S zFDiOZvZiZhjrjAW`?^v?#Y@<3T;&BQwzQhCgGY!anvqWjr&te%szlU#;~mlcCQ|?xIoJ*CpHr!N`ynD_2Lrw?R;5~VacweUpwsMOI)%cSmdIyOn_29)MbV4>7a zr7e-11MHqIkcFnUVf~}7$(7YDyVh397Ad$@#J7`5+5UvOf@?T!eEY__t5hxiLTXZd zSBb_$&A;VMxIPj;i+)|vG2(>YxPLRJ5kEWVXX?AOXP4nQfW`(~$LUjZA@-h{2K->Z z!Fc?4-g8aToepD<^L^ccMe%*U+x~8xnk1K(a(pSiL*2+x@d>_>bAuhPZ|qp{UcA6t zX2(w&GRQmL(?4p(XCeMXJAQokct7IRd#B5KL5`d1-Bl8h&-emgU^&cCfZy*8bbr4$ z!0-1046~Pkpp(Nu7I5yF0gXqXYXg~-X_}MoMr5?$PMBFt46hv2(a^ku=6ik~`G9wk z4~M3f7a#W3;kau@#kLjY0*$Uj(TKL95%iTlnXPw$>3xaivw8gKm)`C@Ap@g6^4PAf z+Fmt}(pb0fSeG7=HrDFB1jo^<4SNtQ>@a36gC)*=dQ4OHd&)w^^|#`j?{6Oxg~%@8*$bDT=!Q!G?$Dl+dC7;&5}jK5=r^nZ(G z5o~rxb*)Pr10GJVU)LcP8N%XpFj}-a((Ud(_WrgjxfdKFZe(1I2g7`g4`Mt}N>>#3 ziFSl=e`u7Kv&HK0`on360n6BO46$1D9PpHW6q!T*-%yQ|-)y#Mvzb-n{`xMqw}ROv zPB8)8o*H+CY{?MNHdg-XDguj#Pn6K!V%gt_CES5>Zss+4k}N0n3#7jq(5c2J8U=G+ z1`6`U9mpZ)r|65WF(P2UCI+F;;#x#92F3wL5(Ddn=by5@k{#WHUd#Nt;9M#=5B371 zkXyWf)Rwu^N)#gkRHHt>Y(bq=u(W4>3Of`IZofsD$e;R(Is>Hm8a~wQ>nzr>``K)n zJL+rbtJzo5&!ep59wbJ86Vc5WYeqxjC0WZe;$D=g$M;BT8V!6E`a7JOHV3iX--)VO zG~xj?irSmJ4i$+$6yp6f{X9it372_9Z1&Nxzl+_9-&0Jlc|_jE=&`BOm|tfg$vGJTzF|pd<Q+Ld!poE zQA$rfB>^!jBBNN;c)XFE(;$rNg=Yc zd$((l-M#A-2;D0u`s}HHlT;c<|4!2&yMM?Kf0cL10gk@ zmG?n^vACrv_%6KQlQ~IKaGe=^5Ec&Trcw41X*Xc(Lym`+@Gs_dTkuJA7HX>it|Ud5 zRMqx@M25BO^NcN(C*V@ijz! z3aO7HS@If$n$6%6EYZ<^G}HKfZfq-=7C!KvM7j9m^RjpHebBWqiWC*-qP2)!iQbEs z0JiWk7wEF_aW1wRCq721X7kLH_!y)?Ha;>G=wSHR4iyKHi~}DVG|0xs3JGF-tnA&L z$Z)WsQHOtdBunC-s~K0Do|IIzp6?5YEniSyu;?raiRI79eie#80xIPprRW`_B2l>n z7u`e{eHV`-TGA`md>zn5_@MV_R*O7rMLkhxS%8=b6ml9**vddR8g*k4rEQ4W&k~|7Y5ec)fQHOtU5!n^5aC$R3zl1;W5w zVC?CMR41tvj-feCgY2O>PJ$Rgq_3sH)ax7OKln04g~Wc0TJjBqbbFaz2QTZYcR{Yc z9>UTb;AL4?Aq0v?;0yFS(AUr#UxX{5Q}ljTc3j%iW#S69_!asu@dac8Uk?K}3STL{ ze~mTw72s6k>kh|$Vo&TVG(p+;D$^hvUuP=N!SR)?QaJF{TZ3$TeJyds_}T*@Z92Zr z!vUW0wHC>e6A;q)deR84!TT8l(J$;rgcKs>T~Ev2og?<)uArz#2c1-$K<6cWZ{e$i zz{lgvrV#zC6EkruU6%iYgba~6cAf(W*{cSJ2)RbJ!}3>s9X01`l<%bH?=5;2lXZIr zS?yUXKF8&F-CuirTBKOoxuZR+LH79kT7eEeKC@K{$M}%!oCcuS9-j&c;_)H*cl!A3 z>!-$N6p|%(BBa~P^qk!mY@scxEx4NgBu@j182=#W0$)QP2RWbqdpUCQye0B+#Zjz6 z|DE)_-lA7Ags(ti{5}UxH9fyVyVrs9UsIJ$&vhDPh_sNjh{Tg~4Y%wY!H6nl3<8b>@?LSQ4{--p3AB7n4 z2s-Sf?`MGwN#FZFqlCauD{v_BvrgPYyBXsLj5^!s!nu-`=<&BPd8!84n9NlmV6w+8-=*Rmc>GEs%0YJ@OAz$Lc}0kup?+Y@}o=5Rh^({#ig9 zK(ot%m;cfro4!^_kQ`g+ODTuFztloAfT)mo0LhYB7+TfGqF*#HCKFab>FujVfsq*xqLv1;6 zh>rqn@q^bf52DZ8dDw}Zm>VoR;#{WtXpoJ$Z`2STY_hzs;vGn9(IA^Bo|Pa*+8?Ba zj)N#FAq;1txC6HhPaN5!0NednZeOIl zArCuPTK{F6()zDKj{d75K4||{ytDrrwE*R0MUJnwOc8d;8Ja6>Q*(Kn=e6;%{Um z36~@rF#|Dsj{`RVyMuTa-e4R=-_hOi)=p!^Y{+poK1;u5f_{xeguXp@8Np^_EhOeR zujlQb0So@lT35pJa3~H1w|L z)_mYa<%%UtV97hdR)}jT`laDC+Tx3LJ)h+H@*ASB5@&w+=mAX6C)oddip6Up%F+A~ z@!2j_{_by3eqTrV3#{_x(eZ97|8rb7wAvRIPcx6C?ThA6`OlynT|OPMmi$Jxe+CR= z#S@fWwf}gle0kJ5mCC;(z5K~(99nCU^gLB+xP7L0MWn)BC5o4L=e9I1p5R^__PX>eNO=zAZF6; z#{6;Ov5PPtrJWw-XMLmPj{?4!GH5Np^Mxhw&6H&ndyR0GS>iXV0!Fdl2nWoPY@;}P zVM$I?F`RuJ-Bf(^!jhp)#Y3_BCrWZdiQ?RlxM>?PqX>^icyvfy!Qos6L0?X`1Z4oF z22%eaY4*wNhf&Gs}aq2@wpYjB^p5vNTT#IABQhqjY5&DheX+ENV zQXhuvon>U(`KK8}7G^Z{!6o5=)c+y?`Y-ex)#N#)p(Xl{sh3Hgees=RC>yq&&Z@2` z?0VW^M+C&RdWJ&x09+@^aBs9dH`>qmxF9ycpBveW?v=aW4vV{v#DHytd(5EU@EZ`{ zS8mPwINEoq3ohqo;`YhHBVzk>7**wOwp(1~yxYA5l;j>Vypr?D#s!Ze^ zr29|19tw`ng-@eJEv#%L9cU%q0HFS$EfDo1gJ0sa;4E6qXNslJmmyvK&Md5Jq$dDA z>d3+qb$JsncY;b_7Xh6}tLIc2ysB!E_gO!@>>v>1w6SDciaM|Fl`~d;p6z?3)V;FZ z->(%Py;in+`6GjVt34~XQFL#LUWJc76ipv}`{C7sv0IF_W8XnCuT0iYC+n}1Wg^*z zvG4U;+3$U_XY|6Bp`JWb#G;28AC29zGI>nXnsIL2-2T3c+)BaNt0PpKRV~gzADUK@ zWdz)5PJ?FI2zyeQ#z!mnAG31rF?cPZX^l2FVA@x{MBvN7_sSq{ObK@hO)cRr(MLwV zRrUL*@`w*rRo7-!i4TF7)aA{-SE^)BOLR|5bWcmtdRirWTB3VeqI+86=qcN@I=ZJ# z1C)L1Fmh*5UzbHgI;$_PeL_ieQzAT_yAMCha4Yu`ng#L%c~>UF^JvOpFRc&*KuHpO zcH-_PW|U!A;_gKp16&F&>>3n?h)k)D>O=GeXNuD{%Q;fNlU!f0b4m zFx6`${(`dHNLk7PZ6und7Le6v?er?KjgqzkkNy`(yJh0_wvOqM-tmrKM0>pevpauN zbIi&?uV>VHtHilh`3-|mZoHMQ%Oh>PWdz5M)bY{&u&q`)e@Cj(oC=zKIWkBE+xx=N zs7IDX6CLjeK%pDfgX(K|29iQGy*9DgR*?N;x?K4@!G(ex5T81Kj59v>$BtfEYWpIqRl zI2}1<{-$5nqs`bm3NNM2qwosZNovu=5S1P0?712}AqL*4fw{4>NrKPyUIlW?p{h5; zTgGsEx5IU@YVT5#jkJ1Ia@1RRwN8$z#&PnO?Bw-!a^;eAcjBSlz(W}CHP8;#8Lpv= zbyY&vksDvpLBt6p14?%x;Zgh2h4X*&+ni#zV|hb;B%(GzJMn+5CH@G`*7}C zSh=lf@t;vfY#(^~UPuMHWFihguL;XE(;l21NZ;1D8i~0bjccs07WI`VyUR$>?VUt$ zzR~y~K9WgHTUxjp2_2yIe7n3wD37CdP?WitGFFJA>;yBA0M;P!w`)w!ZZz&f60@-# zzXs#aY^1zKBN2fd5u>q_zU5oTm&g|<<2=mSpk##NE9f_4)*0r@4^qM(+?{Q2mil7+*;I!1Zfm; zM~+B7i9#(>FGLjf7_%rlPm#KTXk7nGtVT@!d4XB;z(2R*@<3&v4P*kA@jAWV_!{b9 z)Xsa(LG0#nRMKEXDuz}#e*5G#h+lK0QvoEntYUFPS5useC8#?4Dmu{HU z;l3|ZChlX6cFF|iNzpYO$}d7>F+v4thZuLb+$Dlt(tv6Bjaf&M90aU z2wCS>kgC72WmabNwEA1KTm?9srZsoDlr<~dy`al^l*)M&Av6!y!pxie^>6bw^?|E? zJ8>+yf0}=}cP1J5LJa-K^~`^nN8&mx_G7ZOgg0UwGtP%91!5O^WybF=nr9Y)W%8Rx zwtD;^RZvExFCFLMt=1@|R~g1QyO`@}ni3Ws1`vF&Jxv`{`q`~{xP00`FFY|l0mEtZ zB=z$wGXjBO?VKVf#{j0tDJsrt#cpA3$7 zl(SJLGEx^L!Oz#_MF39CGWIZ09Zj1D$yC9MiuD`&5fWQtF{GueOftEY1nM)y#9JVs zc~YmUSE;P!!&&*^j>;8A_Cq@W>&*L+jn0c=@@mL;O7NrcL;8Mc-?xEP-ToBp`{;g> zwC`K4fXcov^=4{i>h;u$l)7J#dNK7(>iN`@c;Jumoq9O+Nb1+Ahf@ECxpx7Ks<{5g zH_1X4h;EPoQKH5g1qBt9DiPE`*aSuFCQA}j5ER51ZHtg4C`1FBNG_MP_`q5bi(enL z)wZaJD55-Uf?_Q`YN^;tmFldE6)j?v)cii5Gjn%u9)kAY)<2rN_sq^p^Z6i*iM{>jWl()_MWt(@uj+V)9YRu+L*a1 zmR1-!(0y)fbqY04nm>{`;t;ExosAqwnR{AOdR{;F-{{!26oBrmDe3d?TcRY94{z!9AtL3D<$#VRU{yA+^Jgq45RnNJ9m!>CmA5KvX zI~QOtxiwT$p=yA$_!+W4go4{pF#b~7n$p{xvNwHs?537Zg}>KMUqNG69>va_O?^~< zjem$!_7ObnGG;V1Tl=Y&qOJVGJwq^1&~ntEl5$v;C%Tfu8v3-s!ilVvdpV?VE@Pf| zhJW!wVGONRGf+y~=~{4xuQGfQT{#0!kTYXu=Y`Y{1>)i$+&2kN~Xg(7p`2G_w?kGshw8b7ml(o$o z8dB!~&pO4iku6~Q8Fe?z^i-3Fw9OtKQpY&a;hx%-^+t4;WWsge?=bG6uHI4!1*O;j zQ&@Yxi`ogQ=roUB9kCGXhdi2PJ!80wwQ>)8SAs?s;>yHYMA#eHKCSx_2QQoKQAji^Cz3LmbAGD?FL>V65xjWk1F0$FS~a?Whi z>pT5i&KmHHJk&mEbAK`HMQ8wo=CBGrDrJ+i3jPEmdAZbOGkIL&*1YtLp^d2+$roTK zcbof6}N#U+9oZGe<1R={AI5G%? zaO1F9R;vX_Ut73mDOyS{$`LaPjytE}SB}GR-GSqf?gRUfX7Nj}e1HDj#}CXuO&OTZvH{ZVu4{#-o32BOKf|1@?}o!}2X7 z;^}z5kUDiL$EMGn6P=f0)z&%o@_{;7+*pCTtg?HMf3$3=u7wx1FhZ=q;Q-1&>nqyM z5IJQA=8i<%^E%F!eCS;gg3Jd9OCh(70(1(dMW$x}|)^Ln$CScOCE(L=4mq4wzE zRv`~HQmbk<(Y(l34&<^JGXH2H&Yk|FnV~ueM^AY?cc%p9M#oQn4mwftoyg|Nx_#!{ z=|6Dp6v3R13TG@Cb7f=Ul}pCVY%H7^onIN*TnYcx`CnE~w`Y4t*7)X*b{|ph^_Iw= z$-C81fX5sJhGeT1W$y=71nI28N~;EF$+YBh>^_^`r?RXZ&SBs#;4C%#dtXAkyc|yjU5%yZV2~ZrE#(L(`(cOly1mWNjZ~x6gh^BKtLZzkfi7{JXm2Zx=Mk>eFEd zx#Q2hUkUoehz0*L$8;jKxX~0>DCi51VC1Epyo%?jPA>8$WWZ5Q`-44>H&4uta_Frx z8z=g3?oD50V%+RO#4jryLY*c!w|SwJ=(ao`&Uc1D)yXP$U%p zx6DlVU)=^K_Q=ix_D$Z9jP2$8!YbPh#9ri}%D5grS6$2s?n0sL0y!`FG3sOZqZ)}= zDZ0C6$;Z|6$ng=9JhgSx!j(0p6?Ff?PEL6<`aFM>txLD>==3_5jrOISA4b zNShh&Wyb%uCt?4!f$5z_T>ZLk#FPBO3h%-)|9m#W<-pUzRI!><#j9 zI@w=YW?Cu)vM5_rqMp`r2C=eo8bU(qrsqUT)8*COm;(o7bvF_>T4;1E-fOcfLRDw# z2Di!JH$&$ zRNp&SInFI0+0jYzMfD7{%ucC-0%$A(u(|o2Xcby_s?neFqG_J7yG(_pCHU!Z=PxVyrlVJ&d@(d95O)#58#IdgKaScawR5vy0*EGp!hsVFaESPyL zr5=>`586+JTkKkhIxSE~vahI~SLgA-iZf+H+we_C-eR4*9(jgeJ@VvtfOlNfq|bpT znD_~R?ZlYdr>!)wg+Q0jyS1y#j8F-Vx+gt8`|F#(dDE9}bCH~B`sy{`Nz>2vw`V#h z172nf5u-!U$!Vi=`jq5a4L-bE%QN_ttD(&8o}+WHi7iJb@_EC}PHryJ+q=KvTi{~> zwl^?fH7RJ)QmdZ$PVjM$KCPV~g{3^N&0&*fHF(i@^nQxKo<6b!5!0X%@-?Qo9Wy~}mvQ zIoyWTPb%!1(o*aZbOhwD{|l7dj*LI>&=N}Q72pm20}pwhTZI}7Z%HVf_qply?TEr- z!rke6Ft9xucq3XnvP zF9uf8D`VgedSwjUMYgHOyogaPe|ND>ZjE$U^G@2*nPL_^`khcr_x9uv+Yix@Ek zsUjU!RNFt8msYVL@~Q{tdtr;1xKA5*WBBX4Xx$C6+hQaD!wK(wlJ2 z(m1T0yKJ1%Ww&eGA0Gbh8^>D5ZsFV}I{N%cIpH4pvmm#3p-=iiD~fd+mUD_KRlUCR zHfZY&?D2Y1rnK}9i$qe)3v6kmfz@ckyP#Xg;nt&_$*y-7t@{2izU!XB(cKoDYtgbs z?Cv_)s{-o-ide_OA1>;lft3osd~0ry~w zr5_%;eySJY?n(H-3c&mE(D7z}%3nVYlRlalQcJL53vL)Yi&DUTv-RVz|ECjQW#ZqJ zct_vnub;a|GH{lw%wjr%97PUJ6XRGvN(id#^}2*UJm;T~?E2_Chuq(L5abY?zrF@G zD)Rk~XY}_oC4ls1c0WG9pD8k9KSqSn2gYdM9lMMHvL6>4M);y6d>r9(lW=dsrzYVP z!nD~k-+$5y`0ynBH^N`xVd7sU{EsBOiSS>O@MDBuNy7ILel7{$O87TPcp>3?lkjzf zZ%M+J6TUGCmk|C@5*|(XvLrl=@I^`ZIKt;9V4+}tJ?~#|5j>Ile+c4zO4#r6*WcYa zezA$i)))56I>*m8@iJ9cb&jtv@p6AuS?BmMCVn6DKf81MK#7kXV0-v5{c$LG8`JY) z(jN+5!SsBX^oN44VR}AH`a{7ZnVt`m{!nl)rsuG?3}4+Y0zaTVjkq(2nAp6U58=??|lOwWf&e<=7;rsuG?3}4+S59;aiLklm1ZfHm2vpq(2nAg6a7%=??{8!}NTZ^oN2+GCdzA{h{Dq zOwWf&e<*lw3)1h$!=xvy?o7;wFm{7Uq_&&m`U>__Fm7+ge2xQ9hb+Srh-BEI|+X$<8LtjhT!iM{GE!w)9^PGf5Tuf4>?Ng zwv4ZU=Jec);r_hXTW}?Re5)q$C!-EO(W#ly;=JZ!DWHA*v=i#$p+P9gRbXH%XGXB} za&_ez(OksXsAVdCJLG})@zD6N<-Q2Lw>|3#nP=TDVW#LHO5za0T1wUAod=k4{3$cv zMz-JvwN`r$4}TP0L>~gF+9UACxECBM5S;&q1kg`sgLc}5841ORCz*L#NTr&b*GeW_ z-IU2f2cQ4xaV-FFA5p#av!0&j;z@$&V(&(rvjK|gJdT@ z5fb@Atss1761EB7oPZ%-%X(Z2LdzeMT6KS18Wg{Onf+5%2m6;R5#f@B;!)E-KV`)c ze{=iz7=2wB`P&mM&J3#8PLM8-O+|#cOd)oeyvvOWu?oCf`_07)v5A1#9(}_?>;iz= zesBI=Xj;4bC15Ps?7`*=j;V-G3>r_iq}B}duU)q2!M->Pl4WJi^sl{b)w2Y$XIeO1 zlc`4#?#k&V+wcyJe@$K|A+Lr*=LP>pUP`raTV8Zr%Ioh&4)mUz zzUjlBi1{J1FD+L~fgsRPT`l%P^I*Z3U*rqZNp-n8^==re!lbX?k_l~%8JPt<8f6uE zjbjxV*B8nWm5k=Vc3{ynZ0CI&(bi$FMZ<55Ob`1IZg2&O0uAeB>rr=^c$vQ^GKI zZhAGN(6%zt(xWCF`@Y+T#=CjX@;|quUFP??GjGf>9TM2FB(OEI z%g=9n>2KvehR)w#_BG$P(GT~_Ba40hMOT3s+M)4e_ctJbDNcicwQ?~(UrH(wr7)~= zz|y?G!FjWR@HclUbRs%ppG3s58BPZKzTq$NI~ebaUimO5sm)%T;Sici_#nbpu)V)W z2p^XrY{Q$I_Vn3N(B5uh7Kbs0;`n3!Kj$0=<2vvU|5K^JivOvt;3z?Vm4#| za8P;T{e9s9q`w65qK0!Iz-m)$_<9(k$CmcrFh0umCY{{wd{pp(QQ@Dv2w7FgdDe4K zs6GWpd&;1C5~<>aXpicZ_7x^*rmxK*EAq}=AVYOW{j|q#J@DEJL>~7YnHan>n*tgcbbya+heQn3cLG@fW<57o?gZncuSJe zR`+xx!RpkE+`6ZER+_H`bx+&oHMQ<(s%RKmSNHT%c}=T(8Ns{-$5V}WSgp4}N47VJ zOAgXe2hE>wTW3hE2@wPZpI3^qM=Vq0ZOosqVg8h36R;Xmf5Qk+!x3!s-{2qUE|Qk^ zH~HeNa)J_Fg0Z1`@%!#fZO$Vg@ArTnrpNt5D!v5qv)%bGWd3g;IFbK~cKKh8{NulH z7OhYgGIf$%xRx%j+40+wC2pykv$IGW_CrlExzh8HJOo?^y&d12V9V< z@zv6=dOYD78cxzvb!j_VdW5txO4FMVdNmlEi^y%p=P=%(v?E-U_Q`m`9z()eA@v*S zAfO~4)Peg`iY%vnsu@j9kiwfp=}CwL{>s%pppxDCQT!G4!cTPn;V5m4X!bG(%4-K2 zC3Q&s^#?ljZlw^Ue(cWoM&zs8tG4O%{6&%>DBxsuoaC0E zfD=Cv3V08p>IRk;#zV_jpCc=$|4~As|B)a;e*;X>TaACZUIu3W)4W{0iAlrsk6Xsk z_u-BAHoRD!#m>O-g^bcFkJ$r*O(*{6(GJbmxM>E_E_LhLo<3`g*WAUwow#L-uhJvdJhJw4W~ZO19@XE=gNYP18H3yR5zfZvHyeI8EqKE1kr{({)D0{ zCm|-Ju8{O_3ge4xy4H$jBNFC>vm+ar%oDzPNkb*l<)sM|!}+pd`}4n=gRd_{D9W|= zZrar?THozjfEcV3MH|_I15>_kt58+knSg~NoetstADACHYE5GX9C%3jz9|2z*}q0@ z(I~8Yqz)xjvJt6wqNF|khPSyZT?%seLpHDv z?1hSI`lGqkR^SWUcF3<+u~(Z41C32}WD7ht5naxYOO+2Lp}VZnGpv%zriGlPQf%oZ zYjkz<=y`xWO$#|0y1%*`MaowTESc|`7IGrwVTS0F)yNlBj7lbuIeLmII7F^QFK(B9 z&536?{5KB1Z8z{kP#R7+g3{(apgBV~&^=`x@S%S}J|WlP<>5IAB$#$QI#ZB9r}fK{ zhmCMvEd?XZ95%uM`DJG1*72|a65>+QB@+9hK1$HxLr&aXm=Bu|8QZjob2P`3?jDT* zbp&dLq4{Ig4Xu>%>Ci1K4Ydk2sI2>?xv@M1EOSuduYXshb)e&F6aOj#mTA;F<=~E? zEA{$+rGwA$oVXrrc`kXLG_ps_ra+{fhGS83gEwx*&cX@}b20UKccSu!-(DJFZ466& ze}PmDJu^hTf{a}bKVOdvOI^n4eIUMZ${&Dt^?yvOC)Ib5Kr^M`n*R%z#xQ9@1ZRui zO9!tr&^s~m8P$O4LhxloXT833%h<`LkS3&0lLuhz+fA3b?a!?zq^Ba%Q%w;vKupbU z+1$A|G+HLW*OM0`F~Ss)s$aX~`up*Q@RpD0BZ7edTJo z`siNtH1B&%lr8HS9z@0BR9|nch-P)*cUAx6;$UJ%R~~nX}BlM0bc2;gFtXR zvbK25WoG0iII__Zo?MUWDG@LqhlNfn^D!sGF=`i19tUrL9?RN3IIzbG>|5tSNhj^Kcyk(@tF#2Mr(wiv**iulX~n~}h`cwA zm!wV|6;hdKhy^=ziVVCd>nFrOQ{V$&AlI6* z3$vgXbkRLht31_Sgr~^da|+#o=6b5(yypW?^>H9#xF~?PR`^tcry%t)_FRDjPD7`n z@;K6qOTxrcC_I_qTB!8gIBe3iQN}w088^ z3ksaDXXJ#|>RwI7r!YN|bE#RUm~=?P+b}*OEp65PBP}Vw0CacozSL8njrlF&FzoBrX#xINkxsH9 zonWzBa;<&-ESMIRWhX?G=7wzO-BAbF{^yuC419Y+HjjcZjwd^W-3uKBk-Zr=xPxr@ zM*rHq&=1;~<5OZ1g(+JwJ)07eWq`<@mtD8aH~zXaUS7S5CC@X`MI6J**? zCg=;;%m=Jb8JbXzTIaPv6UK9##ZdQK%}-EfKtP46IFU|`o*=zLy!$gIo%)?3*j1+G0UsGd-`qYklZ+0WK( zHyD0imLQq&$93zUa5WNN#P0{a>1N&AA?B9Y0uBlAr;h%dV$%^3o5@(IPmCufW93Ph z$9-Z&Ntnm7kh@;;7R`~mihOqJ!gli68SjdGwilsl@%3o#niJ729yK5DDpk@Vn{ss? zpfgX!Bjd7Pa3$~V^67?T`Dq2P~C^PShYECz{7kEvwR>ZOn>3tdVp0hQnv?R zV-~b~V-Nr_Sdy~5I73zfZptU;yvorRm8axm9d>rTy_ETQvQJaYJECe$i^$V$; zb(;T}`(JOQM)mEP=(Wpv`(Zd8m%i-wR8K_O3e|irb%L0w41I2^L2jk){4ZzzYY?2s ze}23C&qx01j%0j=nu9z^puDekKJ!a;@~f!wsNT$PMlyX!4Q`j;7q$3$0}%?r;%!W6 zU7=0iP8*ODtwIIQpd9j(0Bg=87JDc7A2}4PWf-3YPvWykWt5IRN9{n6n(EHyN65#tZ@o?*Qa2}ZdqtHqH{l;Z9j{?k3j*3U9Xh2k zna@zxq0o_PZMMqp5~?SQ#`J(YAVC8V6P(ktXd34Iw>j_kN4t<;VlGM-7}LtzQQS(V zehI&&XwJ-LS-tlKSv1TAt}uoKo3>z6-=$-f)uFU#*IWqI!+i$r;!Aa^y^U0$zt<^35mNOJ@EvM>H{c3|MKqF1vzGaUk>eftNM$-7~VrJ7>Js7o^)+tBJb_ca=oP_=0d? z`PrFC#O0cXUW*=fH*_*!`MwBQ&3>j$s%LLtC2gtN$aydV{V_pO2)q;Qz~>On9))U? z4l2$=6h;4#dM1a$nGQi2xj6587N#A;f9p0drQ@376)0HI5z*S++Aqa8*2yKUVL#!( zY+!Q{P$u}TsPd>=(Yb0jf)oAu2+*JG&+BDIO2}(jkk@WRoiLps4eYR^rWdE&L3)HZ zMC}%L!XA)SZ7#!%j`BAM!SJvo3BJaf8@Ee8BUT0&96KyAWTdz~Iychdtv;@%JGk`W z@$+%_d39c-CAa#t_&NHDA@+6r@@2{UhT;=he+@&>_Qd7>PYuJ&+7lQ3$Jbb>%6PLn z$bQ#T_JbP^v4XJVs5e}@`5S(P+#dG~d(movlX+{)$noAeGnuYK)As?@X!6+iw*CnGk7wFQA;?``< zC>R1N$Tj}|e@y>15@ww6{Bo&g5*sM$T2E3#j)mO>*388!&N1`dwjZH?N->2d_{HUv zxYi&z!7nJ&B>BbpGDEiG7Z;&wKp^>rl!x0=xNqIInrKjuVu1_tF_zGsoXJRMcUb6Q zRq+}~2=mim*6&2tMz1FZ@byVg}Pu*#bir=KY7TM<;CXX>qMqe zxpS>ljWJnohitFTXN|WbeWJ$iAR}izG1$p{zo4D++V52pCkVZsi6RR#N%-qG%hC;1 zc@PR>^hWG41jvww+bXOKNdty=Fm@_}%mjCF=hz|yEfZ5+x4rIQgvR(V7pP~i!Q&}B9Q<=GX2$@j)kxs%U*5qa=wC#@ z_X{F8KAipQ@doDp<#^Oa_2cX-{S|#M8>E|9&qelRhyu&kTqlzxh6{2;d0SvBaE~p9 zjKlVi3}?+b*?I?SJPI`QTiG`J@e1|8Qiof9=Ety3~Is0wQuaWBuJk?`{?H{%? z?uC<9_#^byoQ&C^?FpJwacIsOrN;hPELPwe?`=CmyDM-mYZ2=a`KpJ%{sXcw?lwA# zVtfYC%MN<2=KQkOIVV`J+vh{RecTh72ank4aJ&m6ip}*@*}xlHpf!I=>+D^uee0Y; zC`)rzgNF{c#Y|EgV1BH--fbiKwhls7t6(Gf*T-ZkL$g|EZ-~^kda6$#pDy+e4z%JZ zY|!ox-+)o?65LZ%v7NhuP%*WhRP03xsQ+pPh0hc5E6?^sgBfu2>8U=JNcg@F7L#qW zGSnDc_yae?M{4!pYQesVE>#!Lg(=X+*xd+K4_8a0k?dU1{HKC_J zB2-W1BQtox*WG<}5d3GdG- z>UrP+do_`gEm^m|L}OPOc*ElgJv>04rJUGKbO z!byKKPW3qNRf+djxhF)2x5j2BzHN>D$n`!ukxy%E$!_Lj+I7yu(W7Co*pP<=YV!35 za3^9a%v;ZSdkKQWBO>R#Z1Dx^yq3zz(A8HGRv*KN0-c8;A#mmGjNvD0xrsUF;e%%I zn+_Q?Fav&~COR2BYagrzKkSgf9A>~zR39gUdk$KIAssT9$qe|3dJPne##ME%e1KtZ zNY#KPbsZws5nqWtGBPeP?Wim7=X+T1rIo7tB0XKSBYTh7y%PiKLTx}@s12yoXh5wu z8ZkX+)-+M8v~6djv*V_=vm4nVoP5g@EyP;$j4yEQq3q)e!TLN#wTiQ>Kam? zLH#GAPSXQ8ZMz9UR*>VBuZD52<}XVYwV2q$bZoTHYjuy0LjsxqmMj_pp`KqS;(dr8l#CzOF+KzFzICbC zkd1d=)>b%a*hcY%uggRIfh;>XDSAPQHExo%)vLu#}1YpkYK@PCG}M`E0>1OCs5_t5BpJyKhdw@dtZ z1wY=7`0)yU5PUHFxX6X|?WlvMNk|yh@qN$x1x1T*WF4Q#N9YaRfPCG1?w!gI+rBOh zQfYD5QpS7kp|9YUQ%Jp+XZRv?X^^7|P9_KeZrdPO+d=<#Ip*Z4m~azzc0Zytr`H$j z5h+65%~g_#=ts*dop@NAT&{kKG=|<;IbO)8BOt>bmkIYsD)mIE3D6;?hJ`0d zdqV1!fhguIwR0LOa|POyX#91kjd}sW3HifD?b#Tu@4FZ^LbE69_52DZG>x8*ESc^@ z)qqePpYG1OAG5w1ae~p|CfkqVe^6dF6Y@^{H|mR-i55HaA-bPOF3b+_@sXB-x!u+k zfL73|AbocqW~D)J!xk~-OAnoRC+335l&7Jr3Bv^ZS^Wtt5S|T2r)-2B_74XpcKwgQ zr-GzsL+ZK4G&TgHpkH!~eTHlk>-p}{vNfgJ%nfd6WWQJTJGLW{9av+Rt+R?VtctGe zWGcu>+8N2z;38JHJ<#~6f*mbXzBx${DvOlofEL#xWlOUNm36?I>W^<6dg+CCbsN*_ zMamzLz`frTzsz8NEh5-i+8*d(0~vduFjhy>-sqKgx#daPy%c7kop9Nm$sf%dG1w9d zNla~wFy=Kvv)Tq9oANjj6+R5@EyBE_#}~Ea1KeBlhiln8k10S8q~>%g2um{T^FhyA z17nOA627Qgu!n@pXb_p~jd!7vHM{TJ%QE}#{mtfkMVCA8^r7ZzN^BcpZiF4J_ul*Y z>#13BCplGMRG^%@S9-@iOZ|}w?Iy83kv;cvb^MxtVIx*ssnCDG^eN~w*gw!1MV|^u z(OTFjJbq1S!P1C39%6N+P3qz!i4Qdx->JuE=>8RV&YRHLDvQ|(zQBBT>b0#IufN2~ z#16N1VYSuOyk^bm*u%2x{&gG2)L|=Xm(kewsh28OUv#5-2OvMiu|SPSYV{hbO!~zwM7X8bqyCBp8Gbw%@%SjD_5%l`-;d(kRMQns zJm^Jp{fdy1YqGuo%|F`=ad_;>|vH~1KU zc)`c}dI2i4d7Tb@9iQn4+-bt7b6VF$)M$b=YmdY5E`RN!;>#q6f_)RiD?Lw%k!8GRJ z`x?BfPcccE`RO!}s(XGKFH;^+-478Q1$ut+8R(tZR8&Cy5wnkK}* z&N%gItTR@s16*f#P}#~%JVI*xJfJ+e&TwRSv;p$bw_9&?T<`sl*Bg;N=A3xsCa4*I zh)$`>Q8R!rPC5tl-blkqxc@A00LGV?TXW+*)V?xwG3Lj*+5^t!>8;S@g23Q>3rtVe z?X=c5_Un+|I=Q*Grh-B31ATpNbikR$`nNf);Kw*}9d5-@a5Hg-?z<2{nvaiEb6L9P zFP~%n5>{Sbg>zaI)-FaQ@(rmx5zVv(#y+rh);9|4(L&6~B5XnQqGbV{-UYo0JLSkm zui@s#U|-u2R*yxd4)=v^rRI0!u>9NyW3|XeXBsdc9;vOV+R3MTV`5%5KeJnP7tvxL z6t8M3&hj@E_k~?(ziv&%{XL!Y!Gb~dXVoGksDGyM#~D(F|3E%Q)!XJwQ_XK^{c~tyXF{?= zX%(IBIZ=mj*SDqBqxReDq4W6cAmAUBwg14evqyr^xD^-n&}pl33RUNWhX5iXP+A!$< zK!Yx0-$Q0Op+lDE0LBbkH!lygWI!`8ZAdPX29e9tr2t~5SZ=uGVyFzN| z;bd#xT?-*cq$1t#=XOod)F^ac2BKvKv+rc)ow<{BFT>-#)SVYO z^IKi*TTXk2U90EUfX}}+*v}p}8MZOh;-pz6n3OTDVF)!D6PYYXhO}KbC^?alYkU)O ztLrdeW(f=*!I|aI`LxwcRzn_17;nL+8&P%$3O=PnmPZ4YswPpq3XLYm$y5J;CXe|2 za{|9!*t}9Ih!DTIcnW_1EaY+VB>TD~c84JHn_#z_8Zm(^>(35e|E#rzL?KCO5@mt8 zL)zvh@rN>bkFURhu2+zbN6(E3Mo@hU698e$-vq(OLYL#_NPfV)LYiS^O8cDUFw}g& zVH2>pKRBD%+QHJ1Cq=Y;gxdO_3Va%bSK|^iuWjxm_2TM87ap1c{is9EmkA83Czxvm z?O+!3jcm+HE`Ld9hpcaQhg^NG`tH*M8hk$~PkmGR-3Tq08@;Om>#E|=6l|73cxhv@ zmw0e1s()?ZUGD7P1{#jsP=L;jB*>8a$>{ThYbJfSSb=X>HCGGzZZVJCEp`yEO~Swm ztSyP*e__}mP>@-9SHelH&zd^c%+!X5;zIIC6HOK_Fd@^L0M3g64#FR6Q=?cx^3#VelAX%A>ijOtJQQV~+QG2%7{HQ|zrG(P2UlkS z;juIXsh^$C3ECIAVH`T;O|V^DkbQV~Zqt|x&qH!tLbesURqDrfaM+ZqBQfKUY3x95 z)Q??^@9S!J=;2+izJxjtd3S+BYC*da9Lc)J#jXHh@c!<1ukbg>ZMe0*redi=Wor(q zImXoDPr4Sjhd8R50)LWP_|)s;z{07I{F76W>%O)k++OIaA}|-ZWL)geq|26!aMm-a zsa}{(qO+QcE<81Us$PG++auf)G>*FUjr*2?Y?=x#%p!F^<4N&)c+Zk2Wi#AYBPOzO z9A;GR;gpoBFT*rC)R@UXR5xDLL6KVlSj(@vqrzt$Jco8_BiV?GaW549qqNtPXc%fm zp7yavkF#Na+fq@v75kK+K(ppM*U@*(FUArt6#@b4F8bQu5a`ql1Sj;hgM-rLMqm2{ z*uAFR8k7M&`UGFy^`ksEK(sZoaX9X!55twr+b<@u5&X9(eJm)|Mb5F|fNB3-_0sI$zGF-&)6{{GVn0kQLbQ6p|hS?5dglzzPcMJKi;cZGUPium=oEUljKO>NSt}h zeD0X@-Uk>%rS7J_9v;MlCO0!kp=LeYLO4U=)I$*RG*`9bp=E@`0Yh0%WV5fdN(6nG zY~51yA;wp`(E-!UM=`og|JqnT-I(?HpKwisbtCld%9bn7t-#Ax*>;GlR*F^PHTbH& zfLDwCzy}RX-HmAC@pjQ<@P8O`!M?!`ziiiTPiZoDd&ZB@@&Q~>!LL_jV@BjPPySmq zr-XCzx7G}d_hU{Ku=C2u-&~U&PPdDF`RO(OHcX*`-EjBiU)1lPZEf(<7I+u({Y-02 z)*;a5)`4Kd>Lm;gy?%V85To}YJam1yl=Rm>^ob}%aTmH)Q^uAf!0;Q<-=6ttyImvB z9mgYx{CX$8e+iXC&%p13?2Tr|o<@LtPkGv3zha+>|BH!Vf&df$XT<;cGZVkT#BW7_ zyZj1m2KqS0TXU|0l%%)rp^C;(zbNo4N6KFz9p<8r%0c zf)e`cKWYWKyZp^!b0yv2uYXYMg6#H-%GfQAM#x{^Xi~V$Rl^91UE@4-f5a{&%!h%; z6XwIfBMI|i;K79XFz^7vd>FVFVLl9efYzjZ7&uOt4+HNc%!h%u5$40d>k0E=;717a zVc->n`7p3em=6QbC(MU|uOZBbfiES@hk?fv=0n431t*>>*NGC1_6M+YYmMy}-ml*; zz+iUl)=FLPN4V0={g8bNofjtQgl^h1wY_dy;;>%8f~dedjSC|9Q|SjQEl2mv-=yBm z>>Fe8RDgA7bJ{dM3o}pyEU5A%o5Df-0i8u7yYYg19eEq3%;lu5c5mw=FD>P!s=uwS@qvDxr|G5r6R2;8BilYzK+Qh#KZe|(% z^LAuRed4T}rCHctory_K<5Lu;(7!G-_;UB3cO!Qv(ss!0y>;b>rA`!M$Iew1mi*t;2vv_8h7t;lPo#Shc?S(i$?v~F!hFzcXMnjRzcHAs6jUq^c@ zpV(U=_*>Xp!53c!OuvV{mjBY6Yz(rI+2I~`fj54*$dem=WAa~`9Y^U&TQ;*_0aX9BFR{RR`p@M z(K@%R5PdsNAw_CtG~A$f3_W@Ywa;4q3i!UwmUSAF+rB9hkhbQKgH=SZwQ>^ z#qux@b_+0Gw7qxXvyWL~T2MVZnuTY^-!b$mNuW2VF9a5(Czj}}V|ss>Q~>@LI|#^icps9#EH#1}cmeANY~+Z|DooWl;i_M&;^X0Ujlg13+`UZD*9L?dNL; zofT?Pk>k4Z45`nT=+*cj6*^n`Upuw@L}Hx&eowuhaJZ+Gu?63}P-(*4$c!}@ ziXB!%f4Vz<-S<$|hxFH0;YqL4JVk5_Io-JPO078sdA)z=yv+UKuKXfRzrWWL?M%=%quC zpStI1S3+wp6e}<&j4mQ=ptw_#An<=mE`K6Nn4tigyd!G7yxa5qyl3MpXJ$%S} zZsewkp4ySo9|Y^Jho70l?Td%l=MU1&h-d0w`{FFvpPjVn$k#vLfu+aiZ(;G#J)EAu zbuKdVIj08k4!+m|8#5r~XjVl$`PSql&KTZ|GFN-*Zk$c8HaCXhHIx| z%I%BBwS4xRLH7J1s1WuvLs^51h7TwoVKrHQviA09 z3FkZpQ@lL8FbC@&SYl&Z&o9iKoB9|okfqZPAtN}^W4-?P1*w7cgf%Qf;Fa{0HVK0^ zYTKC@hhb0@815s$eSC~shahzxX}66U#`ZRf}QhVBMr>+J3BFGRd?1#n~fOJT=O=n6*p(v zrCtk1r=9tH;U1E-VJ&4{`Q){WGi~oO-Wc5!X&O>DZwkr0DaQ_EMmGK{(sH_g@##=t zgXzrrWnWIu(J8w_s%iq!+0ynD=Ra_rC5t&9&J2nI4*k{`*_a!IZ>7edI`+3rF%(~h z)SqVZ&>8Pp2WefhpLyh(PX4{tZUbJ4ON^h92G= zcz{KjB?{RS4qxhzE2Ni~wV=X0sV(xFbS0^x1jy6fc)aPxmyrh9M+0|2MTyS-xzhvw z`p0xsTlkLH-TD%CPwDtKw*82B!}0H-9feX0yz67 zv!YM!>$LOBt_e5=JbAaS#pP0qQE~Bqu67RNdgaI4x*O60VJs%Sje)oP zPmSq@n789T@ei;$o(cafJ5u0FFMfii=O<*O&dc$H!QfG~t-mxx8cuy8rEv%Ql857f zG1Rnec1|n@kf44{suifmH_^b3pgL!iG#R7a{}fgyxGjKRe#Du!wtl+5fnqfBX#2j0 zi-)our7HbA`2ua-%~rq9Rx8L-FOIy(>yIqKms%gy{cGF1yHk7LH|+0!G_~fE3h;=W$CcCkvF2Y;znW3i5vws>bq`cWJLe)DfT!odMJHv zp8u)dGp#=Ur$(cf3RCgx#Vh zoXiebh##(Duao^1`ZMe-<_C81h>Y&-YeqMbdnObUu6oa2M)<-Mj_7@hw5n}p;*(l26vBz~PU{|-2nE5Ak=Sl#_= z$K=Ohq11?%Zln6t^cEq}_BL#MgxJyiinWyRp!!E{yLzI`NhmYUis?+engf)6Dm6hc ztnP5yC8S!xnxf&Yz+gz#@548a{{;IK2na`D_D={Q$DM_cY6Kg3Af!f$%;cP>>46y$ z5|Ta(s>bvCBBmC3z)YpT!>N85&o5sn>?yVe0nATW7o6K_{cBJ?YU1+{pyP#A1)TV$ zCVqG#UXc5wEFFN{YfbzE)OaF)v=MzFMX%IsFm^HJtp|qa_NalVeWIynqG8HHl;C9| zumBnmc`NS>ojx`IUn5ovUHeav6e4u}6)9Xo*L!z}(6tKLtFu^`9*=4;-qqtw3t<$< z{}>6}_QSn&>E-H8M6h&iKfKjI@5Fvifou8cj{We1^j;&{P_2u^Y7HV$EA3KxMgv*s z{|s!o@rHRv{?fi;oitULlO+WlgE+b=cOHp&$w8NqSTBRn_Sxy$f(aSwW1Eh)NObnxed)rbjp21;l7hK{sm|2fj*)} zpXahLqoMF&8=+H3m?oO}fr$w|W(|Q4>x5)Ofr|CHt95eiUB?Skp_>@ltW2m)|g>q>%o^ zZ9*@z&~lZ|%nZF8I0*rZoI*qDc_eVt%TB~2|8n&ZB9ioSmx11iolJ7Sa;QTuZu?Ww z1K0YZHJP~g8rVB(Jg1AhP`yvVDyWV*Whna)H!n07L2Ti>DAUxHRa7%L%2Y>>LVMP* z&m?W`UVy%CF3K?9Rc^bweWN-a(YZlADbb4Y^s0JUw<<*ug#1!kBd%u7M?NS zhHNa3yLngt8xn_j9@`v;!{fCnb+v0@i-M&U<_FYM+Q3olulF4(M2LNg$mR@fwH4ck zEs03&>gnN|AhYcwLG7pX*20EoLTJT?u}rVsD8i1@lIuh>z78V4?&~Da?KkpVOG17< z3^+@H6tfR9Y+xOF0;c>w8>>nDw=`72IjIT*oVs>E+APZeagqrR-a*_(fqLnQ)_}X-V7pDf0juIB|QL9f`gUkQL8!S zfS>a8pRrfS5=uAbNfREnOS&}l&9VazTS3_RKHT2ccS&Gf*H=W5fDu1{lGwUC1DvM1b=@>cIptg=28YJchw?2*U;Ng!v~ zle*%{H1o>pqS7?~h1r77z9g#)US5WKWIMLgnzGlww(LWeG|p$NZx4s{ZS41yC$xN7 zme-t0{@~6M&fZwTE=};nva@S^KAP1TpLZclxKTa*s=<^gay<_1%p*GC&Jy}GXcCFe zJN01SG>GfFJ0U^vN)|od^S?**-RYq3Ev;vy?bXGcbfqpyIf#u7cCq=$95L4TRc7pd z)WwmneUW(?=w#mEgj(S^>yf5P%M(3(+TWyySINHgMm(j5mrE^=g1z@ok4wlKb+yZ# ziVjOw^vJKNC+FWzxI{fOq@G=!OZu8_mbEt8G(knfdpKwE%x6iZ%F#Ay38%X7-~C}O zc;0oG-4k4}4&st}9l^3b0!6P7naJ6HyLw|nR4bK4Ehv0 zoC24Ey;rWax#2Zj$A{L@!+A;NJnX|_3Nu#J95%U};ud0<3jblA*dVJwnxxl0#Ot1J z3-3`MVlPT4{lC_-$FVsDvT8Tq-mAl+wQpCbH%>Nd+&x_5zKN=lpHd21>#4pX8pc3` zKtAP#kUCu!>8-N6({u^HYQf!cLx=DU`zVgQ+v`~Bv$jJ9)%!aujIP=2PpLQ*eRkl5 z_+^^@qv02H3EM+z`&rDZ6&^Fn)r>?5uME~DnDaA_=Dwdr@Fr)uk7k$A|}ZR_FV|ACH`hn~r`7t#ET- zE1C-wt+oO$pgSAL=TQfoj@XVZT{0OQlhmdKI2Qq%av1uEVS1r9OivTT^g_%N$jn&B z6y|6smp_Jg;zVV_AiZpBXHH~I*(&QFv=mA{@PSvM*+fM`vB6*nkZ)7MRRAk}8-b7S zC#xpwGT5Zx*nOg;rOp|A`|CLG)7r5_f^;C_=UD#n!A7Qtc?Yd1DcQ2-I7I)jX zEUt%|$l@Sx*VW#J^7^5?_#7>Nuf8ID1M#>QG@)uudAFjx7H8LH-Z9#g{nl?;D)-yf z&LfG>TT$qJL?wG?9u#&Q$ICQsGr}3hl06my3KrI`76-pqxt3P{i8=5`y`=bdGsPtc zgMxc?2h;dyU~5os%fT-G-J+x=_?#~3^*yQw!BDe^GBgZu+o2wBEIu=dBB)YX{LP>2Wi#Um?x;h?pBlS++_ z%}l`tE0WXir1~RBMpzv@O=7Azf;P-N2YXgX-ExyY2%Mgn;C!0CtYe{LwkmMg&ugb! z!T{8Ax!P-VmP6HV$rY`K*h=-OVen^g#$_+svW{>HYP~rS%XF z+rqgn@sLf~Sv~*1)tm?Q)@8dPbSuJCd0&VAIu|_*XHKNIoJIF__=58_Hu?Mwv=#z2 z=mV-#p)w`=U7X;KxYYKQ5*|=pEQ^&f*<4cfQtxLu<<-?LcGfEkwaSxAkI}eh3gn9O zsa>5z;tDILb46u^mBY`k%eJTN?P6Lx=rK~QM|eVa4E@y5DXmYX%?5LC!f0&R?{9cf zPq8SeZMIKMMie5jGugl?-ky-xoPyJuXlWNT@t+~c7rP+HClRKXxNqpr-~kI`uz)^m zyAG;H-5Ret;U?XhT(;%_DvfC@8h8d9(`b=bmDaf$`!=HMYM((T)BNdw(YkmS^!X#AY{qt zV@GVRULe!wf4RGk>Y_p25k~CS5~*BQ;xYypDz?C59vX?0CGEv^OsW4hYSLV&J$qYd zXoy~#vem!JlaqV(f2}6fey|WXSHhW|9X_ZNVE;}nRZcvuYj+1-p~jl>06AxtSZ`TU@ z#yo>Pi>JZrZkEd#pZ0{!eSmTw?M8HymHMCH-kqo%o9>@dnAmX`^UwA)SnBWE zD~wel$l9-$&P96-e*UF3kFoC~K=88~J7)g+JDvEynD_=KUN42;*YV|QgNgrRGM?+# zQ}y}0a<$ULAMKpa)9cMzC%)FiUz?2Q((p|ueu|0zof9vjHg2=i2lU+Sn~fmagJG!o z>&NQ@dhYlU2uj3%**X3LiKl#q&vBcD(AQs}wzftZ7Z^xParsUkMkhC##RvGLyxc6 zjfD9y@O;9282B>6d>Hsr!h9I`T*7=9cqCyy415e>J`6m7Fdqi~3WhK-J`CL9eu~&% z8PA7_-$|Gc13yQY4+F0!%!h&RCCrC`R}kjIz&8@+!@%Hsf!h9HbK4Cr#d>LUr416hJJ`8*=VLl8zk}w|z9!!`I4XYKH|Ds8wAJ|zZ z?o4bB(8K~7P0I23*`a@EA_!=g{@Ja6l>WgkC*$_&pMClV8|Msc<53-MG5hE)8wkYF2z z0&bE}B&0vS8Qswh)c0**QfCSJ6?RI&H=;QE9pxw1gqN|MFOG0s+xa8aiTqmTXY~tA z)uPWShcaiaACq?vL`uJ?N!M;()h#wU<^^5q&L zf8=b)!FB`NYcFS8O~pp%SS7i(;Kp7)(G{L&l?+1ZCF=3jNzwgeyX@u83+5!g?}YXn z_&yElKBG@hxGZk5<#MBTJv@B1EL<|}oYm2W87Le%!Kgck?y?J~K@ZO+aN{h;iVi_^ zUF}A=k9Z;_p0muB0DCkKiKYb}=u`Hvwf*z$)|O52V=>k4r2BB(=*B#8Ru*nVkP{~0 zJ2ui9{&@(`9((z<(%M;gTFZICofRF+5V>~DUOtZ@a^;=1d=$gES62}&+ggf~thn&F zfd0SqdY%q%NpTxkT!l&z1t@Ueg>wH8_$%)N{Oyf>jO8TmmTed)Qa6kjSTxi-aLX*p zIjAH|kx>>|qHYm2#*@x=Ih$9iev8UE+4}1T8{LKDT_PLsGLnYBp-Cews?lOMkZ6MH z?GT#C{TsOy_IydRFKY7s@q9xZFf^wI82;m6D^X7t$Tss%>sow@{TQClOZ3q1uQxs9uRqZYh%S1i{TQs3rug(@J9;oU^0K&<7I_@sbj5ZiwQF5}S6<(;v#*8i0I=MRW0&JS z+Q3`=;N8vF_SC}|du^CH1KGhgm~HEUsu_L>ED6fh$UlKMbD<9MGx#>6u|aslx9#_G z^%saKsLovI)QmhL-23Z!A;)9eldN<5?w{NaLHk8-_wB25k*>}M7-7zS$N@Pe=o*~* zxKYA?&rZa5$#;#^q;GPSyNOd|y6>&0`{g6h20O|rE=6wM?Hv{IU_xeolmeQ6Q4`K1 z{acd5Je;JZ+4Vu0;B-v(z@$BM9dgVV&6)TgwlmyqHb+p(H$?@SREc z8p1ax;Y$h6O~T^|<4mEG-$=scNq8{fq9i=t7vU3=@Bu7yWBrnFoN)Ifyp!;L zJWTz!5$08b23}A2%>*pH0!N|90Ib%H54ORB1W49#Ix5n;ty+4%r7U?_G+I~-LZE%5i=0aoKeY?F>)Z!; z3#wn~lm_1j3aMXUx0I-S3HqMoHuOTB5FCJZ@c~~@{Q*2BaV9~Jf2@xa{?^5CpGIeA zfzA4#DjG4>236^_FX$26y2QJrXmVrmbF;t$q<{K?io+5)N|S3`OFXOR9G!k?ysp&+YD2`Ri*|IFi$ zp(cH=o7BggQ^ASeRXkGC&hd+J=Ym-vsBVHDiD;Rc^9|jUoT~{-`Yshs<;QXu26_k_ zdq8)iYjZlCis>&r1gBzvZ(jJVEd@W(ylKk*0D>Hf9zUH9L0yx&f|1s&vmyCNUF2_^5hE6V8d{!y!|&3A!(G;_Hs$y^*4J}cJ?vyYEbzX02J`1!zAj6cYfEoIQZoQYAP zESVHAtR_MV;jsD$Hx%a`(Bnl&rT-Cny!{mZG#y7+8IYOURBaP-E6&7y0v_BafWLle z;7rYRt5Go~XsTO75^t(|63>*TI*~b=>Udxmf$Q{-_Ty9cER*2Rp%&>chhBWQ@NPan zJ>hKCPZp!Cm05r*R|$no2Q|9*vV$}8J&!S!Wi+SBalDWhx}74lOvC{k5Q*n2o*5^9 zQ0ZuR0zdsIoL!A5LBnvMPUC00@^Xqq`UFwB{f!Af!6g$IymqJyoAJ&bwVup`70?uw zyd$JV#s{CgBcx|HjEdh~C3g{S82ha9z(YJk; zt0$lebPk_6o#)WIzBdAMGU)|wx{+UW4zh&Q(K=aj!+W$4nIDGCn{R#t>oxwPed!~g zpg(uS{f7QE>f_2O%Av0up)Wp(@4M50?=ncWxRXWj-6r^c3gh7ahxm4(s~vxcH0NpN za7vOn*h2gr&M*jdpKi3Te{hK$hl4E9S5$rnVXNP1?aT14EQ=W4^^usa&w4O@7vlu8 z5^h-KY$M{%GVb!4sl@STw-7Sp8c5f%Enpp(UlMR1h*{oU$Ck4QCuk-~xoDYfJwjLv3SVo{s(Ou;xs02a4#d(|R^Ti} z!;R`JrCShlU>c-!SFbi5N%^Rht-uiF*Q`xkhJ^t3hK)T~-K0K(ynAT|)`_7*m>I+& zuH$ZaSIo9#7FKxN$2u9M*$WsBiYONuETx5w1V0^okbM3=vfSb|^n+H=U1B>TG;qGl zniR=Vo@qwOzrn5o$-l;@@GssuNda`8tPM4Lgikg4RtooW%X~h2fm^;3TQ66s{dr3f zzBhP_?0NW4G#(63VlA_+PoJY@+SWS}Nu&aiM4X5uQen}Zw9Lb$Tk~eiU|(8=UGwH3 zsFzlet2^_w3JiTL?96wEEAri<@H;E85QDR&CtOkB78@X5C;U^6eTMa_H+rF3uk;Fn zJi^!u$N`A%7x!XOQ&18=q{~zL%O9_hWE8xDeocOG``Fw7Pqk(u1sPZ~vEKlfm9Ei7 z96cH`IFO*-p~21F!Pu(>zK-&Vci(E2kgv!=JR5{Y$?FD^i4= z7WVggt36O7j!C$;VYe}rY38dn2+46d=BqdsfylLl7Htwz>5%Y#$Y0_hlGS`boHH5T zL&Zb56CpsLSv!;YE9iO-uAB9rp@U3o5%E2TBUneLD}2sDudd-H@1Z6y6FRjwEVaGS z)SfT3y^?3JXG6phicSUTnd+IBM&3 zy@-Enjbqv_*Dfjqbn)SR<~KAGaUh06gnH?PCt1sgLCmOhe=K_8RH=~of$mH)k#G6T znta|o;)q3-bsd5o<=dby+W5M~+bF`T9wbeOQx zF)KNEhvL3jsgUThC4%IKm>(wtW^M{Fw+;XX5tF3*xm%Q>SmX_QYhFqL8QWaX>s4*= z8=%KEdhIf;c7q-w)M>6)gGb}OspOhZ7Q$sXxn9;8x|vXHTR&WdNbsH0KRkke(462R zMA8~0OPT|l_yZr_Y52_CZ0mW@MKSsxbBiaBGy1_TmNU0_fVjm<9>v-mTq5RQ?rj*X zuta=AqR1YK!var^qF1b6E$4_4&*znYVoH>Mp29z>LI2`0Bq#XCEnlS0KL?gC-Srp- zPLBPV8EQO}PLY`^=~U$KiNrdS!)MT-f~F`iDw6{)10Bg-c8fouSmYYK>8|BqME+r2 zuFcfj$bS4teh%g}+}284VMfw&x7hoP1Xjh1*?$nd`58b?@W(sQ8?hb9iT>&6ev-dj z7wz9ahe0CA{#~GwPSwB6l>QAlp?{C!G#}8q#Ya&3Mmq4OyH;wh%^bgUJOHDv)Gn_P zS*j~#VgynpKl?SH`KSAO1T!`vVd(Xnmqkf9ULw(Kp#2u?YDLNd*u>NT>Un zN7CxWBW%`MLX4rKp!iA!nG<^Fvy zVP&3@unc?yo#K22ip2ML0_O$PFTs(-^;&{{M3w>1UVv=i`-x8tcvA5lFlZx*@7q+; z_u_l9EX2LO1{yyevjlf~)xh^?6pK8EH$`8AJ6$iBA|Fed%CfcoIfbUmo|M4i{_k$| z?`^=FitY~+^diP1pIbf*92ouU{N!Z)d&HoHWdFh{>3jP(R~F({Zk0OB6ne^leF3tt z{-IdpJDm6+e$7g`0KR}|AMGD8fXtv8o-n%QLn`r8@f|>wU6cGN9bFS%%1!d8QL1ai zpZ+W&SZcnPjK-dlj8gg2hmT8Gt`OowH2I4J9Fl|jhI)OjpL8A9D3H?>#=m+R+3p$WGVZ!K~oWJ{#&5%3+gvkEx5{<`(z2m&jAF>rP4`h=o$l_ z=TR(jCEmJR0Z<11w9=nobGONVTDU$CY(4-3HJy@Zp$fRY2z0Hc^iP;SASL9YO1JA$`A%zLv~xazTLCg3Oz_6bhR zPD&FCzNM9_fZ|{6C;4l6LcZK6hp4^k1>N-&Icw0a3*I@wyO;F+#P4g}>AxMSR_a8J z2phwhq=&my(y8%3U6x?{&%kkOfBYj5CQ{I|2`Co9yy9>Oz5<79wTdtb$$V!oud@IU zfOT1x`~)DD;xGOnI@MDgXBl%ku#wMhe3|++;Zxx zA#Elck{@$3uYF+zK?Vda2LfS#G4fMtG7s_WV($&cE;L$3{5KVG0X0gs*7haTMiGMC z`YzUMpVF%yo3Pojd%zRQ_EnC5fzGCa z@vy3_xedf$0;TnY{S$EO(+jZryby0ETUe@cbTgr}VUWT1P7r*b2D-xj#{dTt>yqCx zl+og4Lf;2=I}D37vs==)j3x=uhvdY5qJ(7>Ltil%i(l#vHNw%OnIVi_b~60zkOde& zyFh;Z>2ab#kH15)$dB&FO$oKC`w&WSgEBVoQm?0Xjg&H@w(kZ%Woa(;?ekjX9G z%YuirCif=Rn^eFHC0wW6N_yZ;YM5rx})UVD`a2>EG5QP{dPGjn*R{p@C}u?>yVbW3>xadChD!phjyW% zspAt|d-NjQr}6OLpsZH8i28|Khsr%j_!Q$00K1JSBz>ev0~2;~F~9{wP!}evd{H#QQu3S6HY;w9gQ|juA|b=Yv>3 zFulP&b=L~rS~IteZ>}tp0TQC+V#gj-aIH}#k;u#hy^Cj%$(1&$N@@REK~=K6By{8> z#ykQCo_M~8@4~JXZm~X(?M%8{bgYkcdaeA!?7h?VD%DRx`^EZ?c-82HLyl6kDHk0a z5}ZfvKwce%zX(2rA?(3tZt;x5{)dV6m9DaS93D@Ef!*Ta_ffvy+Olm08U-)+glkvS z2>%++M=Vjz^_cFoV@+yz=Crw1w>w9)xt?uzj%;&1r?b9L@1VITFEniLAZ=k=?H+=< zOND80ZSDk5u3AnJG|0ujOF9w}zK2qz>u~69d}Kt?FjNUoGB|Li+$W|TRg2~31Y!P7 zYK&z^r984#CZP*B2(MaEEw-E``%t_5M9dRU8c+0aGJd+ys0qY-H`KvEREm7n1A92e zY&D8SKBTuz)B(BUd6nEV2cefZ1q*E8f%Fejym)myk$`-1!{OS+0EOI zoY2iLq{cb5oBL%_vYYRp`TgBIsc_a|)PgQP2>o6EE?xvxKX>tV6yvK(&#w`7nz#R_?Owv9!k#O30-idJQ6jpRtxIKDvp z3M!%3t}UtE;IB+&<8`7L?I`}e7F~sc96@#bYrLYkSTXM;2A-GWs`=Mw%^UREH98ic zJbT==wspU6M*r%4yh?b*IaEFLR-pIP>OJDU%TB1iMpa+GM)Rxc5h~w=`e|lk*F%#K zXX`i~Y+pjWa1Nps=kfKu!Hvw!eQDZmK%Y&4k1<_v$*EgdKZF3>g_SWeke?YCPxkCx znIy-S80g-S-#@k|odfq9wP08~r1Ej#u-=X$xWVi`9Qi8wRJ`&A7K4}YqxkzX^!`NR z9plZ?cc6nORb&Pn-^G2Dz4ihcWHAVW1usoXA3L1n!#Sznd&GE_v7|nBt2hFV9?3yH zYW-pfGhfv|tq1jAm{R|fSm>Jpj#>wg_EV31kgyHz|$^=G3VqkfW;HZPa( zUjesu(e>9P{FRCNrE1ed^*=!cc)dgaJ>r&r^*gBkZ?T3O^^>$YTh(6;uXk~CO8uXr zbSi$nL0zJvfBjkg>VNMY)IS*YQ2o50v9*3G9n^6aF9$Y49_uOjF}`*J%i~g&|0xn= zJ`O6Ni<1}7BL2V1UyB3-e$uBr@+*m-mGDXzPwq&2yz7w!c(D+lbas9t)yMeABfgXRzr^eW{IWj8e~`r@J|s~8*cCq2AN~ep zL@Fqk@gFH2@IId2=||=B`^e3_la590!ycP;W#a;m(ke^?#NbxZsh4f;KA&_##dfv$BUMP>p>gi zu|Wc?01yFn#OT-MTXPIfJjGwd<~{KmO8Ve;i?@n!b_PhL-3~ z(kl9XhT6il2WqgGXV6DDtEo#meNU2NpcKz?BrT<)&uk>|sQrpP@GxqhK@S}ve>|pt z{oY5=IHQoHr08kEPHSZ_o?*N9XP6hkc&5K!GtWvTc4{*Z8A;sC1c>T9LP2WgJiLkb zIt_`HoWI@T=kfz3&%VOBB9euozz3Zt`>&qxwq9W^$so{tHr#@n(KM{Y@;7?*f0ckW zcr?=%qAS1@UA|;U*;Zhl)h~5FD+Yf#*=#9KBQWli1uns@R@HFc` z;5sPMQ(!Rk4Rd&Onw&m zh!bLS$8y7m#D2^?0F3#v5bzM|*=z-$!C2h%0jYVc8N~G5de!b~aGO<5gWC)dF0>-) zKP52qZazAvh=c~enQ1_<4p|X5-WU~Rk7SNi<8>L~p-6#Kw8H?$!Qfak=mZIOki1)# zn6_B?+N>*QxqQi;Vj2OV;N*M-k|YMqNXwuE(h^ z9^YDP;AK{D+gcw%V&{?#sKXRlj%S0OE?4dOPH2zHqP;Ut(jJg0VSfnf*T^M__DIRj zP1srssl66%JaIoK;p+<3p2cVn@&_8~a_zwfs5CaW6eV~ZSM4X1V!hZy>qV1-gVu}S zR<&Lv>DSJt0IB2m8?FyL=UXUTBg^o{<41=8uw>l>YSos|K|qAsXM9oXlN5Y6b{gYJ z_rVc4k;nsl3@S~Gr*Ep9E|>8*{ui2w764!vt0j2$)1GAMd|6tO{%n+nA>fthwOG4F z$_p}I&c{;ZgS_LeUC_}vs&?6yOpV3k2;P#7FBJb`PHb!4gbaotTYeK+jfBMf#-)aa z{MsY6%#k_$9x@zQ9ITl6jzcr< z_kihZ8BAZxVftEzOZ3WNfn1iUms?@RjL>~r8A_Jhk!CmU-{L!js*r4+qoo_S@abh1 z+`*@pSxMVmmaSLYp>Wn`1Hp-Y>?1_pz@<%6%8!g;4ip(Pt`o%8W;0si^$&yRnN_;&}c4yHUPj0kqyw70fI?7@%E)!x|>%?keGTy5``FEWCkTowHL zx#qVg2V+@HxlnHB1dp8CWD6cUqiIO+cu7-6@MuY+1;=){Aek(ZW!=G^0x~pZf282C zLAHCl0c618wuRooLyN;brLfSS8QfwCZtK&{SGcESWctg3$41!hB{l~x5iTRaug5JG zz({%xlx;mG|L|aQFOGlvPC-)vod)fMV(@FXlhe zCE@?TkCiT#nyZ)3g{U(UH0Bon#DM~dI#t%Lvbo%rbk-ujJ7nrJ8e+ z=9x@Ev}~>Kq9Be@^t7yUTu!i)0CmM6w4f%eP^88^1k%Z_7EM8Q=a?--L3a6|$7*&L z1l@(8h*-Mq-Up-*fcCYru}ns`)-bp_Q-ZCP_9A#JEVPAgMM+qvCz|O+e9QW5j~I?N zh(j#m26{1h5)JgCflE$kz?UT}53vA(Ys#FHEJ4p?Q)C1hQ-;gH4X|M`iJO2QcBY1( zhhY4;y5*mP^am8Kx%NcP!k6%^=#mEz4*xz|@BnhPuE158F+|yc#pWrt(93wj1RhTp z$@f8p*vUHiOjxpOgr_Ab6`YmY z^3`Y=QUM)g(EbH`#wx4%x`JSJAv)S)c8Qi|j0kQj?r?pi`vn2y&ur-=|5YMW-vzp> zTdzH6?nS?FznVV9;`j@$lDCzlH)b*Qj(2s3=b0%)aVaKcYSV9Gzs~bGI#!&wQOQ>r z4&PTi6l;);NfZ5tc@&k&t_U2bH|K!bU^lR6jLC=d+CFy;bjYUzL$1E)IpWtF(44Vf!&F0de8ECt51>FN z%%n2V32hL5%+7+Kr;v0-b&2wa=GsZW6n&n7M`zZEcL08>eklvW7rr?U_!i^Q7J7?& z;Wo?Oejd3S<1V(n#`rLNZn(efQzHA&Y{zY83_e{TR0r_)o<`uu6i9?O(qAEySOvrH zUQF=gjEO$}DSe#cUlHsfxrF_1OBPssMS41rL~AwtpQK{A z3x{&x5t2m$#Pg8p6=m-NYw6kocx54YI>`-v-uT7D>^~ymOgj27o^q)Nu%wCObiyjO zAQzWT#FJ|-=OaAfanAo8<*#=gACPaMai{NFB-JXv9{v_8n;7Ta#ChaNW2`SsXMU^R zoE^9a#C0u}q&ly779zB{q9Eu6L*8z8#MrF|IQ(D}QO3z}cz*%o@OBV_$aqQZA1Ca0 z99w`p&Vi4iq%hfTcRG&E|I#3n6k2b#l4T4{QP^2r5NysiHRi+qhdj{U1=KWD+st55 z4!^xA;?Ho@XE*)bs79@)EI;CkNuV3osH+t#9aBGgS;+!x<7wy{c1hR0#@m+UaJa!{ z_2HeCk>F^7%T2yPrGbeE3V8$qtr{g&Kg&Ltjq@n{$0dkvfwit*bPMVzbXri!16;LV z!c=)u={I*m|6FD7QXYLSoOSmGX|)>z`cd<-zoQJQ!>V5+C_WDE9X~|xRn}@j@o{YH zdxNfCEEoAD{@%t5!C5*>7tqB6u+gY-i*w~jgH*{Q%PocjD9A9d#lc;Vp_^!Bs>%sE z;*f&x#I-=R!Q+FPaNkh>N+@oPwA_$8vNxc*U1N%@$Ksjf9}LklDyf{a09Gv683PJ* zS8lL4?w=f7h$hOZ39Mf*1hKUy^k9pm;yIE}b<+HoJuc{GXG!>4xxReO%wy1r zVE`M7d4WK;cno=XkK}VTeK@6#VNJs@{t>EmE=WG07m-dJKA>N+52)*q;rJ;GZMPzm zdWzv89Y4P$wZ3xv^vB%d#k0uqQy7k)Uy`$wUTrCwHNQX7VIX`uN_lkajgP$#y$DHntS zG3bTFdc^r(aQ^R9es}76HO}7)`{BJLwo zP&!i|9UHANM}I))QDkTI9FJbU{66}KxPTT&wH`|eocS)FWz?gwzJ{~H{)2M#%8!r^ z0eucMAB3-^_O-Fafb2k93|s3CF#C4bL0DI{yZ+hc%m6d~1Y2Q@1l>okyFPBY9b`KWEZA9T|f_T+1|dur;KcKBZKNtd0YIcEa| zuo*{}lpecWBsxM6?WRBUnX4N+DVVc3?f3`1p0mL1WioR!ndJiq@ddf!Gn_=WZuU#G zEr6r(9t=G=y1f)Xw80yyW_`<|*|b-(J+RpjS}=crC*DsY_KrQ@F1(dK(EYmROH!0Xx)UMyp9UHze%smaa82^f1y`e9Tisp&3a|F zqaxcs>qV3p7loqhp_M&0fvbHAT)}PaSTm#f{jjuQ*j`((yeuh)-lY&JYqke z+~)J%#z*~XNJDI|b@8~Y>qY*GmPLv;j%=Wj_oCbL0lZQEleI?qAfXY`WaVs>rF*c# zmGF4J_Xp5qR?Z+!1_Np9bHoU^p=a@7WE{zd-#m*c$meMUKnK#P@H^t>b&@AxnS2aF zgA}jx#dazVdIAx9gpLd!!BEnPf{(o}K+)aZ^ty27~}aQ#jOzCoR;A z-*AVi7tbAs@T{+*6wd||J{i~R)=w>2rmKZ3*wJHr*d zjx9|W>zn9PZChZX!|l&+d378$;+_JU8?G-OXT^)o(3nB%zVT&__Zt6Z4ik6~iN0De zTxW2WwOfX^S%#N69be5qqh$|~~t2huTNdzvJfJp(8L21Cjt&~cl$_+^6ow6)+4ZUuI zoX5w7T*84Q9B5Vbm0X+WFLKPX`+wqS%JKiuQEBy`@2Jbh?Fhh1^emRA#52!8yu9ee z1kwBg)F6pw4AG0wkVc9Q>tf7EApI_p8aeGNY(O?sWU z5{PVf?P+rsx4Zt<=5(~X_AH)L{k=f>0Kx?4IQ}x9g)|lmzn|wTSwm&zlF|fh?Z_h%4Hxp z17iKBc5RB$7s+qcH@Hnmug=59#shWlSiQOcA8DR!y{u5LE<*n`PmaN#OTpT(wcsso z3smCq#Z9;x9E{5=#`29Dq;ai6N<(qDeg{I%Efl8ttQykZL(au5%{$yvGBf=n_y~S? zaPywv+j0LOxFW^&G~%XsU@D4jRjfMh&k@(7e$u;cpj9QQJ0m(oSc7tCO-cVGb;MF< z3K}HFc@Ly-4o=rJOs_rUx3(Pp4^kOsXz#+F|4%=|b1*)_U;))Atdv36SW`5+Ix!u# z3{n}SHN$>j4~-zk7HX~WuHB<*_dvm+)%Getu3xBM42Nsl{G$*VRMY0a0;0lhy=sqE zyHBe+Aj4Esl-Ob5wUB3S#K(v)4ikXrb@Wk{)lpUe%+~fgstbLixDfo3fdMXfAqqyW z!5i(L`s(6-#7)3;MhnI7=V3=p0wAhJLy!|NJA=Hi@(URSA9#+I@&R@L_& z&tBB`DAo5mQ36rl#H{jCpGSL3FPo@Wm!`YAhu0o-?DJb3U;C~gl_(fEEkK=e=K$Kj z5Dm)0T3L}+Ey4BO!=O$^)wrFL`B`u=c2+oxCWelCHKx=3;%85xm^*2> zI1zPxiJms3Bi_zxUTdNs0eNaajoN`jJ)v4dt9CLARjM^L*~fyyX@^s5bzEIw3+2#j zeU9ULXp$-Zw5-G}h92dC>ntBbGL80Dgl;QS@(83gk7$LRB66_UnbT~cze*|!*RS-5 zA)~087^(W)q63==vY+Mq=2pm34L6EQw_&>B=FEqwb}H-@!_gz)NvoKRB;)`}oTBkw zt}fLkH{n|GcO22H&0O}0o4FO)YBPt}Lcp8cP}%SaY6ohyTx}t&TBrr=R+mu_ovPRs7T!NS; zLxEmhINoI+Rh#3e&9mJ%AKb)0*x|~x-G@MW@d-N7}KPZGNj`uipY3k8peqW%^*pzQzpg&FGe8Wm;8V^yLH&@!c9z%Uxqkr6yC8 zbxzA&X(n?cHbtkH`=d`b_pf_O&3y@vG5<0AEsMs|Nue#2jj62oBkZGTR{GAMd9PTi zI@E9>LdtT3u9l6eU9PzfXtmuKSWmUs4=K76s%Iemuxq8&e<=-}Yc=fJm9YIofiY2Q zX#tZ@xN2p!c;!i^=bsY=E$jwQLW@ ztbp`69`TmS?-pH8B=V8N{PD&J(BK?P-)D>Oew)mvBbaN6xw|dc;k&3jDV+4G130qs zR7-YY2fKhf6rq=-pmQa9iCxTig3&t!Q(Eo^9!A|VoA|{Q$VQtO>6SYsEwmoRVg%L{ zTx2o(arR?vS%?gCn(r)XIz3(}ZbAXr5UD-h8cbpA!Joz-Iev%c&R&;g6|b*gY>@7< z0JA~-5q+j0@e1p?!I;@!L{+AtN*qNH7^rnLl04!sPx8k}D(QG!ZK$J8QT-HlG<$vn z6oFpE>v-UA9+2NeKaac$_Lk&Z*W**v9Z3Te;LlUAzNRoL$o4HgJplgSE}_F@Jp-3e zus5e+VKAjYzoF2uFrc9Ti?d_njDE~D1u&ufRn16=p~0}e{#0JKF+J+g$_GN!fmx@2&&O&C_p!|XkzPg$r#cEt%gi`aWSxsszjMDj(iG;t*n2 zQ4g6BEauHmQo-U8p+^lp$?Gd2FTq-|TmoNZuMRUnZgndV6medxi%GeHc6@Sg-3u(@ zQw@i?SW}Lh8*xa*tJ;OA9oO^JB6a~CYX;B}to^L_&v=dSi1U)$8I5%0JHD)FRCTfD zT8sEmV0v;567NupTd871lA^_rqz7}nXqiXM>rvG1m$jjfouxNI(@0{QNiGqnT`QZR zRnLZgNWgwuK^Fc!f0~T{)fJ*OS7Q2Z_0$=vqbHItZm?*p+;~CnY@z?MFbM`b3r-~_ z{#aI@O5>6e&0tcU&N0~c(V|Jl3?yU|BFjMh@S4`%&}UB48z*}`a<8a_IG;;jMF2+6 zR{U^^Zg~juRSxwBa_Oeuaet(bA~b*9wCPxh7lD!&z z#B}&323$+2(Kksom?zh>0qs?tti7Q|d*@Pn>3G9LZMjFXy_s5Xu(Y5LrWWze(nfP< z>3p+n0XY1@6m^Rf%i7@b+^5JR+^6V=yxwx8HsXT$Swzv0=r`gdJTeS#oKK`nLNmI% z>kEtziR1N<(_S(6LS#d0%thIF%>;p-0hr$>uuu zVU~Tzb+N?0hy)xy(PTNE7h=C1GAhaKAVxZjsAJ?S)QH``;XzbGFpAgX0pswjD$;Kp z?%?wY5XfSnJ%W2GXjH(sYQ&E}2CmuW2kr6R$|tu9iW)?{tPl1VkNz6#p3*1l>u9XJ z;wqUNc@E33nx8?wa?cX%Ac~Vq1@9v`c@(E=%wM&Rc_<-^_sQb8F^?FJnjez!V3wTK zSqA1NuUk{xO?yMDn4x)RBdUqUchv!x4FwHwNC?P5?hI9O`vYggM5Jo#O7Y8LNhX%Y z02s0?j>&lk%_O(Ds2jzg^x$g4&8zDeTPr>!%;jTD>U6}Nr^!>lmy-H|+xB3x@xcQ8 zZSgS|1D*W!BUHpPOrSO%h5j+$4958;LucUA7{rOo%CeQpD@h9l+BgJ?N zY+?@W!vXSR6u*OS;L%qR&c|&z^BqiLZEBG=vsmN%)-(?1W^i@B)Mvum4%bruBuDKs z|5Xmxa{uLy+7oxC=Sm!|$NX6`=8ePkl&=aRC7m+=8-98A z$@=p=ACZ6_zl6#-@+jVbUKUkIB}KwiU=t6Y-@w#BcGLOrNzin?QSAz<_8Pn~y-KzC zBpy2{D^J6-99@j1T*}W!5--SfPoR06{)$P`WBc*WqOG3FyAGbYqg0i601b2<4&)VMf{Y%c(;NBqYhxp)L81c?86zuYew z_m|2o>6Nlbv|AKm8Dx0`i&;8HJH3>9f%9Ew@_ctezWC#}3>knzTvIB8IHz3H78;C( z=*ZYvk@X=WyZ- zdIO$q>nm|@j}x+HjBe%$J14tEWd^6?9v_?rRZi5L6T=IpY3m9B4KD4Wso(3nQ?Hw* zb*Gvpk`xu;ExC`jxyf~;MB5e}$c6{W?GW>%vSLT#d zSd>M`e9&(n*uie-%&^&;3)MX&ii!J}k#?4`LqWAT@DHMAggE?Pphl^$hXpa~6Bf1cSdk=c zg)g|6^?;l|7^0OBZ7_^1Yk5QiT8NwuBMx=`iK=)Y8)Yfz2X>IJIm;vbiCbJIfr|W+ zoXlMTl{#9bZaEB;$X(1C%Lc6X|5`qvJCd&ul*9$lFk*?}Xdd82$iQKlczrp#_P7<# z$#d0IyA1NMz!Bw*P^W2~*!)Gq*xyzb=yio!(%-p8ECQ~gFEc&>k;LctMER@4a4Nrzh7Xsc66?4cAIRgvUvyUb%@YnI z_Jv&k#0`Ll%Upmm5n|e654wci000x~kSK~#L|lv?xqf@ZG1LzXM7Q$(!6TyT{e9fW zH;QU_=~u>h8`d6t-c0teXsaP#T!K?-G~qf%@|{P_`PETi2d}6$ANEk4OO5XX&Bsi< zGXVc%HMKq5+^6~bFrWEa=FEf=S;Z^Y@u?WbJ;1nA@SxGu2OrhQ>oJ-uQSeHC>%jmP zP|!|oGE^nxErW;{l|_0TZYa(kPS(i@C5b+3Atd0_sd%aj47r>1cY(pFZw@Zv)GD$y zuf3}x2g7UXs>r23ofUa>BBV}Hqvc|sPDc#KOt#i^AdeB^f0{8I`T96$l`mU(kJ?lo zHiY|~>ilTRFVQh&t&8zV;2GUle%Hp$x|LQRLNyeldS zNu3c=zpBqs6|)7E(-Uk2PX`*3_e8Khr3&{%w5fX{V7Tu}+!IkMp`2-@jXWc9Ga53? z1sicsMC;cvAhQ>@xq-?~a!-U6_!CpwX)qF(MD$24WXdHGG)1CkbCI{vOr6-N6qVbF zzQilb=)5m+2?UP^`#&*A)U`QX&dWgz&WVIor1BCNz_VJnx}4J~r_(tD|LXCt82=om zsI>2RMx(L8ZEzm($SP)5(Wt0EqmmvHmmv(eKcRr{PoQ6Qe?tBmzK4v4&$vGUumW=O zT>vZ+on6w!1_lM{zkdDUh-trEPUghu1?-?+CfsC;L4Z;57hF{|TIWFX5fnoF4@Fx0 z4gRD5H}FL_MM?NkKb?KTrcGV;)KwwJ)oq; zEak4?^>MN#2=6O6Asw|ej)Q&L`ZL)viPIdr;r_H6_IPH0Mlg0p)63>90C3LLHHeU*PsUMAaqTq!l;9CdV+E!`dv57Z12EC{jfCp(61w%NFnA=r zalCHQ1_6}wC%kQYX+ObZd-RxyJ%{ynpU3MK?}H^ot>q{&|L$m_X3;3Ra z&+&NKwfVU?$rETF44e z+e(KBfumWzjKI-!zcNpOCzm@sGaoT(P>c3Hh2UxdM%!oB!n-r;&w>$Rv0h=% zf^lM@UPITKjl+c@fxGST8UAx^FKr3NGJUSaSrGWHirVD*7t4YQD0aH<$Efe8bP43v zEuYzKFYOE-u{Am3W5T7Nb8YweCRm-$xx!@eosVCu|6B~x*@WLM!ZOAj9oF)9vR<3h za@14`yG;1}8HhFLy%yH_fxBS&2$;(qQS`Vx<9yQ7!hqd()?zC_8XO&q^)Qy@AI$|v z>DNz;j>Jz3L@qc6y&3p!8_JjZh9QUosRy6MKmujy!Po6-3L5;I{baCj2`of|!vhN) z>HgDf>r1cH;CX@gRnbw>;esa=o&BPgOeB@kWfwe`l)XOtpVV5()pd)=8iVMe-`GNA zw>z2t(K(^rD05gb)@8)srvxQ!vK4ZE! zgY*4*8BP5dbANk$z9oK<$m@;CjTSEK2_CaF{z9*?1d7c~HPZm4h2U1~ve&M@Zv>^Q~L39t~XIlk#O(rL<$IEJpunEa0Ap8$V}RJmTv- zwj=}CSu*}j4Z#b!iKUmM+@zm@X~tDhtb?{2uk7)O9&y%_2hg3%G+J`w(?1s2KKJpe^?|7B8ZV8r` zW|jn9EM68pW9N=q(( zN_LZD3l46DN8*ITj^hhpYn9!eoeA3#J-sbEEe6h5`B{>HlH3u^J&JO5#PZtzY1-cY}IC&V3H3uva1%)5aqTAxmPW4E{v72!S1 zu4%YH*n(2nE8964E(!K{qb0ro<|`;m{1qvcsHfyE%ltJ1+f=x%&u(|Zgb0WGnG*|| z($@S4_4E1wvR%kk0B6n&ywQE!kUteXUh$C1#U)(GU7E;+?}Ar6FEir{^1R}4Jag+i zx25v;W*`H+_!TQeMo=JN4J@8y@{gg8m*<2wH=PAF_g(hmWZj9BY@}HILxOi%6NDL? zOI9OwViGro{)19Mp(qXm+%p&{1nverfosO0Hs_k`pa6N)Mk~O;Tq|6U=cJ;|~M`@_{ zv4E(?x`4z|C{CNRJ7J>)j}0}Bi{&`>nQ8Y74V{r}=ixnu{?|ROvv%?>Iq{%aJ*5I8M-! zq9koa4aZFWbZ8J!Sa9JKLP4X*vLfrRGAld_D3T=N6(LSTXy-m$%E=(D{X|->gM9UOH|Xjtt+q$6o7|tO zoQS?PzbCMGp$TfQ+TQS_A!8Ey5e%7m2av#224H(IGI(Wj>87Y5NZTjV8cgU5Khju( zye>!Ht1>U%G|?*#CNdRzjxr8PQEVq?F%`N*e4Yi)H)u;5)^QgbP-TPJD{htbQHSx_ zOj#ohAsxZPalxwBfe^i7HRr&G3rLeWcAdNzU=wBJV8CS#IXh6!LX`tV*jgWwOuJ!- zSHu{OSOY-%oFA!w)Z5|w0mHQ?nE|%diMQ~q**yK=4>TL&FY5qT^@;lJ@V$$ibpoyWQJ(3h0lM`SLt;Eh+~#l6Ke9vHT6Y5hgJBzL@NnpZp*qdBzWc%IbnavEF45o^@HL?E4(7WByD#hd49ww*{jta8t;mYg7O01 zhqXPOu1|5M+y{$3FxKW6Pq9xi#Xdo5k4hDs`iZ$^vE?`zmhIQua4}u;rzZc9K=UUi zzXjVD2pXg@-zzbXNtl`G6@NrGn1?kKc*S0RVf6pVD`xXstO1X;$qbCkB9(#1c}50k z16pMo=KDE`Y0XHwM<&68Pp|EvGPfl^V;fFNyN=U{Ib;q(%qOD+Q^H`Qf?jY@DqN7v z2GxG{9gh;wimx-!tM@p8KYfTF4U$?aGcYVb$e<0x+p*bNUrF<9-uL89OXQ&wgi&7x zK867U`jV0rBa|nzYB`<)nr1+SpiDblfruR zQt=0TASNuPdI2dZI7?fQ@+%~xeH8bI8v=6U^BMfb-W21o-jQm74TzO5Q`tnA#n-sw z6Ci&ei~`RfLnDb5P_rlEMVFvnseznEpr}1Uv{K2}#9(Z#bYR3SZ-U|#l|{fVrM_N% zx-sQbWJjMC%bNi%uN{QwTGCI<^p#i{TR>UWUbJiVTYlhCS@>lef>Z=_G+e z7oHc3Uo~?7#Tn==V}`DNxB!R{cOr*@n*^j$>z_y85;>}Uz^4?k+-)Ua0g*}l8Gtgh zVW#feaAj~QOaM(LsS{KB0n|TtGZMuNrFq6Em>p2Dj1fougK?1v_9kRNj(b*E+l*Mi zN`I^0t@K}NozEc+xva}Bkx9M5hc6V9n;7&A>0zvCyQ4pp=OGXGuYO{p`n7DYD#j0} z-`digO|y!k4k2g|sUqf@o*!WqXAu8;Wwk z4dG?!5m7;NNpd5tIs9%o9>W%Lx{-v?Pf5NndciWW-)GR*A%J4g7Y&oN*STd;fBdjc z14f#xo}(|)!w{t4OEglS3PW&@ijDWPKW>0oR;(A-$A8?GfllBhg{_<3UqHFj+QmgjcPq{&ec4(LUpBkOEu>_ z&EspYNN;m4#2xQyJ_mac&E5r>8P|#z>!n3-l+!$upcGDra`>uFXGXfzDbtDq@q7pd zAh2)@g*pe>WdyR!(e%K1$61v9QK!?AgVJ=6?qoXdlKy(Q2%D%{xo3Ad^XM%(9hfdA zLI$O+wkt||?(&h?Gq-Wfv>e1oOVi8k8X}yLuAkg05DWp)(5i8rE?AFMrw63iwdx%0 z&BRT}g~`yl?1IJ~Wo|JChZ-OOqyINUy-gJHhIUv52Y_le*fklqDQnI9pwc+Sh05p3 zYCr}aah|H`>+JBn5$`}_)u2dJg z;!0cPHi+6A28n5CiVh>37TUQ2Sk&5Meh}hgdu^=EKF9V_?U6P&ESl2FI^qA+UVF67 zZE3IVYjbB%-oM)1nYup*rkqq=wip3u>EPoth~qF2=%L^Uv^P3v1V<>9TJicriPMg^ zVG&@QcKCbU;(_<*wBw+0+VL4ez_Iy)J0&tgH(KM!2p#k>_zZ-herGtBdc;)JLm8Q1 zJ*07Piyab`+Btevw>A}X%c5t}Rol??HGgLEL1~Bm=!<+#Ymc5Mj?AMK4jIG%>%>DU z<5S7MbgVB(N1sRIB!Cvjj}m>(4Bul>`hR2Gxx?q;1NeRujw-NR_j%&f;m7wu^*BqO z?RJ0OaA=r`(73^>ZKk2$p03 z%quqVk*Ymj4M`cpis(++sG`iz0p}r5xat zsS*O*cruNaJ6=Df>ln{Z)_?e|;A)`X@IA$H{@|?9EyNFwQilTfOfuO*I+JKD{G07~ zfZORc@s|$bDc(3O-Z(v6F~coB$b<6n-pxqFeh%#NJbmglh>@2^T+7oKU|LfO z#%UA-M?Iuh6k{9a7H2_FMQfdvgU$NPVq}D!d2X@%T}nL!y_QF;U%(6iK$(Mh|$Ul6_ zt2pTQF8T4)^9oPse$4MZWGGlU^})xVON(W#~IvRWDRSSZ1+kLjMc}iqt%_P-Flz zg@K8VrTM1c%HwBb6-r8kxTVH-)B+5pQmq)Yh3L+9$O&}%U=>>-$E3)dxKkY5X}SoK zP8t>qq{#(!EWb~x+q4SgQ@q*XXczVIB1>%2BcA7zT00IxfV&e+2C`2=vNQ1^1_|mn zyHpT2T16Zi(C9f_?ZaH{^|IP%Sn|&)^Qk|q4wv%>QiAG^IX=(IIyghmP3yN5ob=j! zw11YK){q`=vNo78(Ch`mUVM2Zs+~qO;&Obf#Jr)4xmrpg?AMDh~b%D~?co}rreMroIUQd-$ut@>72i|KWxT#^N+N)nv3kECo6 z+*Y8~cY|i&*9NX}OE_m8t(x#L54!gCNy%eQONseG-!&MabENMGz^j&FX z{!xLu(p~-$?d6s>*JluqGLX}Q1Ju*;eHpygN~T!muZO!5ot40G1IHY z==Cx4nRwIT)x4CEC_;u%{!zF-9*PAJD{BhiuMqhI-g!O|o--S8BibQP7(TaQ zD9ysn2kN|F?AkGMzQyW}019McWNY=QTGS>#awFdL+5;H35_c}vky4m(T6_)gfWnc& zVoTgNOS&y;JGA$qn;u`0I|@4`*DhQmLFP||@S#oj?;75`n+k;Di!=S_hYmN6#^zDG zNV|*h%D#_vUMWdXhg=7UB4ICIk*j(0$OjHLOTh2#5RPcEoAG0?NOO+SlrcHGWVneg z86*n54cG7Sgz0*{nrm5FL-%lEj7>Y6U=cdVtRV-R!KW|h0@Mb=JEZv5*>t}2kK3Ra zuT%m7dQqZBK>>d{id?~P7HQsM;{S7)|I2Oek7+CnRSEhF?D{@PNkdPge^v4?tsDLP z|66)i1Mgtf_@JRs48hqo7M@TL>yli1a&6d9hwjF^OvT8=EeoN zpHQ6W{1F5JAf*bm!=_LvPzazBk|)I!d@tSxP%Ish66Ir(mx_=q&*QMN9fQn3Ur778 zowv{%ty^6xk5 zFH2apB7Pyed>w8eNTF3;3g4-JVDM;Fs1a{UOj02@@8ce8Jqd9`U>Pahlo{qKG1d1;KxLT8Bdvbi^%g zKnX%%2=*ijR~Gfu86p!@IL-`~e-6^uouPlypXj;5|DP%zCBY8Uv74H>-RLJGt6?z8 zjiIktu`xJsC3Xnk5zno#V!eSTCp}Hi#dn^t@=#lGCo-YHaG^f{J*K(@wp}CIUgC<$ zK;wSYAyE~kZdQv&ey%!8=u>D|D${5X&La9!_PEAC+@`Vz3`7NN0A$+~Cjpnu{p)nD z`a~s@lv=#m&}At5s}b5GZw5+??gv{7t@G!P(if8*e9pv zv%|7SSgmrg;^FA{D?XO6^R=m6p{EGz+%e7%kII zM(>#_YXF)*l6quWGhH?Hz-dV|+gi6l)dBn@=>0{!|Bs;i_01b`)-4t&Q^H?I(k@YhGj>Io}Pt{6!<%lo^U(eV4Buy5Nx4` z0qQ{W8Cj14@egxSI;%i@K&G8+C>E)#0T50b2w~Q#Ae5J-+&Ea;Pe6vjl8I1Suphv2 zhN5LJ1ZX5f9J5CWx_k^HOvh?-0|-sw8x*)}1St=tK*#D&h%f7Q6O|IN?>NBUbcL2C z=o~zNUfftSt3`}OyjXbEG9*Da(-&{diLayl_&S;h%sLkVe&WG}@W^hZsi}8Ri4*DC zK=sLytmdZcrW7PAHZ?(}oeaq%Rn`C`e~CkZ#H=Cy{=^WjmdU`@`VMvvsr0@L?}1HE z0&2n;54Tkz82GilR5lW(M1eaQqjx4T>JfkZ%z#!gAx7)C4=Gi;$9>Ky#IRuX%*QUx zgbi9MBlzDVOi^VH9QqSoRa9w`X(vP2KjGES^P&HO_!wpf0+950B!$7V4V zVZWr!V|XnPW)AbR9o~TFpINDj(4TsNc71pr5>GoX2vZf-0h)dSX>S@+%4ALDWys>Z-P|G%ed@_N3;Pb zJ%srQxr%I})L})4Y=-rYTu$L5ix9MgNXh3E-hZYL}nldhB!1 zPw6!0S_YYPIOGjTk~lb8inH#mYID03IdWHi?Olu(&A(J@UXF@&*HXS7ds$!;x8*~S z8VFLw3%Quo2Q9jupwtTEI0=OSXOsK7@Fd4YtL)#!>_ zd^DR!Av#2yj{?U23i)b<{gcech1w{tgg#eJ$z)iZ(tVTvD_J#aNy@4}JK5B{S~faR zRy_{`+>eCb&q$I`e`l56$fcN=Mt^Z;mlt*|m2%CWKLpq(5s?2jOI6mNA3P^fE9V6X z3^$#sQFw-J0oCICZ#wC}@uT)Huj5heUu>;EmK$lvt5A2NH<7cEV6XyP>)+W*C?SAQ zfj5z4tQfY|?h^};wNd10{K)nqo9O+)1Q0A2?>rIvQ zIkMFJi)_Yo`?6?&&1Ri59UNWL?^ zQ{HtdPd}1Ioq{naR*@dZuy?ct@h8FN} zZC}mYu{ed`{V~OM>I!9}Cb=Nl6Hk`JlQr?w2Mw?+XG)~SR2qf=m)&ctCgUC9cIme^ zrv%r}1Zf>4{a#fLj$>DGj%7svD)$MxI}h3)Gq*pqgW5KSsEwf=RDUo;FqnfK3_xTJ zT1G6Y{u@C=TR{10F>40eqm5t;aDZ}jh69E&h{U+~DJCEA?gFMM>~C-26h%utFkDZe zrN{xi6TGgc^xDhtw1j;n~{uhi07 zCVBPs1x`Ui#*`3jrfuDD&t6CR6gO!|1X>#VCb7M`U$U zev;q7I!0}VQhSi7kMyMBRp(-qJ45t~N>aet_%6;EDAvG6fB~8G?%_JO$BtYJt;1pW zI@uoDdG}eJ>1G*yYUe$}wKsytOYg~kjgS|WVWa|^xNckMTcqhcEp?uiP)2vqgw?|| zVXJGzleIjG8b?ThIi`V_pBRt;h_M5JprO0sxA#(@-wlu8&lQina+;~}nkbo78Tg^^ z(T`xvviQfL&G(!a&T&zfU_j8FF>ZI*vLtK?;D5YDhb#Wibs>Hv)yC$A9x+%#C#TYD z`RL3>`au}*cMvKu)3F6kd6266ycn1cnhiCg=51~m(aF)x32%RQSQ42WfYWWEKjZuG zs&jY%=vNJZ`nq`U|7-w8VgUGVGenhKEJI#uTcg+0U}hUA?1BFi4<=AJVgL#=fWjyo zh7K9?B96imU$)6Zq@Ek1sLc>|{zY%O%`I0*^N)B6jR`y%E#$akHgY517O2fM67 zuIRv8lI)>}40Eg?w>b79CFFOqY-N-s&8AzdNtVsygg0eb@D=cI;1v70SmLQqJz-25 z>|!@-u{%Rw0qIh6{>xi1nxP)N%T%ysWkC4 zNj>2}k7x0g?!oRbE8_8oKy-`g=!O=OF`?-oz4cnscZ8_6#B^IKDN1JukV@O}{v+KW zOLT>%6CvV1a2?c;ibV(K*@CPl4N*7sRa9CpTG3fC2_`pgoGoA3X{-?apzYarrPJ3f=<)QOOS+$2nFT%6r9~|4KgpPCmyO zAPJ}fZV5C-U^R5KlCuI@y&RhH={4d$rd;qF0-Gb#8N2&Ca1sGpov=TOXe_b#IvQ~V zB*8B%@x_JU`N(x5*&uphfu-O#UsR4Zi-Sua#~!zhOx#qy|Bf|)p=^xh&-9Ahc-}`jPCqi)~oYg zGLgDerJh2GuXprP9Va+sLV`y+>$Ce|v&zl$8zf1eQM^T?`SWB$flXt9KNH7c4Tp)R z;{FQw6mWO*@ahp~^Q*yq1Dlv(%MTR8E>RzJOvVQ_q6e-O%&xg)>SFSo#PWc}WQ9!S zg~M1^moH0MOyssf6n}e)#YE>x6Tp|cZD_QX?8 z;we`>b%yfrgb1z0l+YP+(4X)+ss>1EC=wb@cIg22Q#7npWjMTFFar%P$_=l}N5Q_0 zIJhu<^LRT~(&j8|=W5!V6F{=^OK32Oa7#LfU7aFkq78_W>M$m9jAb%rBFzJ@*uo=$ z*+Z|1vA*nPCSh$IrD~g~1=*S`$1xMB@xUhPgUNRl6Y@|T=>ojy1W{L+;O|C}C>Qwx z#|Tv9194ETUt&DU>Wt(>^BaI5lu{clxz~i+YdSVsx1rUpP`5E;9kfI_I_TXNd;zl2 zvhb>W$Sqx=F(k#|zpl_&^#rklb7tUItuqI&$8y8TT(s132nn5`8|e$I2Ql~N1g0!45} zaa$h<)gHmgmefz-d(LpFjO&nr1dp)ZE=yJ+K@7)2O#3^S{|oBmqc|ak#c}8(j18z9 zr#Cb(xP%qn?O4_JAz5bPlYG5nI*?S-F$2E_E&J>wV}&j22zPGb1a*-J1X`uC{b-q3 zzejwFJIFboR|11?-6Ba&TSch|l!{;3np`pTFhQbaBMK;08`wnfntWHF={j-M&m_72 zM1&?O{eV&6b1ra>D)5oWnS$o4ST93~RSfxlWsDOx^;>b@hqasn4tEwl$E5Yq(~voM784-Ky>paGm&+=-AYouz|8 z&{Tqu8QjEAw$_VJlqV))*cgeEfsMqByg;UQg=VNKBL9tgsJ{w}9h8Bf4*yPEsQv?w z(ExGb^=IS)LgK=kJcGQOZO)REvt2mR) zA!<2QX83Y8_qw0V5R&__Vg?sI%mbCeZ}|y={-iQPm^OLUVvzb^70C=9vBCJ@1exJ3 z+2{b7;YOJ%XQtYK&TdPQ8I)el^7$!c2AVXHyC)Ok4>e2^TW5kHky@s!9Ot%JY0~m< zA8C~Xq+M+dU!99USG>ZMOEc>-US7iGW3a=K>0|gix$K0?i@M68vqVMzkGpRHkE*)% zpJWCYU~~ov7$jcx%PVP zwbx#|O4gU{Hu9dTyqrkQIh?Hq>I+z@9|tf(tMZxTVHAvO^YVMDLGsmLNZz6l&h3C1 zg!#+NqMjOjse#00l|I9Xcy6Yqs4bk^bM-znMBEsQ;1?F~oEn|9EXJU>7S^<@1 za;y!Q2S&dXjunupk*>ukOtnVI?Gygsil0(4`02mmS9jjcRF%fBCMsMcesw(4W*Wab zAO1V&6Cj53kQjsUyj?!WxmO0iqOJ_dukLMPLeIjlej+Dg2!1tl3zy5nuM`8y28hT>P#WjiVSO099$|B{A;C0zltA2+{dm!MALSDR(35DTo@EsTq*dpYPQ`*m7m`WJMPKw)SnDgOr<{ z^vXNd-S+!C8l;hn3}4b8k{2{RYnQAL+J_mmS*_50sARTDJg7kwM>n4Ex}yS%tq;K zmcjHW@i3U)Z|=y(^iEU=O-%1wOuT7K?_$K4;BkWK-5pCjza*dI+$V$SQCEg!dXE5f zJT}(klQoLlv73)CV0zz>^9Q)4TXtsS4p!tzXMMO|JPYfi8wb6jPF5?|FFsMP?5WQ| zUS#k;nUxS!>0%=v;`S)T;D0~Q;D5h2@|gTj=1J#&u^{!YnGut9Ul&3Ww>nQ3QWa@WAacfp5v?m_hkO^%)5&G#J>)NQ-XzCb23DxFAuO zG??Q^a(Lb}?RGm-(SuMoj>RqEF}q?%h`Q4ZeiQqIZ0x*+zlmxfCtkUSPky{z-5?9h zKQ2FVb~Sq*+5Ck!G1Dz_27{~K

rYMoq93EQ=e^Tp7 zaf{?nYCZW=e$C3C)Ozx9RY0vLml*{z_|vy!qiOspPo_%JQ0qz86-oR_ttU6Xli*J& z8=5+kWOVXWB66~`>a0uYGu99GRF%M)2fc5{%&UKPR3i$@DmP%U}f5l_42{o$UeHwx2$h z=f#FtpWS{AD+Ffv#N9BTgUVx>_M~<*mr4Kk8nkWF|E3K3zsJa9 z(!b1;PXDs@boy7RUlIL(cS!ojUN}abmHux`rGI`sB>k%b2K^faGU;D7noj>RHI@Eb zv(P`nE2GPq4h=fX`sn1-K>teaI=ey{MA?1wVNkvz%8lhol&^^LN|}~MlzxdmX+&8i zQzKm~45Cb0JZz%G!=T6?F(A_^GRoK_De|M6vQT94{sa{+dpGgCQ9j4HPX z))|b-Su7@t*;inw4dL;U1k%Owp(xTRD`bisd-hNi8O7E>sziR{E`!<(iY)m_Iz`_0 zDX(^?P(MlRHJ2J z=n-|aP`Bc&qdYj%wFNi`xk3u{Eg4ihN)mxV*x8R7b&*1i`0KE5GkTC~l(H`L$h0)7 zz2huKq%^ACAX9PR6+KEBL)>br$L#Bv!_YY?5fZNB zY1;09ihM7=$-NJlK54O@ZHr@G=6YFMIM1Yf_LWk{%MvyNNi*?Qujqqs5cWejVIaN& zfg|i<|BH+~wAV|qjLzx1jIs@DmQuYJH(#36F^ma=9CvU{Dl7p zEy{gj8&6aE8vXQI#!4ImKql=`YC*OpSr5hL>Y@tuO=JqL+%yBfLv-O8zu%4roz3Mq!=P=qZsN7uQCd&O z6=jG&6z5OTKL{1CQtN{q9S7dw^6(%!MFLT+$xgX7-4@=5ltbIX??;aRiY@#&@$3n* z|1@r#*MIbM9&zjgalyCfygnPj^)Pj@<8p)}9NFQ`~RY1wRVxvHYy!%jsI!)f~k*O*2ZrArR^G5 zMDfu{1ow0UcRd!B1Z7FjpybXEk2EN`qn*fmgC{pOUfL(Ykfb8|gIgGGWCvH4a#;ax zyv&E!KMwa_@Hpp)RvrZjB;~8ViS`HGn`qZ?^+JvRD#NG#%KnJ@aUJbbFr>eLTfIzGsM;6f2 zKm3|XAcl-9{wSr!9}VEwCxSmk&n4G424{57&)q9DI^To?_ceUrJ|l!d*pu%Sl@Bm1 z2>5dO&Fwz=a~>m~zrXw*?ltEiDrrQ_T}dXfk)r%K$&U?1!P)t~izdz7yFk~YyOE^i zodxXIDt#9!^m=c{DxClCB0VK52q?DH_Pe=*QghMU$b~z@Kf{|%dC8h{2v3eh-X71m zoN!AK_1sg$y9qz&WbV*YhhU8t&n6jfdrNgwT7G zSbzLc(l^AUzu6&3e*;_tcq&;3aju(h3KoUP>rdeClD5=}Dj?I+#7o1pY~rOtrbfE1 zL_+|vB}$=Zls~2NAE8f&Azv;GNmx+e%7lG#FGEPKtKMa}q{)|KUP;K5^IuLpuanPl z?wKK9s4GLtmu06)R>0j(an71kc_{f}zlqEJXXHzctPm6K6T{p?$(OynAJ6*}YVYAW zgg(G@5~8U6(}`Cx)F?%*r@}um@)+{v(+ z)*~AJ25}%FIMQ~z?!|+Z51{Bt3~7q)r&UmLB#lVjJR%%St8yOGZ|cUow&^a^Kw&lJ znMA9Mm%EQoB3fmGdHSK~b)F=U zEc80$enO+HkmF`9^^Z zdVNcRI*neRm8p_m)qZ04f+TuX`-w{sPL=@1Apn!3-|JmOTG4&SlA=ch>mf&jE?OOz zaGcNZG&MC6P(WVqe~RmQ`VmkW`sm4$FFGcETkMsCU!dWu?tCQ{5k zQ~hMo`1Qk}^R7FPj!J3aw;-L=#YFxl$Erwuk4#G=_1~3eBlTNkDnjs3-FX9m4fSB9kbouxz3`@^Rm zir$w=0{hR<`-QSXruU1>hNAaMGnYZ{C19j-fW~e``{n8M{?P^_k3sLvGEW-4zkNzJ zdXK2ouZG^W35;IZ)_<~{Z1jHbsuX%Zk6#Z(?`^7pqW5B>KnA^kC_$Y@?|Wow3cc?- zFO%K_PY+4&L}Jkc6F|}ny}FN7`4kE4@e*lZ;&dM=@2TI;QQwTU3mbV7OSQ9arvsww z@Pox4E}G+oP&-E+YfnTT3t#;#>hX&2{G1?Oh{33}B(Hz&yPi^I{IMTM!&Ni~d_uo^ zKT7d>hHYmskq#heyjN8H4qA45{#89xt8oOb$1?@a5FjtI94QxvdyYdKJ(DxVDw+4PfKImjXGRa-R1#s3Vydg$8>OXgRPP9BP1>1Hm2UtNBU!HW!j^+F(> zU!8Hak;mXy_sBeH{OV*`d)j*9XqEca@T)iT7@M>3tKXl@qt3>!23k`1)qVVWD1H@D z1r)zpWfaKZS5sx9Y5b~4rl#<#!lq1q_3RTv@++dS=(KSJc#0Ueu9S8Ldb(~yvZ8QB zr#|5aNc67v$o{iQ;8%l%8Q0r%9pIEcPLUDg`Z;BQQ)I+AGG!YPlfgbc~?ou2n(NcSqQnjb31=*UMOx~ZM z3OkNio^0SO5_ni7HD3iuM~EJWLru=wJDN-VSpK??QlW zBAns#qp3CGp2|G({i7J)Vk3D!;{o%tvXq=HKa&gpEL(K&l{kzr^xp^s@jKSe>WMVwEX7Gi_R{w0)n7#z^KG8+ff6m}B_4D(c_aloBV zB{-lx>3NELj&q+34oF=Yk^_#P#H=IB3e6(NHv|WKtdqmFG?^Y> znwiVsfNkpx?q+bn=YEvV0V}UE@)#WOZkZ>I1D49#(>UNbmHO3iz&D&jalqde^Qg0N zz=J>!CQ{A5;Ow0b7j%862=eHk!r(C&|vU(XBEy(zP)g6;a}0P|z+(d(e@`2&mYR?IQPk*BI=4sMML;|Ja-&pVHRR~1bg^kAwv+;_a*kG6BGPBhBS9v zBr9ZMT8d3v;*Rk5NVj)Xn%N9$Dp_k#ia|~7m!?zGN2`rI1~oOyJZaSQ_BXlVG-`^d z)USq`G(=iu=F6fg`Si>p*-kcUy7!V4YC4Z!4@FIFs(`WnF$!c*(}xn)Y1FhwrlwHS zu5&V}DS#WRX)qb~4g~z{b6|HqX2b6M`}mRed9jz?Ur)ThK<_6QLi|8G{ZLf0?v%^ezS`25f$CxU9yN)lIC}6=s027~YG;MP z*?H7cR22RkZ(=JRLyG1gVWR>7pHC56Co&dAAAbgG7`eX|UH2|{#?|kR(+J z1(OLfsCBd#A2!OxmHHBw(VL?YDx${oTRcbUN456=z2A~}{|UX{lz3lF@ARYcx6}Kw z#QR0`zBKVZhu;0>dtxZsdl^G%MN%TeWq-}cun)RK z@!P3JSM=t@_vocm+trlt7^^_@>Af}aeh$4aO}tN|ce*21<)2LNb>_PvGMt?hn~?GA z@^47|`V$gh|CXK;&dxWC@8_xSJ@h@&H5Y%lC&~8mFr^;G{?=8?7@^YEqhEYqG82*` z@#XZKCP$`jPRNcc9!Wg^Qa;DIQ-&O&u9$Kp-G5>|JamXZB<*iGJ3swGf#QdS5)|(v zLBekcc`~7$tH~lyhIFSmO4iNtWIT3r(Tf!SL1$;s=*9=f%Wf=@35H|Eu2qK6FgCs> zEoE?`PDA+I*d|#*IgJ4LNA#@1ME&Dp&YUJ;+GSg566Ru+sw9lFGx~W3vcHZb_&@f2 zDR*dI%gpf%l2qiVA>{cH!x`ffYgzS#Wx_SGKJY&YtSG$YsUiKdSz(U00y_jam}epG$*C?5OLuGTlNIGA{QzZYuCP8m`^e5Yexb`fLVlCvJt`85lyPB8hkcH5n zbXWQ%^v!3-6{~QTTaF87=*pRDz7rICEWvZ=v&XJaX-520pG%*W*N8Lhb@+~t-_bqT zw8G`)g_^Gjfkt&7u1hc0e3KD@RQ6NGN%Bq?FL6AS2~JHCs1bPnv2xSVfQ zg~i$VC34byVP{IOnc}V~#Px$Uc*$~i2%(QRkf z6R3u+4W2dSDg@A-Zb7K7Doe@px~Iau3t^{s;mT4iIOy(awet12gLGFi>aw2gXpFD4 zi}RmhZ4P5>!I!evaN(bh8*LXB$s0}&XbbwZhC*#&5t8(V$y#l{)->RL0dbs<*6WJh zb%m|COOS60r27hswZ_T%f_^8zPb^Yu-_fEicEN&Kc*Gy?;Hwr|vj+JA*zS^$WPtlvpt@Ra%v*3QUZA9=CcfG6i zWcqUMWKKBNU0>YFCp*a3^tXT>po2|;kKfxHdAI`3ufcjjrw2q3ky-c&UdVq+n){Y3%Ik=7< zH%N$67T`|z+4h{vD^QR=t-u|d<<=Dyp*JjAuuogve-$o{nvUl|Tx!p_4rH4>P=;W+ zI^U66TH80Vsh=aSyAXNZ!SHh-l`e6>U7OCXsf0fY98N$Sce$cTt$K>qSkCzG(q6dg zFVxD@+`v1PL0794*9vPvSNd#h3l4KP=LMW4J1c7`Q>{y@b;Zaz`6^I3AQgna>45H4 zfB^_x7QhD0&k^tN;tSIhY^O=7p7Kp<)7{%Tx}?|L2jWGS(ID6-M2pb=8t}F_DmK$)vJDcT+)#DoL%ZoX!p8T=Cg4l>HITmY2 ztf1?))g!i)<&5ZvjnOZ3Vdg*xd)5 zKHj~kxb+wsU%g!i&3pA4kS~BUU0YPFwN1vo$nKuDyx_3PMN`_2h|~kR!0bg+w6^jT z`uG?j_eTMU!%OjPQAL6o<19blXFK1#BO3R5uf_dkYgbx=!#manErHwzb2`DCD8Q#) zUjaUKEe^#4kTc!8oIm~r9&!J3{S0?~x$_!!z^yOWc98FPV3h7F)@M!T`@LCsls1=7 zJhwvIHF9Tg`9t6`kQ#C-MnQbIJ%z2g59M?|7i>_ss4y-QCmw|OY8sfcEdLm~&z-JO zAv$Op=z1+UIsMRPrU_EI;7^B31KlyW!x+X|m$QrJF0{5BEa*3Q>cFKJ&aPil8kk}I zD&0lQkp2Vg5H55;su2F!r*P9*8+LY&+E#nGX)c+g6Fi z({RO;s&dMqs{9kU74=B1R->=V_vO>XUyo47wjv%352^vngNVn@FCG|PF=**f?z__g zQK2A57t^wrd13*Ki@cd@H(<>J=;F@ZvZ4Ew5+Y;Ek(Lo1(RaC10~j0D;i!X8lcDXY zL)QXpY}&{^1w&+hDz?IfJZs5F?SnkHT7;^@fNQ}#=+931XAk`$d5P=XY9I89XO|~> zGCf?o8AJ4n=Jk{Z2=rhk7?gqFhv-N$$QRw$Wyvblwo?n<+8QW{gFd=p{S>cg@sT>=(5oGKqf4uEXnxm* z>b&)Jd0JnJj*d%27TCd3Xj(irgT++Ic4gSpu*Vhg$W=*7I`zUc#VaP?@mV}J3Fk** zAKERk&%}H9BjJe$@jAV+{M345jaW_qW%r?|SIi$JEwwMJ@#`KNzEN;(_@Ak7TlKM^ z-;7C?{G;^m;2*T2lJzIxhgBF<4_sB{6QB05xe!p%YaCdJLF<8(-cXab-jlbXX54zu zxD7Sq*L%i?Tk=EO^R=cy_s4v2Hm*#Sh0?Jo9)J;l)b4~~Ft ziTNtm8!I$Vx#p|bP(5wEXPVZVGGC-$)2e5+!}<7#rJB|Gczy0t&6A72HvF}b4$+K( z+BF{}whO9|R7&*vd~^)8t%i;P$v|H#Ev(PTTPsaOX*lHIL^%bJJ3RG8tzfnx{(h&EP^aQD~-DT!cbl&s?mt!u4}O43)KmfhBtLT&$S%6*erd zDp%M7XXu`}fF@vq`CV+6(DckD_B@ph%R zW||BQdnyoc*9_5ab#dVJum>oIas9^0uXy%}fc%uaT)KQ1JctNm6+Z|aV7(CYiK)-g z8*Q3Z^V!1fcH9}&V;_8ig!?CVhkaNd1y_`}!LEj$B_e z5=j&}e?#4j^`03x&8~T7>i%;y_B(Arw^+eY*V>#Z+#i5KyXhnsZfP25!j15+^nqMA zpGdPJCgLkk#{2)l_mIUt!sTI)ePqxx)09{9AUFq@%v_B@cy?MFQ^g*wGjP=w?0eHucvyyZdgZW{MLu)S6{cEa)jttU-uqA z({F5wc>k{ke8gTniq{kGFVK5W;(aR~ArfyyK^`xU^l1ZtF4p5>zmur>a9Z*&u|DQW z{dwAl>(UVPq9Yh1V^?i7aMUhSqL)GVp|DT9pb{=Yf_Ob<^xxn+8x!&gOEI~oH)2jp z388FSN|r2^=8CWfaToWUt*i;&fUbd?#U`i>~Za&>}qU__!Wsb z#7kpQ1jGyf`$?Emx#r6AZLNX|5ITc?Ex`iuA>!l$)e5w^!JX2|8;+pF7w5hjwJlA?*{nRhEv}uz0mvc#^&W zJA&61K08O7Y14KZYf(F^A-3?$xOO&@vCipk=FI!hIJm}XF%omT9krFnz%(dZI`?8}RA$(s1s?Nms&;e=l1nUPj;wm0-$Cq)v zt_ms#bO7By1BwUm?;L{|l^|31vt66>-$hU7<)zh6!mSWJ7>KIf%RE3`m>0| z*cpodY<(A%)g)KnNY&qkWV64QsQP7p-PGT@d75XQUN>L!%-8D{!yh|#jMRrOq576m zY1X&J1$YF1Ycu&9jWP>=Bamj{Z?H6*+V6wd^`IF@QiyMtNth>!jQxufSBEq2-G~qI z7Mos;n^~dX#!eUQ?_j*S014S4SbG@*Xo)3AR`BzQQr2NyF(v=O@tMaGZ^T-x))C2d zEq2(o8e0U{G2oxJ%cML0e%0q>`3Ri4_Nc2q&jEi8oORXbHu_r@Be0EKJL;;>n<+}c)amQnO@B+Q2RgY))VYbkVebaJ7ch8WC62ut2?5fLhvO#)+e<#OL}PlewhWFy2hL{v99RyU zcp0R6Y%1QxthWK3*GT9Y@cI*gC(4m*!s`pn9%@qXdhRdyL|Zz~?a&S~&!T=}z81Lj zI$EvaI=4YsC2%S5s9ytkb!b0uB-;0(J+)NIS?CD)U4)2dis$yBJ#TUk7NG}*zWD&Y zf(Ct}Rds^&%{uA=E51<89b3U7HM~ltDNLH*T}B?sHfz$ea(&o<85q@e zM!cwNG1!xA55p*9yI1U6QohnWV?Js6c|Lg}F`x8K^EnI;hc%zH7nd=g4xUf7QOGxp zZrg8-O%Ybk+CBmk%KNjN&m?$-4)D4W6So@8P)zH< zxV1pE!01?EXdpL`7n`6Rgg;inRvyzh9`9Bd?kus95`Qme`z9jngKBFBygq$|-fY7@ zq2Dg|5@BM{YZ2*sP#d8&+d^x2yVD#+CE=HN;VpD|4ti$};zD#=Y(}z)f9)7!0{_nX z6F#X`U1Hv0Hi_g8T;#B0v9tc)=nv1Sns;L#_F3M}y6u92ctjdWfq!RF4|btavj^`I zdTo~Lol<;dXdXl#B{W|WJ;dx8|D=AWbRvUZd1p5;tg^)wIF8F+A+>7k0b!E@1_!Lk zX*J&BQZpN?5If#Pm7vG^3^5~rE+EonYjN0NkX8MxR1iyPp}{EBr~R6<*u zKRz#k3vSq}DyjADBqR-f_$nF_MMyUBF^0}1@bL+V7DIj{>nhmYmpDK>kv_4`z=6-^ zNgPPb{#5aYHw=2NPj1>zP2Y!aTth%LOY}TL$+HyrO8g787g~ZPI?P%vwi3Q*86q-I zthocc*h8E9BXVHZ@)aO17$G9|gJW(n1C1~}Mo_Ui^w-g%C^6daN7v;1?h?-``H<2+ z;EI(A*3H$n^{y(d+E!U@55g$a-zesjz#;hVeH~R^l-$T=)X1|)HsPzQhNOHx4^0{H zO`g-<@6nvbjxbbRL*LcM-2sg_^!fBQ+A`H_o4QXv)*c^5iBblPyNka&&F|l)@06(4 zA8KE&>|o`0sZ@(cFL;zHfkF{)am7y;8{Q%V8TLv7$J5?9tZK6zT8`ETVCG@FP{Yny z%*Fh&PFAtOLET4! zUeJFkzA}>Df36?0<5>EvET5GN?XBgct0?p6kNX*647)YUT3|!i_BMnFj`cbJ0bCod zEwpP3ZDo5axvG}JXQ+evk-F^{x)+<_HqG{?Hup`NM}A-VS4KG#j@%Ck$kq8h^|(F@ zK{F%u4w6|0ES>NaFyhaZGdj2%?9MLQPjWBBeew6;p#u&Hf%CvJWBx3Wm}>KM7c@Ke zL{OVDaAnZ)V^?O$d~{k)?f6&|L#2kc5FURJ^ST`TGvu9u8)5f4iU8dj}zgm z2eAc8ySn5dj;zaW!LzsqHgp{Qto;;8$R-Q=M86XpqzB2s{leHN#!oSNw;izi)WTEl z6TgA64V00^M~R@4W;WGM*B1{AqX=Sn}|%=M1wSNz>jESN?ap0Jj{IuG5JK-z~6VAHXm{)A`uH3B$GeRI5GHGveo z)}=4#%QB#BV?SPR>dzdb-qe>q|9!FP;_g?Kd^kj*w=jRkRxz>Z=b4{Rq=BW`z>9nv zW}~NR;~~nd?eqF*OpV~27&bP3z_>Vig38zMwZD zpP8l&JceqjOhvT7uo8>xu4HcAaslj}lQOD!~#)~k#cd`M4)_y%J|`~WA* zji={h>Pvt8RPoUjiJ6h~JDGgruyp=5pzjqw{b&RmEnLv|?|#M54^9HGO!<5oR4<|7 z8(``ab1~I4@uVLVCFCh|t~ugbstoISaz*oo7a;dfgwdC9t?-JyAB?bs>*=7kyJyX} zDuV+pM`+}@)*r#PB>quROi6Co_Mn#wyu;iCCtQo|6HWSWLD&up zx97xiwRhZ~2H&7j`Kcq^>cz;jen-bAIeP6rQ~bEF3qW0|6=u>uv5mk<{YWBjHOxDb z*7wF*^ItKEoI9VF`;#?SNz~|hQDe-R-U{U z_5;}F3|-HFgC5M23u6~-3aH8}PVc~!(bb;hRmCgh&esCNuuQ4mD2_h`d))Tq{tW85 zjb?}72osyw^;~cSFU(^uvUIN*1y?hR

Lw@+sqFK13d8naCPlnJxct#47(Z?w!k}~FJPpS)sNhWg1Opp31(ufKX7^9g8b0uxvgaSfydZ% zh5s~}SW06%ll;!GmL`u^47qnThP(}I4L-2EqNY7TZlv?M0L)`a>z>d7R`0M;rpgXn zX}3H{b_kGAZrN+JB$oUJ`T98%xXmN&8JSEy65h{OGD)AppHu#_@k2WKM*V|4Y#Oz_Ek zhs2>AvH#>`9J=T`NjRiBd=zFVXP!Oebr5t@kO}k|no(pMj6x`quNgnX4aj`1Nq#0l zuJXLjzB39Jw_bT276fO|uO;{mu@H9yh#c4_#k|i3_s-vw}L#CfgWvh zdD=GuNJ&eqaV&*7(h=J3nj@A0?xuZkh&(e?p5z4_>XgPr=&%c1(g!86zctF--#Rr` z%lapMv%@>E!Zs>6O6`4}8Y?M#P0`bab;auI5%O!e4*Tgb`<7hLLu~lQc%5B(WUBmV zAMnP)gZIbm>HA}L-XBBqVeF4>y_Vrhzr6qR7T|hWFYjUPBaj|oke&eRe$t+Y9KX3R z9FB>_GUoro{vOR4=p>R$qCmNJ&k--dHkZ)Tu#b5!kCA?9jFS)wUmO9KWbAQSHe-w~ z{P@IlSm4zd8D|W8u_H2kKUR+%NT0<+LyHs-!>Q4OJETLoUo@jt#YMP0`Nm_Bv!Tfq z=^*Aq{~{gCfbb--ap|1KP&Wv(5`<~;J6R5lb%=7R%m>iS%rfyHHX}&%pfJ~1!Zn)s z56PDF@c@6+4jMQu=QGG_vP0vuybqP;n!H_8@p+^~SJ;zbo6Cx?U%`Iv)-61j^hzrsE=N1YyH~v@{Cj-o=pL^; zn43~K92l^)4SO1%@s?2g444qzEi(gE;r1%Xw|GmHcxMI-mi3JFB=PE; zUU3hSup0`U6Bz0&>eK3NR1_kQ_NijSw3e9(4J09lAtE9FL%gVV!C4hHVNzzggYp`QB&3_6z z_)pPd{!?7Ye)s>&>TY%_m;Ca6W<){Y&UiY)6JJ+fCi` z$nksR_&sv`II+dwu{2n=ej~u^8j^884?~&v8$nksR_^mX4{RZkl7K_0R)WvM+ zG>B~JG|X)21c+?u9of@;S7yoVyEI$kvdlz<&8`~u1&Vkoh~-B-b_uj-wo%f(YspAOBpw?6S z2~rLKCOE{DZwZtmRz95cpb6t}$w{y(q6D-^cTU?e(Yx@>Tf5Pp;fdB;2#az(WmtWn zWA!JNpqtz_Ju^!NaFh&ki`Ki^fYmd@OU4&5{Th;Hph#!ed|Al4y1%l0rgKy6C&*34 z_NyfIHpeeR89u8}djLh;1FiF@0UU-|V6XJdY#qf~Y;+t|Q)};7H5Ycji`X894Vf7| zwh@;4%GC#geN^o_S*Jex0In9W$6Hj*RBi2n;A7+t|6M8?JkWJ8n5%usU^ou<2w>ec z&sI8nVB&&7t*`7g_ggr8GTglrXLqnbCO1uceB}&%wyRP6Ju$L%0Ax;ZAk;JncpgBv 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 z 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 z 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

dM`cmK2B&;#eERq&Zm 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

XnJNBo*lQwmE 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⋙g3l`jl( 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 z zqsBcMd(w%MU0c(m-P>lI<;C z>hs*@}INy>~5SVtZO4EtP6QNm$N#JtanfnR%3%9Mq6mUd?fOcv8ZqYn%1aeBnJU<%!$G<#E~E-o zuw6JuaW%OLULvZXg4Q9f@Q%m%(iCr;R+@U45M3xO@=BL!3sqXFngaAC>pO$XZpLwx zP0@0%5G{UDD=lGlaPu@{Vuz~*ni6&m@08-X;ilpjn-+hff`d2JR}P!fi3n+zgf+v8 zrUV<_a=_GG%)Z+P<7+g3t`@Bg4 zSs+^MHTAPmwvpD9hH4;4FRM&W9an1UkZuVJzz8tG!r}CJTI8d!>dm!p20Lc3qF9x& zQ<{rueRJZS=5c9rNl}cQ!}I3h=g0pI*Y`_s94HS5V7T(gh60%oTrKv0P@vXhEz|km zHBNna`VcdzOpkJp5d1=!3v&GnWx*Q&$7udF4%bs3Gc5m37_+a~BKrzY!qM%zgJK7C zl-VU;`iKv^8*7TZ3Ggk^WWQ+Vl&~!^CNBlPP+km#G~jMoREk;o*8?jB4AD1~IT;J* zXtvADrwh!Y*iIgYb9*r{XYV<2O@X5Z)Vc1znXYQ)W;F?aq?q&pG%LNIezF#8cID`F z1~^%8c`E>^vX!MdxkOo;a8T0u1=r1HyouQjA*?NI_dLM~5M7=D5w}`Aigi4MDA0z> zp4Oq>O|Uka9s$EpeCE0PCN)a}-r94SAP>qD1#Y}ZBeAlNb9Ld}Zl-Vzvx9+RL}Wu5 zcW*i)n5^>p^GH8#W4C*o5HZnA*PvnCvEdbG+7vCW3#TImO*)1q0i|p!8fe_ub)qd^ z+jkI+Br0s(THAFroHrUY$A~aYr1;h`>x5gQglto^PLyEHJ23>PwS+!)`rs1zMD^w(egK z3!eO(l!RVmLaF{f2O7QjH_8o#MK*)p-6WQ99VLIRfpK4C&K{9AYy8)Do) z+J+~jSuy@CA1=T7n8J!1!cDagw2pT}vySYAL-RGY2N1najZmuk+E-%RwRPC&>pY7i zX171miq}r(aW##U(b{xuTYgHh&QH^TV9%MhK49?75kz|8#H-8Z1hC`s9$$hC1s^;N z$yVVqXFEdKenU2u@tgr^IQ(-7)%-i24)_IVQKEzjN(kQY zeLwZDEH(H>azKEUL@qfyl}z%h{N(ffixEN8et;j@%yI?D#ZrSa8B8n9# z8t8fG(z^Z{(8F*PqG#pIL|qA>JQAe>9!DqY#z6TdL=)$Pc*VCvU4UK8<&`J%%PmoM zlZX7pZ}Zl|j@5P6k3S?)*Q)-Xtf^;c!E=l%=Z+8rUFX0!6A?{d;LmAPsJXL_E5l)& zws|j5M6#}&L2r^<#ZcnO_)B9I8WDdv7=N8D)sVSW?0G8{HzfY@*!a#-b4Tf=fBfY$ z;yWkK9UR{>wzw<4W8$2F-KHv1%nm*R-5lQ8Qfwm`seL9k)c>}4eyeT2zSq@@pBkMW zW{GX5@)$E2elq=nci>V6C(C3R->^vw@^j)Fwurxi(`pqPu>dv#ZBBLCgb_|PvhDiW zMZu0Au|wJHv}}>6^z_fELR#aB?1p#-HxE&v0)P0O5RiLUDkmZ z45)?$Ri07*X_^DlW&NT>PgS(i&G5g^@}H(ipbxfBQed9Gpi9u^KNs7RlkFmor2oTO z@+|he{ph4{vlW1sd?u=DWfz~tbEMnck zc9i6~+~aFC!jlORY-Q>bujAJ)|LiZI8Q9;OY{X!*cTrqK{>|7^JqyiYWA$%T@nQ|k5`bYAcoYUkm; zfxu?!gZX3l$(?QJ@Xb`X2A*Zz_FVfNL-yNTUBeUaPf)L@4uc z4SYbtE-bOlwGQ`Aa;ba|esz#U#Jq{SjNvuQP|B#<}r_4P$7HJ$nnQ1p(VD==fT zfaI}ebRX2^`+&pamo5g!$H9@4T-KPT&$X0FlkIv;`%^*LulOF(aYXeUB7#q zC9d9ISENpON8+!=f3Zf^z8#F8FSbbSOFW78NLgqpnRQrHT>EzHjl?_SK1`iL3bza< zms>ycnd&vd?8OfVDw!41sO*+K?qaQHj;?mlUvCz>S@xL=kn*<9MQR(3_PZt|GMlVx z70e(7|DE2o%kD|UXXQ3;7r;wwuog)k07$}$_K4QziQqph$jsa3J(WvbKk>3Lu@Mc4 zH=Ap(2*t|SDo#8n;4XpO;|@jW5Q9*8XwEnwq@P}vUFB!>vC2<7zN>rkH;V5$n!dS} z{*`~ZT@4F3H@esYjwG1{++WZS_ZM^)a$C@k^cVChx1f)A3wpJ`pr0t}6kLt9fvxJN z+NwTDjKJw|U}F@(Emz%{(3CS1b@i|UlgSy?vM+c%0z9-utMr%lmb|6?tf*VrjX5a( zw?;i&)CLdD6-XnXplC~QpA&_wqenK3T7+{K%s?#eXagPM56p77fcLG*TvjpA$)^L! zIndg<+`pQf3}IyLm<)%Bf41agI){jR_g%f%D7=*A%`{|P$9I`Xg}u?d>E4_a$bcL# z#>t$CAMVj&qmA5ENWF+3w|G)z%UJ^k#B4)|toilvYn~C#*KU|gE7&k>^{(JOy$6|1 zO+L0ivPd+DlTGcWqw-7GBJN^ud`0{XFvTw2^aT(soREU5oNUGfGr^8YTBaGfs>pqp zB4v);uixltm+(7xG{|j8ABlg2YlD-N`~2wrE&3dyQ=j8U!hpo^%I4yoCYxD&s!3EkhFP|c&I;bZUX}W}D5SG~ z)EkRy7_EW9jz16?pNEjL9y8HQ^w%|Vzy<(%cb7iV(VCD7m^r+*$?T4v1h3tS;g11 zXcvBjv<^biiLK;0(DH2dnq7v$P^uPYWfYwxdJ%~)7{$@VDcV7?lX~C7qzI$|0OMYd z_M_QNNp8UIHyH~tR}YxjdJ@Jynx^UTnw*CToT;1OV($k?7&{~$Ob>IxGWY0jkA$bK z+hA?oHZ9z_%L%QJ|6YmuBe)5IURjBA*H#=38SB8r)RL!6w2b{8nbh+-&^mvw@9rLQ zrk{xuE1Pgx4V0_2-=QvB*XK0yk#il{Q|KuL7Iz5S6_SKSYkl&(1uQhfh@2b;n z3-;X-awBQguNUTJOYzyrJNS~bWcwj+nmc!r&Meu+i!dM~$Xq@EmO-BG$;_U_lPt|{ z0x>WAIeY#9VQ;e%Hn9*P?Ouu0`Ga7G^V<$v$h{bDLI%3SHSnxcp&HIIJRMYmOBKf-!5dx3QY_00 zt5f=853$03-fB;6GT1|KwG$f#RzVW#%V9wKKLrqisL9~rO{(qQz z_xLJ{YyUqX0k#6}sHjn?L`^j)wo$Prh3ek9z>WqRtJbKfX;q4sDoD1Vhz2*YdCoR1 zZSB$a*p_~4TdnpS>jh900)fO!wTL%r?E$TqCvFg0tKv1^_h-$sZy`|neVy}r{q`UG znVDyvH8X3iS+i!%%$oR3spAX^cVij=)*I#pTzL3(8b;EaCHEuN=>4^?8i_8{%>;E3 z1+FHbalF;5uTxXz(&!jiY7$<0>zmzUnjRd95Xpt8S9u1AdMa*+YVyvXHVC4m{Ca+$ zV{SK*%;Kty;l$0G{wb~;oYWb@)j3vTKCVsxRHG+cH5;yA{s33a0j|RB^E3kEG#jjM z^veMPLa1CUITz_`^FO*Mdmu&Gztcdl(85Dc>lHc^Vhv$0`Qd`GuGN~3y29!XyO)(0 zy4@|zd*{!{ob#xknK|fDKa2VAon&PGD~Xnjh9*Ww#=q`$uSyN+oK{*GU^NbC)fADQ ztdYIzz}(5JB;m1ADo!#Y7ZYWjL`^t`CfGRO9p;@o(n>g;o`KJ=@#~VOOYQcEqi&TH z#J`d{PepXjZ}LBS6q)3uVsg>+j=~wnd1a2_$?YRSjBTFH>}?|>#s{nW*_9VBl~`iL zEc9M9r&W>h&YQFi$f6$=%!AW;u7bje0uSh2a}0Exn=BvKp|MfbGuY zc5DFVL! zSJoZz|9G{tLO(5ZWLt2vLAV zv~{|sA$e9o11bzF0e(YrFUCMIdN=!T@!uamt^wYS;W{aujV0ThY%|`#ynHh~E5L_oZD7$q6e?$P~@GO*I z#P}P%B&)alm6-IFkFVN^-hzt3aErR!HzCj_O8iYToi^b{56-%PB54&ien^}6rbRDS za>mj~^4uWb_3nl1R_U<1oqp*W{gns zpY(B`=Z?}8zE5umvDXN-qs*xt3o%Y|pp1bx&_iB*HLZvII-`e39%Er&yHR_BrE+U1=l12wRl~w$Wc{aB`HA@6G~n zW^8FA#uz-++uV0rpqI3OO4CceNkDqZ#erVJKy4MtFG7)Yd;0rZs{eJS*&@$acIfYPQFHmpSUba|kim;!@#vR|%tVw%aFM(G^QQ-* z=(2iFVo45^_M7H%zp#`yRR5U{$QUs<&k8!}<4CoePcY|6$=rv;Kb6^BA{tUgMq7hSAR#8tsLQRmLv=-@Fr`=7E3)tNiZ+Ku=tn11PBdkMu66ed|g7%|ugJFA&?wsJ6dp z&)dUjCpNzln;xKmyZ;$QDXh7>o{-^$jZlr(i zuJ&^Vc}0)Qzco<%sdi9yOZyoWK>2(YN~P;F?}GcR_VWfYX+NJ%540couZs3g2??Kp zZk;jNB(Kid<`!6Nrj~Ln0(KsbZP`!Zs&tr2&Gg@#E~O@` zxDnK7q#wbweMl}EevnSoK%<{NTWlfAtDdbNsahq}PdV;$K?^Sn!YFlJ3i4bPJk>D8 z-R^RxG_}FdUjX2tGcZP-pHR~t%lfLT^+!^?WB zHfRl4&A56rVtx&&B=lWEMC@4x)%7D-kqvST$$s3V8^UT^Wy70WyG?w;rZEPAg7zoe zF6XHC%s&;Fr%~$e3e3ZTR(<)K0|jQtLD?;V`N|~@H~;uX21+0>SMw$-Fdrl)f%ymW zWgNC;1t#-;?9vPr9F~um3>sAU*t!vdhv^&peZuVpNJH1FkvTK`Jr+O!I zyUW-KqnzvaR!)jpFc)cx(!d7&8Ij_iHm!FT_Owar6!zU`x#&baH5kd+wD`b!eU@uj z*IMOF%^y(^Wgs8*&HsN3w&yfkwL=D@hNi9Ny+$;ftu`@_vf1j_2$I^qqy&`9}TIw(VhT1=<)jVqtE{4y8sn_xg#W3j!YkKnxTNU_mURax;DjK+E zAZFJBB%#41Japr7x z)v!>YZ8hdVFW6W^QpP@f4MRNOWCyB9osb5+(f{xQwJ2v6`#3!+JMVaem`v;QZ3^qm z44{}>y||3MXK&fQ)6_IWS&$X|ogq7YbF-}e68suG9x$eO z)WvP!_(hApyu(uDQBY;DyG136GVVjn@~#pIwnn>9#ymewoUKXkdB4(J#F^*6s&Hn~ z`xVLni5c_!RBGFI#9jpjcbj$oAQP2LpQ894w#znbmiwx32%Cre1D?%_Rhw*u+y7)Q zbI0ZlbgF+rzqs4_;6{Jdd0CZUv49#@k`CDJj?L2oV68d8+A_dS(p!zqHZY&cE+7AB zlKP^A+(fR){}~8l>Q>tK050t`{V9tjws34s>efw$Oes~el*@QH&evo{dT#O-BbA12 zGas|V^njk4xoFJ+?Kn0folNRj=dI?|PB$_K-c`Jp-i_U30}@wdvt|Dk43#Gr*x)pb zQ}YK>Ku?>LRED8m{~6Rii2cZTwJfdd8-ezG1_Gs1I-T=8|EwOequW03h*-H!L=-t= zz%eBe^9g3vQrlbeX!-MiWgc+UX#{&OYX*0n6nS_;iMBshq`YznPqwx!6p#g)-;=!4bpa5Tk%} z|JF5j@atp_1IdA$()z>g2f%Ep!!-sd0Yr)hiVktn4Mh8fkxAbujk&;p*Fl3{1v|>5 zF}A<;U}aKJ#MuOpAlFktu3_0+3M!ZA66AV_T!0E$rv0IkLdvr(ou_qA-jB5RVT6@J zF)s8IchoO@y>(26RmQCi_~g zB6Hv}=*_v|GJkpVFgw>+iia>qSLv1jC z|MKe+Raz_cqLtn`+EtJq#bsG4bDhl8BQ`~Ii;IkUoT;+=8<_%T@A2$I6#nx;{AfHp z1|U*j*BE}7Dv&>h_XEj|;q|uR_$+80jNtX`I9_8nd6vZ&IF*Q9fws}O?<}>%j(epy z8!S0TN$Jf7cPWOMdL9~4K#7`2K#C}OQB4grs7cn;c~SJC8u%v~izQa0KCq<30Xs_O z7SCvtu-O}Jb`M)Z6530X&9+FQ^OFH?r&x`c6d;V7ymPe?As@FZ1VcOV* zirFRz9s4+)$|*phIPe2^^SNrl&h;dBRcd7_EQY8^!%1DL8PFqV>f5xgWOt|D1~}dH zDP74BJ(~5xjH(2td%!dcQsH(}mIPB(jHQkb;2Yj&8DR8KWAOB*g^A57jzcTrl@tw0 zvt|onG^of7d#XdklIPBl>cqK?jsCuZ7Vu+>Q3>l$OK|7sn?_HS<2BE4BwQk^1MJ%o zWj903td8icWKF9VZRIA`5Pf)L9PU`PWk}~06@}hb)0}>Ph9OZI@|Or2k|(ML3n(OW zZ9wbU()`9oy{krYhbXJSY~8fZGICv1SIhMMUCiXI)naht9TNStSLi<3B5Bq;1~8fo z6d6sf=j_2mYSDK%Q=`DrGMYVb;uPbgNJVu`MY#Rn(~JrV%3Qh0Yw@Q+kI~$6j=i=S zA^r&r{nbq+;r0tHU0VZ_4IJ2t;T@vUlGtseQGFe&=dw1PnEpQ5g!}}n)lE2=I5hor zcqt2)&<8<9H%Y9bAF#oT1rPOusmyPx{}5g%Yg_U%tstZ?DAA(%4yKG_tdno_>%Zov z>(-c{54k2cH%~lg+BIheJ!cg8OiWOGvZfh29h|G)iUP@5RA{UJoG_cudR^IWcbU4K zB;F#pZ9w;{aFah(1>_cHXCq}stey8VHyar%;dROBs%N@W*}SfXuhSEdK|9r2Iu$)B zesfv|)fhH%WKZ>z@lxlg&`Gwim6GcFN19;VJ`4NLXfg7{CZ0Q^6@hhKi!|AN{8gDA z)EjMaolHF@-Q(zJm16VXHVJV~IMKh(osk-tgl zZ$cqhpMZX)0Wy4(&$@-FEZR1mQSDw5+B2%%6U1!9ZylrF7efu(M3N5L%Jy-S8ADQs zNtICgbasbS#fMMVP~6IvEkQWag|f0JyA;V45s>EyM#12nKze55V9gcnM) z?0X-KNZ4u33*Umh{!ujCe}Rvkxx4Syw;@(~GW7l172!TkC!5_Y=z0>J#6+i+uH{F5 z?6Q4V*)VB}lKLr}vHS0a)pJS+3g%cn`_^+%L~NI%6!(3^DS&}mt>U@*E2?OSI!G0j zs@nGr_7(Yy)w33?xt$kzOM%nMw`rYDUJa1L@@n88|AtKnll2j7Q!PE57Ry}^V}Cs- zw!LouXC?qP`u`64z@?Dd3g3S;Bpyxe8y;H+YMvrXvea+ok@~Oci~QvT67z5nGtzG% z=yn?YpPqI(yD9XiDoL12CH(IbR>{8Kn02b;E;Q?{L5J1hx3A(h>Eu1b?QO(x7Bu#n z>lzsiqn!<(EK`QWhsD=?o4uvi4V&6oLvnO`_4e@O?f6r>uDCGH5$6N0nUpH?K5Q&p z6<&JnkjBnvF_YTr-td&|(-YN&@v+Kr(5g3!y!RUlw?&f$ob*jbioKfRWukERxb2DU z#dB6#S>5*kZnwJ_gRAYQFF5(EGvim0;~H*=x{(u~OUB}CslT!FYXOYDf9|m3DNK`SIz#MB_E3u;t^3+;e%HViPgnXs>`H+ui`J{ z)WX#zU86c=n!UuUP3uW9O(&{_w)g=lmWn6oWKqcCrFNqK-EN>3p4M5sHbfhj>94W6 zD}euQH%L!Id!n_jF*&>;S>>8KCKcv_uL1*SZ6Cwgn)m$_%fy1&2h5RA=fHeCzAnHS zoCn+VmaPz0{qbMLV|_w5#mPrf+l}~$8pi$U(G+KGrwnBgx@6Lb){&EnBH>$mR6=T~ zeaCLhGJo4?pY_|}ejWdmo*G_q#;k?w1>jTzaO%*QvEKw9Z0bBFSz7^Cj-bWzPSrMP z*tGb8Z6EG6XSCrz_S`0ec6T&}kp6}p;{aN7vbN67)+*;@SNd~r-c=F_|ETwa9?N?| zp_|D;UW+@{bB=J+Ja{>lhXFbHt%I11Jc`&c)Wx=N$NMG!u~^0zW%Wg$F*d;MIarAYfJeBE(eZ6wW-IU8xGi z!gZ^YO(CkjkhO+_Sdu~bknqwXd2PCj1bGY@!?i|T9Jt!I`q^;%FO>`HREhtChGBTB ziK7h9NA55-CC|XUV(~Q>LD^8-NriLHojAELepctXA2VSc>Tx(1)u3IgYc~&1YHS=`XX?BXYznJcWeF&Cb#)fUyftriniiOf!mqwz;lrq5RKSu8n` zeH(TFN*&+uZ<{v8l&gv%?Kmy5!Ddmca83-aHE~lAE1HwDgTVQq(V9-{A?wcAVYZ_EF)1T_3DVY#QxNIg{IJh9$a25K2xtv$J*BA>N!O{JJf9 zVi~0RfMY=6+g68{toPC25MnX!agGT-9+gv+{>JJjdD&R~ID1|9uuMO+!a#1B40V@s{UdIXpEK>6oxL5}aeq6KhAuLsH&*gc^J$HB@hzv%azL z@{FH@ZplMN7Jd2E%$HM2CQccRU$f2|Lw?det&J7p3yxlzH?Di{nmAU&!b{kZveo|` zK`{h&oht%F>#G5@=VYz-?qeEo!%N;3=``tHl?riAI=+R@xC5;+zEa+OOza|s{zGni`4247qK zTc8H$ipuNG)oV3!IQ6D`QQDKCbeiyzYl>mek&(8~#xFZY^_sj*2oWOg1VVVp?4b(Z zuJF?16*S*BOJ@%;T#=ldO-I=3Z?GVSudTkk8n^=U?=KAWsAarn2l?bsG<;hx&k~+J zJYzi9)GvIWEuceWC}frVK>{nZ66;^fM^pyQYpXxPg`*1hbF|Gl=5ZIvj0JYoc48$t zoJ)oXnSm7_E5s<_i~4%$Yz!`2{Vn>MRu`lWS;2=0gspx!=l#=qFLFiOJ`4IssBm?( z?UQU|I);F~q8mlCxWtKG%YC75ugZuUGJ!3O>*lWIxkl3xn8Xi**FCDq`wkdz5Z1b{A}Ugl(-2N2 zjJ$h3=2-R$0B}II?^HgNT+f+?EE+`em>Thqm1R`hKYX$VvF_f8c$A4%!M26APf++{ zsVu!u@YbK_?-Tr_p4nY*jRwB6IK_TeBw61SD@1QstJhxrhE|2)EsouKFHIe{^%44Ke?#>Pk??J68>(Ll-&R+?*H=F4M|2SiM;300 z?}PHN7w)c1hX^mc0oH;b!-fg;u`KGX7!P(7(TV;Ql6s1~O1(3Y=M@nW_2$#u$TlJ- zV&C$|@p%wDgrMmvZ~6OL5WV9qKP31%C9KHOTqwUKqT?!h@tR(U{T2DXBHGEP$im!D zqPdX?M67x7eUJ$V{I~o=Nm4kq4}9o=?WIrBkwW*$UIoUc(Qw@d>94?9I_*8BjUuOx z7gk4;7obqu@YcPZEi!*@9i=-{zobm#NpSa>jDG`O%jeq+>TV%dYD1<$4-n0~o0%KA zh)CbDP*&q)FyFpgvShyYAzlW0f?=b!B>bK8h{mdGHGr%Ec2TkQFd*dgs{Lt%B;R=Y zwu!0}d7qYJM-xtu0eu|ziJI6>jW;w1*q&s_L_Q@)I`?wRJsN5yYpa|*?=pE_smW63 z1UEet=j=kBubx2Eo+K=)Zbe$G*Zx(ubOQqJ&^oUC^JWB-~Ya~to68z%she& zD@s%*RX>nOx}D!~VQc?9g*#_gD$i{eo*(jO{#6xq2>MUVA*O<4P+Cm3Tv4~0cwi7( z|5-nMetucu`cJ1o{&8wze88wlUoW@if|?f)3$4hHl&OE;j8 z%me5k_8nVAIXZyzfbvu2m2Fo{E%2XswMZQy)Gdq8DE_YAM^>NmMI0w6np2i4=D$MT zAW($nlo`v#&<1c!cx*Ql>!P;qWycl{Z<9uyucbPl)2J*H=Wv4nW)rkL+#KVND1IDM zhpO1b%Oi6}W{&B5mq!@g7k$x_GPCJifSn_rCc>gfwc z6hMjT3l8u90LMjg?@>QmcZntI;XmA^a2%QE^*pI&LL)Xax}uJRG=|g&EtBuR6<*`W z2G&c2e{HO%Hd@qE8#%eBc4*P`-r5>zh+E>7(Y6~Z3tGobPmCx`jqj-~9?d(HMsT72 zpr;Luy|rT$P3yws6eMlhi-(`_)t$^2)hpo}%Fb+&O@ zN$PT&J-f8bymh00|5xY$R8Ul{#N-|Uo>t!L^i;besuNdb40ks)UW|nAJB2^D3gp#B z`o0y!$^cQ-ca>r+S(zYGKiC;-!aqzT--9(-?6nCqD-I??rN-F4^Z2*fjD|QVF1Omq zh00bxhHla5y(-Tbc3gC${~|jvw1}J6IBx^DHy;xi4f5VdLs~wGW_QY{!hB3-21lrA z(AqK5#rS_D#0soV1SZy0S)cav?FXh3JqK%Zh-qZNM>^KwK(vm6rcSMUZWR2F=1x=ILoPc?OevG5I5Kp}1eWNmY zX;sdupqpe$r0S}qkTaMZ@MX!&js6$EOV#fCttVu@Z`SuV(fgS0 zgGu^=(bEAtOtS@s4wm~e`t8g z#*XucIp+yslg-`JdkYGG%sN`28M~u14&3<$t~SIWVXq{-^elFBG+{+OYgk9qFbNKo z8AU=xC)Q7je|50^dj=7E9<>WCPkBH zRpHEy4l{;1V|`VjtMxgC-CfoCHxsa+?Q8o~Sq~(l{h~7F(r^A*Q<`bYw85Lw1SHoK zE!^ferAbX0>zdN!xL|MBlqQ-oji%ttnyG_pN^>D*uJ}F~ZxX{?9koSbtN*7HsXfC- zw@hKM-B!Ps6!Ftl;){IsF>mHTM`u@Bj1j5CjYCtt9=UThtK&@7>R=cezXT5#feh1$ z+^LiH`xyxE@XbW@C_?5VD*FB~7TABR5rT0kc@`s);1+#d)1a6Z^$|mL7y~!`d^R#i~=huP)-p4UkV%_ z6j-;b0uRV7(AI>t4F@E|a6MS%G-^0%YD4n0L3HEMh0_;&x$wvF17eBmN`~QYEBUoh z+jT>t@nLP(71eXLIxv8|5UA$EqPFw^u#$%4*F(|dH5JjsCYC4Q4gWgat~Kf$rXtHZ zXyd4wTyeYM*8DDsvd}u@|AvWye6)qzwK}bFh#~e&e3ldrF;yvbLvm_stZ1qvLqX!T z5PDqfz^<5VqtsH|lFa3n!p9xMXi+?kfY{(A9}|=uM*_F1)JBzhtgCh5-sF%=aQD|g}M|zrTVFC$sqdL7TcS#A^$OpeYMEo!p=MbguaWF<@EyPrQMn#T1WZoTEpio=BH zS|2cvU>GvzBpKBMrB^2xJI{!$C`jLmTGw$AUT116sge}Gir`rmJWGS8Qw;OeKO07~ zGnH46T>ft`73`#jm}O&~S0VSd`p1$rr%WrW(Ypvywbfs%cY~GlPgaVMLmzwZY448r zbYtfnlfq9NZ=)uhGcO_nvET!N@OmZ!;p!OreO)f%M>Hfymvgw)JF~k~)^+0b1>P2T zGzG(*QPMV#Tf|t3;PRNF+R_w=t*s>IdalemL9$;FzJWbYV2@qYM{>S|( zh7en8lW^DDJk|6ZXXDut|ge#4jZ`&-=V7&87%>a>{U&6wZ ze~9dPnQ5*t#tZ}8(e4VjiW^JZSXvO@Yb8sQ1^$1sJ|i`sC0OnV`B4|^kvr`l+*1;8 z`IIti-oVa6O>@?lILX_25#mp7t6#MVy%}L>86=jstT;yvIsI$PP6M6&#V4iTVKmnF zD$wcIM;IU3UC?ll?t$*DjaYpGk8!DCID{MGt%V_X><8JE4)~oegKd#?)U=RE^0>=m4dXVe+b|5NV{nL)C5GzRmErbQL{;h*6IN-H0{rR( zbHKH-cAgkWI@9mhiCYKv*qqo*J!s_zQSP^4GReGunA;R#McBTiEfV5M5vn#O<84f{ z_=f7|nb^UL9wm`D9)Hn&-ID8t>+srt%>=b6oOoU-sX0XO3kG|8nIj|up=Ue} zGfPJ13lSfm!)eLb>pzTSw4Er%aU%W!6n3caj$zZ=?@xS+k)omi+X%W9xMIcer2!_zvT@U{1HbWklAq7LLU7H&d3I@2!c|}niAKBm^PfYzZo;^7=b(u&Cpj0 zv{;~%ljGLyY>)G5cArCJIW+3LrM$^raO_8wZ*f|tC)W#&f}jq@53yDdC{8zra7nh6rP<(^ zoE&92;ff&40eIaYrGxOt2G4@vS*WL~R^=ZTR82~xeiSFwGzeaiQ?;ut%=^|LQ7vlA z=9RJ3cbp3e6+I4v_%X0YY&Z(?#ut zY~vfS-I$!T4(r44=^SDaMF~&gsK>(c)jkMJ34=$Cx1=@T|IZ4# z*HSooD5%<%t(!{*?8+{62TmH2!?Gt!zGtF+=Nq!!v4^pmtvr9Ys+iu8ZKoW5&(}KT z5L8=!7}>2Ugap1AU2__cQ;ieRsNx9`3rEsy2ZbpW;b4gC2N0!>pn3vyLkKM_4-tkA zO`?N(1$1EdHn$l8-z@v5Ta{9MhhtQQHtH^Uw9!X{(B`8f9BuaDa|S8VCf(DZO*6Dn zZ_Ci;&xfUHV+HI$8!H6_{Zf>GHWoM9eBTPX*HWO3p#BTAdG|<_yIZuWvMT1$WmEv~g9nb12|f=?z)h=(2$l5PY-xnM3flLsf-T-|Brtl?!JyB(G|Tfgeeo)&@0J zvPg`$w}0p7$qOn6lTPX!EPibCzh?klCY_WOAh$c7wWpVLeMA7$Ka19*pii0E;Ut^F zvj|JN!7HuQe}c;He9*~tE+^xLqk`@iP#?>K1{qggVa1;Y_V)R$cZbhkc3M*p=cC>pMsn!38w~1Pk z5u(maUMQ~NQgMwjZATSX)ihO<-jJq>9OA0W>P8If`Jmx; zGJxi30h%BCoDjjKBzq|v${eqqfJmtCBOsKbpThds!f63pTtl66Xx{zo~EE@WoUPFuCNwe-_{%F$;DZI^Xb6KQhVI_7TTSt{bwVO&&(wnU` z;o+_qoJ!u7Mgg){VF|vN|Jlp3pa>JEjBcdJ2yf(N$y)5P1yu&`i$J0OmbirR# zBZWr(S)nvyauJU?<%?1-tJKQEMrr>GohPnBrV!Rs)k1peSVsrk=Ck}r2M&_Q1<7m^ z%%Pi`svF(zq)m`FHIk$E;jxi|R1tx^%yWiihp z=`3{?XsI2jcEhGtCiPB3CgEbiG341IWq>;!uy*654q3Y~QfrxsRb`q`!dloNwQ=C9 z2kWdg%lYXe*0``6?1(jTX9fjIFuo01g0qa#10_s#&ef}_^v=!m+m8JM$&o(sTiW*@ zL{--oz+}be_e>`4Tzt9%iFUFYs)H7Hvik8-3AwZ=wZnE$HuT_{>Ji8`uo;GVxfAbk&}fH@EuWt20+4cGNaMY4pqB> zk0oMOb#`%{8bsOv1tN8hEI{P;1G0z=j#IPR<yg|&M zx5;0;^yB`%E~`0|gwa|E)7>J@Q~+u;+DKPDM!M=>_s=4wCGa=1NExsOEFGhFg2HiW zbNj9rV#SUc=lh*_hfa0k{N28(Vc8M?b}oFq!Vg;bCb#^!u>4Vdag$acc{c;na{yFk zj&S<|(o%<+vHmSTdZCujw))jP)xFF72M&W*eoUT$PFoLC18h<$aF`~vOyioLsKM0nj#ORr=VCDvZog6ypih?uCmAziTXsOg8gKfQ9nL9b%2ri zdi-kraz7TExRC*C7~nH1TFzWr+%$+bc8b+zqyJ3+NE=fDmeuMy-T^c5kUKF~M;`>( zr`G8<`upVov#bVequv6(NgrFv(?Lp^8f_`dNul=A0`oNd5<|-l8vZRofp?D1*50xj zuqz#~?Ua`XY}??qKREz)b`CJhYQPTFTWY__)jquNP*&Of5v2AVK#1Ldk%G3=i0Gqd zbG%gJ5VqwEt*|A$N{{&$=yJbxF#O-{n{8Q^F1I>hyGxf#0$}rVfMw}2MQ`)yazc=j zrOV;2z}=)MMah_p56v@smJgv&F%we?q zpH>p`>2QuK+yr$lOB-@`v^5)ooz{$4lDIGj}E^J zQnGaT4^sYx{&7W6;KG~&vvfGk0oz?Vj17RDm;)?JheEv#=-~SDR{Bxq#J$wbrisx| z_@;kw|5s|CL9EE+Xfd5E=AD9lSSq4dgC_Hm|JT)0^R%>ECQY+LBMaK7B&gHEeuB>? zcZ-(Jw@a1|cD`NtcXGbHmb&il{;dPZD=L1m#Hg5aMfN%A&*5#?;Ozfm>r;03dMiXz%OQ-xwb-U`57*H)IDP2lAGB-uF_UFVzz@WlE z3&RigL8jK4&N21VR1d@QM*l48l((L;jGbvQkC958z>-RfmK$IfmKn63!lKG8=Jrn` z>Nd;Etq2##lA{9$%eR)_Me4EZZPHl`5QBq>m1;51BxS`++f4CCcD6EQSd`8Kk5;)Q zk!3?|NhDZ(u5x*G*wfIW~gB69V~$`lozjS4lMGtvx_(S5qvxw{6i3wab2^7SIH45w+D|B*SHT+W|VV)Wt@xg1ToJt9!HqM zOFMO(m}41#WTdjDX9Ldv4_^m{6;;w1R#fw>WnAeptjIE65l^JBkJ_x@dV`kA@+bNH zH|}L-05^(W{_0W`zK@P`h>pl2wvObCHGRDzNwcOuPcUsw-$2-`=^$q9ifqA-6VP~E$Ca57`5m_|^wD{FYn}{#m3z3uhq9he0wYpt?1`?4-7kT{) zg2;V}ys$sS9(AlhuP zXfSki>TQ4yN4j}RVcH~t-H1S~l)E1%d`JBcU+@xnYX&DnK0)<96l53d7=B;9~M8!(c(^k{L%7h9>%nT-o3q zK~TBx%O)?&1|JQAEb(?Js6rkm;Qu}}OzXazERoMQ1R13bG!?{;?6bQ{UB?h;Kk^m# zwQAy5e+fr0Tg5I+)k&bQ9*r2HXR2i+#FFD#h~1*wemF0+`4JZ4QA>^*4q^Tre<7z8 zQr()8%^~d9YE8zBzjc`UiPm8a{ti=SD+G{B1FBlw*#1{0FYdK!ARh#k>RnFt8av15 zEv(3GZgR*e$uVVaH~9$TpS8&%`E6cOTg)zbb~J~q3D2%%HOW=R$v;KuLM6@~kq|TLG zqKW?)%G~6<@j@z{nRkwRAEV2F$TWosrsa1$#6K!#BThG?|U-qTwH{LE7L0Apm@OS$N4&(Xuu1h83d% z<`vrg&wfhXyTaaA5Jgz4h0lWco{_dsM~2(SktR(x|BIfVz_3NU(n(jG*3e?v*~1H; zq(<(;y$R)ibek13_e;2CqnjJSlf|p2C+3FsjUSqf;LmsNLFRObx_q~rI?&b!BH`0E z^erLc&Kc6*tjec4Se1jpIyf0CS@7Y{Z!Rpj=A;E5{$ly4f@O>O3)eoLI$roT04D+9 zVI|`P=*BS*FD7?;*A4q#+7%g9RM6Sc!cqU!P)kEry6uABlQDE*-gEePAhnl@a%Ac=d z5rg~AQ)jLi36M-{Cb{nq8|?d04~t6@b4vsHJ`co3p`bL2zXmul$pcwQ3et)sXUX%>6#M z#kbU=SRp?rJ?gYCpaSKbH{GA_{8uR`*c_Hwy!hpFZdlr;n(|Xcwg+K?1-^Mydnrnj&WdR54Sid4OWd= zfoVG6G>CX~U%^2{MGJx|!KxvGg*+>i#B-dUD0T89&=%}})VbvQ& zvQ!N3|Bx?=yvsx0A zUmLO2D}{%^Gi(ToYH0a5@`b*sBLz{zdl>G_`pxnYUU(8v%yn0+ll1`%0gat^mfuHW9V;*uknAqP`VmyJexhU6%{L$toKzp?;|+S*|ETj(vfEd9akff^QCIMcxUrg=uT163Rt$!Q-LR6m0^~ar}?wsx)A@C~2 z>hw=>4o7MKqZQDJ(}Q!%{#^sJ-Cqc~xqWoup)Mh(_&f_)4iW~Yr!kS2{?E|S0R}Rb z48zHO)GLdVf0Qxgb{E!Fr^4-B?2&e|p%KDKgfxOk$(}}7%_J`jEkdF@Z!+I^N5nek zmH02wZmn;>3WBFEO6{H3;vY~#EMcdiSW4Tb_A{hb0+qAuZQ!RT(ZN3tosuf(dxjj1 z-rOqI$T_?k<=eSTOppKIL44m73zj*O z_-6u(op7*v-DK~UFWzOn&Uf{)Oi3%I(VKyBwxzT;p;Za}Fo>*p{k?jg8~uwXivq3t z_gyCZ=2m52AT=ON>Z&j165{WC89@TibQuI>1eQmGMcSft8Y`pOpirY=*02wYWAf!c;BPkamHBJT+MhFzPYu` zeAEh3IPonab=UwDi{jlzmq9CRGLZ>2Yu=mM=96>bRRB?kH)GBE4~Lpq=%N_?sF{o^ zK`?Ej)Yfkq>Fm8sboxn}Y|7@9B||?_(`Gs4kO4?Ph0|s$q-X(6mNb?1NzZl4#`9S{ zRl7wH&7Tm|ZgD_CVBD1rYH3?`_nNov_G1KtR<-ekem0Y7OwKHs z+Ia(J`hNezj~N-^6ig{Yl5yMTrMxO{Zm`p<1wl|6D}s%!*qNMBp;DH~G{b94{PTO! zWCJKGtQ;MYXmUHCes1Nu@%ofx@ur?gb)ky>!Y3d0_gzcl=;rJuV8fMQa)OM@j&BL9 zI5uTq!v3h>JA+REpT&tLKCBg_*J(sBhHJ8_xn+yh?;vxK>LhR5a!DcBTFaBE2D?ey z7K^z_nI9gn8 z-85%R_U^G1Mx~%UJL{?ymppPUmpJw{*Nr)8m7IyHHn+qN-AR&$h@)yh?q~2&7si7L zRiX-#G9W<`ruv2WIiA1DAL8|OUJ**Wvww}-(>ZOA+06t}Ybm)E(qV4R!YZXL{_Z1q z1H7^~jiXyU{r}khAqp93WkFIC~6~vwIV2i z_wkUuv00nmlvd}JFTe=dT!`+d#-+m2{pz$R5pMqi;#!c>*w4|G)YqjL4fXH&;6pQ) zl8|SLmb@6mdVD?EHD=uU?uQvuv}HA57dT*&OL@Q+4-V{$0kA1Kz$~i)+gopi2z_iR z{qMUJ$x)ZGg%p@!cP+;&1c2JV`1fq>CAJ-~#SWNceqQZ09t?ttSphIF2bg8Gx}Kr8 z)c!s`u7f%@{%G!5yf<_`fw$?@zQ32Clov*@vZrO+*AJycA|@^yh`<83L*BlzeC$^7 z9^<3*cqVDEnAckR)A-n7;YV%U^gsE#8`UE8Z~f?dv23t02x{E;nuQ6R86>Kowq*0p z$Of;-$uTo0JU0k4UbHF5b3yQI3ZAFyDa>dT_b&))R|%T*qr|FgQ1)c~RJ$4r6Q~Ok zRlBBa-sWs@T279ZobZewOs!@r$a7Zkj0DeU@VrG&;Z?ZIIo5Q3NXfW%C)rLmr58~r z=vdP*E$2ytAw1cRHSH5bY!P)dk%r{tkZ4ru!X*lqDN}N?jx|-dpcYZbD@W%wWx|yN zsZo+a%}zFnnvJ;hO`mKMN%NRi83tk6N9k(n0ncxBJpdf0xd9h+I@u(S$XL{WN;YRv zw*q#ss9Pz_iY|H2al6GG|64)#mMaDB6;!QC>SR-AEt4$g-CM?{nQnN=yEEq@Coy+t z{r01GRK>it$CvmzSbJ2po$cLKHN7!j=?&Q4wSGI(PBu-pwODbfh-W98)FGgYPBy7a zKsqy8Hxrg}A(ga+Fm%X2*)+$hlEUmL1skSC8e`e+c^lp#n&n<_pJ&MoLu{h*Cb zHmTcXXj5pV$mn1N>_8hU1=>6zO29)FH`*-yn+n1J061tPsQ&_O4m8T{*4p|7TXvw$ zM7|DaqiQ?axT>aUqx2lw*i}3EC!6*+xT(Gq?PSvhoNT(%PBuyWxRXs1N|Ne(`%mIV zQldgB`YD_iQ<;-Z4{cUOT_%mU%CN)11wruVK_r%oC+lQW8wm>QWRt`kydtf3AwlV` zC3>P%wD_N0;k4Sv@zAPOQoWI=C_u_6E-9h7&d4Y(L7}(~$(W@|kcfwZcv%oHArAd3 zi1N17#m2js&Z|kqNb6uGZXbSUsFWv(*gTGu_#K2JziZupqyOtvh9lF`nMJ%91;LaO z(ix__f}BoZSQ$Gor4po%GVz6pWB`6l!C=wyX(5~1|$ zR`7+Q^6qW;c;ank%@Y{E=IekdRc*(VuBvIKRC)sfBXho~iSk7wjU1wxgoWZ7r>LF; z1~Cm*s;y*(C>Yb*d&`@7(8aUoo9e7mslH2c&o?#M$2;sv-EQ2^`ZwPMazgO*gDUDh zP(@>4hAJ=irKw^C??4qR2&(){G=M4=H>%uXW!-BjP(@I8Nfq_vELGky5w%;Q;&`iK z9#u-HO+Xb@+fl_;HBA+zH>9be^G)iwnxUw#>a3%N{G9VmfANKgRNrSTOqopNwG$J+ zlmtLD45lw+#Kd>)bC*eCLeO^*6N2EMNy}wGmWV()%p^@wNeQCTIx@;5aK~d*$SQ8Aaq1cS2I-`b;S=TnNie|m2w;)wB5d9<- z70y)nJHOTx<<=mP<4V{KH3a@KuFSh?>U~WArT?1ugjW zu3&mZ#r(Te5puZIn2mm!Dj>9~wo=>AFvhYoL6UoFvnF845`|jG)tD?_*Fg9#QrqT^ z!w}L%XqT<`ex(}RVTClnwE9%MhBGF%E6S;BEcuv95sRj0Z{AN`%7AQANb|EPr2*)I z+EY6YGt9gue={a9Sl9?gN~E%AH(w z;jLjoMA2~K15gt6dPGXq?zGNH_eYbscyXw)ktLb24=~df9%H=;jZOLm=F{XoEzI@W zw}jgt6uizW$_rWb(R_ED&mF$)%9@_};*9NX8Ad*S3&Y42%z!CNb+MdlT~2KGWb;qy zoV3k+Hi>%xCJ`uD0n1Srd!%xyXci`Mw>ooxzzw=A_{6mzR{Gm)E+0Mvj znxr+4gV}xs>wlP647OKaMo<~jpD>2svE4l3m$I9G^Dv7fm-AWPZD*jp`eW$4Z zqw|_!48tq$WW5y`KY~ zEF*%O=*h9fu`F$7q30f8ISb=4Jd9GSI@w6|+M8wyumLW2+r14KJMO7_fb5bqPvH|h zy{9fa?ET0As{;D&=tWvijS93bY1Ee1 z$Ofu0zb>%aZ}dy4b!w(c$rhd&l{UnZ%hILhC8mqZN$iaT<+Qb_5Plq>Eb$Md94$B6 zM(TUU3stF9wL0k$8^xL7b{cNHXs9vn+)M|s1#O5K5i#Rm3|wH?_FQH3r{k%y?_0tq zYg;gtB`zP0MEe?vp6x%hm3Dm7Nc2?dqp{zH6y2hbz*eWOeu=L1#SC#=ey5u6r+b8~ zHWyGE)%TkJwx0B?IMj0Tc8nk4ZEC-u5=!x+1u0abw-<)5zCR3Ids%Br`L4z85!&Y0f?DYiaKo-~o@EBI)$ z;~fZH=MJhwCtsSW_FyMpB)fNV@}+??cK77V=TsjMc*0){fjK8%iX4>Py4mriO%BS| zS29q7lP{0)CVTSbzldpDMlbpDPQIu$4rRBHh24U-)2j6#p?;A>(tD~W5pA>bm;D(j z5bVYxukGM+d9_fDuX>laS&>^@Udtm=JRV5Zq5fg2G%5FGQc6fcf4iLo1kbMa%65Iv z?Unru=-MkQIEylH9;f%Hvg_y`{`X&T`xj;gO$;c`NN&PY8`t2MoLeiW1E+7AfH~G% z#3<(LV)DKdG@iM{ZM^qCo0q#e;3aiy_jWO5`E@14S@f+Wy`WDs4&K_TR0ssQZ3a}k zEvQ%CMg=Nw3xFq4tjj4vs3PN)a<HPQI_mqapo#lQa6Hy}KD#kzhY77Y7Pk@}E}80+o-GTTj&??#gW{HIR8PKcCh z%Oh|f^GH!{;b zT7$Q9_3UYDDTfqPKEuQBvE_xyNkn#? z#rm91^Ua!lLYYQArHlkZRCFVIo?7I3{sIvgkLFQn&kc5WFI%{x1{OaHYCHb1Un zar?)eKOb<8G3Grr)qAFn5frDF7rPU~Z4duIZ3?#^2|?N({*jA(qQ0w5*i3smKCsB? z&9Ulr;qMiYEjDg-+qHA?D8i;l%=3j2odCg&^XrzewuKvEW`w`*{ z(#)$j5hW-f6i|(KVx96xF#o%{4up!hOD$xO;9%oy{ENfGYwC%q-Mx@2q@q>Rm7j%gB~US%nbL+b4YNSe*fUP zSMX%3gP0wE@v_S}p1ikwF_0RQciQBm5smOZi#yYLBT~1EIGtCWu{*;ZxpX@ws2V5S zP~TMZN3YGPc`ycBWyzt+?wPHuMB_t$`mldd^6Zjj6j9K={)Q1;@97bR#s%-d4&+D`E ziOSWIS?8#CYydGizkjK|D>wd+;VE5(e^NevwztW1ad6kQ8ah*wrt`)o{}(T5_}d+K z*%?pQv4mZOEf2E!KHKv>$j$+>d63;DUd3mRJ^LY^WpnU5NtN1Fty3@VZmj`-0pMf* zYV9AUghj!fo^T`L=tw&@=5FZBJu>$2LZ=3Qu+G%rKXDtht_)(A%i8B@*A91n;wrtx zz5f;OcXy6*EqR5j@2eE9H)1}~wzzC@6*JM*cZ;T$*;#8wm!tYI?P|=1^z`B*xa=)c}YoK^U%Y)KoHvXj?eJm=c=@E^%QwUZu`tH>_3NgMgZ;dfzXEf zRlJht`b{(~t?YC!$~k_Y*jyo{20`8`S61w*81D8{Ou>28WVTXFK{3%biYc^tGTEk- zX!pdF(&XeZ-jp#hZJJ2*mibRTI~2Js?I_V(X_xsnB-T_;_1=&-r-fBER&s_XIV1N* zo-Ar|ZsciS?{M?eXB^FA=zS$=?Nj4Z^4zM4&66?YHsx(NFyaVqnYt> zyjfy$899eqFVUyeL%04Rk6O(R`9`hgiOth8)LKfuEVY^kr&g2cY3W)(t)SCirosYh zHF?d`{sn6NQQ~kHi`F^R8f{g~qt@T}+W9QQ6z{FlZ4|-T`lyWa_+-mcOZFFKcn_nbDxw4CD_$!~vGl!;4SXm=zHf1sSCDGC;J27}JI#9O9jsB6PJWckZCFNQ@ zb0*VDmOd!31CrCFPcQ zuS?EB`@+$yrnS+;J7{2kXVBh>wftb0m^P^qIU;SR;_iT zCAw#zh8dAc+@=c{zRq0+_# z$^514hi{ZBQHT=3)>-)}twGh3k5b%Zcu`cn8ngy{lh%~VFKNw~9G|4==%B!9Y2(E5^7waCjIuUL>}?=Y>K<5Br7ol8`qy3z(-W)k z&soQ^*9|g7*`R95nqfE^k)CEQNNeiM{U|z_hb=I%x+&)A^6y=^Ak{Elnrt=~L(gQ9 z)!Hp&IlV6ML7GLDbXB*cn;gmTr1MvS&(Wt5(!0`t=9f%mTt#2)_xDi=8H{~ob~nCm z^yckcU+qBy;&!e0cO(-GX|JpnlzgN$`E?h8Dvo=DDyP!45SHC5uGXJrXz}egG*5_id)edj6LG3am&KB1Nf_$?fNrkZ)2EK|&K>E#)?FT~c3YxLW<*umR-$K~jKIowJ&LRM-b$VM@b4op0Bq3pig+Lf zYPkruo*r4t-Gm(3;u0^ORFQj$lI&&iYAblsL%1u_U3{z?KqJH>JmK=%7*Dvowuxsm zPhG1CA{$ef-`QMp~CmpMSc7gs-UpIQ?Ps&tjsSSx9 zcIJK-|5fTx+92KT-4$+8acz3nM9YPAk3S*~qsjJleD5XnPvm)v=wAfez_TNvf5rY} zG5ss{vc>cdVm9&6uQ%bl0HMu62*fCnc`DcXZB}*8q&gsF6RF-kdgtAv%niwhl+?(s z6KFgZG^m_yBy}Y8-_ZHcb{@1r5C6Yc4iz7T=p6vlL)ls8AiMr~SL)vB0fT5mNz7Yr z56G?STL;|hbRJ^WKcY*_^;m_=ZI8ioAEVscA+XA=Bzs3f|CDRi6fdC%kRlF}J=*)@ zN2cl^3$56sRvh)N^T(JW&DhN>k4?}gu6nur`#FOI|5GT%#4MW7gIJS`=|Qa7#q@xz zEj+x0{&_XSz0!l&Oc&FG*jyLWL#=A#*~Mk&Aa&Y87l_-#A%THy^bYebGjSWT14g+28nX^K2w5jzOLHc}!s?Ej zak4YgVTMs=dl@m4PT9#k^hbL-oq7BoIg0mhmWz3}`d>td=L&DaJKBalb|2hmcEi2= zbJ{^)Z3!dJ9;s2i!9DSXmzSo7J_aMenf?H4uubj}>mSFw_qYwV^?<}jLt00e?$Exz zb+6QySI~jka_#&ixl7k#ogmudj&Zw-T-Q1>jv>nG3%K5~@W3uzCmZ5o!J#Sd-=9!~do{Jf*;qbOH?`K5QVe1` zub3U+e*)Y3y>P@C+`d_24MQP`dDv=%CEy{dRZKxFT>pHmQ!iPa4+UGY!*zeNve50; zlwg?8)ca1sy$ZOj{S3eM^2y+GPN;WEi6C`*+ZOa|$+5M;J#RcsEKu$ww#p3tRVF(64jCj|fFdUuIyI!RZCv%NP&%7v7!i#gS*HNU}y{kW`XJ z5;ymiLN9|%v3su2aNvIpEboA`$B~u(58*kr?W8MQ+qj3blrLCd>mA;7SzdcHuM+)x z&N(J^sWel|_j_iExrz0IBP~ueSvvd&d zD@@--I-o;jDSkgp>d&VbYUEfcapR3?wJj6C+b}}xuDxt^n}4PWa}OTgD=6y{{MM+5DX#)914fUghLv!(Pu}r zNh9BE-9qASV6Rn0oJYsnIrQ&Sj>aw9$#eGgR>!0 zt3c|^(3eSnm-qMA>wP%=e$#`&`=5~hZg<+ofDI6RxxstUxIOWe|KRI_)+x3sgg?c< z2rQBjEqPM8f9UUr7O)LrKNgEh8W3D)&QWie^@`N!&RYDubr)6-JqHkToCrvdG~Mp% z;J^1yR<8x%upaiCpYTO;TDf>MXow|8jiqX_>T65lhjH0N5<%7l9*D9ZYZhdB$?sY^ zw7?a2(6SCS_#LLy6W&uW#`SPd88EmH`{r3%@l&y`g+cS~s8jQzndS*AG>^#u&8xZ3 znun*pdcLX;O3F5@g^%YvktxG9E^ALt9&<7o=>BTr#H&VLGd`9!Zrr>~j9a7^y|p9t z2z1@~4~l8=L^Tp;REe*ATC3_EZACbtp6qZ{oP}6qSI2}x^)~QQz2AEB&e^EOG9cwP z_xYIjbWgOTpeMR_L2pz$Itr5etpT;{z*%?}(PhRfZ-ctgFBs~QrLpRHCE@m?c^O%V zrRm@KCYC&vQTU1Q!u?3?f40F}+cvMfp!EoL{OEv*+X=yJ$}N!wYQa=*e0ksB_&PDK ztS~+xFYAH1*7HX1+Xa1VRZ;&Q5AP#0eErroFg zTAlZ%Uk#8b>R4hDSf1Nczjxuv5SaJhUMd#pCW}=3`{i&3GXfOAZsU&lj(9OXDFT=H*bR^E zig|A`4t(inL&4ZPLfYv}X-QPDbv1@t7yPh`)Z|3}tkZ|_#DvC%oA?;n)e!*|Q zkA<(Q;&^%Lm4?C#+$=!b+(twZcbc1_jOQpDANR*Mq~4AtwuVwn**2p|^p^VXo;j>w z67#vwE3?MU?zATS6govw8&kzO<>V}}388<>S+EY$h=KP^&A9f>{g$~@phf3@%S~QP zCjF*=@~sAke2%XWyLVm%{a!U6sLtF?e;Ep>M^s}diqrV5;Kv_vPB!h}Sf{F&oWSBe z_h^xudahsanm%Feo1Vt3lPlIF@0cX4spxk1lcP^DNq(B0W7gi0{`#{qkugujZCYVc zTevlX6nSUm;Y^d?MVWqrmb5bxif#S=dom;(@2~z(N5aEWub5yNNIp>{&07fw_;Si0 zSX0C9NdJAq?v~c!R^77-OjBCe6+g+pfHHKVc6p1{-_9?g&OM+*QvG{-t5XLfJojP$ z*j!M0PtX7`S7pi#cGV^iTQ?dnCtyP9WmWx5pP@9=afoVjI& zQmNhKo!sBP=`^^gw>C7hNM9D&W1#fIjz!L8&#*_{vyFH8*%|fU|1S_}wbES3|Ax(A zHu_)vEo+9FeGaIp_g*lQX9ks5WhPcLYfeK)Edv5u?r-G8**%D|pvFB39nT?}P|Nfq zXh+-#MmjEM4+hdr>?C_aDO2ekYT9TuwH{aEuWa0*#|6Ey#J>c|oZF)`?+aS!Hlv1@ z?DgeQ=Pwyv5I@BDCA{Qz+lM-Bz&_NAsz!bAP;Rd8Yq#paTs6yv&>^Zu-K(r$2mp4> zN^fk%Vwl<3Iwmot#LZ(7Ec!|V^_Nrsm$-LE*4j^nhkg4$NA_x7dLwpbNW6iCpFVznSuxwT5f z2PX^=K!t!p{@?G~XI>$Iz4iWod_Lry*=Il3UVH7e*K4=)&qsO;XEU=`;$6G9xWxL-J;L}R8+vyz zYYKXcdV=2IlreA*(Ccm;eC+;GY~+yEVV8U{}ppfXJ)*G5N0!eQROgkUG^adcNH4`ikkV_)q?bq?z0rwmPq zlSyyg+^2#Mu!>A(-F%2CQgL@$VssQIoVK)Vb+X(*#Y=(=Ntt9>tVpAy@GJIV*#MHM}#lX)+PC%4d+8*A{YE&dt)mP;pU zZmM0$=zfmyjZyh%kEhku3o#ki-~(hns_k;AC$b5>JVM*5`pD_%WgYAqyV|e79|34$ zkZ{R~d?i3rJTq|4lj57z%(kD25h+U zZMH^7S>jCmElmu?-(np5j1DhMN)EXKBKF<%Rr){ z7tN$l(Ur1#a0E&oTB9p1%t3aZw!>0njc1h-ijbAUdC0D3*r9C3lMMC$6G&o9z38{HrGEWuNzMU} z+t!Fxzm{`A%Cb4y@Bjc1{R=m7-^*H+wdiBVuCA^{2fN@~yTaiC{TXZN#%fY6gk7Ev z;QId3#P=&P>9u&VENW{I?i=s?2XVC#*Q{qmOJ&p|g#soGG#3Bca7>b%h_tS%>~B8K z>NsgUol{B1-3^CF;Z5vyNM(I7h$TqEW@|JKBv(yu;>J!|L7pn!u!a@jU%Vknz2gn9 zs3b>ggKRr`yx|c$1+R}LU%`lA-v%QhUsYbGbq7y9%n!u-Za-=r5+QrqCL9BR55@egcZ-K(Of(&}&OkA0{(+yU1noz$t(m&w) zxMrw=Sz-(>Z6qkXFyDkvil9^Y{lsmM^xEo^C=t?Z)s~MMVZL3_IBEp;QZfcF*L)Z# z`54AE=$KYVahO=IRr_!YSHn;6Gf~FLN}PvTDxfSSQJi`^m2ZHKBTnpik{0re; z0g%iVl!+y4ylNh@W6B$9`NTiG%2JWnyjlMbcEflBmni?m8%QV|pbK#!9DJ*2e3m@P z(HB{~VVM+^;mBggPmFARI(1X}wJrT>rC)cYUpv#UL|gt#O4+_h+@54Jhi0>x5LfwL znbX&7A;B?qyH{o2^=ezOB>FGnbL2e3>IU4S11ettkmlcjWLcLgN23T4=;X^^UPL53-kcZ8mVd2Q0zsN+{KLU{fG?98%tl0{SU zc?uxumYyr40M!dKCvhuq*Xu=h!y^*ov+CW%de=+6*fX)CeP7i)QECp_HTN{M zP55T_`1kB__nOVM9pnJS6!LtU**`i)8=43Nb0 z&Ge@B_mC*Ni!C#^{`fN;fR8@y>tzb4u~bXfGiy8x)*J%YhnkgyzCe3 zG=UX)It&D}dYdJSM+0B1VD8$5rH%*;C}5ik{iK+8q9Yg3(icO6xE7MjNw}}lHb@48 z6+U&f3k9v|7?-K8WL;HpHY8^dWgG`w75mQ?J!cRNKGF3hYZ@y{ja{%JxSAeLFd4#3 zL&KcaA7C$GV_kvqLrdGo2#$2N=5)bl1jj*bxu+4bLTp$-SOtY_9iz;Ib+Rhk&!`;f zT!Hs4+Pn-(S)UGq7BsDu#`r}s4HIK1e`(qJ3Qn7I@|DdvnEulflM#+8e1bqpTVCMw zHx{_qiIC5VbcCG45+h-(33Hm9*)Y)FY&`^=hWdR7Y_8B>WFD@1oTKAR9P;gmY>*&9 zAz{3dN^G$|q#WRLby!7zrP7l1I!>ScbSI)34XSo-2N&do1t(r#(o4j^iudjSP;Z3H zHZsOQx^DX2);ubK+}8EKRJvQy=~mi0T|^PBj@jwd7R8lPSFk5rdkg*%gX@hMCwl%I zb1qnKtQIYBWZ-HZ1g(EYNu#8ao^;I+sxmvpnz`1mx%!|?R%$9JwLdslDYGsrz%x2u z?4{1PYLG24Tttj2Dc8DzCDDs~^uo3?y9Im!llF4~WFrO6nA3=;_}AJH<{MIyit2a+ zW5W?i1aelEWf2z#ki&dStSoTCxutfsR1i5;k6lr?>V^eS!Tn_r>?>F~CVfJy!S67Z zoUhCe#6-pV?YGle&gNM%x{|HZI^!T0kHKH|a&g|vu0asDq~!<}8JyuZ_A}d9Fx6RE z7{J)?1KJ!oBX@Wl)g=eRmF9XNZHV%`oRypiM9Z=U17gYk(4fZpL8?n3=i{sZ5B4cg zvSWgCyNrma@Hz>43evO~f!RoMQKxi7i?*`{f#co`^DNv^fMi%`#bBxZ^6=gOo>q5* zY?$||K66TvYcPBPj%%vF`>ffMlnARlo!kBz!2JISqoH9WqI;u(+Lbb0S{*kh%FsN5 z{ehxFRyI&PDpRnvTd;FoRp70vkPE$7C9@?N6)D# z)P_0|F1(Wz5S4gN5_|qEze&RDPVuhUH*-20cWKbyEv{>dIu)s zxQaa=L*Xh^jU8jY1kd;xK87qahhoM$jRM$jTUV2uFgK^tDZ#!-1T`6F7%u z+Ry;Q5Mus3=~)B`-vieZPdG2h!ZGX~28kV0W_4iptfsgaa!t^~6Di?OpP`7SHwKK- zOQRFYjCQBF4p#xXRE6c?!EQ|qCG2VY6PgiMhnVZc4VG_H_yo)jvcvHILcM&pTdUlp zjd>;U0Sr5v+u)-T*K;n=ht;@i7kC{JaIO(g*xMTPg4RcXFbkk?IBYFUpxXxv=L9jI z6>fc4kQWr@li{*qFXb{|zY}W(kjw{QoKrmbUpN7=#aw<9CXBMAC8UNxS5}CZ&^-@Y zWUP>;#BtH8GQ+algu7DCEHD+vUM(p)B&$4&DoA(Xn?p%*^W1NMC6AoiTIqEPO|6}O znj<{Mp0FL^GT1{V&bM(YIgedfo#3U(N3$*t4-ZsVG9KXvl@X;)tgFQy5os;R|q)(aJ2e*Otg)8e(oV|L9lf7?&l#Dpn(F$b~Pv<&>Lo|x^G?0 z7`;TCx!Cv^-JIZn;11wC4{H>M69|AY_YSNdpd3yMNXwby&7y~}Cm=n-7Q~0$U-nVv z4$Grg-9kIUr^x{+CZGoQvLq-rD;DG>Fw^C%d8+X%bwK zii|~y3EDgF>}m!B#(K;Fm937>V|&%O0k%44R&n-VQ=_B`5mt_nn}bSY+mbHk%r5Sl zScdlT71SAIF~g=Elt4I7E{-hx>%J>#2G?zmJ5v+_AYbe3QM$QXFKGs$tpLi_d=n%o zA3fnQr=@17AS>AM%XRY&OjjBGg>x70x2-@>;uzc8c|C7$vP`(8Wo*HA8US$k7Dotd zA_UrK)epv2U=bGke!znE{ct;@Izt&4tuDi;tuO1y|F4Z#C=`x6*4Oe3Q=v}oIH8`x zvnX#8fr&}#F#a}5S^u>NMbSCj&=3U4LY!6{bFqPEm|&PQJt6b@QvCPwn8H!9s_N)VY`k zn@s-}AZ~|s68fHHk9l(x!o#E6ye922Pi5AWJ!VR1nrY4Y740$QX0e+ig6n z+59obb6ZxfqmJjC|DVT`g`K+_jyam-y1S2AQ|m6JTFAt^e{bFGTJ)9H-Oh!{b(hpP z{ag5_9eaepzgHJ$!r`d%bqBMi;PADrztTGe8rYlDR(L&7p|(5z&Gn~cjcfzSMR&@= z@z;O#@iXh!IR0a;Kbt=7Qt-i6d{p?XSivwOZ`RCnfVKd%$t>=+OA(V8U zyc${ZwMe(#j!Tz3@;=Iv_jE7mNtbNOf^gMsGDAH;nDtb5ujds^hz+l7OzE0;BursF z&hGWprt8VZm}gZzJzxy$c`n=yB4wy2MX!m0(a}~T<=iSFKw7&bdXu)E<-pJ*SgR@F zq+7nRKX2|F^143)2dQg+*{_?OO2)ZwHyrih|0{=pYN#f@V>v{m4i!U=BvSJ+s@gc{ zoI6Cs%Je|bL7iq_J!cZCrWT|v(r)u@;$~i{E(!nxMUFWw=Od4sAt4s+6j*c|6v5eE z;em__W|%O|rP2zfm^Dnnso)4BgtP+&4iI)c&yXv+ue}DQFFP#@Lh0x23oyvF>+Az; z_iO?F9gx1wL{z5^43wAYZ9C`3Fv+(D=7yo2r+Qq5-TNj_8k=?2XV zo0QL?VgsyBr&NYIu8}P=H5}C_fYF%gc0!qkqtyFJOeb_~TVM;9F`|{^{byK$_Nstu zAt%}nmqGnrW?WQ&5jsT}*M_1uCB1<^3RjD;%Wv-WoBJmCwg%0QgWA}gzH8ib&kmY9 zOa{3J_KsZ78%4y_bpM57-!~9(OD2?TkGwX$33Dr=^pqe<8KnVhvuDzL$NXGdPT_72 zYP77&IF)#hyDWA)4L6y`ENIoZF=;0jCrs<^2DK#5l0~059d0$4@>?+F z3yQ7Z6YiL=Rd}}ITx_rN%%iM~BWn&Q&;S<7G*H5e@&y=*w!E^i5up_!OvdcYa~ty+ z2AKzETVWw8ppb8-XYK;IEiosADM84U@?d`CyJk!CwqCKx9w#QZ02dN5AmG$n*}DM3 zh6agfg^>NGBH>dwMJwncj=+v`kZYYVhrdvQT4g*7%wT?W3dlkb=lzlEjiB3!YhEC| za7$Q?&DP17KGhk_px8@Ha31s{lyac_dbf7xC4!`4k%3|`l;pg9gHsN5cT$0Z*y2r1 zMwh4NBmprlp4kXW7ndLV;wQkQHKGV8qVF&^jd@Vem8+ft)abGq2HD;P4(rk%NFW*) zE@OoK(^?pFeK9cdj_AEbA)F>76C)PDX?{p_f?FDZTnnZ}fP=@_ zR%#sRQ!_H*qm(`ZSZuXUsm*o7=0KkMNiQ8S3h077s|}dV`!h( zBHOr#RKbrHq9KWGkSte>a%yP{QOpopey#$OVc)C%6-u=-iVLBymq2{It(OpC`bvF) zL4a1oe&Y1SwL3q+FJDXKQu%Bg8m%?FixlI~(3(>egm-UjLtW@`uQPfpoRxdw?2iI| z`TW@F$j9#^`TGUP~k`u0PeD&700GaJtdy4xfR) z{UVouKK5AGdMMh3HE*^x!Xw)`8`<4JK1fl5}pjX(1i{SX7 zIRsU;z&3Lj`~ul13OeYCv(7qQh}~g>T~AJC6J@z=l;uL88)m?k+miuXzVMr$fg@4( zhD_^QBshLHC|qsAE|e`x3e|qLS;8Xhra;ieW&&D zsZ?SoO<&S{4CS&=?BOPN_jetJ?0Q>FNmbM~N==(X> zx`BiAAra}e`K}%t^$-!onm&U&o~sBbE%h34w{@AMLA#OQe$W*@Q;$t_Pp2RM^!OP3 z)#GD?V?sPWsEt&n$Y#)QOe(P0SO5YtRF*1fIB|On5G=cY(3YyWhQ47&IUY6pQ}f&?bMq;geLL}-M2Z6pu*Utu^LZ9Wh$3% zb40?rSR+wT%&jVt+b_r_0%@@AJtx7kB8NXy?c_>3T+AS8XlJV3&RU&X(PTT%p`cpw zzD;N+Hm}qA+YdMs9ab2)z~}{*a~|aT8u!nF4Ziat`Jb*$zK1>ddfRTSm1M`*BaM>;9=6Z)G$IdX|mXoh~+8*)_x!P#fS})<>tC}6_}U^P}k4GuFFLc^K?5@BD|vz zEhDL2%znGA3ps|=t_X^ybGw;HiZzv*q-mg2Gk_U(;H7@d4m6jaZtKgzKwd1Cb)cVF ze7dfKNHbIqTPd~9nGNo40D7Q&huY7FnVp~e98jt5Nnir77~!_-U6^v|F0eu9le#V{ z8G+kX6dhh@9K2AIkm9SE!y1jIWfg`&Q-N|b(Nw^Pqj=;BG~j8rdVvynVgYdX^|$_o3IL56t$6j7b09;wK=@i4?9eB zvy5oU1zZ~En***W>U4b;+Gx+k*idwYAmx5`MOO3h|-_+2<0XU5%v zHg~NnR8O0KUjBp(l3<9MS|sxe`2oOvb2|K|1mCh;6(i zOLepLuW8-e_@jL3ur34G)#8u?t}?ziUrs#HbOc&H542o2KLt-<+`%LAN!-ef3muW` z6wvE|n+i+k%UcS>80vxDSwIH~A~^)Ir@?s~`(=Y$t9uobYjtrMFuEG|k9nvBvu$&L%7@zxJ%F2sD3CWQ?DdB*uOm&c>h`WB<^aLg6jVw{g@FvUcO~y&dg~ zP)Znc9VfQrmx1___yIQ*t-c>hSIf~Fg(|E)w{Y-0Y0J-L(pe6tLJ8eRVko$8MFQ+6 zzM=N5%sqm;&||<%*$3F|W$1v~3VtCIcBHM~8c@}vZ3VA=@90~>uLSHW++wa3!#X|c zRscIg*$V1VEw_T{(qVfSQ1CnBI6x^sGhN9Er*e0g#@%5CcZXTn9pEpgwu4gZ{6A!b z3L3x0^neTSSTm<#Q~b58REy^v9Bgh-mMRbyi;!z0 z7ioC@s@dL4u*E<~^T(+?cSmkk*U=H*3M4LQ0_LG}+yu@!Gl9eAC;ap<7-OzZ#rNi0 z5s;CrtsYErmVqee5#?_Ao$Bc481ZzY+#UW+VqKF+o0V}F*lCOoUYHreme+B<>;nMK z`vy%BA>_pdA?8zVSglZLfG}>Hmti!Vf;n5trb(=6Y1I_H0!1JWLTU4zBU>~9QEUQ+ zdZ3)ij{USCOMPozgDNu&X#{_0Mx#d$lQMR@75K^-UqjR{^5O6Y+Ew?JG|P)IJxXJ9 zbp84^hLE*10 zU{LrDYZ*32^O^!Qb-ak~gASZ>j^bAI=(VVP4k~Z5!vsdF3e2kfIN}=OU((lz4o0}o z`BFEojW%D=bE>?M@s{lJZJ5(LdPRZmT#wU@9b+44@&&w%a6U3$F8Le=YPr!{3rZkR znJ+4`0)$y$fTi0Di}S+eknVqLKcPOZX~1k?qnXbPkiOO@u8@SxL{R5Wr>@DtSO@J&*~kTPM#+pfCvew!!yi8;|poX6QMiTA*6O!Npn%sFBpV0*Ie5!MQVt zmw0~n9Ygq5Zu6gljhB#eB8S$Lw0BHM05b#f4YcpK0j813xB>b7(&*+4?@IC-M zacQ)28vHf+E}j*bqiaP%sMUWc6C#lz?5$%I$7=2c#LO0qORHOhEa=N9XAnBq_P}IQQ5_x9?_;hePkv(-LQoJ3AO zDGceudrom74=uSf1Ia_~PeS3g`m?nZdvELN%(=Wzb9ffa|xwpFclblcvFJd{N8pbqqw}B_I zNv|7q*u=&LE`JJktq8mjip{k+UvLy`@Dnu1Lt`eZeVA>!TyXmWy9S`u@hKh-yX0aU zC^%pzWVTourwWS)25MQ9@u{o72FjR>vzw-nN2ia{LpvVtm`mAXo`q~xB6yHXOLdbs zh9(ymm@c>xLHLP8pe}f+Ub5JUc&Vm4>jaE*QOZiywU~|Uv;|{o`r&4@hThN!D!;rS0MWPl>ipy;Yn@Ek|?e-PDAY*OJW#|Ru`p^)(e8sQC*g&JH@ z84UA0&`YawB3F@|4)YZI%T5E)k}%JRDE)`;W?GQ;XlI(Vq<&&*rUj`JeJTqfhR6TH zlKODYGOplmLn^gbX1jzayW(z)rR;Ut`AiETbnVO_b2os_9((`(&-#RAcuNRKozh*} z^MZZ&sC|0{r%fSufc6pO4aDr_Kd4tPg@9zcI3aER5+9I9|K>3hi6 zYIL%`R%1W@I^)Kd{DprARFI7NhF8Xp;lCql!itq(23MrCHmC|4RD})c3LDZDHY6)l zGQg$i8$>K=H>0M;380kIAjPmyuwY1LPRi2{9Kh*TtN#U( z6xb2OnNUK=#(-AUmMj~dk4Vk%V<*(?7|pMPs3Iz}q&T0FfIf1nfqFf9FRKWYY%%3U zDgpLfU{9>HeBgef0}$kyO9We>%D8FsL67B?t8l9P(V`$^%DrWZ)1JZ*a;xYOV3e|)u-RsJ@8mM^PKJ0~b-B!5zddzX zW-y!fV3d%A?}I&g2Jr!dIfBmmq3Dg?knfW@Mb#yrnQw-CTOcvo0-H$>#i2hOM*@2z zy7+DwXMtou`%FeXHJ@!fV^}<6Ks}+X%8PZLAZav@!GnvNS*VvBgb}>Y(isv44lak5w)G|<%YOOU!h%8njXux|1f%cv@t_M*7KNQr@qCSS1n`4UVHR0A9hx* zHuw3J%P@qZ_Pqo$QNem#TDXUVIy$Kg9ukP*fv6TAFrj1vV~qNm=Xm_)88~#@EeAwSwjzOmeYs+Z3*v?`vAFE(5i8M34 ziCiWlJOoablnn2*=Cen(bVotqY91qD5ONq7*aHN11e5y_uHLgA_DfxEH5l-kNq%`3 zDMiZbBs%yxusIIhw`Y!y$=4w>!mZI2HLxu|&__RUhi-iQ86ue>6vtb-?{i%nvlIOV z2JW;5pteRJ=QE>sieX141cFPGW>#9Bba$?Anrci~fDL~4DDf^Qo;h&0wTl_2<$V*E^$STs5UhnMm}~;ZhyRF&C@Cvv@P6AK;{#I{$6ChZ^nz9nedr|7CHg z+PGtKsPzA>&denY^pX5u?_kyxAA3(vy!O8pf8bd90DQN}o7|2zI;*EW%2_a;{rXoP z&!3s~YaEZwf6H#dd&PlB$xWaKX4?aDc651P*696N;Mt?9MRx1*1* z+j`NCJwmSkU?v=nzW$jt1&9Cp^`9y4zN`$S+Lm_<4289^>3Xg;XcTu6(d(sdk;~4p zyF8VHhss{4FO~Di^TDj|T+r=cd-+ASMGNkmB!kuCT4%|Jx|bZ1F6ki-kZTwMOZ8OO zlc(?0*F$?#Us>aLsWF*rJ?gOjOq;Ld(6hcQNq=EkO_j~Ws8p0oxe1LC*vL{wPqN7_ zc~ZYvdDiNSpr`Cw2>p#VcB7K2BLJ9~ozcqyW|8^kx@u=ZQML0eoB;;o$TC1L*%*m; z+Y@aA6<&XkA#-hhUVeW=s%m<@NFxT zwB=oLi!TA*S)T#)g!^G$490Hwro+EsyZC8VdQ^zP zJvz={QP+Asid(LI@65hnZeB3G(a{~R2K_E|r_5X&pcJy~^_N*s|q=1e&8q4VYraKnKTT7dV`V1^c+zs7I}t z0F25}^r%r;=v0R0AEVb)O2pX$4=%!T+HO?idr}0Sk?fuu-8(+hWdUYb`>fAcVbXwl zE7}a1=R--`&6O%tzQ7&Efm&%8`&+BnIf#T*CxX%m$c(9~{U+_!|9n2XNhjL{?u6U^ z0vn_SY6jpgbUWHb`r-F}G)1p)3$F+i#L;lHTt+_fEjFRJy=eYmJ;#p#1uY0%w})(A z(mLW`^x8sOnO1)7@VRjBfhdGLt2IFN*USFKgTwg{kE&jlOZC)iUNf8_xuX-n=|*r{ zYgieIL<<(1u6tl#8p z4U0XO>W!6ce2>7@W#uNk!1{F6mwU!Ktj%{E5c?{~ky{%iKW^-DTj#Q()GndEIK}U< zk90)Cce~E;V13bARVPA;EJQhw$Q$saZJV3|%~zV+3ZLhcz`wYUbIrG&J*C-|=;d64 z$%D{pKrvv&G-M#a-2>U=dnD#0pMOYt1_nuaeG@2C_)iMqTxRgr67$*hvjCdC zk$hZ%gg53%XvQJe+`cLSLs2DE0jHeZj@9c0g3C#^*}Mkl=WFzyIxC$>-k_>hKw3NO zMbjC*^(1iDlm25SCcBhHiHmi3cY3fR)WWM&t1H1!qIqJpRppAh7B^dNa}AyWZF!r# z2cn}EBizD^m}}b!f@YmJLrH??5CO#KptgLgzqtcs0h9+$K4YV!o;P6O>5LTljnAAQ zv_rIK>l}`z2@aBe{>Jp4*@e>hJ;V<{M#lS>D=n9Sew$XaRTvmyHGk|re|SA{4+PPK zXI{TRjxE9wghHkyn+IMj{aOeJo%MXu(~6qt$6w*Va>YMRs)< zW2(l@Z^3aAN*pJyCBm>xYv20z56~?ERDQI|C8LbG?o2}HPC%d|14LN>2?#(|{D-3) zk3MxD<#t(a80DV-%_#T(Lq?g8QHJbMVrgUrJ&;qLF&czyb?u&SJFK@wfsmsc_ z^(1I`mpdOwrX-io3iWJA(kMN)dK!jj?Rb!EvEcz_;=j02lzOYM->|7XidXCW+YfZb zjkaWJ+$c?DEla&6NnESpMH-xvQ`UpAm8{S*f5J^{CHrA*KZRr*0_xYG<2$T^ z5%8W;Q892ar8KA2RiR{S!@s2V*lMZs+S{;Sy~w5=;R>;Df?ZRrU=1ACCRR6plpD(V z9ShgK_z%g_mr7la_2YR5z~F4PX5*?82C{gF71Y3v;zef0mY~(GM~yHP>SSelY{*17 z!saSJgcVy^%G79PY86sn zK@ls0RJmUY;bhM19KTOqYwl=>;voWsh&V=%ka^+FA^cUXTr z7aSONBWut(WYy|9KK@f|3Ad^2dw4TZ%9>B@dTb@<-TE6lXQM+EE43%}X_YP*_0BJm zKPnTPxvg@Vhy4BUY0g9tX=4WJN{&MC?tOOJZfJbQM?s;-PR4es#*7A5zHxX196xK2 z-I!F#8pzcQ>VIYlPpm@jYex@`46R-0oEFLooi+~j3DbZ^ zHx$9ruftl16J#Uk`Y^I1x^xK;UId-S0hiYBdt_hc9acXTsW1`rt=I1SDU!71 zlZ$$T3!)oyUY{2G&7FGd(`UUOJUHElzK!8S^nO}v{bcmO8Lj7%Z+>N{|9qHj%MSrb zVl*?qkJ*PY0~&K6Qpj+-Olv(m?_B1HE@ffAZ;B)AX|2Cp5}gq2GCy~^!t}KRxz^`r za~hJ{gz!-YyduczE-bc+Fty-*D-E$Sb|6AWOx~=1>ciQF+&rv4bfSK156~MW27-iu zEBWWD`C1id${g~hHdk&4eGtZ2QHuMeh*m!y9R!EVbs$``VBSyckLTbcE;^D`5*{qT zh~7)$;JcTEPOIzB3_zf1n5yXG{DR17+WiK}i}^V7z|SNW*a6~pJ7C_tHCNc~-<^f= zo3M@B0lIjwD-5cjgF^hBA(@kSutzUB5DyG2M907-4J5)i;&lU?_{2ZFa_Ic0FKV3z zRw`LrBO&IY@TT5xz!F%h=|Gl8pi-L#J|NjJkQPyLP1_jYF;Jm~gql zB0R{Hp>d!93?d=5B?jX_>XX!(r=@yZhoT4x6fJ+n6kFHej|4+YY!xm5+jwj3d*}x4 zOTk1xi5b$VOIj3{_5HnJ0E_x9({NH)hzy5p)yr&B+~LK_CI6|;gV+v=Wn56EHx%Mc zF9|?n##=_NeT}OdYYaq)dBg%1m?(~;5K;gGy*RvNaJGxK7lQu~{gSOp&RDEBpt$Xuce3;1?vMou2uhj^yqIWO`E z#Na&lss6Ygd$7pC*^50<w#k+HjxGVO&YObeKI7tlQ%H%+il#{RCzOYw@ytWB&&{m(Ie ziGL-s@U%XXeT4vLmboGN!rhM`)oD!3}t$tQ*)s|uK}mTU-` zn{ayvPWCQ;pEu2o!)||I>c*|W!DvBK^R|9)Vu(#1JP~ez6Z3gQnBYrhN7^2c3Rm4IGays$lqGI*BCH@uMX=Rs8jM0g4*7BnV? zgVKhI$`ZK-N;nauVz?vX!(@*1A){vO#)$E&7y*3(Expb6qEo~-wP-!p*QTKk00A;{>E*KwqO8`=54%@24X4np!_>Uvrj;5Ce%`h$Sw{n z2(RzQ#dCd$D^bL&fW(a2vrE471Tt_P8e23cH~|t%_)3&nFBYI6(ou2Z2N+DDOew1> zpItm>=ksW^3mq#g&>HGcMGkUglwQcvNJ4ZFG=y$J5Lf$HX4kz0vh0nqxI8=v>0n12}Nt+_47*D`yu zA4bT2-!(4nUJ&3{69FlcxJW&|tsdv9N3nXGrXDA$#~}5{SC3qIa8ysrJ_>elq;SFE z8HwwFZg43AD#`@cPZuU*#{~29pm~Vic3z>$?R0N5XSr~XRRxBWGjXap@oIBP(QolX z7X5R_VF;mE9h@%|O(cD5KNq~2Wq83_EP9FCdq%7ek+7|&oyn0RmrVt;0p*9XD^oU6 zQIU+vR$+AJz}FGWwBi{jH_W=H6DeF8gD3WC@Rr|cLmIaA?kwYtT~ z0^ZgFH(|ZKQ^n7iEon20!OE6eXZ*Aau3p7nR1vQf@}tLsAUJ?jAi4k&BzOgtPx0Uy zLIBBa?Lzhp3C9#lIQ-39-Tpq1YbbOAx9{}V?^nvfER{y?qbf#AX z9Xx;BhAxd7%!{s>lZ=84y8Z7cG-^cHPRAN{$aPQc&mtX*OSW7*x$qe{q!5hPQye2b zw>{54va-K}wbzrKfETY;zYyiPhnr7bjdsAS2|#wYgL{h_dCN^4a!=!`h9!t2!i9DB<<37kt-(>p288(PbHteJQhY)Cwj!B-pGi?NR2-&P!oJ==tQ zHkV&93q?lG$UX%;iYoZMb~QyibiA^U2cw7LgONNniZ@^FYMv&bT;bW|7YOK*_+23S zhfPTHQ_bi53(q`4JhXsi{)HcofT1eZ*AVNHU1UR{?11dhypx#2sxL;>?NtD#>X;nZ z!-LZ@a^^XSd1#+coOed=Czhe>6ix`{BTAvwggl4W-nIuN+bLavggV;9W4@l#REtL_ zx?&n1!&c0~quTk7Q0ZY!JoC$@Wv;0%i6i(Z3dU>M+uRC74?u73W}Qo=&h!E6;3=3l zVUf$Nd*Cw9V(@AlA1nB%IyP#uIts2R1(eY7PR{53pv43QMEU>yKGK7AA8GYhp>^<9 z*v!wz*;AIK$k8^znIGWI$7ctEwhe)w7UnTz9^2JzD8U7GzoVoTbGGoUaTg?sV zaxrktI&c!|JIKyMwP!VAhZJS<1);CckDK;2IiE6RsMgLgaN%&M9d!eX_VC-in_O%lQ!S-IS zavlJIPRkUct%`h02Z+vd&{kt$IAR*$WMv$5MYcr^t`j+?u0>h3Fzyv$82K0N&S#K{ zV5XiiTK!+u>%i}7^?y;X$IZ~{pTH}nWP?VPYK#AXAESI)1E1J712^w_WU*?2b84~LrWH&~<*lK6alwjr^7QPQj>_IT2k`Wp6ilCxd zBA`X_CbVunoK@35SVIU&QQ2^9RH5laRCohBffP%0T)2!?kR0VcpCl}hgnz%2=8PIrdu00 zdQ5=mi4+@qmVwx5Nj7#mfFFuQ;4=&^iv)H0vx+cGzz6!1z)Ami^Eh2Edbvu%x9YKn zIM;gYMdE=q3bn;Wj_t+gc>UE#Jan!% zr6#Hw{XKW?77QhW1wUHnU&zImc2%{5*^u|HBS|tW@1r5i{M+>dD3c#qr4jYl|Rl-Y5c#;Wy zkzhT8pDVflBpwotCw=+%U^+23|B$VPe)Ig&+CYFhL*}d2%H)TnJ|)Ap_2nU%Hj+Ks z-olb{^+}nzc9-^W-%|1>p^?m*wxnd%?tb8~r1scBt$Vo1ErxsE&0dLjF$&sZAZnec zWj&e3;IKEd#{yqFgh)28g~bo-=u$?fUUL&;6d4^J__5hqq>NGj{bY3VG}(T&$tnCC^@cPdjJM5|iN`*Z_NyS}22}F#uV=%1hFLWpwS&GJ- zPu)S}&kWwt4ZE4cNaO`s;*)5K?NwHz0hZ$?E>PTmTfJ@;ztwy~A-_2~x*&*5Q|vdSU^`f%s1;Wbx2Z zLtHSstFt#-&*UpW*x__y^S#zKVF@LQz!8eYtpUfeScj*bQdJ^gJD!fO3ZW(Mry

  • EvfJUx$>C+cLce?Cy>Q1}+B7ebK5E?q~ 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

    Rv*8 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�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%0DK|HUELs4@=<&?EXu&oF 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
    Bl|ad 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 literal 0 HcmV?d00001 diff --git a/third-party/seven-zip/executable/SevenZip-osx-x86_64.exe b/third-party/seven-zip/executable/SevenZip-osx-x86_64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c40e062be1b0721002343638d1809d880eeee9e0 GIT binary patch literal 1528656 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%0A)0 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 We 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

    ekBsu2Fdn52b2_}3ZPHV8iui-0(K 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

    gVA4s zLDWt~POkfG0Y~{$0H?i=cofHPqF@B>TDE#Uu#!@aV*c-oM=?;L;s3>>h~<@a$c$*s zCY@qV3vw&mYf^}o;qrX$Zh8-|+RK*zpj)#&+ucnxiWFByTit7J&0)$Wq`-#{d<9H?^3W>he`nL*F#zNn0OY)LS=3$=PduqO=b1_0tz>kL$|3-)fSdSj^>2sV=2L7p?B$9U{~Qv-QVY)_&Or{ zk%_!;I=ooq`#skWoj(-f;8xP5xbhl*TuB{5yh~b{4;K>N)SfrGpXSXIzP0s&&fHV7 zo&trJN^NWycU)HZAiyc~!id(dolDmvVK?|EuDWr^3@o6lXVfBa3pfDVBtipJ>iO9 zo4YjN>Pqc{fVdbyt)$MxYsM}A6xL=7rq@bi`*gr%`O&=zmn7p)5pc?9;|VNxchl8) z0GYFA4A~WnqsE=TD}Z6nq6*#L?D5}?$SO>{>Y)PMpqsssxEF&PRc=SdiC+}Wj{wQo zbYf#3u&TJ_QP|?eX1Dn;;W1bKxm3W3^7+5;3E5%uJ?1A?_S($se|2QP2%j2415y5OsR_gPMZv!P+2`cXXYaB7-n<$U>y|ohHmmEQ1-2Wgxo+t`v&}j?7|n!8G(AWEgl;{uAz0+L4>(a}jP+FFs=3rd~vval;ZR zXRMJ7ux`QobyUUSQf@dc`ko&FTCe_1Vqj`Rq{LCIw#bOmz22m|6 z1OljyGY-O9a{ z#R)Y{vE#^uEnb;ocS>O~#onn<^joATQ|#3bTPRx1dbJK?h5W+1#jV_`8o8-B?6GMt zqxx&{TLa9{S>*#zi=+!_hU!#)axheToiBOk;4}5jVtHfbsX8Bz`_&^H5v27Oh;Mi- z(x(h7-+7=%>(mw&mG9KL4)kR1Z@dP<B{(zS zUf{s)bNI-7SdT?Z-^>DLz^5*SSTjE`wz@EMY9KZh){0l;-=39xF!MY&e(eUU4=^U1 zgjO-nZwk-#$wgj$;;{C_5VVb69{9+!-yQiqT4&c-2Hj(iRDTwz{=D*4{duMR4RmC> z-Jjg!%Dcu(cTR&k$rtQ~d-gd%9YknA8hgkh-&8p1G8nHj9PsccX>>P)U zU>+2Y_!y92941AU(E;u+ZTmdqG#g$U|CoCB2xo@# z@lWz3^Kq6ihN_R5k7@b`{sO>@slkqx7|y91>w)&~~3PUg6S?J%ONE!1d_&*g`BQ>&Squ8r?$Lr%!L_NyJK z0tPSqO!p1qSU?5!Sb_4)O>X}>DNg4CACTdHCqAJHRlG8&!AT=nd4brvdQ@W+0#)Yo z`YecFjU|IH*6X;Ppm3w8fP))JxL{cx(3)1_5p2&5l6f_DJ?_<#9})p~;~{X)gW79~ zqkqCJ+^4{1eqattQR}DtA=N4LK-G_sC) z`oqyh?8I+EAcq{1`=y>kDTFGIop^>ylwzyTJPd#ypMespkK{&g6JbMDMdV=r&@i=a zi*NqLOvlm%E6lxoE?)HcWscTVGyBm@jV?7NPtq?NX93v7mQ*^pzs>B1*3_VWqWpkZzm!D04#Ix8K&m{=D>Pn9EA#j28 zF9>7kKmZQ%1;%QKOQuv9OCO|=M9t~zP=(nwFQyxzSMwZ#4Giu+Ib6m<=sVN?8<-%b&l$T z19&PT`@pQ11;^tZmWYqf0Vs%BU_9~nbWiRF@HP5hh)Dct`F=jiyw_sceij|0_5SrRv$aTwz%1A%pJjh`%O zHUk1~T?aM=b9-^+^EzdLWodZ9iBEUgLpK42OS-3DdN!~d0}!Co|E6j zAIxo{HaRVMDwD2~q?GZc&qLL$JudUU!k-5+xk7!y=U(u2R8&K{_FXTz

    rvD(kHy$M4T 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 pG%+19ra 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 z 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

    =!IZnQx93m&lky~M3@-X}-2V(v*haB1o{G{ex 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 Me9KYe{*eFvKMQ?>;s5{u literal 0 HcmV?d00001 diff --git a/third-party/seven-zip/executable/SevenZip-windows-x86_32.exe b/third-party/seven-zip/executable/SevenZip-windows-x86_32.exe new file mode 100644 index 0000000000000000000000000000000000000000..710bda2f9bcfddd37ad2cbcb9e28cc482211ad10 GIT binary patch literal 643584 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 z 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%0DSGp_hO&^I-kF#Td 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

    0rV~gUn*c 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 literal 0 HcmV?d00001 diff --git a/third-party/seven-zip/executable/SevenZip-windows-x86_64.exe b/third-party/seven-zip/executable/SevenZip-windows-x86_64.exe new file mode 100644 index 0000000000000000000000000000000000000000..881b7dd97a8318dbe12b363ca6267da8b36c7e25 GIT binary patch literal 1062912 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%0Djbk#>a59klDn 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

    5>F8VxhYD$AKdpn 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

    8J%n&$;zFPR~byolq3sxGu*Q-gX1)r6ISeM)D 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%0Dm7rd_-8Lca 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%0A4MiJ;_i0XHUpZmUm6!NtY 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

    + * A base class for implementing an Application that delegates to an {@link ApplicationLifeCycle} + * instance. This is used in conjunction with secondary dex files so that the logic that would + * normally live in the Application class is loaded after the secondary dexes are loaded. + */ +public abstract class TinkerApplication extends Application { + + //oh, we can use ShareConstants, because they are loader class and static final! + private static final int TINKER_DISABLE = ShareConstants.TINKER_DISABLE; + private static final String INTENT_PATCH_EXCEPTION = ShareIntentUtil.INTENT_PATCH_EXCEPTION; + private static final String TINKER_LOADER_METHOD = "tryLoad"; + /** + * tinkerFlags, which types is supported + * dex only, library only, all support + * default: TINKER_ENABLE_ALL + */ + private final int tinkerFlags; + /** + * whether verify md5 when we load dex or lib + * they store at data/data/package, and we had verity them at the :patch process. + * so we don't have to verity them every time for quicker! + * default:false + */ + private final boolean tinkerLoadVerifyFlag; + private final String delegateClassName; + private final String loaderClassName; + /** + * if we have load patch, we should use safe mode + */ + private boolean useSafeMode; + private Intent tinkerResultIntent; + + private Object delegate = null; + private Resources[] resources = new Resources[1]; + private ClassLoader[] classLoader = new ClassLoader[1]; + private AssetManager[] assetManager = new AssetManager[1]; + + private long applicationStartElapsedTime; + private long applicationStartMillisTime; + + /** + * current build. + */ + protected TinkerApplication(int tinkerFlags) { + this(tinkerFlags, "com.tencent.tinker.loader.app.DefaultApplicationLike", TinkerLoader.class.getName(), false); + } + + /** + * @param delegateClassName The fully-qualified name of the {@link ApplicationLifeCycle} class + * that will act as the delegate for application lifecycle callbacks. + */ + protected TinkerApplication(int tinkerFlags, String delegateClassName, + String loaderClassName, boolean tinkerLoadVerifyFlag) { + this.tinkerFlags = tinkerFlags; + this.delegateClassName = delegateClassName; + this.loaderClassName = loaderClassName; + this.tinkerLoadVerifyFlag = tinkerLoadVerifyFlag; + + } + + protected TinkerApplication(int tinkerFlags, String delegateClassName) { + this(tinkerFlags, delegateClassName, TinkerLoader.class.getName(), false); + } + + private Object createDelegate() { + try { + // Use reflection to create the delegate so it doesn't need to go into the primary dex. + // And we can also patch it + Class delegateClass = Class.forName(delegateClassName, false, getClassLoader()); + Constructor constructor = delegateClass.getConstructor(Application.class, int.class, boolean.class, long.class, long.class, + Intent.class, Resources[].class, ClassLoader[].class, AssetManager[].class); + return constructor.newInstance(this, tinkerFlags, tinkerLoadVerifyFlag, + applicationStartElapsedTime, applicationStartMillisTime, + tinkerResultIntent, resources, classLoader, assetManager); + } catch (Throwable e) { + throw new TinkerRuntimeException("createDelegate failed", e); + } + } + + private synchronized void ensureDelegate() { + if (delegate == null) { + delegate = createDelegate(); + } + } + + /** + * Hook for sub-classes to run logic after the {@link Application#attachBaseContext} has been + * called but before the delegate is created. Implementors should be very careful what they do + * here since {@link android.app.Application#onCreate} will not have yet been called. + */ + private void onBaseContextAttached(Context base) { + applicationStartElapsedTime = SystemClock.elapsedRealtime(); + applicationStartMillisTime = System.currentTimeMillis(); + loadTinker(); + ensureDelegate(); + try { + Method method = ShareReflectUtil.findMethod(delegate, "onBaseContextAttached", Context.class); + method.invoke(delegate, base); + } catch (Throwable t) { + throw new TinkerRuntimeException("onBaseContextAttached method not found", t); + } + //reset save mode + if (useSafeMode) { + String processName = ShareTinkerInternals.getProcessName(this); + String preferName = ShareConstants.TINKER_OWN_PREFERENCE_CONFIG + processName; + SharedPreferences sp = getSharedPreferences(preferName, Context.MODE_PRIVATE); + sp.edit().putInt(ShareConstants.TINKER_SAFE_MODE_COUNT, 0).commit(); + } + } + + @Override + protected final void attachBaseContext(Context base) { + super.attachBaseContext(base); + onBaseContextAttached(base); + } + + private void loadTinker() { + //disable tinker, not need to install + if (tinkerFlags == TINKER_DISABLE) { + return; + } + tinkerResultIntent = new Intent(); + try { + //reflect tinker loader, because loaderClass may be define by user! + Class tinkerLoadClass = Class.forName(loaderClassName, false, getClassLoader()); + + Method loadMethod = tinkerLoadClass.getMethod(TINKER_LOADER_METHOD, TinkerApplication.class, int.class, boolean.class); + Constructor constructor = tinkerLoadClass.getConstructor(); + tinkerResultIntent = (Intent) loadMethod.invoke(constructor.newInstance(), this, tinkerFlags, tinkerLoadVerifyFlag); + } catch (Throwable e) { + //has exception, put exception error code + ShareIntentUtil.setIntentReturnCode(tinkerResultIntent, ShareConstants.ERROR_LOAD_PATCH_UNKNOWN_EXCEPTION); + tinkerResultIntent.putExtra(INTENT_PATCH_EXCEPTION, e); + } + } + + private void delegateMethod(String methodName) { + if (delegate != null) { + try { + Method method = ShareReflectUtil.findMethod(delegate, methodName, new Class[0]); + method.invoke(delegate, new Object[0]); + } catch (Throwable t) { + throw new TinkerRuntimeException(String.format("%s method not found", methodName), t); + } + } + } + + @Override + public final void onCreate() { + super.onCreate(); + ensureDelegate(); + delegateMethod("onCreate"); + } + + @Override + public final void onTerminate() { + super.onTerminate(); + delegateMethod("onTerminate"); + } + + @Override + public final void onLowMemory() { + super.onLowMemory(); + delegateMethod("onLowMemory"); + } + + private void delegateTrimMemory(int level) { + if (delegate != null) { + try { + Method method = ShareReflectUtil.findMethod(delegate, "onTrimMemory", int.class); + method.invoke(delegate, level); + } catch (Throwable t) { + throw new TinkerRuntimeException("onTrimMemory method not found", t); + } + } + } + + @TargetApi(14) + @Override + public final void onTrimMemory(int level) { + super.onTrimMemory(level); + delegateTrimMemory(level); + } + + private void delegateConfigurationChanged(Configuration newConfig) { + if (delegate != null) { + try { + Method method = ShareReflectUtil.findMethod(delegate, "onConfigurationChanged", Configuration.class); + method.invoke(delegate, newConfig); + } catch (Throwable t) { + throw new TinkerRuntimeException("onConfigurationChanged method not found", t); + } + } + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + delegateConfigurationChanged(newConfig); + } + + @Override + public Resources getResources() { + if (resources[0] != null) { + return resources[0]; + } + return super.getResources(); + } + + @Override + public ClassLoader getClassLoader() { + if (classLoader[0] != null) { + return classLoader[0]; + } + return super.getClassLoader(); + } + + @Override + public AssetManager getAssets() { + if (assetManager[0] != null) { + return assetManager[0]; + } + return super.getAssets(); + } + + public void setUseSafeMode(boolean useSafeMode) { + this.useSafeMode = useSafeMode; + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareBsDiffPatchInfo.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareBsDiffPatchInfo.java new file mode 100644 index 00000000..5488e4e8 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareBsDiffPatchInfo.java @@ -0,0 +1,95 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import java.util.ArrayList; + +/** + * patch via bsdiff + * Created by zhangshaowen on 16/3/16. + */ +public class ShareBsDiffPatchInfo { + public String name; + public String md5; + public String rawCrc; + public String patchMd5; + + public String path; + + public ShareBsDiffPatchInfo(String name, String md5, String path, String raw, String patch) { + // TODO Auto-generated constructor stub + this.name = name; + this.md5 = md5; + this.rawCrc = raw; + this.patchMd5 = patch; + this.path = path; + } + + public static void parseDiffPatchInfo(String meta, ArrayList diffList) { + if (meta == null || meta.length() == 0) { + return; + } + String[] lines = meta.split("\n"); + for (final String line : lines) { + if (line == null || line.length() <= 0) { + continue; + } + final String[] kv = line.split(",", 5); + if (kv == null || kv.length < 5) { + continue; + } + // key + final String name = kv[0].trim(); + final String path = kv[1].trim(); + final String md5 = kv[2].trim(); + final String rawCrc = kv[3].trim(); + final String patchMd5 = kv[4].trim(); + + ShareBsDiffPatchInfo dexInfo = new ShareBsDiffPatchInfo(name, md5, path, rawCrc, patchMd5); + diffList.add(dexInfo); + } + + } + + public static boolean checkDiffPatchInfo(ShareBsDiffPatchInfo info) { + if (info == null) { + return false; + } + String name = info.name; + String md5 = info.md5; + if (name == null || name.length() <= 0 || md5 == null || md5.length() != ShareConstants.MD5_LENGTH) { + return false; + } + + return true; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(name); + sb.append(","); + sb.append(path); + sb.append(","); + sb.append(md5); + sb.append(","); + sb.append(rawCrc); + sb.append(","); + sb.append(patchMd5); + return sb.toString(); + } +} \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareConstants.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareConstants.java new file mode 100644 index 00000000..8f53fcb6 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareConstants.java @@ -0,0 +1,170 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +/** + * Created by zhangshaowen on 16/3/24. + */ +public class ShareConstants { + public static final int BUFFER_SIZE = 16384; + public static final int MD5_LENGTH = 32; + public static final int MD5_FILE_BUF_LENGTH = 1024 * 100; + + public static final int MAX_EXTRACT_ATTEMPTS = 2; + + public static final String TINKER_ID = "TINKER_ID"; + public static final String NEW_TINKER_ID = "NEW_TINKER_ID"; + + public static final String OLD_VERSION = "old"; + public static final String NEW_VERSION = "new"; + public static final String PATCH_BASE_NAME = "patch-"; + public static final String PATCH_SUFFIX = ".apk"; + + public static final String PACKAGE_META_FILE = "assets/package_meta.txt"; + + public static final String SO_META_FILE = "assets/so_meta.txt"; + public static final String SO_PATH = "lib"; + + // If you changed this value, please change the same value in TypedValue, too. + public static final String DEX_SMALLPATCH_INFO_FILE = "smallpatch_info.ddextra"; + + public static final String DEX_META_FILE = "assets/dex_meta.txt"; + public static final String DEX_PATH = "dex"; + public static final String DEX_OPTIMIZE_PATH = "odex"; + public static final String DEX_SUFFIX = ".dex"; + public static final String JAR_SUFFIX = ".jar"; + public static final String CHECK_DEX_INSTALL_FAIL = "checkDexInstall failed"; + + public static final String RES_META_FILE = "assets/res_meta.txt"; + public static final String RES_ARSC = "resources.arsc"; + public static final String RES_MANIFEST = "AndroidManifest.xml"; + public static final String RES_TITLE = "resources_out.zip"; + public static final String RES_PATH = "res"; + public static final String RES_NAME = "resources.apk"; + public static final String RES_ADD_TITLE = "add:"; + public static final String RES_MOD_TITLE = "modify:"; + public static final String RES_LARGE_MOD_TITLE = "large modify:"; + public static final String RES_DEL_TITLE = "delete:"; + public static final String RES_PATTERN_TITLE = "pattern:"; + + public static final String DEXMODE_RAW = "raw"; + public static final String DEXMODE_JAR = "jar"; + public static final String DEX_IN_JAR = "classes.dex"; + + public static final String PATCH_DIRECTORY_NAME = "tinker"; + public static final String PATCH_INFO_NAME = "patch.info"; + public static final String PATCH_INFO_LOCK_NAME = "info.lock"; + + public static final String META_SUFFIX = "meta.txt"; + + /** + * multi process share + */ + public static final String TINKER_SHARE_PREFERENCE_CONFIG = "tinker_share_config"; + public static final String TINKER_ENABLE_CONFIG = "tinker_enable"; + + /** + * only for each process + */ + public static final String TINKER_OWN_PREFERENCE_CONFIG = "tinker_own_config_"; + public static final String TINKER_SAFE_MODE_COUNT = "safe_mode_count"; + public static final int TINKER_SAFE_MODE_MAX_COUNT = 3; + + + /** + * notification id, use to Increasing the patch process priority + * your app shouldn't use the same notification id. + * if you want to define it, use {@code TinkerPatchService.setTinkerNotificationId} + */ + public static final int TINKER_PATCH_SERVICE_NOTIFICATION = -1119860829; + + //resource type + public static final int TYPE_PATCH_FILE = 1; + public static final int TYPE_PATCH_INFO = 2; + public static final int TYPE_DEX = 3; + /** + * for art small dex + */ + public static final int TYPE_DEX_FOR_ART = 4; + public static final int TYPE_DEX_OPT = 5; + public static final int TYPE_LIBRARY = 6; + public static final int TYPE_RESOURCE = 7; + + + public static final int TINKER_DISABLE = 0x00; + public static final int TINKER_DEX_MASK = 0x01; + public static final int TINKER_NATIVE_LIBRARY_MASK = 0x02; + public static final int TINKER_RESOURCE_MASK = 0x04; + public static final int TINKER_DEX_AND_LIBRARY = TINKER_DEX_MASK | TINKER_NATIVE_LIBRARY_MASK; + public static final int TINKER_ENABLE_ALL = TINKER_DEX_MASK | TINKER_NATIVE_LIBRARY_MASK | TINKER_RESOURCE_MASK; + + //load error code + public static final int ERROR_LOAD_OK = 0; + public static final int ERROR_LOAD_DISABLE = -1; + public static final int ERROR_LOAD_PATCH_DIRECTORY_NOT_EXIST = -2; + public static final int ERROR_LOAD_PATCH_INFO_NOT_EXIST = -3; + public static final int ERROR_LOAD_PATCH_INFO_CORRUPTED = -4; + public static final int ERROR_LOAD_PATCH_INFO_BLANK = -5; + public static final int ERROR_LOAD_PATCH_VERSION_DIRECTORY_NOT_EXIST = -6; + public static final int ERROR_LOAD_PATCH_VERSION_FILE_NOT_EXIST = -7; + public static final int ERROR_LOAD_PATCH_PACKAGE_CHECK_FAIL = -9; + public static final int ERROR_LOAD_PATCH_VERSION_DEX_DIRECTORY_NOT_EXIST = -10; + public static final int ERROR_LOAD_PATCH_VERSION_DEX_FILE_NOT_EXIST = -11; + public static final int ERROR_LOAD_PATCH_VERSION_DEX_OPT_FILE_NOT_EXIST = -12; + public static final int ERROR_LOAD_PATCH_VERSION_DEX_CLASSLOADER_NULL = -13; + public static final int ERROR_LOAD_PATCH_VERSION_DEX_MD5_MISMATCH = -14; + public static final int ERROR_LOAD_PATCH_VERSION_DEX_LOAD_EXCEPTION = -15; + public static final int ERROR_LOAD_PATCH_VERSION_LIB_DIRECTORY_NOT_EXIST = -16; + public static final int ERROR_LOAD_PATCH_VERSION_LIB_FILE_NOT_EXIST = -17; + public static final int ERROR_LOAD_PATCH_REWRITE_PATCH_INFO_FAIL = -18; + public static final int ERROR_LOAD_PATCH_UNKNOWN_EXCEPTION = -19; + //resource + public static final int ERROR_LOAD_PATCH_VERSION_RESOURCE_DIRECTORY_NOT_EXIST = -21; + public static final int ERROR_LOAD_PATCH_VERSION_RESOURCE_FILE_NOT_EXIST = -22; + public static final int ERROR_LOAD_PATCH_VERSION_RESOURCE_LOAD_EXCEPTION = -23; + public static final int ERROR_LOAD_PATCH_VERSION_RESOURCE_MD5_MISMATCH = -24; + public static final int ERROR_LOAD_PATCH_UNCAUGHT_EXCEPTION = -25; + + public static final int ERROR_LOAD_GET_INTENT_FAIL = -10000; + + //load exception code + //recover error code + public static final int ERROR_LOAD_EXCEPTION_UNKNOWN = -1; + public static final int ERROR_LOAD_EXCEPTION_DEX = -2; + public static final int ERROR_LOAD_EXCEPTION_RESOURCE = -3; + public static final int ERROR_LOAD_EXCEPTION_UNCAUGHT = -4; + + + //recover error code + public static final int ERROR_PATCH_OK = 0; + public static final int ERROR_PATCH_DISABLE = -1; + public static final int ERROR_PATCH_NOTEXIST = -2; + public static final int ERROR_PATCH_RUNNING = -3; + public static final int ERROR_PATCH_INSERVICE = -4; + + //package check error code + public static final int ERROR_PACKAGE_CHECK_OK = 0; + public static final int ERROR_PACKAGE_CHECK_SIGNATURE_FAIL = -1; + public static final int ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND = -2; + public static final int ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED = -3; + public static final int ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED = -4; + public static final int ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND = -5; + public static final int ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND = -6; + public static final int ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL = -7; + public static final int ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED = -8; + +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareDexDiffPatchInfo.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareDexDiffPatchInfo.java new file mode 100644 index 00000000..a623f195 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareDexDiffPatchInfo.java @@ -0,0 +1,128 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import com.tencent.tinker.loader.TinkerRuntimeException; + +import java.util.ArrayList; + +/** + * Created by zhangshaowen on 16/4/11. + */ +public class ShareDexDiffPatchInfo { + public final String rawName; + public final String destMd5InDvm; + public final String destMd5InArt; + public final String oldDexCrC; + public final String dexDiffMd5; + + public final String path; + + public final String dexMode; + + public final boolean isJarMode; + + /** + * if it is jar mode, and the name is end of .dex, we should repackage it with zip, with renaming name.dex.jar + */ + public final String realName; + + + public ShareDexDiffPatchInfo(String name, String path, String destMd5InDvm, String destMd5InArt, String dexDiffMd5, String oldDexCrc, String dexMode) { + // TODO Auto-generated constructor stub + this.rawName = name; + this.path = path; + this.destMd5InDvm = destMd5InDvm; + this.destMd5InArt = destMd5InArt; + this.dexDiffMd5 = dexDiffMd5; + this.oldDexCrC = oldDexCrc; + this.dexMode = dexMode; + if (dexMode.equals(ShareConstants.DEXMODE_JAR)) { + this.isJarMode = true; + if (SharePatchFileUtil.isRawDexFile(name)) { + realName = name + ShareConstants.JAR_SUFFIX; + } else { + realName = name; + } + } else if (dexMode.equals(ShareConstants.DEXMODE_RAW)) { + this.isJarMode = false; + this.realName = name; + } else { + throw new TinkerRuntimeException("can't recognize dex mode:" + dexMode); + } + } + + public static void parseDexDiffPatchInfo(String meta, ArrayList dexList) { + if (meta == null || meta.length() == 0) { + return; + } + String[] lines = meta.split("\n"); + for (final String line : lines) { + if (line == null || line.length() <= 0) { + continue; + } + final String[] kv = line.split(",", 7); + if (kv == null || kv.length < 7) { + continue; + } + + // key + final String name = kv[0].trim(); + final String path = kv[1].trim(); + final String destMd5InDvm = kv[2].trim(); + final String destMd5InArt = kv[3].trim(); + final String dexDiffMd5 = kv[4].trim(); + final String oldDexCrc = kv[5].trim(); + final String dexMode = kv[6].trim(); + + ShareDexDiffPatchInfo dexInfo = new ShareDexDiffPatchInfo(name, path, destMd5InDvm, destMd5InArt, dexDiffMd5, oldDexCrc, dexMode); + dexList.add(dexInfo); + } + + } + + public static boolean checkDexDiffPatchInfo(ShareDexDiffPatchInfo info) { + if (info == null) { + return false; + } + String name = info.rawName; + String md5 = (ShareTinkerInternals.isVmArt() ? info.destMd5InArt : info.destMd5InDvm); + if (name == null || name.length() <= 0 || md5 == null || md5.length() != ShareConstants.MD5_LENGTH) { + return false; + } + return true; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(rawName); + sb.append(","); + sb.append(path); + sb.append(","); + sb.append(destMd5InDvm); + sb.append(","); + sb.append(destMd5InArt); + sb.append(","); + sb.append(oldDexCrC); + sb.append(","); + sb.append(dexDiffMd5); + sb.append(","); + sb.append(dexMode); + return sb.toString(); + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareFileLockHelper.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareFileLockHelper.java new file mode 100644 index 00000000..63c266a8 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareFileLockHelper.java @@ -0,0 +1,85 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import android.util.Log; + +import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.channels.FileLock; + +/** + * Created by zhangshaowen on 16/6/3. + */ +public class ShareFileLockHelper implements Closeable { + public static final int MAX_LOCK_ATTEMPTS = 3; + public static final int LOCK_WAIT_EACH_TIME = 10; + private static final String TAG = "Tinker.FileLockHelper"; + private final FileOutputStream outputStream; + private final FileLock fileLock; + + private ShareFileLockHelper(File lockFile) throws IOException { + outputStream = new FileOutputStream(lockFile); + + int numAttempts = 0; + boolean isGetLockSuccess; + FileLock localFileLock = null; + //just wait twice, + Exception saveException = null; + while (numAttempts < MAX_LOCK_ATTEMPTS) { + numAttempts++; + try { + localFileLock = outputStream.getChannel().lock(); + isGetLockSuccess = (localFileLock != null); + if (isGetLockSuccess) { + break; + } + //it can just sleep 0, afraid of cpu scheduling + Thread.sleep(LOCK_WAIT_EACH_TIME); + + } catch (Exception e) { +// e.printStackTrace(); + saveException = e; + Log.e(TAG, "getInfoLock Thread failed time:" + LOCK_WAIT_EACH_TIME); + } + } + + if (localFileLock == null) { + throw new IOException("Tinker Exception:FileLockHelper lock file failed: " + lockFile.getAbsolutePath(), saveException); + } + fileLock = localFileLock; + } + + public static ShareFileLockHelper getFileLock(File lockFile) throws IOException { + return new ShareFileLockHelper(lockFile); + } + + @Override + public void close() throws IOException { + try { + if (fileLock != null) { + fileLock.release(); + } + } finally { + if (outputStream != null) { + outputStream.close(); + } + } + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareIntentUtil.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareIntentUtil.java new file mode 100644 index 00000000..965fb4cd --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareIntentUtil.java @@ -0,0 +1,180 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import android.content.Intent; +import android.util.Log; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by zhangshaowen on 16/3/18. + */ +public class ShareIntentUtil { + //intent + public static final String INTENT_RETURN_CODE = "intent_return_code"; + public static final String INTENT_PATCH_OLD_VERSION = "intent_patch_old_version"; + public static final String INTENT_PATCH_NEW_VERSION = "intent_patch_new_version"; + public static final String INTENT_PATCH_MISMATCH_DEX_PATH = "intent_patch_mismatch_dex_path"; + public static final String INTENT_PATCH_MISSING_DEX_PATH = "intent_patch_missing_dex_path"; + public static final String INTENT_PATCH_DEXES_PATH = "intent_patch_dexes_path"; + public static final String INTENT_PATCH_MISMATCH_LIB_PATH = "intent_patch_mismatch_lib_path"; + public static final String INTENT_PATCH_MISSING_LIB_PATH = "intent_patch_missing_lib_path"; + public static final String INTENT_PATCH_LIBS_PATH = "intent_patch_libs_path"; + public static final String INTENT_PATCH_COST_TIME = "intent_patch_cost_time"; + public static final String INTENT_PATCH_EXCEPTION = "intent_patch_exception"; + public static final String INTENT_PATCH_PACKAGE_PATCH_CHECK = "intent_patch_package_patch_check"; + public static final String INTENT_PATCH_PACKAGE_CONFIG = "intent_patch_package_config"; + private static final String TAG = "ShareIntentUtil"; + + public static void setIntentReturnCode(Intent intent, int code) { + intent.putExtra(INTENT_RETURN_CODE, code); + } + + public static int getIntentReturnCode(Intent intent) { + return getIntExtra(intent, INTENT_RETURN_CODE, ShareConstants.ERROR_LOAD_GET_INTENT_FAIL); + } + + public static void setIntentPatchCostTime(Intent intent, long cost) { + intent.putExtra(INTENT_PATCH_COST_TIME, cost); + } + + public static long getIntentPatchCostTime(Intent intent) { + return intent.getLongExtra(INTENT_PATCH_COST_TIME, 0); + } + + public static Exception getIntentPatchException(Intent intent) { + Serializable serializable = getSerializableExtra(intent, INTENT_PATCH_EXCEPTION); + if (serializable != null) { + return (Exception) serializable; + } + return null; + } + + public static HashMap getIntentPatchDexPaths(Intent intent) { + Serializable serializable = getSerializableExtra(intent, INTENT_PATCH_DEXES_PATH); + if (serializable != null) { + return (HashMap) serializable; + } + return null; + } + + public static HashMap getIntentPatchLibsPaths(Intent intent) { + Serializable serializable = getSerializableExtra(intent, INTENT_PATCH_LIBS_PATH); + if (serializable != null) { + return (HashMap) serializable; + } + return null; + } + + public static HashMap getIntentPackageConfig(Intent intent) { + Serializable serializable = getSerializableExtra(intent, INTENT_PATCH_PACKAGE_CONFIG); + if (serializable != null) { + return (HashMap) serializable; + } + return null; + } + + + public static ArrayList getStringArrayListExtra(Intent intent, String name) { + if (null == intent) { + return null; + } + ArrayList ret = null; + try { + ret = intent.getStringArrayListExtra(name); + } catch (Exception e) { + Log.e(TAG, "getStringExtra exception:" + e.getMessage()); + ret = null; + } + return ret; + } + + + public static String getStringExtra(Intent intent, String name) { + if (null == intent) { + return null; + } + String ret = null; + try { + ret = intent.getStringExtra(name); + } catch (Exception e) { + Log.e(TAG, "getStringExtra exception:" + e.getMessage()); + ret = null; + } + return ret; + } + + public static Serializable getSerializableExtra(Intent intent, String name) { + if (null == intent) { + return null; + } + Serializable ret = null; + try { + ret = intent.getSerializableExtra(name); + } catch (Exception e) { + Log.e(TAG, "getSerializableExtra exception:" + e.getMessage()); + ret = null; + } + return ret; + } + + public static int getIntExtra(Intent intent, String name, int defaultValue) { + if (null == intent) { + return defaultValue; + } + int ret = defaultValue; + try { + ret = intent.getIntExtra(name, defaultValue); + } catch (Exception e) { + Log.e(TAG, "getIntExtra exception:" + e.getMessage()); + ret = defaultValue; + } + return ret; + } + + + public static boolean getBooleanExtra(Intent intent, String name, boolean defaultValue) { + if (null == intent) { + return defaultValue; + } + boolean ret = defaultValue; + try { + ret = intent.getBooleanExtra(name, defaultValue); + } catch (Exception e) { + Log.e(TAG, "getBooleanExtra exception:" + e.getMessage()); + ret = defaultValue; + } + return ret; + } + + public static long getLongExtra(Intent intent, String name, long defaultValue) { + if (null == intent) { + return defaultValue; + } + long ret = defaultValue; + try { + ret = intent.getLongExtra(name, defaultValue); + } catch (Exception e) { + Log.e(TAG, "getIntExtra exception:" + e.getMessage()); + ret = defaultValue; + } + return ret; + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchFileUtil.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchFileUtil.java new file mode 100644 index 00000000..ddfee922 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchFileUtil.java @@ -0,0 +1,424 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.util.Log; + +import java.io.BufferedInputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + + +public class SharePatchFileUtil { + private static final String TAG = "Tinker.PatchFileUtil"; + + /** + * data dir, such as /data/data/tinker.sample.android/tinker + * @param context + * @return + */ + public static File getPatchDirectory(Context context) { + ApplicationInfo applicationInfo = context.getApplicationInfo(); + if (applicationInfo == null) { + // Looks like running on a test Context, so just return without patching. + return null; + } + + return new File(applicationInfo.dataDir, ShareConstants.PATCH_DIRECTORY_NAME); + } + + public static File getPatchInfoFile(String patchDirectory) { + return new File(patchDirectory + "/" + ShareConstants.PATCH_INFO_NAME); + } + + public static File getPatchInfoLockFile(String patchDirectory) { + return new File(patchDirectory + "/" + ShareConstants.PATCH_INFO_LOCK_NAME); + } + + public static String getPatchVersionDirectory(String version) { + if (version == null || version.length() != ShareConstants.MD5_LENGTH) { + return null; + } + + return ShareConstants.PATCH_BASE_NAME + version.substring(0, 8); + } + + public static String getPatchVersionFile(String version) { + if (version == null || version.length() != ShareConstants.MD5_LENGTH) { + return null; + } + + return getPatchVersionDirectory(version) + ShareConstants.PATCH_SUFFIX; + } + + public static boolean checkIfMd5Valid(final String object) { + if ((object == null) || (object.length() != ShareConstants.MD5_LENGTH)) { + return false; + } + return true; + } + + public static final boolean fileExists(String filePath) { + if (filePath == null) { + return false; + } + + File file = new File(filePath); + if (file.exists()) { + return true; + } + return false; + } + + /** + * get directory size + * + * @param directory + * @return + */ + public static long getFileOrDirectorySize(File directory) { + if (directory == null || !directory.exists()) { + return 0; + } + if (directory.isFile()) { + return directory.length(); + } + long totalSize = 0; + File[] fileList = directory.listFiles(); + if (fileList != null) { + for (File file : fileList) { + if (file.isDirectory()) { + totalSize = totalSize + getFileOrDirectorySize(file); + } else { + totalSize = totalSize + file.length(); + } + } + } + return totalSize; + } + + public static final boolean safeDeleteFile(File file) { + if (file == null) { + return true; + } + + Log.i(TAG, "safeDeleteFile, try to delete path: " + file.getPath()); + + if (file.exists()) { + boolean deleted = file.delete(); + if (!deleted) { + Log.e(TAG, "Failed to delete file, try to delete when exit. path: " + file.getPath()); + file.deleteOnExit(); + } + return deleted; + } + return true; + } + + public static final boolean deleteDir(String dir) { + if (dir == null) { + return false; + } + return deleteDir(new File(dir)); + + } + + public static final boolean deleteDir(File file) { + if (file == null || (!file.exists())) { + return false; + } + if (file.isFile()) { + safeDeleteFile(file); + } else if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null) { + for (File subFile : files) { + deleteDir(subFile); + } + safeDeleteFile(file); + } + } + return true; + } + + + /** + * Returns whether the file is a valid file. + */ + public static boolean verifyFileMd5(File file, String md5) { + if (md5 == null) { + return false; + } + String fileMd5 = getMD5(file); + + if (fileMd5 == null) { + return false; + } + + return md5.equals(fileMd5); + } + + public static boolean isRawDexFile(String fileName) { + if (fileName == null) { + return false; + } + return fileName.endsWith(ShareConstants.DEX_SUFFIX); + } + + /** + * Returns whether the dex file is a valid file. + * dex may wrap with jar + */ + public static boolean verifyDexFileMd5(File file, String md5) { + if (file == null || md5 == null) { + return false; + } + //if it is not the raw dex, we check the stream instead + String fileMd5; + + if (isRawDexFile(file.getName())) { + fileMd5 = getMD5(file); + } else { + ZipFile dexJar = null; + try { + dexJar = new ZipFile(file); + ZipEntry classesDex = dexJar.getEntry(ShareConstants.DEX_IN_JAR); + + // no code + if (null == classesDex) { + return false; + } + fileMd5 = getMD5(dexJar.getInputStream(classesDex)); + } catch (IOException e) { +// e.printStackTrace(); + return false; + } finally { + SharePatchFileUtil.closeZip(dexJar); + } + } + + return md5.equals(fileMd5); + } + + public static void copyFileUsingStream(File source, File dest) throws IOException { + FileInputStream is = null; + FileOutputStream os = null; + File parent = dest.getParentFile(); + if (parent != null && (!parent.exists())) { + parent.mkdirs(); + } + try { + is = new FileInputStream(source); + os = new FileOutputStream(dest, false); + + byte[] buffer = new byte[ShareConstants.BUFFER_SIZE]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } finally { + closeQuietly(is); + closeQuietly(os); + } + } + + /** + * for faster, read and get the contents + * + * @throws IOException + */ + public static String loadDigestes(JarFile jarFile, JarEntry je) throws Exception { + InputStream bis = null; + StringBuilder sb = new StringBuilder(); + + try { + InputStream is = jarFile.getInputStream(je); + byte[] bytes = new byte[ShareConstants.BUFFER_SIZE]; + bis = new BufferedInputStream(is); + int readBytes; + while ((readBytes = bis.read(bytes)) > 0) { + sb.append(new String(bytes, 0, readBytes)); + } + } finally { + closeQuietly(bis); + } + return sb.toString(); + } + + /** + * Get the md5 for inputStream. + * This method cost less memory. It read bufLen bytes from the FileInputStream once. + * + * @param is + */ + public final static String getMD5(final InputStream is) { + if (is == null) { + return null; + } + try { + BufferedInputStream bis = new BufferedInputStream(is); + MessageDigest md = MessageDigest.getInstance("MD5"); + StringBuilder md5Str = new StringBuilder(32); + + byte[] buf = new byte[ShareConstants.MD5_FILE_BUF_LENGTH]; + int readCount; + while ((readCount = bis.read(buf)) != -1) { + md.update(buf, 0, readCount); + } + + byte[] hashValue = md.digest(); + + for (int i = 0; i < hashValue.length; i++) { + md5Str.append(Integer.toString((hashValue[i] & 0xff) + 0x100, 16).substring(1)); + } + return md5Str.toString(); + } catch (Exception e) { + return null; + } + } + + /** + * Get the md5 for the file. call getMD5(FileInputStream is, int bufLen) inside. + * + * @param file + */ + public static String getMD5(final File file) { + if (file == null || !file.exists()) { + return null; + } + + FileInputStream fin = null; + try { + fin = new FileInputStream(file); + String md5 = getMD5(fin); + fin.close(); + return md5; + + } catch (Exception e) { + return null; + + } finally { + try { + if (fin != null) { + fin.close(); + } + } catch (IOException e) { + + } + } + } + + /** + * change the jar file path as the makeDexElements do + * + * @param path + * @param optimizedDirectory + * @return + */ + public static String optimizedPathFor(File path, File optimizedDirectory) { + String fileName = path.getName(); + if (!fileName.endsWith(ShareConstants.DEX_SUFFIX)) { + int lastDot = fileName.lastIndexOf("."); + if (lastDot < 0) { + fileName += ShareConstants.DEX_SUFFIX; + } else { + StringBuilder sb = new StringBuilder(lastDot + 4); + sb.append(fileName, 0, lastDot); + sb.append(ShareConstants.DEX_SUFFIX); + fileName = sb.toString(); + } + } + + File result = new File(optimizedDirectory, fileName); + return result.getPath(); + } + + /** + * Closes the given {@code Closeable}. Suppresses any IO exceptions. + */ + public static void closeQuietly(Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (IOException e) { + Log.w(TAG, "Failed to close resource", e); + } + } + + public static void closeZip(ZipFile zipFile) { + try { + if (zipFile != null) { + zipFile.close(); + } + } catch (IOException e) { + Log.w(TAG, "Failed to close resource", e); + } + } + + public static boolean checkResourceArscMd5(File resOutput, String destMd5) { + ZipFile resourceZip = null; + try { + resourceZip = new ZipFile(resOutput); + ZipEntry arscEntry = resourceZip.getEntry(ShareConstants.RES_ARSC); + if (arscEntry == null) { + Log.i(TAG, "checkResourceArscMd5 resources.arsc not found"); + return false; + } + InputStream inputStream = null; + try { + inputStream = resourceZip.getInputStream(arscEntry); + String md5 = SharePatchFileUtil.getMD5(inputStream); + if (md5 != null && md5.equals(destMd5)) { + return true; + } + } finally { + SharePatchFileUtil.closeQuietly(inputStream); + } + + } catch (Throwable e) { + Log.i(TAG, "checkResourceArscMd5 throwable:" + e.getMessage()); + + } finally { + SharePatchFileUtil.closeZip(resourceZip); + } + return false; + } + + public static void ensureFileDirectory(File file) { + if (file == null) { + return; + } + File parentFile = file.getParentFile(); + if (!parentFile.exists()) { + parentFile.mkdirs(); + } + } + +} + diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchInfo.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchInfo.java new file mode 100644 index 00000000..f787fb38 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/SharePatchInfo.java @@ -0,0 +1,188 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import android.util.Log; + +import com.tencent.tinker.loader.TinkerRuntimeException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; + +/** + * Created by zhangshaowen on 16/3/16. + */ +public class SharePatchInfo { + public static final int MAX_EXTRACT_ATTEMPTS = ShareConstants.MAX_EXTRACT_ATTEMPTS; + public static final String OLD_VERSION = ShareConstants.OLD_VERSION; + public static final String NEW_VERSION = ShareConstants.NEW_VERSION; + private static final String TAG = "PatchInfo"; + public String oldVersion; + public String newVersion; + + public SharePatchInfo(String oldVer, String newVew) { + // TODO Auto-generated constructor stub + this.oldVersion = oldVer; + this.newVersion = newVew; + } + + public static SharePatchInfo readAndCheckPropertyWithLock(File pathInfoFile, File lockFile) { + File lockParentFile = lockFile.getParentFile(); + if (!lockParentFile.exists()) { + lockParentFile.mkdirs(); + } + + SharePatchInfo patchInfo; + ShareFileLockHelper fileLock = null; + try { + fileLock = ShareFileLockHelper.getFileLock(lockFile); + patchInfo = readAndCheckProperty(pathInfoFile); + } catch (Exception e) { + throw new TinkerRuntimeException("readAndCheckPropertyWithLock fail", e); + } finally { + try { + if (fileLock != null) { + fileLock.close(); + } + } catch (IOException e) { + Log.i(TAG, "releaseInfoLock error", e); + } + } + + return patchInfo; + } + + public static boolean rewritePatchInfoFileWithLock(File pathInfoFile, SharePatchInfo info, File lockFile) { + File lockParentFile = lockFile.getParentFile(); + if (!lockParentFile.exists()) { + lockParentFile.mkdirs(); + } + boolean rewriteSuccess; + ShareFileLockHelper fileLock = null; + try { + fileLock = ShareFileLockHelper.getFileLock(lockFile); + rewriteSuccess = rewritePatchInfoFile(pathInfoFile, info); + } catch (Exception e) { + throw new TinkerRuntimeException("rewritePatchInfoFileWithLock fail", e); + } finally { + try { + if (fileLock != null) { + fileLock.close(); + } + } catch (IOException e) { + Log.i(TAG, "releaseInfoLock error", e); + } + + } + return rewriteSuccess; + } + + private static SharePatchInfo readAndCheckProperty(File pathInfoFile) { + boolean isReadPatchSuccessful = false; + int numAttempts = 0; + String oldVer = null; + String newVer = null; + + while (numAttempts < MAX_EXTRACT_ATTEMPTS && !isReadPatchSuccessful) { + numAttempts++; + Properties properties = new Properties(); + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(pathInfoFile); + properties.load(inputStream); + oldVer = properties.getProperty(OLD_VERSION); + newVer = properties.getProperty(NEW_VERSION); + } catch (IOException e) { + e.printStackTrace(); + } finally { + SharePatchFileUtil.closeQuietly(inputStream); + } + + if (oldVer == null || newVer == null) { + continue; + } + //oldver may be "" or 32 md5 + if ((!oldVer.equals("") && !SharePatchFileUtil.checkIfMd5Valid(oldVer)) || !SharePatchFileUtil.checkIfMd5Valid(newVer)) { + Log.w(TAG, "path info file corrupted:" + pathInfoFile.getAbsolutePath()); + continue; + } else { + isReadPatchSuccessful = true; + } + } + + if (isReadPatchSuccessful) { + return new SharePatchInfo(oldVer, newVer); + } + + return null; + } + + private static boolean rewritePatchInfoFile(File pathInfoFile, SharePatchInfo info) { + if (pathInfoFile == null || info == null) { + return false; + } + Log.i(TAG, "rewritePatchInfoFile file path:" + + pathInfoFile.getAbsolutePath() + + " , oldVer:" + + info.oldVersion + + ", newVer:" + + info.newVersion); + + boolean isWritePatchSuccessful = false; + int numAttempts = 0; + + File parentFile = pathInfoFile.getParentFile(); + if (!parentFile.exists()) { + parentFile.mkdirs(); + } + + while (numAttempts < MAX_EXTRACT_ATTEMPTS && !isWritePatchSuccessful) { + numAttempts++; + + Properties newProperties = new Properties(); + newProperties.put(OLD_VERSION, info.oldVersion); + newProperties.put(NEW_VERSION, info.newVersion); + FileOutputStream outputStream = null; + try { + outputStream = new FileOutputStream(pathInfoFile, false); + String comment = "from old version:" + info.oldVersion + " to new version:" + info.newVersion; + newProperties.store(outputStream, comment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + SharePatchFileUtil.closeQuietly(outputStream); + } + + SharePatchInfo tempInfo = readAndCheckProperty(pathInfoFile); + + isWritePatchSuccessful = tempInfo != null && tempInfo.oldVersion.equals(info.oldVersion) && tempInfo.newVersion.equals(info.newVersion); + if (!isWritePatchSuccessful) { + pathInfoFile.delete(); + } + } + if (isWritePatchSuccessful) { + return true; + } + + return false; + } + + +} \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareReflectUtil.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareReflectUtil.java new file mode 100644 index 00000000..28f0295a --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareReflectUtil.java @@ -0,0 +1,128 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; + +/** + * Created by zhangshaowen on 16/8/22. + */ +public class ShareReflectUtil { + + /** + * Locates a given field anywhere in the class inheritance hierarchy. + * + * @param instance an object to search the field into. + * @param name field name + * @return a field object + * @throws NoSuchFieldException if the field cannot be located + */ + public static Field findField(Object instance, String name) throws NoSuchFieldException { + for (Class clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) { + try { + Field field = clazz.getDeclaredField(name); + + if (!field.isAccessible()) { + field.setAccessible(true); + } + + return field; + } catch (NoSuchFieldException e) { + // ignore and search next + } + } + + throw new NoSuchFieldException("Field " + name + " not found in " + instance.getClass()); + } + + public static Field findField(Class originClazz, String name) throws NoSuchFieldException { + for (Class clazz = originClazz; clazz != null; clazz = clazz.getSuperclass()) { + try { + Field field = clazz.getDeclaredField(name); + + if (!field.isAccessible()) { + field.setAccessible(true); + } + + return field; + } catch (NoSuchFieldException e) { + // ignore and search next + } + } + + throw new NoSuchFieldException("Field " + name + " not found in " + originClazz); + } + + /** + * Locates a given method anywhere in the class inheritance hierarchy. + * + * @param instance an object to search the method into. + * @param name method name + * @param parameterTypes method parameter types + * @return a method object + * @throws NoSuchMethodException if the method cannot be located + */ + public static Method findMethod(Object instance, String name, Class... parameterTypes) + throws NoSuchMethodException { + for (Class clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) { + try { + Method method = clazz.getDeclaredMethod(name, parameterTypes); + + if (!method.isAccessible()) { + method.setAccessible(true); + } + + return method; + } catch (NoSuchMethodException e) { + // ignore and search next + } + } + + throw new NoSuchMethodException("Method " + + name + + " with parameters " + + Arrays.asList(parameterTypes) + + " not found in " + instance.getClass()); + } + + /** + * Replace the value of a field containing a non null array, by a new array containing the + * elements of the original array plus the elements of extraElements. + * + * @param instance the instance whose field is to be modified. + * @param fieldName the field to modify. + * @param extraElements elements to append at the end of the array. + */ + public static void expandFieldArray(Object instance, String fieldName, Object[] extraElements) + throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { + Field jlrField = findField(instance, fieldName); + + Object[] original = (Object[]) jlrField.get(instance); + Object[] combined = (Object[]) Array.newInstance(original.getClass().getComponentType(), original.length + extraElements.length); + + // NOTE: changed to copy extraElements first, for patch load first + + System.arraycopy(extraElements, 0, combined, 0, extraElements.length); + System.arraycopy(original, 0, combined, extraElements.length, original.length); + + jlrField.set(instance, combined); + } + +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareResPatchInfo.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareResPatchInfo.java new file mode 100644 index 00000000..2aff9593 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareResPatchInfo.java @@ -0,0 +1,189 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import com.tencent.tinker.loader.TinkerRuntimeException; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.regex.Pattern; + +/** + * Created by zhangshaowen on 16/8/9. + */ +public class ShareResPatchInfo { + public String arscBaseCrc = null; + + public String resArscMd5 = null; + public ArrayList addRes = new ArrayList<>(); + public ArrayList deleteRes = new ArrayList<>(); + public ArrayList modRes = new ArrayList<>(); + //use linkHashMap instead? + public ArrayList largeModRes = new ArrayList<>(); + public HashMap largeModMap = new HashMap<>(); + + public HashSet patterns = new HashSet<>(); + + public static void parseAllResPatchInfo(String meta, ShareResPatchInfo info) { + if (meta == null || meta.length() == 0) { + return; + } + String[] lines = meta.split("\n"); + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + if (line == null || line.length() <= 0) { + continue; + } + if (line.startsWith(ShareConstants.RES_TITLE)) { + final String[] kv = line.split(",", 3); + info.arscBaseCrc = kv[1]; + info.resArscMd5 = kv[2]; + } else if (line.startsWith(ShareConstants.RES_PATTERN_TITLE)) { + final String[] kv = line.split(":", 2); + int size = Integer.parseInt(kv[1]); + for (; size > 0; size--) { + info.patterns.add(convertToPatternString(lines[i + 1])); + i++; + } + } else if (line.startsWith(ShareConstants.RES_ADD_TITLE)) { + final String[] kv = line.split(":", 2); + int size = Integer.parseInt(kv[1]); + for (; size > 0; size--) { + info.addRes.add(lines[i + 1]); + i++; + } + } else if (line.startsWith(ShareConstants.RES_MOD_TITLE)) { + final String[] kv = line.split(":", 2); + int size = Integer.parseInt(kv[1]); + for (; size > 0; size--) { + info.modRes.add(lines[i + 1]); + i++; + } + } else if (line.startsWith(ShareConstants.RES_LARGE_MOD_TITLE)) { + final String[] kv = line.split(":", 2); + int size = Integer.parseInt(kv[1]); + for (; size > 0; size--) { + String nextLine = lines[i + 1]; + final String[] data = nextLine.split(",", 3); + String name = data[0]; + LargeModeInfo largeModeInfo = new LargeModeInfo(); + largeModeInfo.md5 = data[1]; + largeModeInfo.crc = Long.parseLong(data[2]); + info.largeModRes.add(name); + info.largeModMap.put(name, largeModeInfo); + i++; + } + } else if (line.startsWith(ShareConstants.RES_DEL_TITLE)) { + final String[] kv = line.split(":", 2); + int size = Integer.parseInt(kv[1]); + for (; size > 0; size--) { + info.deleteRes.add(lines[i + 1]); + i++; + } + } + } + + } + + public static boolean checkFileInPattern(HashSet patterns, String key) { + if (!patterns.isEmpty()) { + for (Iterator it = patterns.iterator(); it.hasNext();) { + Pattern p = it.next(); + if (p.matcher(key).matches()) { + return true; + } + } + } + return false; + } + + public static boolean checkResPatchInfo(ShareResPatchInfo info) { + if (info == null) { + return false; + } + String md5 = info.resArscMd5; + if (md5 == null || md5.length() != ShareConstants.MD5_LENGTH) { + return false; + } + return true; + } + + private static Pattern convertToPatternString(String input) { + //convert \\. + if (input.contains(".")) { + input = input.replaceAll("\\.", "\\\\."); + } + //convert ?to . + if (input.contains("?")) { + input = input.replaceAll("\\?", "\\."); + } + //convert * to.* + if (input.contains("*")) { + input = input.replace("*", ".*"); + } + Pattern pattern = Pattern.compile(input); + return pattern; + } + + public static void parseResPatchInfoFirstLine(String meta, ShareResPatchInfo info) { + if (meta == null || meta.length() == 0) { + return; + } + String[] lines = meta.split("\n"); + String firstLine = lines[0]; + if (firstLine == null || firstLine.length() <= 0) { + throw new TinkerRuntimeException("res meta Corrupted:" + meta); + } + final String[] kv = firstLine.split(",", 3); + info.arscBaseCrc = kv[1]; + info.resArscMd5 = kv[2]; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("resArscMd5:" + resArscMd5 + "\n"); + sb.append("arscBaseCrc:" + arscBaseCrc + "\n"); + + for (Pattern pattern : patterns) { + sb.append("pattern:" + pattern + "\n"); + } + for (String add : addRes) { + sb.append("addedSet:" + add + "\n"); + } + for (String mod : modRes) { + sb.append("modifiedSet:" + mod + "\n"); + } + for (String largeMod : largeModRes) { + sb.append("largeModifiedSet:" + largeMod + "\n"); + } + for (String del : deleteRes) { + sb.append("deletedSet:" + del + "\n"); + } + return sb.toString(); + } + + public static class LargeModeInfo { + public String md5 = null; + public long crc; + public File file = null; + } + +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java new file mode 100644 index 00000000..d62e4693 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareSecurityCheck.java @@ -0,0 +1,211 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.util.Log; + +import com.tencent.tinker.loader.TinkerRuntimeException; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.security.PublicKey; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +/** + * Created by zhangshaowen on 16/3/10. + */ +public class ShareSecurityCheck { + private static final String TAG = "ShareSecurityCheck"; + /** + * static to faster + * public key + */ + private static PublicKey mPublicKey = null; + + private final Context mContext; + private final HashMap metaContentMap; + private HashMap packageProperties; + + public ShareSecurityCheck(Context context) { + mContext = context; + metaContentMap = new HashMap<>(); + + if (mPublicKey == null) { + init(mContext); + } + } + + public HashMap getMetaContentMap() { + return metaContentMap; + } + + /** + * get the base tinkerId + * + * @return + */ + public String getTinkerID() { + if (packageProperties != null) { + String tinkerId = packageProperties.get(ShareConstants.TINKER_ID); + return tinkerId; + } + return null; + } + + /** + * get the new tinkerId + * + * @return + */ + public String getNewTinkerID() { + if (packageProperties != null) { + String tinkerId = packageProperties.get(ShareConstants.NEW_TINKER_ID); + + return tinkerId; + } + return null; + } + /** + * Nullable + * + * @return HashMap + */ + public HashMap getPackagePropertiesIfPresent() { + if (packageProperties != null) { + return packageProperties; + } + + String property = metaContentMap.get(ShareConstants.PACKAGE_META_FILE); + + if (property == null) { + return null; + } + + String[] lines = property.split("\n"); + for (final String line : lines) { + if (line == null || line.length() <= 0) { + continue; + } + //it is comment + if (line.startsWith("#")) { + continue; + } + final String[] kv = line.split("=", 2); + if (kv == null || kv.length < 2) { + continue; + } + if (packageProperties == null) { + packageProperties = new HashMap<>(); + } + packageProperties.put(kv[0].trim(), kv[1].trim()); + } + return packageProperties; + } + + public boolean verifyPatchMetaSignature(File path) { + if (path == null || !path.isFile() || !path.exists() || path.length() == 0) { + return false; + } + JarFile jarFile = null; + try { + jarFile = new JarFile(path); + final Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry jarEntry = entries.nextElement(); + // no code + if (jarEntry == null) { + continue; + } + + final String name = jarEntry.getName(); + if (name.startsWith("META-INF/")) { + continue; + } + //for faster, only check the meta.txt files + //we will check other files's mad5 written in meta files + if (!name.endsWith(ShareConstants.META_SUFFIX)) { + continue; + } + metaContentMap.put(name, SharePatchFileUtil.loadDigestes(jarFile, jarEntry)); + Certificate[] certs = jarEntry.getCertificates(); + if (certs == null) { + return false; + } + if (!check(path, certs)) { + return false; + } + } + } catch (Exception e) { + throw new TinkerRuntimeException( + String.format("ShareSecurityCheck file %s, size %d verifyPatchMetaSignature fail", path.getAbsolutePath(), path.length()), e); + } finally { + try { + if (jarFile != null) { + jarFile.close(); + } + } catch (IOException e) { + Log.e(TAG, path.getAbsolutePath(), e); + } + } + return true; + } + + + // verify the signature of the Apk + private boolean check(File path, Certificate[] certs) { + if (certs.length > 0) { + for (int i = certs.length - 1; i >= 0; i--) { + try { + certs[i].verify(mPublicKey); + return true; + } catch (Exception e) { + Log.e(TAG, path.getAbsolutePath(), e); + } + } + } + return false; + } + + @SuppressLint("PackageManagerGetSignatures") + private void init(Context context) { + ByteArrayInputStream stream = null; + try { + PackageManager pm = context.getPackageManager(); + String packageName = context.getPackageName(); + PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + stream = new ByteArrayInputStream(packageInfo.signatures[0].toByteArray()); + X509Certificate cert = (X509Certificate) certFactory.generateCertificate(stream); + mPublicKey = cert.getPublicKey(); + } catch (Exception e) { + throw new TinkerRuntimeException("ShareSecurityCheck init public key fail", e); + } finally { + SharePatchFileUtil.closeQuietly(stream); + } + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java new file mode 100644 index 00000000..404bbdcd --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java @@ -0,0 +1,328 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.shareutil; + +import android.app.ActivityManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * Created by zhangshaowen on 16/3/10. + */ +public class ShareTinkerInternals { + private static final String TAG = "Tinker.TinkerInternals"; + private static final boolean VM_IS_ART = isVmArt(System.getProperty("java.vm.version")); + /** + * or you may just hardcode them in your app + */ + private static String processName = null; + private static String tinkerID = null; + + public static boolean isVmArt() { + return VM_IS_ART; + } + + public static boolean isNullOrNil(final String object) { + if ((object == null) || (object.length() <= 0)) { + return true; + } + return false; + } + + /** + * check patch file signature and TINKER_ID + * + * @param context + * @param patchFile + * @param securityCheck + * @return + */ + public static int checkSignatureAndTinkerID(Context context, File patchFile, ShareSecurityCheck securityCheck) { + if (!securityCheck.verifyPatchMetaSignature(patchFile)) { + return ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL; + } + + String oldTinkerId = getManifestTinkerID(context); + if (oldTinkerId == null) { + return ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND; + } + + HashMap properties = securityCheck.getPackagePropertiesIfPresent(); + + if (properties == null) { + return ShareConstants.ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND; + } + + String patchTinkerId = properties.get(ShareConstants.TINKER_ID); + if (patchTinkerId == null) { + return ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND; + } + if (!oldTinkerId.equals(patchTinkerId)) { + return ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL; + } + return ShareConstants.ERROR_PACKAGE_CHECK_OK; + } + + /** + * not like {@cod ShareSecurityCheck.getPackagePropertiesIfPresent} + * we don't check Signatures or other files, we just get the package meta's properties directly + * @param patchFile + * @return + */ + public static Properties fastGetPatchPackageMeta(File patchFile) { + if (patchFile == null || !patchFile.isFile() || patchFile.length() == 0) { + Log.e(TAG, "patchFile is illegal"); + return null; + } + ZipFile zipFile = null; + try { + zipFile = new ZipFile(patchFile); + ZipEntry packageEntry = zipFile.getEntry(ShareConstants.PACKAGE_META_FILE); + if (packageEntry == null) { + Log.e(TAG, "patch meta entry not found"); + return null; + } + InputStream inputStream = null; + try { + inputStream = zipFile.getInputStream(packageEntry); + Properties properties = new Properties(); + properties.load(inputStream); + return properties; + } finally { + SharePatchFileUtil.closeQuietly(inputStream); + } + } catch (IOException e) { + Log.e(TAG, "fastGetPatchPackageMeta exception:" + e.getMessage()); + return null; + } finally { + SharePatchFileUtil.closeZip(zipFile); + } + } + public static String getManifestTinkerID(Context context) { + if (tinkerID != null) { + return tinkerID; + } + try { + ApplicationInfo appInfo = context.getPackageManager() + .getApplicationInfo(context.getPackageName(), + PackageManager.GET_META_DATA); + + Object object = appInfo.metaData.get(ShareConstants.TINKER_ID); + if (object != null) { + tinkerID = String.valueOf(object); + } else { + tinkerID = null; + } + } catch (Exception e) { + Log.e(TAG, "getManifestTinkerID exception:" + e.getMessage()); + return null; + } + return tinkerID; + } + + public static boolean isTinkerEnabledForDex(int flag) { + return (flag & ShareConstants.TINKER_DEX_MASK) != 0; + } + + public static boolean isTinkerEnabledForNativeLib(int flag) { + return (flag & ShareConstants.TINKER_NATIVE_LIBRARY_MASK) != 0; + } + + public static boolean isTinkerEnabledForResource(int flag) { + //FIXME:res flag depends dex flag + return (flag & ShareConstants.TINKER_RESOURCE_MASK) != 0; + } + + public static String getTypeString(int type) { + switch (type) { + case ShareConstants.TYPE_DEX: + return "dex"; + case ShareConstants.TYPE_DEX_FOR_ART: + return "dex_art"; + case ShareConstants.TYPE_DEX_OPT: + return "dex_opt"; + case ShareConstants.TYPE_LIBRARY: + return "lib"; + case ShareConstants.TYPE_PATCH_FILE: + return "patch_file"; + case ShareConstants.TYPE_PATCH_INFO: + return "patch_info"; + case ShareConstants.TYPE_RESOURCE: + return "resource"; + default: + return "unknown"; + } + } + + /** + * you can set Tinker disable in runtime at some times! + * @param context + */ + public static void setTinkerDisableWithSharedPreferences(Context context) { + SharedPreferences sp = context.getSharedPreferences(ShareConstants.TINKER_SHARE_PREFERENCE_CONFIG, Context.MODE_MULTI_PROCESS); + sp.edit().putBoolean(ShareConstants.TINKER_ENABLE_CONFIG, false).commit(); + } + + /** + * can't load or receive any patch! + * @param context + * @return + */ + public static boolean isTinkerEnableWithSharedPreferences(Context context) { + SharedPreferences sp = context.getSharedPreferences(ShareConstants.TINKER_SHARE_PREFERENCE_CONFIG, Context.MODE_MULTI_PROCESS); + return sp.getBoolean(ShareConstants.TINKER_ENABLE_CONFIG, true); + } + + public static boolean isTinkerEnabled(int flag) { + return (flag != ShareConstants.TINKER_DISABLE); + } + + public static boolean isTinkerEnabledAll(int flag) { + return (flag == ShareConstants.TINKER_ENABLE_ALL); + } + + public static boolean isInMainProcess(Context context) { + String pkgName = context.getPackageName(); + String processName = getProcessName(context); + if (processName == null || processName.length() == 0) { + processName = ""; + } + + return pkgName.equals(processName); + } + + public static void killAllOtherProcess(Context context) { + final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + // NOTE: getRunningAppProcess() ONLY GIVE YOU THE PROCESS OF YOUR OWN PACKAGE IN ANDROID M + // BUT THAT'S ENOUGH HERE + for (ActivityManager.RunningAppProcessInfo ai : am.getRunningAppProcesses()) { + // KILL OTHER PROCESS OF MINE + if (ai.uid == android.os.Process.myUid() && ai.pid != android.os.Process.myPid()) { + android.os.Process.killProcess(ai.pid); + } + } + + } + + /** + * add process name cache + * + * @param context + * @return + */ + public static String getProcessName(final Context context) { + if (processName != null) { + return processName; + } + //will not null + processName = getProcessNameInternal(context); + return processName; + } + + + private static String getProcessNameInternal(final Context context) { + int myPid = android.os.Process.myPid(); + + if (context == null || myPid <= 0) { + return ""; + } + + ActivityManager.RunningAppProcessInfo myProcess = null; + ActivityManager activityManager = + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + + try { + for (ActivityManager.RunningAppProcessInfo process : activityManager.getRunningAppProcesses()) { + if (process.pid == myPid) { + myProcess = process; + break; + } + } + } catch (Exception e) { + Log.e(TAG, "getProcessNameInternal exception:" + e.getMessage()); + } + + if (myProcess != null) { + return myProcess.processName; + } + + byte[] b = new byte[128]; + FileInputStream in = null; + try { + in = new FileInputStream("/proc/" + myPid + "/cmdline"); + int len = in.read(b); + if (len > 0) { + for (int i = 0; i < len; i++) { // lots of '0' in tail , remove them + if (b[i] > 128 || b[i] <= 0) { + len = i; + break; + } + } + return new String(b, 0, len); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception e) { + } + } + + return ""; + } + + /** + * vm whether it is art + * @return + */ + private static boolean isVmArt(String versionString) { + boolean isArt = false; + if (versionString != null) { + Matcher matcher = Pattern.compile("(\\d+)\\.(\\d+)(\\.\\d+)?").matcher(versionString); + if (matcher.matches()) { + try { + int major = Integer.parseInt(matcher.group(1)); + int minor = Integer.parseInt(matcher.group(2)); + isArt = (major > 2) + || ((major == 2) + && (minor >= 1)); + } catch (NumberFormatException e) { + // let isMultidexCapable be false + } + } + } + return isArt; + } +} diff --git a/tinker-android/tinker-android-loader/src/test/java/com/tencent/tinker/loader/ExampleUnitTest.java b/tinker-android/tinker-android-loader/src/test/java/com/tencent/tinker/loader/ExampleUnitTest.java new file mode 100644 index 00000000..8074a327 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/test/java/com/tencent/tinker/loader/ExampleUnitTest.java @@ -0,0 +1,31 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * To work on unit tests, switch the Test Artifact in the Build Variants view. + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/tinker-build/.gitignore b/tinker-build/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/tinker-build/tinker-patch-cli/.gitignore b/tinker-build/tinker-patch-cli/.gitignore new file mode 100644 index 00000000..5f1b6b07 --- /dev/null +++ b/tinker-build/tinker-patch-cli/.gitignore @@ -0,0 +1,3 @@ +/build +/tool_output/*.apk +/tool_output/TinkerPatch \ No newline at end of file diff --git a/tinker-build/tinker-patch-cli/build.gradle b/tinker-build/tinker-patch-cli/build.gradle new file mode 100644 index 00000000..9b48cc3a --- /dev/null +++ b/tinker-build/tinker-patch-cli/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'java' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile project(':tinker-build:tinker-patch-lib') +} + +jar { + manifest { + attributes 'Main-Class': 'com.tencent.tinker.patch.CliMain' + attributes 'Manifest-Version': version + } + from { + configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + } +} + +// copy the jar to work directory +task buildSdk(type: Copy, dependsOn: [build, jar]) { + from('build/libs') { + include '*.jar' + exclude '*-javadoc.jar' + exclude '*-sources.jar' + } + from('./tool_output') { + include '*.*' + } + into(rootProject.file("buildSdk/build")) +} + +defaultTasks 'buildSdk' diff --git a/tinker-build/tinker-patch-cli/src/main/java/com/tencent/tinker/patch/CliMain.java b/tinker-build/tinker-patch-cli/src/main/java/com/tencent/tinker/patch/CliMain.java new file mode 100644 index 00000000..37dbf0b1 --- /dev/null +++ b/tinker-build/tinker-patch-cli/src/main/java/com/tencent/tinker/patch/CliMain.java @@ -0,0 +1,215 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.patch; + + +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.patch.Runner; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; + +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import javax.xml.parsers.ParserConfigurationException; + +/** + * Created by zhangshaowen on 2/27/16. + * do not use Logger here + */ +public class CliMain extends Runner { + private static final String ARG_HELP = "--help"; + private static final String ARG_OUT = "-out"; + private static final String ARG_CONFIG = "-config"; + private static final String ARG_OLD = "-old"; + private static final String ARG_NEW = "-new"; + + + protected static String mRunningLocation; + + public static void main(String[] args) { + mBeginTime = System.currentTimeMillis(); + CliMain m = new CliMain(); + setRunningLocation(m); + m.run(args); + } + + private static void setRunningLocation(CliMain m) { + mRunningLocation = m.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); + try { + mRunningLocation = URLDecoder.decode(mRunningLocation, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + if (mRunningLocation.endsWith(".jar")) { + mRunningLocation = mRunningLocation.substring(0, mRunningLocation.lastIndexOf(File.separator) + 1); + } + File f = new File(mRunningLocation); + mRunningLocation = f.getAbsolutePath(); + } + + private static void printUsage(PrintStream out) { + // TODO: Look up launcher script name! + String command = "tinker.jar"; //$NON-NLS-1$ + out.println(); + out.println(); + out.println("Usage: java -jar " + command + " " + ARG_OLD + " old.apk " + ARG_NEW + " new.apk " + ARG_CONFIG + " tinker_config.xml " + ARG_OUT + " output_path"); + out.println("others please contact us"); + } + + private void run(String[] args) { + if (args.length < 1) { + goToError(); + } + try { + + ReadArgs readArgs = new ReadArgs(args).invoke(); + File configFile = readArgs.getConfigFile(); + File outputFile = readArgs.getOutputFile(); + File oldApkFile = readArgs.getOldApkFile(); + File newApkFile = readArgs.getNewApkFile(); + + if (oldApkFile == null || newApkFile == null) { + Logger.e("Missing old apk or new apk file argument"); + goToError(); + } + + if (outputFile == null) { + outputFile = new File(mRunningLocation, TypedValue.PATH_DEFAULT_OUTPUT); + } + + loadConfigFromXml(configFile, outputFile, oldApkFile, newApkFile); + Logger.initLogger(config); + tinkerPatch(); + } catch (IOException e) { + e.printStackTrace(); + goToError(); + } finally { + Logger.closeLogger(); + } + } + + private void loadConfigFromXml(File configFile, File outputFile, File oldApkFile, File newApkFile) { + if (configFile == null) { + configFile = new File(mRunningLocation + File.separator + TypedValue.FILE_CONFIG); + if (!configFile.exists()) { + System.err.printf("the config file %s does not exit\n", configFile.getAbsolutePath()); + printUsage(System.err); + System.exit(ERRNO_USAGE); + } + } + try { + config = new Configuration(configFile, outputFile, oldApkFile, newApkFile); + + } catch (IOException | ParserConfigurationException | SAXException e) { + e.printStackTrace(); + goToError(); + } catch (TinkerPatchException e) { + e.printStackTrace(); + goToError(); + } + } + + public void goToError() { + printUsage(System.err); + System.exit(ERRNO_USAGE); + } + + private class ReadArgs { + private String[] args; + private File configFile; + private File outputFile; + private File oldApkFile; + private File newApkFile; + + ReadArgs(String[] args) { + this.args = args; + } + + public File getConfigFile() { + return configFile; + } + + public File getOutputFile() { + return outputFile; + } + + public File getOldApkFile() { + return oldApkFile; + } + + public File getNewApkFile() { + return newApkFile; + } + + public ReadArgs invoke() { + for (int index = 0; index < args.length; index++) { + String arg = args[index]; + if (arg.equals(ARG_HELP) || arg.equals("-h")) { + goToError(); + } else if (arg.equals(ARG_CONFIG)) { + if (index == args.length - 1 || !args[index + 1].endsWith(TypedValue.FILE_XML)) { + System.err.println("Missing XML configuration file argument"); + goToError(); + } + configFile = new File(args[++index]); + if (!configFile.exists()) { + System.err.println(configFile.getAbsolutePath() + " does not exist"); + goToError(); + } + + System.out.println("special configFile file path:" + configFile.getAbsolutePath()); + + } else if (arg.equals(ARG_OUT)) { + if (index == args.length - 1) { + System.err.println("Missing output file argument"); + goToError(); + } + outputFile = new File(args[++index]); + File parent = outputFile.getParentFile(); + if (parent != null && (!parent.exists())) { + parent.mkdirs(); + } + System.out.printf("special output directory path: %s\n", outputFile.getAbsolutePath()); + + } else if (arg.equals(ARG_OLD)) { + if (index == args.length - 1) { + System.err.println("Missing old apk file argument"); + goToError(); + } + oldApkFile = new File(args[++index]); + } else if (arg.equals(ARG_NEW)) { + if (index == args.length - 1) { + System.err.println("Missing new apk file argument"); + goToError(); + } + newApkFile = new File(args[++index]); + } + } + return this; + } + } + + +} + diff --git a/tinker-build/tinker-patch-cli/tool_output/release.keystore b/tinker-build/tinker-patch-cli/tool_output/release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..c32e009e485f63cccf211ae19714682621986820 GIT binary patch literal 4095 zcmajgcQ71U)Bx~Z*6KYh5=5-J$|{Qxo#<^hM2}w95^d9?EYW)lA?ij6(FGes7etK~ zova>Gh+aP5oA<~2-n^Obk2`bkojLc;oO9;<&bQCE0RRBW-wOyJ_jmU5_jUFI0Dwq# zsaXsF0J?zVKqqiIFcl081ObIf7=b`C00;+K8*~25^=w_5&fS(S^-=W-+fe;9-JX@* zW`hLVhKW`k(@?3))nf9VuMA&~4f&4BC2@mR5XY1k_V1n+}E=T5CD=A?lK~EMg zZ5GaJ@1-tYn}c8gqY{i;ec~S%BDV&Fy`KMpX@kz%CgQNAuHFv10=PSFoZU z&8&3OQD~tv<@cZ^aQqfom)=D;cGv<=F{&*@1@zIeqTY%g4;Hj@1heE)QL{eIAutGS zyt;mx-YZypGTRu<_mVX}ESl8=X5*u&l9@8kO`pMQ{fg?Vy{hhNc_g)~fu7LIKd(2g zQhPbbVCIhMWS=8c_1b0XGlDCFu9ueUkTWAz7!tH4j@60jkloZuGim^^!E=pP#RY1} z4d!=ao=gt#EOMB|acs3-Wl6uiBfPH4+Kw)WK*pB%$lF5Rn@3{DRwpe6wzSsUr(>Bg z!6R+Ys%}S=yZ2SmrY-{_GTz#B$m5)GC%>Fu4H#V8c!0T`*4t`*6F?+1w=}b$6Ctm2 zt|PO>xkiAhG_@MWQriTIh)l*18f1}7e)C{m&5ORF7ua#phs2AZsya6YF7z5|0sJW2Wqy?IKc@!rafNafFM zZZB%uth3|!*jXl5xjr)5fW`({+3J2Z8Hhbk|oPO+<{H-wh z4PWbXItH7fEui*73B*Chq?5$bsh!mb41*T-B6Q2Ij($$+wy&##onn55v#rplEOJe$ z4f15#A^u1exQIIq9tt+0Zt6F16wRF)6pFSaX5yRmV{x$kY7@LdH=L|U=IuO99h$(@ z!j^QSwD0b3eY>(=kVwt$)Z%;oXJz;M0<__hvajzZj8<{@BJV zMQ!(42bwKX_tH?ILIUplLArG+xCKc}&z1srk4qOe0EAK~oa-~f&PJ>$a;@y*ku(s4 zGcl2wJGVX-^}8J{_#9K`U(3F!b3`hKWh?qVum77js4^N?Bb+QX#7zjP zgER^F9DJ!VQP88D-|OVPrfpVG$+0Q~j=UCBm06q+8Ft4eB?v@3BM)?3V^D=BD5=cc zvbF}Fp$_Rg>;QWtb6<^nu9n_E=2y7(K-K`k+fS9BWFa0kbv|+YZ~-LQlD?JnGd%GS zgXG$f8d=7~WF5sBx&Fzkc%aBiY9&3b9A0Yf@pk_AB)Pj(L3hht%3qJQQbI*%F7iAA z8)7Zb^7)}XAJ(Q^TzGW90dAMox<;~g0FDjYyKkUBOcnPz>8@g)@61|r!+y+6?JMlO zQt3<~@2C07i)=}j{sCbn4N6@m0ViwJsZ4+WZ8F8CsExvV)ALz)tjme6&`QX_ zCEzlWQt+En2uld9G+g3x|M&5~LU6zv|9tpz=#t`q^nlC1sYq}@AfToueUMDV8W;dr zpliT$JpaPWwYjuQHCH+w0S}-%m;T@Yt0OD(9Qw+xR8o#+ldhG1_vhR$d9e9TuX%L* z)}yoNT<2@AU-T#aVUmB+_#_iuiP>U7#UVUZ{pkIpf3Nv8$o^nMX_z0vcdTrz9p61Q zG3m%~NDL1BIKscVz4ZVg@CnMz>^tGQ(VsXu7_wRk9llN4wkRRHx=~94W;;|CF}ooWN(2UogZZf5GjhC1t%c}}8htNxk9%j#Sv5eUe10$SzgDSn|k!=rkRpHS}S zU_DgM5wJwDDNhEJh*=~041dCxt8(QmXhp5mtE+fmv9(;wT3Z(Kea;tHMuBh7X0VO` zft-=2J=UqoCDXe`JhYY~*Os$5j)QQ`qa*7(qY}x+%Oxz6fe@FrZOhvtV_F}>b`%4Y zf}>#UFT=(;#No%SrBCdR7H!y`JvFkDcB9XSXwy((4t=hHHWue)&@J0>IJt;DIjuzc z5W6w!reft_&#`#qrzH?rMjU7Vidj|!{I$8j(k6s3$W-m6c7zl-z?W7ekpx?jJra$9 zqT3BS3y{Itl=ATUZdVdWVs#F;Cy4$O^VYNTub!s1_j0-3lRqEAc!fXn{H zflmL!`}GTikq5735ZfT19)@_qI3dJ;u)UTiFoc*alxwT45Lv4Pv^Tp5u`&8Ys#5I# zNi87> zhQTNB)lSqTL!@*axTr%Pq6TF0Lu84=<7?!gjjKV?IvDYusS2N&6*i&f{9njLz~ zQT#4}77%f@YR#^uZ{e^#Qi;A>#D(n`d!u$M<3p7`LoB}U=L!GmmXqln)2A)!afbIk zUq2Jrs(cqVKAS{lY<-L$PWti`>x zovy@|3Fn^`h?m3jSf*GI(46K1+VXGPj>Hq(;a#^*d!DM$MI>dZ98DpWZ!E?K`6P}` zDc6TjPuGPRr!I2*h|6)J1rx5Qm9R8+K%?_kzwg;i8k;!ijPT9LvFwkP?eGbGBZtco z>4m^W8PiAxk8oz@*PpwNgkV?hb{X^H%A*!3wKvdlhrN1BTg&(1Ay&1IM5~o}C7$1~ z4;oV3w-nX4tPSx2io_Q(3hr%UZ6m%jORJ537=C{~`8>UKWk|N4h8}#YXULY2YliW8 zb76ZL>Hl)+x9E?I`G>C~wss;NW{h&{l#z0;GricEF3Jkx+t*^bTu#>=CWgneyV6ajg}_a)Qt?Pmp3Uq~}+K~XRh5*AmF|2r)WGZ+3sMzA;26&6~%{ zHMINXW8nCSzj#rN@B)Foc3>!>Gtip)&*3kND$mSnR-8u5A`O^}I$InnlqjYi;9;7t zL9~^g5LAk7h(l+JT$EpZ%eYiGam%9`rXRvycAa6)RJ@yuvtQB8BKw%hX3uU2?VI)8 zG>m>a8pGwsB{#m%m@eK!b|xYu-u=+yU21xGX$(;rk!f~mar5L)WZ>3|(&d3ikTX|d z)=58EBlLIMsh#B|jsEzVciQK>K>WO=@YZloUrZoMA_H|8Z^1l9FqQY{xUZ}^Xsx=q zElVRUiB0Q4n@4F)xk36N)>ZAL?1Rb>)27gv#)F*=)JRY=1bA!W`8niuisx3 z>K8>us485T+3<8*6!(*w>f_W<@yaetxM7h!^$V45KB#s+9eO;t&ZT)wpvTU-aVDl8 z?r!I$S%6em9kY<*&~=M^WYCUDMo{DE(}g*WL#&9S8ULEatM~XgtuUQ1-Mb$m40KC% zZ13b-)CAJvXzwYQ&!o1Fv_0ruVt-d<_v|HGuaJ;2^nvX_Z?@ug%dI%Z=)utxhxY+r zUP8D`1rYDE3(lON=<4$S3x3Zf_#Kz%mi`Ss$8BA^7P9Vp8Trh}J8nvat6>Bo)8U@!U`JZQ@;PcER0Z;fp3SwxbG;8J`-F zRSo4U?Q}wTGiaXz%NuIZf(b=RlsY-;7Lz2|(F7BtH?+Y0F-`9d>q=NkQ@N<);)kD1 zbi#j_=as2ivO4^gVen~qNYsDc6QKPDn{GSD)lsaNo=On=~q7Uvl6Bqod8 zBbVM~-fJg>`B{H59*bj9uGT)Rf zVKwIsZol|MS;!E-e9k8FtWN?~u-*Btt@O46-tyJSiexiIWi90tM`A#W>K-?E&`V~M zWo)g%vn}mV$W$_~5$@}8#D0MnvA8XHc(;fOHq0n^!e1KKk}*yJAPT=%6SjOF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tinker-build/tinker-patch-cli/tool_output/tinker_multidexkeep.pro b/tinker-build/tinker-patch-cli/tool_output/tinker_multidexkeep.pro new file mode 100644 index 00000000..af70fdb0 --- /dev/null +++ b/tinker-build/tinker-patch-cli/tool_output/tinker_multidexkeep.pro @@ -0,0 +1,21 @@ +-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle { + *; +} + +-keep public class * extends com.tencent.tinker.loader.TinkerLoader { + *; +} + +-keep public class * extends com.tencent.tinker.loader.app.TinkerApplication { + *; +} + +#your dex.loader pattern here +-keep class com.tencent.tinker.loader.** { + *; +} + +-keep class tinker.sample.android.app.SampleApplication { + *; +} + diff --git a/tinker-build/tinker-patch-cli/tool_output/tinker_proguard.pro b/tinker-build/tinker-patch-cli/tool_output/tinker_proguard.pro new file mode 100644 index 00000000..23c74455 --- /dev/null +++ b/tinker-build/tinker-patch-cli/tool_output/tinker_proguard.pro @@ -0,0 +1,31 @@ +#-applymapping "old apk mapping here" + +-keepattributes *Annotation* +-dontwarn com.tencent.tinker.anno.AnnotationProcessor +-keep @com.tencent.tinker.anno.DefaultLifeCycle public class * +-keep public class * extends android.app.Application { + *; +} + +-keep public class com.tencent.tinker.loader.app.ApplicationLifeCycle { + *; +} +-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle { + *; +} + +-keep public class com.tencent.tinker.loader.TinkerLoader { + *; +} +-keep public class * extends com.tencent.tinker.loader.TinkerLoader { + *; +} + +-keep public class com.tencent.tinker.loader.TinkerTestDexLoad { + *; +} + +#your dex.loader pattern here +-keep class com.tencent.tinker.loader.* +-keep class tinker.sample.android.app.SampleApplication + diff --git a/tinker-build/tinker-patch-gradle-plugin/.gitignore b/tinker-build/tinker-patch-gradle-plugin/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tinker-build/tinker-patch-gradle-plugin/build.gradle b/tinker-build/tinker-patch-gradle-plugin/build.gradle new file mode 100644 index 00000000..d07a0497 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'groovy' + + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +dependencies { + compile gradleApi() + compile localGroovy() +// compile fileTree(dir: 'libs', include: ['*.jar']) + compile project(':tinker-build:tinker-patch-lib') + compile 'com.google.gradle:osdetector-gradle-plugin:1.2.1' +} + +repositories { + mavenCentral() +} + +sourceSets { + main { + groovy { + srcDir 'src/main/groovy' + } + + resources { + srcDir 'src/main/resources' + } + } +} + +apply from: rootProject.file('gradle/java-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') + diff --git a/tinker-build/tinker-patch-gradle-plugin/gradle.properties b/tinker-build/tinker-patch-gradle-plugin/gradle.properties new file mode 100644 index 00000000..961b8b4f --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=tinker-patch-gradle-plugin +POM_NAME=Tinker Patch Gradle Plugin +POM_PACKAGING=jar \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy new file mode 100644 index 00000000..fe44cea2 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy @@ -0,0 +1,158 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle + +import com.tencent.tinker.build.gradle.extension.TinkerBuildConfigExtension +import com.tencent.tinker.build.gradle.extension.TinkerDexExtension +import com.tencent.tinker.build.gradle.extension.TinkerLibExtension +import com.tencent.tinker.build.gradle.extension.TinkerPackageConfigExtension +import com.tencent.tinker.build.gradle.extension.TinkerPatchExtension +import com.tencent.tinker.build.gradle.extension.TinkerResourceExtension +import com.tencent.tinker.build.gradle.extension.TinkerSevenZipExtension +import com.tencent.tinker.build.gradle.task.TinkerManifestTask +import com.tencent.tinker.build.gradle.task.TinkerMultidexConfigTask +import com.tencent.tinker.build.gradle.task.TinkerPatchSchemaTask +import com.tencent.tinker.build.gradle.task.TinkerProguardConfigTask +import com.tencent.tinker.build.gradle.task.TinkerResourceIdTask +import com.tencent.tinker.build.util.FileOperation +import com.tencent.tinker.build.util.TypedValue +import org.gradle.api.GradleException +import org.gradle.api.Plugin +import org.gradle.api.Project + +/** + * Registers the plugin's tasks. + * + * @author zhangshaowen + */ + +class TinkerPatchPlugin implements Plugin { + public static final String TINKER_INTERMEDIATES = "build/intermediates/tinker_intermediates/" + + @Override + public void apply(Project project) { + project.apply plugin: 'osdetector' + + project.extensions.create('tinkerPatch', TinkerPatchExtension) + + project.tinkerPatch.extensions.create('buildConfig', TinkerBuildConfigExtension, project) + + project.tinkerPatch.extensions.create('dex', TinkerDexExtension, project) + project.tinkerPatch.extensions.create('lib', TinkerLibExtension) + project.tinkerPatch.extensions.create('res', TinkerResourceExtension) + project.tinkerPatch.extensions.create('packageConfig', TinkerPackageConfigExtension, project) + project.tinkerPatch.extensions.create('sevenZip', TinkerSevenZipExtension, project) + + def configuration = project.tinkerPatch + + project.afterEvaluate { + if (!project.plugins.hasPlugin('com.android.application')) { + throw new GradleException('generateTinkerApk: Android Application plugin required') + } + + def android = project.extensions.android + //add the tinker anno resource to the package exclude option + android.packagingOptions.exclude("META-INF/services/javax.annotation.processing.Processor") + android.packagingOptions.exclude("TinkerAnnoApplication.tmpl") + //open jumboMode + android.dexOptions.jumboMode = true + + project.logger.error("----------------------tinker build warning ------------------------------------") + project.logger.error("tinker will change your build configs:") + project.logger.error("we will add TINDER_ID=${configuration.buildConfig.tinkerId} in your build output manifest file build/intermediates/manifests/full/*") + project.logger.error("") + project.logger.error("if minifyEnabled is true") + + String tempMappingPath = configuration.buildConfig.applyMapping + + if (FileOperation.isLegalFile(tempMappingPath)) { + project.logger.error("we will build ${project.getName()} apk with apply mapping file ${tempMappingPath}") + } + + project.logger.error("you will find the gen proguard rule file at ${TinkerProguardConfigTask.PROGUARD_CONFIG_PATH}") + project.logger.error("and we will help you to put it in the proguardFiles.") + project.logger.error("") + project.logger.error("if multiDexEnabled is true") + project.logger.error("you will find the gen multiDexKeepProguard file at ${TinkerMultidexConfigTask.MULTIDEX_CONFIG_PATH}") + project.logger.error("and you should copy it to your own multiDex keep proguard file yourself.") + project.logger.error("") + project.logger.error("if applyResourceMapping file is exist") + String tempResourceMappingPath = configuration.buildConfig.applyResourceMapping + if (FileOperation.isLegalFile(tempResourceMappingPath)) { + project.logger.error("we will build ${project.getName()} apk with resource R.txt ${tempResourceMappingPath} file") + } else { + project.logger.error("we will build ${project.getName()} apk with resource R.txt file") + } + project.logger.error("if resources.arsc has changed, you should use applyResource mode to build the new apk!") + project.logger.error("-----------------------------------------------------------------") + + android.applicationVariants.all { variant -> + + def variantOutput = variant.outputs.first() + def variantName = variant.name.capitalize() + + TinkerPatchSchemaTask tinkerPatchBuildTask = project.tasks.create("tinkerPatch${variantName}", TinkerPatchSchemaTask) + tinkerPatchBuildTask.dependsOn variant.assemble + + tinkerPatchBuildTask.signconfig = variant.apkVariantData.variantConfiguration.signingConfig + + variant.outputs.each { output -> + tinkerPatchBuildTask.buildApkPath = output.outputFile + File parentFile = output.outputFile + tinkerPatchBuildTask.outputFolder = "${parentFile.getParentFile().getParentFile().getAbsolutePath()}/" + TypedValue.PATH_DEFAULT_OUTPUT + "/" + variant.dirName + } + + // Create a task to add a build TINKER_ID to AndroidManifest.xml + // This task must be called after "process${variantName}Manifest", since it + // requires that an AndroidManifest.xml exists in `build/intermediates`. + TinkerManifestTask manifestTask = project.tasks.create("tinkerProcess${variantName}Manifest", TinkerManifestTask) + manifestTask.manifestPath = variantOutput.processManifest.manifestOutputFile + manifestTask.mustRunAfter variantOutput.processManifest + + variantOutput.processResources.dependsOn manifestTask + + // Add this proguard settings file to the list + boolean proguardEnable = variant.getBuildType().buildType.minifyEnabled + + if (proguardEnable) { + TinkerProguardConfigTask proguardConfigTask = project.tasks.create("tinkerProcess${variantName}Proguard", TinkerProguardConfigTask) + proguardConfigTask.applicationVariant = variant + variantOutput.packageApplication.dependsOn proguardConfigTask + } + + // Add this multidex proguard settings file to the list + boolean multiDexEnabled = variant.apkVariantData.variantConfiguration.isMultiDexEnabled() + + if (multiDexEnabled) { + TinkerMultidexConfigTask multidexConfigTask = project.tasks.create("tinkerProcess${variantName}MultidexKeep", TinkerMultidexConfigTask) + multidexConfigTask.applicationVariant = variant + variantOutput.packageApplication.dependsOn multidexConfigTask + } +// if (tempResourceFile != null && tempResourceFile.exists() && tempResourceFile.isFile()) { + TinkerResourceIdTask applyResourceTask = project.tasks.create("tinkerProcess${variantName}ResourceId", TinkerResourceIdTask) + applyResourceTask.resDir = variantOutput.processResources.resDir + variantOutput.processResources.dependsOn applyResourceTask +// } +// else { +// project.logger.error("apply resource mapping file ${resourceMappingFile} is not exist, just ignore") +// } + } + } + + } + +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerBuildConfigExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerBuildConfigExtension.groovy new file mode 100644 index 00000000..4ad1b62e --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerBuildConfigExtension.groovy @@ -0,0 +1,74 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension + +import org.gradle.api.GradleException +import org.gradle.api.Project + +/** + * The configuration properties. + * + * @author zhangshaowen + */ + +public class TinkerBuildConfigExtension { + + /** + * Specifies the old apk's mapping file for proguard to applymapping + */ + String applyMapping + + /** + * Specifies the old resource id mapping(R.txt) file to applyResourceMapping + */ + String applyResourceMapping + + /** + * because we don't want to check the base apk with md5 in the runtime(it is slow) + * tinkerId is use to identify the unique base apk when the patch is tried to apply. + * we can use git rev, svn rev or simply versionCode. + * we will gen the tinkerId in your manifest automatic + */ + String tinkerId + + private Project project + + boolean usingResourceMapping + + public TinkerBuildConfigExtension(Project project) { + this.project = project + applyMapping = "" + applyResourceMapping = "" + tinkerId = null + usingResourceMapping = false + } + + void checkParameter() { + if (tinkerId == null || tinkerId.isEmpty()) { + throw new GradleException("you must set your tinkerId to identify the base apk!") + } + } + + + @Override + public String toString() { + """| applyMapping = ${applyMapping} + | applyResourceMapping = ${applyResourceMapping} + | tinkerId = ${tinkerId} + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerDexExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerDexExtension.groovy new file mode 100644 index 00000000..2add6dc0 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerDexExtension.groovy @@ -0,0 +1,67 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension + +import org.gradle.api.GradleException +import org.gradle.api.Project + +/** + * The configuration properties. + * + * @author zhangshaowen + */ + +public class TinkerDexExtension { + /** + * raw or jar, if you want to support below 4.0, you should use jar + * default: raw, keep the orginal file type + */ + String dexMode; + /** + * the dex file patterns, which dex or jar files will be deal to gen patch + * such as [classes.dex, classes-*.dex, assets/multiDex/*.jar] + */ + Iterable pattern; + /** + * the loader files, they will be removed during gen patch main dex + * and they should be at the primary dex + * such as [com.tencent.tinker.loader.*, com.tinker.sample.MyApplication] + */ + Iterable loader; + private Project project; + + public TinkerDexExtension(Project project) { + dexMode = "jar" + pattern = [] + loader = [] + this.project = project + } + + void checkDexMode() { + if (!dexMode.equals("raw") && !dexMode.equals("jar")) { + throw new GradleException("dexMode can be only one of 'jar' or 'raw'!") + } + } + + @Override + public String toString() { + """| dexMode = ${dexMode} + | pattern = ${pattern} + | loader = ${loader} + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerLibExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerLibExtension.groovy new file mode 100644 index 00000000..eff1410f --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerLibExtension.groovy @@ -0,0 +1,41 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension +/** + * The configuration properties. + * + * @author zhangshaowen + */ + +public class TinkerLibExtension { + /** + * the library file patterns, which files will be deal to gen patch + * such as [lib/armeabi/*.so, assets/libs/*.so] + */ + Iterable pattern; + + + public TinkerLibExtension() { + pattern = [] + } + + @Override + public String toString() { + """| pattern = ${pattern} + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPackageConfigExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPackageConfigExtension.groovy new file mode 100644 index 00000000..fbf9221a --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPackageConfigExtension.groovy @@ -0,0 +1,93 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension + +import com.tencent.tinker.build.apkparser.AndroidManifest +import org.gradle.api.GradleException +import org.gradle.api.Project + +/** + * The configuration properties. + * + * @author zhangshaowen + */ + +public class TinkerPackageConfigExtension { + /** + * we can gen package config file while configField method + */ + private Map fields + private Project project; + private AndroidManifest androidManifest; + + + public TinkerPackageConfigExtension(project) { + fields = [:] + this.project = project + } + + void configField(String name, String value) { + fields.put(name, value) + } + + Map getFields() { + return fields + } + + private void createApkMetaFile() { + if (androidManifest == null) { + File oldPakFile = new File(project.tinkerPatch.oldApk) + + if (!oldPakFile.exists()) { + throw new GradleException( + String.format("old apk file %s is not exist, you can set the value directly!", oldPakFile) + ) + } + androidManifest = AndroidManifest.getAndroidManifest(oldPakFile); + } + } + + String getVersionCodeFromOldAPk() { + createApkMetaFile() + return androidManifest.apkMeta.versionCode; + } + + String getVersionNameFromOldAPk() { + createApkMetaFile() + return androidManifest.apkMeta.versionName; + } + + String getMinSdkVersionFromOldAPk() { + createApkMetaFile() + return androidManifest.apkMeta.minSdkVersion; + } + + String getMetaDataFromOldApk(String name) { + createApkMetaFile() + String value = androidManifest.metaDatas.get(name); + if (value == null) { + throw new GradleException("can't find meta data " + name + " from the old apk manifest file!") + } + return value + } + + @Override + public String toString() { + """| fields = ${fields} + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPatchExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPatchExtension.groovy new file mode 100644 index 00000000..81210332 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerPatchExtension.groovy @@ -0,0 +1,68 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension + +import org.gradle.api.GradleException; + +/** + * The configuration properties. + * + * @author zhangshaowen + */ + +public class TinkerPatchExtension { + /** + * Specifies the old apk path to diff with the new apk + */ + String oldApk + + /** + * if there is loader class changes, + * or Activity, Service, Receiver, Provider change, it will terminal + * if ignoreWarning is false + * default: false + */ + boolean ignoreWarning + + /** + * if sign the patch file with the android signConfig + * default: true + */ + boolean useSign + + public TinkerPatchExtension() { + oldApk = "" + ignoreWarning = false + useSign = true + } + + void checkParameter() { + if (oldApk == null) { + throw new GradleException("old apk is null, you must set the correct old apk value!") + } else if (!new File(oldApk).exists()) { + throw new GradleException("old apk ${oldApk} is not exist, you must set the correct old apk value!") + } + } + + @Override + public String toString() { + """| oldApk = ${oldApk} + | ignoreWarning = ${ignoreWarning} + | useSign = ${useSign} + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerResourceExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerResourceExtension.groovy new file mode 100644 index 00000000..bdff32c6 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerResourceExtension.groovy @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension + +import org.gradle.api.GradleException + +/** + * The configuration properties. + * + * @author liangwenxiang + */ + +public class TinkerResourceExtension { + /** + * the resource file patterns, which files will be deal to gen patch + * such as [res/*, assets/*, resources.arsc] + */ + Iterable pattern + /** + * the resource file ignoreChange patterns, ignore add, delete or modify resource change + * Warning, we can only use for files no relative with resources.arsc + */ + Iterable ignoreChange + + /** + * default 100kb + * for modify resource, if it is larger than 'largeModSize' + * we would like to use bsdiff algorithm to reduce patch file size + */ + int largeModSize + + public TinkerResourceExtension() { + pattern = [] + ignoreChange = [] + largeModSize = 100 + } + void checkParameter() { + if (largeModSize <= 0) { + throw new GradleException("largeModSize must be larger than 0") + } + } + + @Override + public String toString() { + """| pattern = ${pattern} + | exclude = ${ignoreChange} + | largeModSize = ${largeModSize}kb + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerSevenZipExtension.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerSevenZipExtension.groovy new file mode 100644 index 00000000..f297a363 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/extension/TinkerSevenZipExtension.groovy @@ -0,0 +1,90 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.extension + +import org.gradle.api.GradleException +import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.Dependency + +/** + * The configuration properties. + * you should only set one of them, if path is Specified, it will overwrite the artifact param + * @author zhangshaowen + */ +public class TinkerSevenZipExtension { + /** + * Specifies an artifact spec for downloading the executable from + * repositories. spec format: '::' + */ + String zipArtifact + /** + * Specifies a local path. + * if path is Specified, it will overwrite the artifact param + * such as/usr/local/bin/7za + * if you do not set the zipArtifact and path, We will try to use 7za directly + */ + String path + + private Project project; + + public TinkerSevenZipExtension(Project project) { + zipArtifact = null + path = null + this.project = project + } + + void resolveZipFinalPath() { + if (path != null) + return + + if (this.zipArtifact != null) { + def groupId, finalArtifact, version + Configuration config = project.configurations.create("sevenZipToolsLocator") { + visible = false + transitive = false + extendsFrom = [] + } + + (groupId, finalArtifact, version) = this.zipArtifact.split(":") + def notation = [group : groupId, + name : finalArtifact, + version : version, + classifier: project.osdetector.classifier, + ext : 'exe'] +// println "Resolving artifact: ${notation}" + Dependency dep = project.dependencies.add(config.name, notation) + File file = config.fileCollection(dep).singleFile + if (!file.canExecute() && !file.setExecutable(true)) { + throw new GradleException("Cannot set ${file} as executable") + } +// println "Resolved artifact: ${file}" + this.path = file.path + } + //use system 7za + if (this.path == null) { + this.path = "7za" + } + } + + @Override + public String toString() { + """| zipArtifact = ${zipArtifact} + | path = ${path} + """.stripMargin() + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerManifestTask.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerManifestTask.groovy new file mode 100644 index 00000000..0b60c831 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerManifestTask.groovy @@ -0,0 +1,79 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.task + +import com.tencent.tinker.build.gradle.TinkerPatchPlugin +import com.tencent.tinker.build.util.FileOperation +import groovy.xml.Namespace +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.tasks.TaskAction + +/** + * The configuration properties. + * + * @author zhangshaowen + */ +public class TinkerManifestTask extends DefaultTask { + static final String MANIFEST_XML = TinkerPatchPlugin.TINKER_INTERMEDIATES + "AndroidManifest.xml" + static final String TINKER_ID = "TINKER_ID" + String manifestPath + TinkerManifestTask() { + group = 'tinker' + } + + @TaskAction + def updateManifest() { + // Parse the AndroidManifest.xml + String tinkerValue = project.extensions.tinkerPatch.buildConfig.tinkerId + if (tinkerValue == null || tinkerValue.isEmpty()) { + throw new GradleException('tinkerId is not set!!!') + } + project.logger.error("tinker add ${tinkerValue} to your AndroidManifest.xml ${manifestPath}") + + def ns = new Namespace("http://schemas.android.com/apk/res/android", "android") + def xml = new XmlParser().parse(manifestPath) + + def application = xml.application[0] + if (application) { + def metaDataTags = application['meta-data'] + + // remove any old TINKER_ID elements + def tinkerId = metaDataTags.findAll { + it.attributes()[ns.name].equals(TINKER_ID) + }.each { + it.parent().remove(it) + } + + // Add the new TINKER_ID element + application.appendNode('meta-data', [(ns.name): TINKER_ID, (ns.value): tinkerValue]) + + // Write the manifest file + def writer = new FileWriter(manifestPath) + def printer = new XmlNodePrinter(new PrintWriter(writer)) + printer.preserveWhitespace = true + printer.print(xml) + } + File manifestFile = new File(manifestPath) + if (manifestFile.exists()) { + FileOperation.copyFileUsingStream(manifestFile, project.file(MANIFEST_XML)) + project.logger.error("tinker gen AndroidManifest.xml in ${MANIFEST_XML}") + } + + } +} + diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerMultidexConfigTask.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerMultidexConfigTask.groovy new file mode 100644 index 00000000..a7384fa7 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerMultidexConfigTask.groovy @@ -0,0 +1,82 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.task + +import com.tencent.tinker.build.gradle.TinkerPatchPlugin +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.TaskAction + + +/** + * The configuration properties. + * + * @author zhangshaowen + */ +public class TinkerMultidexConfigTask extends DefaultTask { + static final String MULTIDEX_CONFIG_PATH = TinkerPatchPlugin.TINKER_INTERMEDIATES + "tinker_multidexkeep.pro" + static final String MULTIDEX_CONFIG_SETTINGS = + "-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle {\n" + + " *;\n" + + "}\n" + + "\n" + + "-keep public class * extends com.tencent.tinker.loader.TinkerLoader {\n" + + " *;\n" + + "}\n" + + "\n" + + "-keep public class * extends com.tencent.tinker.loader.app.TinkerApplication {\n" + + " *;\n" + + "}" + + + def applicationVariant + + public TinkerMultidexConfigTask() { + group = 'tinker' + } + + @TaskAction + def updateTinkerProguardConfig() { + def file = project.file(MULTIDEX_CONFIG_PATH) + project.logger.error("try update tinker multidex keep proguard file with ${file}") + + // Create the directory if it doesn't exist already + file.getParentFile().mkdirs() + + // Write our recommended proguard settings to this file + FileWriter fr = new FileWriter(file.path) + + fr.write(MULTIDEX_CONFIG_SETTINGS) + fr.write("\n") + //unlike proguard, if loader endwith *, we must change to ** + fr.write("#your dex.loader patterns here\n") + Iterable loader = project.extensions.tinkerPatch.dex.loader + for (String pattern : loader) { + if (pattern.endsWith("*")) { + if (!pattern.endsWith("**")) { + pattern += "*" + } + } + fr.write("-keep class " + pattern + " {\n" + + " *;\n" + + "}\n") + fr.write("\n") + } + fr.close() + } + + +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerPatchSchemaTask.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerPatchSchemaTask.groovy new file mode 100644 index 00000000..4b7cc559 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerPatchSchemaTask.groovy @@ -0,0 +1,86 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.task +import com.tencent.tinker.build.patch.InputParam +import com.tencent.tinker.build.patch.Runner +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.tasks.TaskAction +/** + * The configuration properties. + * + * @author zhangshaowen + */ +public class TinkerPatchSchemaTask extends DefaultTask { + def configuration + def android + String buildApkPath + String outputFolder + def signconfig + + public TinkerPatchSchemaTask() { + description = 'Assemble Tinker Patch' + group = 'tinker' + outputs.upToDateWhen { false } + configuration = project.tinkerPatch + + android = project.extensions.android + } + + + @TaskAction + def tinkerPatch() { +// println configuration.toString() + + configuration.checkParameter() + configuration.buildConfig.checkParameter() + configuration.res.checkParameter() + configuration.dex.checkDexMode() + configuration.sevenZip.resolveZipFinalPath() + + InputParam.Builder builder = new InputParam.Builder() + if (configuration.useSign) { + if (signconfig == null) { + throw new GradleException("can't the get signconfig for ${taskName} build") + } + builder.setSignFile(signconfig.storeFile) + .setKeypass(signconfig.keyPassword) + .setStorealias(signconfig.keyAlias) + .setStorepass(signconfig.storePassword) + + } + + builder.setOldApk(configuration.oldApk) + .setNewApk(buildApkPath) + .setOutBuilder(outputFolder) + .setIgnoreWarning(configuration.ignoreWarning) + .setDexFilePattern(configuration.dex.pattern) + .setDexLoaderPattern(configuration.dex.loader) + .setDexMode(configuration.dex.dexMode) + .setSoFilePattern(configuration.lib.pattern) + .setResourceFilePattern(configuration.res.pattern) + .setResourceIgnoreChangePattern(configuration.res.ignoreChange) + .setResourceLargeModSize(configuration.res.largeModSize) + .setUseApplyResource(configuration.buildConfig.usingResourceMapping) + .setConfigFields(configuration.packageConfig.getFields()) + .setSevenZipPath(configuration.sevenZip.path) + .setUseSign(configuration.useSign) + + InputParam inputParam = builder.create() + Runner.gradleRun(inputParam); + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerProguardConfigTask.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerProguardConfigTask.groovy new file mode 100644 index 00000000..c0f9e0d0 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerProguardConfigTask.groovy @@ -0,0 +1,102 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.task + +import com.tencent.tinker.build.gradle.TinkerPatchPlugin +import com.tencent.tinker.build.util.FileOperation +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.TaskAction + +/** + * The configuration properties. + * + * @author zhangshaowen + */ +public class TinkerProguardConfigTask extends DefaultTask { + static final String PROGUARD_CONFIG_PATH = TinkerPatchPlugin.TINKER_INTERMEDIATES + "tinker_proguard.pro" + static final String PROGUARD_CONFIG_SETTINGS = + "-keepattributes *Annotation* \n" + + "-dontwarn com.tencent.tinker.anno.AnnotationProcessor \n" + + "-keep @com.tencent.tinker.anno.DefaultLifeCycle public class *\n" + + "-keep public class * extends android.app.Application {\n" + + " *;\n" + + "}\n" + + "\n" + + "-keep public class com.tencent.tinker.loader.app.ApplicationLifeCycle {\n" + + " *;\n" + + "}\n" + + "-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle {\n" + + " *;\n" + + "}\n" + + "\n" + + "-keep public class com.tencent.tinker.loader.TinkerLoader {\n" + + " *;\n" + + "}\n" + + "-keep public class * extends com.tencent.tinker.loader.TinkerLoader {\n" + + " *;\n" + + "}\n" + + "-keep public class com.tencent.tinker.loader.TinkerTestDexLoad {\n" + + " *;\n" + + "}\n" + + "\n" + + + def applicationVariant + boolean shouldApplyMapping = true; + + + public TinkerProguardConfigTask() { + group = 'tinker' + } + + @TaskAction + def updateTinkerProguardConfig() { + def file = project.file(PROGUARD_CONFIG_PATH) + project.logger.error("try update tinker proguard file with ${file}") + + // Create the directory if it doesnt exist already + file.getParentFile().mkdirs() + + // Write our recommended proguard settings to this file + FileWriter fr = new FileWriter(file.path) + + String applyMappingFile = project.extensions.tinkerPatch.buildConfig.applyMapping + + //write applymapping + if (shouldApplyMapping && FileOperation.isLegalFile(applyMappingFile)) { + project.logger.error("try add applymapping ${applyMappingFile} to build the package") + fr.write("-applymapping " + applyMappingFile) + fr.write("\n") + } else { + project.logger.error("applymapping file ${applyMappingFile} is illegal, just ignore") + } + + fr.write(PROGUARD_CONFIG_SETTINGS) + fr.write("#your dex.loader patterns here\n") + //they will removed when apply + Iterable loader = project.extensions.tinkerPatch.dex.loader + for (String pattern : loader) { + fr.write("-keep class " + pattern) + fr.write("\n") + } + fr.close() + // Add this proguard settings file to the list + applicationVariant.getBuildType().buildType.proguardFiles(file) + def files = applicationVariant.getBuildType().buildType.getProguardFiles() + project.logger.error("now proguard files is ${files}") + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerResourceIdTask.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerResourceIdTask.groovy new file mode 100644 index 00000000..4e51c6a0 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/task/TinkerResourceIdTask.groovy @@ -0,0 +1,78 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.gradle.task + +import com.tencent.tinker.build.aapt.AaptResourceCollector +import com.tencent.tinker.build.aapt.AaptUtil +import com.tencent.tinker.build.aapt.PatchUtil +import com.tencent.tinker.build.aapt.RDotTxtEntry +import com.tencent.tinker.build.gradle.TinkerPatchPlugin +import com.tencent.tinker.build.util.FileOperation +import org.gradle.api.DefaultTask +import org.gradle.api.Project +import org.gradle.api.tasks.TaskAction + +/** + * The configuration properties. + * + * @author zhangshaowen + */ +public class TinkerResourceIdTask extends DefaultTask { + static final String RESOURCE_PUBLIC_XML = TinkerPatchPlugin.TINKER_INTERMEDIATES + "public.xml" + static final String RESOURCE_IDX_XML = TinkerPatchPlugin.TINKER_INTERMEDIATES + "idx.xml" + + String resDir + + TinkerResourceIdTask() { + group = 'tinker' + } + + @TaskAction + def applyResourceId() { + // Parse the public.xml and ids.xml + String idsXml = resDir + "/values/ids.xml"; + String publicXml = resDir + "/values/public.xml"; + FileOperation.deleteFile(idsXml); + FileOperation.deleteFile(publicXml); + List resourceDirectoryList = new ArrayList() + resourceDirectoryList.add(resDir) + Map> rTypeResourceMap = null + + String resourceMappingFile = project.extensions.tinkerPatch.buildConfig.applyResourceMapping + + if (FileOperation.isLegalFile(resourceMappingFile)) { + project.logger.error("we build ${project.getName()} apk with apply resource mapping file ${resourceMappingFile}") + project.extensions.tinkerPatch.buildConfig.usingResourceMapping = true + rTypeResourceMap = PatchUtil.readRTxt(resourceMappingFile); + } else { + project.logger.error("apply resource mapping file ${resourceMappingFile} is illegal, just ignore") + } + AaptResourceCollector aaptResourceCollector = AaptUtil.collectResource(resourceDirectoryList, rTypeResourceMap) + PatchUtil.generatePublicResourceXml(aaptResourceCollector, idsXml, publicXml) + File publicFile = new File(publicXml) + if (publicFile.exists()) { + FileOperation.copyFileUsingStream(publicFile, project.file(RESOURCE_PUBLIC_XML)) + project.logger.error("tinker gen resource public.xml in ${RESOURCE_PUBLIC_XML}") + } + File idxFile = new File(idsXml) + if (idxFile.exists()) { + FileOperation.copyFileUsingStream(idxFile, project.file(RESOURCE_IDX_XML)) + project.logger.error("tinker gen resource idx.xml in ${RESOURCE_IDX_XML}") + } + } +} + diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/resources/META-INF/gradle-plugins/com.tencent.tinker.patch.properties b/tinker-build/tinker-patch-gradle-plugin/src/main/resources/META-INF/gradle-plugins/com.tencent.tinker.patch.properties new file mode 100644 index 00000000..2e40e3b5 --- /dev/null +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/resources/META-INF/gradle-plugins/com.tencent.tinker.patch.properties @@ -0,0 +1 @@ +implementation-class=com.tencent.tinker.build.gradle.TinkerPatchPlugin \ No newline at end of file diff --git a/tinker-build/tinker-patch-lib/.gitignore b/tinker-build/tinker-patch-lib/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/tinker-build/tinker-patch-lib/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tinker-build/tinker-patch-lib/build.gradle b/tinker-build/tinker-patch-lib/build.gradle new file mode 100644 index 00000000..f0443dce --- /dev/null +++ b/tinker-build/tinker-patch-lib/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'java' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile project(':tinker-commons') + compile group: 'net.dongliu', name: 'apk-parser', version: '2.1.2' + compile group: 'com.google.guava', name: 'guava', version: '11.0.2' +} + +sourceSets { + main { + java { + srcDir 'src/main/java' + } + + resources { + srcDir 'src/main/resources' + } + } +} + +apply from: rootProject.file('gradle/java-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') diff --git a/tinker-build/tinker-patch-lib/gradle.properties b/tinker-build/tinker-patch-lib/gradle.properties new file mode 100644 index 00000000..0e35ccb4 --- /dev/null +++ b/tinker-build/tinker-patch-lib/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=tinker-patch-lib +POM_NAME=Tinker Patch Lib +POM_PACKAGING=jar \ No newline at end of file diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptResourceCollector.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptResourceCollector.java new file mode 100644 index 00000000..97bc68c4 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptResourceCollector.java @@ -0,0 +1,346 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import com.google.common.base.Joiner; +import com.tencent.tinker.build.aapt.RDotTxtEntry.IdType; +import com.tencent.tinker.build.aapt.RDotTxtEntry.RType; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +public class AaptResourceCollector { + + private final Map>> rTypeResourceDirectoryMap; + //private final Map> rTypeIncreaseResourceDirectoryListMap; +// private final Map> rTypeIncreaseResourceDirectoryMap; + private final Map rTypeEnumeratorMap; + private final Map originalResourceMap; + private final Map> rTypeResourceMap; + private final Map> rTypeIncreaseResourceMap; + private final Map> duplicateResourceMap; + private final Map sanitizeNameMap; + private final Set ignoreIdSet; + private int currentTypeId; + + public AaptResourceCollector() { + this.rTypeResourceDirectoryMap = new HashMap>>(); +// this.rTypeIncreaseResourceDirectoryListMap = new HashMap>(); +// this.rTypeIncreaseResourceDirectoryMap = new HashMap>(); + this.rTypeEnumeratorMap = new HashMap(); + this.rTypeResourceMap = new HashMap>(); + this.rTypeIncreaseResourceMap = new HashMap>(); + this.duplicateResourceMap = new HashMap>(); + this.sanitizeNameMap = new HashMap(); + this.originalResourceMap = new HashMap(); + this.ignoreIdSet = new HashSet(); + //attr type must 1 + this.currentTypeId = 2; + } + + public AaptResourceCollector(Map> rTypeResourceMap) { + this(); + if (rTypeResourceMap != null) { + Iterator>> iterator = rTypeResourceMap.entrySet().iterator(); + while (iterator.hasNext()) { + Entry> entry = iterator.next(); + RType rType = entry.getKey(); + Set set = entry.getValue(); +// this.rTypeResourceMap.put(rType, new HashSet(set)); + for (RDotTxtEntry rDotTxtEntry : set) { + originalResourceMap.put(rDotTxtEntry, rDotTxtEntry); + ResourceIdEnumerator resourceIdEnumerator = null; + if (!rDotTxtEntry.idType.equals(IdType.INT_ARRAY)) { + int resourceId = Integer.decode(rDotTxtEntry.idValue).intValue(); + int typeId = ((resourceId & 0x00FF0000) / 0x00010000); + if (typeId >= currentTypeId) { + currentTypeId = typeId + 1; + } + if (this.rTypeEnumeratorMap.containsKey(rType)) { + resourceIdEnumerator = this.rTypeEnumeratorMap.get(rType); + if (resourceIdEnumerator.currentId < resourceId) { + resourceIdEnumerator.currentId = resourceId; + } + } else { + resourceIdEnumerator = new ResourceIdEnumerator(); + resourceIdEnumerator.currentId = resourceId; + this.rTypeEnumeratorMap.put(rType, resourceIdEnumerator); + } + } + } + } + } + } + + public void addIntResourceIfNotPresent(RType rType, String name) { //, ResourceDirectory resourceDirectory) { + if (!rTypeEnumeratorMap.containsKey(rType)) { + if (rType.equals(RType.ATTR)) { + rTypeEnumeratorMap.put(rType, new ResourceIdEnumerator(1)); + } else { + rTypeEnumeratorMap.put(rType, new ResourceIdEnumerator(currentTypeId++)); + } + } + + RDotTxtEntry entry = new FakeRDotTxtEntry(IdType.INT, rType, name); + Set resourceSet = null; + if (this.rTypeResourceMap.containsKey(rType)) { + resourceSet = this.rTypeResourceMap.get(rType); + } else { + resourceSet = new HashSet(); + this.rTypeResourceMap.put(rType, resourceSet); + } + if (!resourceSet.contains(entry)) { + String idValue = String.format("0x%08x", rTypeEnumeratorMap.get(rType).next()); + addResource(rType, IdType.INT, name, idValue); //, resourceDirectory); + } + } + + public void addIntArrayResourceIfNotPresent(RType rType, String name, int numValues) { + // Robolectric expects the array to be populated with the right number + // of values, irrespective + // of what the values are. + String idValue = String.format("{ %s }", Joiner.on(",").join(Collections.nCopies(numValues, "0x7f000000"))); + addResource(rType, IdType.INT_ARRAY, name, idValue); + } + + /** + * add resource + * + * @param rType + * @param idType + * @param name + * @param idValue + */ + public void addResource(RType rType, IdType idType, String name, String idValue) { + Set resourceSet = null; + if (this.rTypeResourceMap.containsKey(rType)) { + resourceSet = this.rTypeResourceMap.get(rType); + } else { + resourceSet = new HashSet(); + this.rTypeResourceMap.put(rType, resourceSet); + } + RDotTxtEntry rDotTxtEntry = new RDotTxtEntry(idType, rType, name, idValue); + boolean increaseResource = false; + if (!resourceSet.contains(rDotTxtEntry)) { + if (this.originalResourceMap.containsKey(rDotTxtEntry)) { + this.rTypeEnumeratorMap.get(rType).previous(); + rDotTxtEntry = this.originalResourceMap.get(rDotTxtEntry); + } else { + increaseResource = true; + } + resourceSet.add(rDotTxtEntry); + } + Set increaseResourceSet = null; + //new r dot txt entry + if (this.rTypeIncreaseResourceMap.containsKey(rType)) { + increaseResourceSet = this.rTypeIncreaseResourceMap.get(rType); + } else { + increaseResourceSet = new HashSet(); + this.rTypeIncreaseResourceMap.put(rType, increaseResourceSet); + } + if (increaseResource) { + increaseResourceSet.add(rDotTxtEntry); +//addResourceDirectory(rType, name, resourceDirectory); + } + } + +//private void addResourceDirectory(RType rType,String name, ResourceDirectory resourceDirectory){ +//if(resourceDirectory!=null){ +//Map resourceDirectoryMap=null; +//List resourceDirectoryList=null; +//if(this.rTypeIncreaseResourceDirectoryMap.containsKey(rType)){ +//resourceDirectoryMap=this.rTypeIncreaseResourceDirectoryMap.get(rType); +//resourceDirectoryList=this.rTypeIncreaseResourceDirectoryListMap.get(rType); +//}else{ +//resourceDirectoryMap=new HashMap(); +//this.rTypeIncreaseResourceDirectoryMap.put(rType, resourceDirectoryMap); +//resourceDirectoryList=new ArrayList(); +//this.rTypeIncreaseResourceDirectoryListMap.put(rType, resourceDirectoryList); +//} +//ResourceDirectory existResourceDirectory=null; +//if(resourceDirectoryMap.containsKey(resourceDirectory)){ +//existResourceDirectory=resourceDirectoryMap.get(resourceDirectory); +//}else{ +//existResourceDirectory=resourceDirectory; +//resourceDirectoryMap.put(resourceDirectory, resourceDirectory); +//resourceDirectoryList.add(existResourceDirectory); +//} +//existResourceDirectory.resourceEntrySet.add(new ResourceEntry(name,null)); +//} +//} + + /** + * is contain resource + * + * @param rType + * @param idType + * @param name + * @return boolean + */ + public boolean isContainResource(RType rType, IdType idType, String name) { + boolean result = false; + if (this.rTypeResourceMap.containsKey(rType)) { + Set resourceSet = this.rTypeResourceMap.get(rType); + if (resourceSet.contains(new RDotTxtEntry(idType, rType, name, "0x7f000000"))) { + result = true; + } + } + return result; + } + + /** + * add r type resource name + * + * @param rType + * @param resourceName + * @param resourceDirectory + */ + void addRTypeResourceName(RType rType, String resourceName, String resourceValue, ResourceDirectory resourceDirectory) { + Map> directoryResourceDirectoryMap = null; + if (this.rTypeResourceDirectoryMap.containsKey(rType)) { + directoryResourceDirectoryMap = this.rTypeResourceDirectoryMap.get(rType); + } else { + directoryResourceDirectoryMap = new HashMap>(); + this.rTypeResourceDirectoryMap.put(rType, directoryResourceDirectoryMap); + } + Set resourceDirectorySet = null; + if (directoryResourceDirectoryMap.containsKey(resourceDirectory.directoryName)) { + resourceDirectorySet = directoryResourceDirectoryMap.get(resourceDirectory.directoryName); + } else { + resourceDirectorySet = new HashSet(); + directoryResourceDirectoryMap.put(resourceDirectory.directoryName, resourceDirectorySet); + } + boolean find = false; + ResourceDirectory newResourceDirectory = new ResourceDirectory(resourceDirectory.directoryName, resourceDirectory.resourceFullFilename); + if (!resourceDirectorySet.contains(newResourceDirectory)) { + resourceDirectorySet.add(newResourceDirectory); + } + for (ResourceDirectory oldResourceDirectory : resourceDirectorySet) { + if (oldResourceDirectory.resourceEntrySet.contains(new ResourceEntry(resourceName, resourceValue))) { + find = true; + String resourceKey = rType + "/" + resourceDirectory.directoryName + "/" + resourceName; + Set fullFilenameSet = null; + if (!this.duplicateResourceMap.containsKey(resourceKey)) { + fullFilenameSet = new HashSet(); + fullFilenameSet.add(oldResourceDirectory.resourceFullFilename); + this.duplicateResourceMap.put(resourceKey, fullFilenameSet); + } else { + fullFilenameSet = this.duplicateResourceMap.get(resourceKey); + } + fullFilenameSet.add(resourceDirectory.resourceFullFilename); + } + } + if (!find) { + for (ResourceDirectory oldResourceDirectory : resourceDirectorySet) { + if (oldResourceDirectory.equals(newResourceDirectory)) { + if (!oldResourceDirectory.resourceEntrySet.contains(new ResourceEntry(resourceName, resourceValue))) { + oldResourceDirectory.resourceEntrySet.add(new ResourceEntry(resourceName, resourceValue)); + } + } + } + } + } + + void putSanitizeName(String sanitizeName, String rawName) { + if (!this.sanitizeNameMap.containsKey(sanitizeName)) { + this.sanitizeNameMap.put(sanitizeName, rawName); + } + } + + /** + * get raw name + * + * @param sanitizeName + * @return String + */ + public String getRawName(String sanitizeName) { + return this.sanitizeNameMap.get(sanitizeName); + } + + /** + * get r type resource map + * + * @return Map> + */ + public Map> getRTypeResourceMap() { + return this.rTypeResourceMap; + } + + /** + * @return the duplicateResourceMap + */ + public Map> getDuplicateResourceMap() { + return duplicateResourceMap; + } + + /** + * @return the rTypeIncreaseResourceMap + */ + public Map> getRTypeIncreaseResourceMap() { + return rTypeIncreaseResourceMap; + } + + /** + * @return the rTypeResourceDirectoryMap + */ + public Map>> getRTypeResourceDirectoryMap() { + return rTypeResourceDirectoryMap; + } + +///** +// * @return the rTypeIncreaseResourceDirectoryListMap +// */ +//public Map> getRTypeIncreaseResourceDirectoryListMap() { +//return rTypeIncreaseResourceDirectoryListMap; +//} + + void addIgnoreId(String name) { + ignoreIdSet.add(name); + } + + /** + * @return the ignoreIdSet + */ + public Set getIgnoreIdSet() { + return ignoreIdSet; + } + + private static class ResourceIdEnumerator { + + private int currentId = 0; + + ResourceIdEnumerator() { + } + + ResourceIdEnumerator(int typeId) { + this.currentId = 0x7f000000 + 0x10000 * typeId + -1; + } + + int previous() { + return --currentId; + } + + int next() { + return ++currentId; + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptUtil.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptUtil.java new file mode 100644 index 00000000..e7172f4f --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/AaptUtil.java @@ -0,0 +1,489 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import com.tencent.tinker.build.aapt.RDotTxtEntry.IdType; +import com.tencent.tinker.build.aapt.RDotTxtEntry.RType; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +public final class AaptUtil { + + private static final String ID_DEFINITION_PREFIX = "@+id/"; + private static final String ITEM_TAG = "item"; + + private static final XPathExpression ANDROID_ID_USAGE = createExpression("//@*[starts-with(., '@') and " + "not(starts-with(., '@+')) and " + "not(starts-with(., '@android:')) and " + "not(starts-with(., '@null'))]"); + + private static final XPathExpression ANDROID_ID_DEFINITION = createExpression("//@*[starts-with(., '@+') and " + "not(starts-with(., '@+android:id'))]"); + + private static final Map RESOURCE_TYPES = getResourceTypes(); + private static final List IGNORED_TAGS = Arrays.asList("eat-comment", "skip"); + + private static XPathExpression createExpression(String expressionStr) { + try { + return XPathFactory.newInstance().newXPath().compile(expressionStr); + } catch (XPathExpressionException e) { + throw new AaptUtilException(e); + } + } + + private static Map getResourceTypes() { + Map types = new HashMap(); + for (RType rType : RType.values()) { + types.put(rType.toString(), rType); + } + types.put("string-array", RType.ARRAY); + types.put("integer-array", RType.ARRAY); + types.put("declare-styleable", RType.STYLEABLE); + return types; + } + + public static AaptResourceCollector collectResource(List resourceDirectoryList) { + return collectResource(resourceDirectoryList, null); + } + + public static AaptResourceCollector collectResource(List resourceDirectoryList, Map> rTypeResourceMap) { + AaptResourceCollector resourceCollector = new AaptResourceCollector(rTypeResourceMap); + List references = new ArrayList(); + for (String resourceDirectory : resourceDirectoryList) { + try { + collectResources(resourceDirectory, resourceCollector); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + for (String resourceDirectory : resourceDirectoryList) { + try { + processXmlFilesForIds(resourceDirectory, references, resourceCollector); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return resourceCollector; + } + + public static void processXmlFilesForIds(String resourceDirectory, List references, AaptResourceCollector resourceCollector) throws Exception { + List xmlFullFilenameList = FileUtil.findMatchFile(resourceDirectory, Constant.Symbol.DOT + Constant.File.XML); + if (xmlFullFilenameList != null) { + for (String xmlFullFilename : xmlFullFilenameList) { + File xmlFile = new File(xmlFullFilename); + String parentFullFilename = xmlFile.getParent(); + File parentFile = new File(parentFullFilename); + if (isAValuesDirectory(parentFile.getName())) { + // Ignore files under values* directories. + continue; + } + processXmlFile(xmlFullFilename, references, resourceCollector); + } + } + } + + private static void collectResources(String resourceDirectory, AaptResourceCollector resourceCollector) throws Exception { + File resourceDirectoryFile = new File(resourceDirectory); + File[] fileArray = resourceDirectoryFile.listFiles(); + if (fileArray != null) { + for (File file : fileArray) { + if (file.isDirectory()) { + String directoryName = file.getName(); + if (directoryName.startsWith("values")) { + if (!isAValuesDirectory(directoryName)) { + throw new AaptUtilException("'" + directoryName + "' is not a valid values directory."); + } + processValues(file.getAbsolutePath(), resourceCollector); + } else { + processFileNamesInDirectory(file.getAbsolutePath(), resourceCollector); + } + } + } + } + } + + /** + * is a value directory + * + * @param directoryName + * @return boolean + */ + public static boolean isAValuesDirectory(String directoryName) { + if (directoryName == null) { + throw new NullPointerException("directoryName can not be null"); + } + return directoryName.equals("values") || directoryName.startsWith("values-"); + } + + public static void processFileNamesInDirectory(String resourceDirectory, AaptResourceCollector resourceCollector) throws IOException { + File resourceDirectoryFile = new File(resourceDirectory); + String directoryName = resourceDirectoryFile.getName(); + int dashIndex = directoryName.indexOf('-'); + if (dashIndex != -1) { + directoryName = directoryName.substring(0, dashIndex); + } + + if (!RESOURCE_TYPES.containsKey(directoryName)) { + throw new AaptUtilException(resourceDirectoryFile.getAbsolutePath() + " is not a valid resource sub-directory."); + } + File[] fileArray = resourceDirectoryFile.listFiles(); + if (fileArray != null) { + for (File file : fileArray) { + if (file.isHidden()) { + continue; + } + String filename = file.getName(); + int dotIndex = filename.indexOf('.'); + String resourceName = dotIndex != -1 ? filename.substring(0, dotIndex) : filename; + + RType rType = RESOURCE_TYPES.get(directoryName); + resourceCollector.addIntResourceIfNotPresent(rType, resourceName); + com.tencent.tinker.build.aapt.ResourceDirectory resourceDirectoryBean = new com.tencent.tinker.build.aapt.ResourceDirectory(file.getParentFile().getName(), file.getAbsolutePath()); + resourceCollector.addRTypeResourceName(rType, resourceName, null, resourceDirectoryBean); + } + } + } + + public static void processValues(String resourceDirectory, AaptResourceCollector resourceCollector) throws Exception { + File resourceDirectoryFile = new File(resourceDirectory); + File[] fileArray = resourceDirectoryFile.listFiles(); + if (fileArray != null) { + for (File file : fileArray) { + if (file.isHidden()) { + continue; + } + if (!file.isFile()) { + // warning + continue; + } + processValuesFile(file.getAbsolutePath(), resourceCollector); + } + } + } + + public static void processValuesFile(String valuesFullFilename, AaptResourceCollector resourceCollector) throws Exception { + Document document = JavaXmlUtil.parse(valuesFullFilename); + String directoryName = new File(valuesFullFilename).getParentFile().getName(); + Element root = document.getDocumentElement(); + + for (Node node = root.getFirstChild(); node != null; node = node.getNextSibling()) { + if (node.getNodeType() != Node.ELEMENT_NODE) { + continue; + } + + String resourceType = node.getNodeName(); + if (resourceType.equals(ITEM_TAG)) { + resourceType = node.getAttributes().getNamedItem("type").getNodeValue(); + if (resourceType.equals("id")) { + resourceCollector.addIgnoreId(node.getAttributes().getNamedItem("name").getNodeValue()); + } + } + + if (IGNORED_TAGS.contains(resourceType)) { + continue; + } + + if (!RESOURCE_TYPES.containsKey(resourceType)) { + throw new AaptUtilException("Invalid resource type '<" + resourceType + ">' in '" + valuesFullFilename + "'."); + } + + RType rType = RESOURCE_TYPES.get(resourceType); + String resourceValue = null; + switch (rType) { + case STRING: + case COLOR: + case DIMEN: + case DRAWABLE: + case BOOL: + resourceValue = node.getTextContent().trim(); + break; + case ARRAY://has sub item + case PLURALS://has sub item + case STYLE://has sub item + case STYLEABLE://has sub item + resourceValue = subNodeToString(node); + break; + case FRACTION://no sub item + resourceValue = nodeToString(node, true); + break; + case ATTR://no sub item + resourceValue = nodeToString(node, true); + break; + } + try { + addToResourceCollector(resourceCollector, new com.tencent.tinker.build.aapt.ResourceDirectory(directoryName, valuesFullFilename), node, rType, resourceValue); + } catch (Exception e) { + throw new AaptUtilException(e.getMessage() + ",Process file error:" + valuesFullFilename, e); + } + } + } + + public static void processXmlFile(String xmlFullFilename, List references, AaptResourceCollector resourceCollector) throws IOException, XPathExpressionException { + Document document = JavaXmlUtil.parse(xmlFullFilename); + NodeList nodesWithIds = (NodeList) ANDROID_ID_DEFINITION.evaluate(document, XPathConstants.NODESET); + for (int i = 0; i < nodesWithIds.getLength(); i++) { + String resourceName = nodesWithIds.item(i).getNodeValue(); + if (!resourceName.startsWith(ID_DEFINITION_PREFIX)) { + throw new AaptUtilException("Invalid definition of a resource: '" + resourceName + "'"); + } + + resourceCollector.addIntResourceIfNotPresent(RType.ID, resourceName.substring(ID_DEFINITION_PREFIX.length())); + } + + NodeList nodesUsingIds = (NodeList) ANDROID_ID_USAGE.evaluate(document, XPathConstants.NODESET); + for (int i = 0; i < nodesUsingIds.getLength(); i++) { + String resourceName = nodesUsingIds.item(i).getNodeValue(); + int slashPosition = resourceName.indexOf('/'); + + String rawRType = resourceName.substring(1, slashPosition); + String name = resourceName.substring(slashPosition + 1); + + if (name.startsWith("android:")) { + continue; + } + if (!RESOURCE_TYPES.containsKey(rawRType)) { + throw new AaptUtilException("Invalid reference '" + resourceName + "' in '" + xmlFullFilename + "'"); + } + RType rType = RESOURCE_TYPES.get(rawRType); + +//if(!resourceCollector.isContainResource(rType, IdType.INT, sanitizeName(resourceCollector, name))){ +//throw new AaptUtilException("Not found reference '" + resourceName + "' in '" + xmlFullFilename + "'"); +//} + references.add(new com.tencent.tinker.build.aapt.FakeRDotTxtEntry(IdType.INT, rType, sanitizeName(resourceCollector, name))); + } + } + + private static void addToResourceCollector(AaptResourceCollector resourceCollector, com.tencent.tinker.build.aapt.ResourceDirectory resourceDirectory, Node node, RType rType, String resourceValue) { + String resourceName = sanitizeName(resourceCollector, extractNameAttribute(node)); + resourceCollector.addRTypeResourceName(rType, resourceName, resourceValue, resourceDirectory); + if (rType.equals(RType.STYLEABLE)) { + + int count = 0; + for (Node attrNode = node.getFirstChild(); attrNode != null; attrNode = attrNode.getNextSibling()) { + if (attrNode.getNodeType() != Node.ELEMENT_NODE || !attrNode.getNodeName().equals("attr")) { + continue; + } + + String rawAttrName = extractNameAttribute(attrNode); + String attrName = sanitizeName(resourceCollector, rawAttrName); + resourceCollector.addResource(RType.STYLEABLE, IdType.INT, String.format("%s_%s", resourceName, attrName), Integer.toString(count++)); + + if (!rawAttrName.startsWith("android:")) { + resourceCollector.addIntResourceIfNotPresent(RType.ATTR, attrName); + resourceCollector.addRTypeResourceName(RType.ATTR, rawAttrName, nodeToString(attrNode, true), resourceDirectory); + } + } + + resourceCollector.addIntArrayResourceIfNotPresent(rType, resourceName, count); + } else { + resourceCollector.addIntResourceIfNotPresent(rType, resourceName); + } + } + + private static String sanitizeName(AaptResourceCollector resourceCollector, String rawName) { + String sanitizeName = rawName.replaceAll("[.:]", "_"); + resourceCollector.putSanitizeName(sanitizeName, rawName); + return sanitizeName; + } + + private static String extractNameAttribute(Node node) { + return node.getAttributes().getNamedItem("name").getNodeValue(); + } + + /** + * merge package r type resource map + * + * @param packageRTypeResourceMapList + * @return Map>> + */ + public static Map>> mergePackageRTypeResourceMap(List packageRTypeResourceMapList) { + Map>> packageRTypeResourceMergeMap = new HashMap>>(); + Map aaptResourceCollectorMap = new HashMap(); + for (PackageRTypeResourceMap packageRTypeResourceMap : packageRTypeResourceMapList) { + String packageName = packageRTypeResourceMap.packageName; + Map> rTypeResourceMap = packageRTypeResourceMap.rTypeResourceMap; + AaptResourceCollector aaptResourceCollector = null; + if (aaptResourceCollectorMap.containsKey(packageName)) { + aaptResourceCollector = aaptResourceCollectorMap.get(packageName); + } else { + aaptResourceCollector = new AaptResourceCollector(); + aaptResourceCollectorMap.put(packageName, aaptResourceCollector); + } + Iterator>> iterator = rTypeResourceMap.entrySet().iterator(); + while (iterator.hasNext()) { + Entry> entry = iterator.next(); + RType rType = entry.getKey(); + Set rDotTxtEntrySet = entry.getValue(); + for (com.tencent.tinker.build.aapt.RDotTxtEntry rDotTxtEntry : rDotTxtEntrySet) { + if (rDotTxtEntry.idType.equals(IdType.INT)) { + aaptResourceCollector.addIntResourceIfNotPresent(rType, rDotTxtEntry.name); + } else if (rDotTxtEntry.idType.equals(IdType.INT_ARRAY)) { + aaptResourceCollector.addResource(rType, rDotTxtEntry.idType, rDotTxtEntry.name, rDotTxtEntry.idValue); + } + } + } + } + Iterator> iterator = aaptResourceCollectorMap.entrySet().iterator(); + while (iterator.hasNext()) { + Entry entry = iterator.next(); + packageRTypeResourceMergeMap.put(entry.getKey(), entry.getValue().getRTypeResourceMap()); + } + return packageRTypeResourceMergeMap; + } + + /** + * write R.java + * + * @param outputDirectory + * @param packageName + * @param rTypeResourceMap + * @param isFinal + */ + public static void writeRJava(String outputDirectory, String packageName, Map> rTypeResourceMap, boolean isFinal) { + String outputFullFilename = new File(outputDirectory).getAbsolutePath() + Constant.Symbol.SLASH_LEFT + (packageName.replace(Constant.Symbol.DOT, Constant.Symbol.SLASH_LEFT) + Constant.Symbol.SLASH_LEFT + "R" + Constant.Symbol.DOT + Constant.File.JAVA); + FileUtil.createFile(outputFullFilename); + PrintWriter writer = null; + try { + writer = new PrintWriter(new FileOutputStream(outputFullFilename)); + writer.format("package %s;\n\n", packageName); + writer.println("public final class R {\n"); + for (RType rType : rTypeResourceMap.keySet()) { + // Now start the block for the new type. + writer.format(" public static final class %s {\n", rType.toString()); + for (com.tencent.tinker.build.aapt.RDotTxtEntry rDotTxtEntry : rTypeResourceMap.get(rType)) { + // Write out the resource. + // Write as an int. + writer.format(" public static%s%s %s=%s;\n", isFinal ? " final " : " ", rDotTxtEntry.idType, rDotTxtEntry.name, rDotTxtEntry.idValue); + } + writer.println(" }\n"); + } + // Close the class definition. + writer.println("}"); + } catch (Exception e) { + throw new AaptUtilException(e); + } finally { + if (writer != null) { + writer.flush(); + writer.close(); + } + } + } + + /** + * write R.java + * + * @param outputDirectory + * @param packageRTypeResourceMap + * @param isFinal + * @throws IOException + */ + public static void writeRJava(String outputDirectory, Map>> packageRTypeResourceMap, boolean isFinal) { + for (String packageName : packageRTypeResourceMap.keySet()) { + Map> rTypeResourceMap = packageRTypeResourceMap.get(packageName); + writeRJava(outputDirectory, packageName, rTypeResourceMap, isFinal); + } + } + + private static String subNodeToString(Node node) { + StringBuilder stringBuilder = new StringBuilder(); + if (node != null) { + NodeList nodeList = node.getChildNodes(); + stringBuilder.append(nodeToString(node, false)); + stringBuilder.append(StringUtil.CRLF_STRING); + int nodeListLength = nodeList.getLength(); + for (int i = 0; i < nodeListLength; i++) { + Node childNode = nodeList.item(i); + if (childNode.getNodeType() != Node.ELEMENT_NODE) { + continue; + } + stringBuilder.append(nodeToString(childNode, true)); + stringBuilder.append(StringUtil.CRLF_STRING); + } + if (stringBuilder.length() > StringUtil.CRLF_STRING.length()) { + stringBuilder.delete(stringBuilder.length() - StringUtil.CRLF_STRING.length(), stringBuilder.length()); + } + } + return stringBuilder.toString(); + } + + private static String nodeToString(Node node, boolean isNoChild) { + StringBuilder stringBuilder = new StringBuilder(); + if (node != null) { + stringBuilder.append(node.getNodeName()); + NamedNodeMap namedNodeMap = node.getAttributes(); + stringBuilder.append(Constant.Symbol.MIDDLE_BRACKET_LEFT); + int namedNodeMapLength = namedNodeMap.getLength(); + for (int j = 0; j < namedNodeMapLength; j++) { + Node attributeNode = namedNodeMap.item(j); + stringBuilder.append(Constant.Symbol.AT + attributeNode.getNodeName() + Constant.Symbol.EQUAL + attributeNode.getNodeValue()); + if (j < namedNodeMapLength - 1) { + stringBuilder.append(Constant.Symbol.COMMA); + } + } + stringBuilder.append(Constant.Symbol.MIDDLE_BRACKET_RIGHT); + String value = StringUtil.nullToBlank(isNoChild ? node.getTextContent() : node.getNodeValue()).trim(); + if (StringUtil.isNotBlank(value)) { + stringBuilder.append(Constant.Symbol.EQUAL + value); + } + } + return stringBuilder.toString(); + } + + public static class PackageRTypeResourceMap { + private String packageName = null; + private Map> rTypeResourceMap = null; + + public PackageRTypeResourceMap(String packageName, Map> rTypeResourceMap) { + this.packageName = packageName; + this.rTypeResourceMap = rTypeResourceMap; + } + } + + public static class AaptUtilException extends RuntimeException { + private static final long serialVersionUID = 1702278793911780809L; + + public AaptUtilException(String message) { + super(message); + } + + public AaptUtilException(Throwable cause) { + super(cause); + } + + public AaptUtilException(String message, Throwable cause) { + super(message, cause); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Constant.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Constant.java new file mode 100644 index 00000000..e0c85531 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Constant.java @@ -0,0 +1,302 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +public interface Constant { + + interface Base { + String EXCEPTION = "exception"; + } + + interface Symbol { + /** + * dot "." + */ + String DOT = "."; + char DOT_CHAR = '.'; + /** + * comma "," + */ + String COMMA = ","; + /** + * colon ":" + */ + String COLON = ":"; + /** + * semicolon ";" + */ + String SEMICOLON = ";"; + /** + * equal "=" + */ + String EQUAL = "="; + /** + * and "&" + */ + String AND = "&"; + /** + * question mark "?" + */ + String QUESTION_MARK = "?"; + /** + * wildcard "*" + */ + String WILDCARD = "*"; + /** + * underline "_" + */ + String UNDERLINE = "_"; + /** + * at "@" + */ + String AT = "@"; + /** + * minus "-" + */ + String MINUS = "-"; + /** + * logic and "&&" + */ + String LOGIC_AND = "&&"; + /** + * logic or "||" + */ + String LOGIC_OR = "||"; + /** + * brackets begin "(" + */ + String BRACKET_LEFT = "("; + /** + * brackets end ")" + */ + String BRACKET_RIGHT = ")"; + /** + * middle bracket left "[" + */ + String MIDDLE_BRACKET_LEFT = "["; + /** + * middle bracket right "]" + */ + String MIDDLE_BRACKET_RIGHT = "]"; + /** + * big bracket "{" + */ + String BIG_BRACKET_LEFT = "{"; + /** + * big bracket "}" + */ + String BIG_BRACKET_RIGHT = "}"; + /** + * slash "/" + */ + String SLASH_LEFT = "/"; + /** + * slash "\" + */ + String SLASH_RIGHT = "\\"; + /** + * xor or regex begin "^" + */ + String XOR = "^"; + /** + * dollar or regex end "$" + */ + String DOLLAR = "$"; + /** + * single quotes "'" + */ + String SINGLE_QUOTES = "'"; + /** + * double quotes "\"" + */ + String DOUBLE_QUOTES = "\""; + } + + interface Encoding { + /** + * encoding + */ + String ISO88591 = "ISO-8859-1"; + String GB2312 = "GB2312"; + String GBK = "GBK"; + String UTF8 = "UTF-8"; + } + + interface Timezone { + String ASIA_SHANGHAI = "Asia/Shanghai"; + } + + interface Http { + + interface RequestMethod { + /** + * for request method + */ + String PUT = "PUT"; + String DELETE = "DELETE"; + String GET = "GET"; + String POST = "POST"; + String HEAD = "HEAD"; + String OPTIONS = "OPTIONS"; + String TRACE = "TRACE"; + } + + interface HeaderKey { + /** + * for request,response header + */ + String CONTENT_TYPE = "Content-Type"; + String CONTENT_DISPOSITION = "Content-Disposition"; + String ACCEPT_CHARSET = "Accept-Charset"; + String CONTENT_ENCODING = "Content-Encoding"; + } + + interface ContentType { + /** + * for request,response content type + */ + String TEXT_PLAIN = "text/plain"; + String APPLICATION_X_DOWNLOAD = "application/x-download"; + String APPLICATION_ANDROID_PACKAGE = "application/vnd.android.package-archive"; + String MULTIPART_FORM_DATA = "multipart/form-data"; + String APPLICATION_OCTET_STREAM = "application/octet-stream"; + String BINARY_OCTET_STREAM = "binary/octet-stream"; + String APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded"; + } + + interface StatusCode { + + int CONTINUE = 100; + int SWITCHING_PROTOCOLS = 101; + int PROCESSING = 102; + + int OK = 200; + int CREATED = 201; + int ACCEPTED = 202; + int NON_AUTHORITATIVE_INFORMATION = 203; + int NO_CONTENT = 204; + int RESET_CONTENT = 205; + int PARTIAL_CONTENT = 206; + int MULTI_STATUS = 207; + + int MULTIPLE_CHOICES = 300; + int MOVED_PERMANENTLY = 301; + int FOUND = 302; + int SEE_OTHER = 303; + int NOT_MODIFIED = 304; + int USE_PROXY = 305; + int SWITCH_PROXY = 306; + int TEMPORARY_REDIRECT = 307; + + int BAD_REQUEST = 400; + int UNAUTHORIZED = 401; + int PAYMENT_REQUIRED = 402; + int FORBIDDEN = 403; + int NOT_FOUND = 404; + int METHOD_NOT_ALLOWED = 405; + int NOT_ACCEPTABLE = 406; + int REQUEST_TIMEOUT = 408; + int CONFLICT = 409; + int GONE = 410; + int LENGTH_REQUIRED = 411; + int PRECONDITION_FAILED = 412; + int REQUEST_URI_TOO_LONG = 414; + int EXPECTATION_FAILED = 417; + int TOO_MANY_CONNECTIONS = 421; + int UNPROCESSABLE_ENTITY = 422; + int LOCKED = 423; + int FAILED_DEPENDENCY = 424; + int UNORDERED_COLLECTION = 425; + int UPGRADE_REQUIRED = 426; + int RETRY_WITH = 449; + + int INTERNAL_SERVER_ERROR = 500; + int NOT_IMPLEMENTED = 501; + int BAD_GATEWAY = 502; + int SERVICE_UNAVAILABLE = 503; + int GATEWAY_TIMEOUT = 504; + int HTTP_VERSION_NOT_SUPPORTED = 505; + int VARIANT_ALSO_NEGOTIATES = 506; + int INSUFFICIENT_STORAGE = 507; + int LOOP_DETECTED = 508; + int BANDWIDTH_LIMIT_EXCEEDED = 509; + int NOT_EXTENDED = 510; + int UNPARSEABLE_RESPONSE_HEADERS = 600; + } + } + + interface RequestScope { + String SESSION = "session"; + } + + interface RequestParameter { + String RETURN_URL = "returnUrl"; + } + + interface Database { + String COLUMN_NAME_TOTAL = "TOTAL"; + + interface MySql { + /** + * pagination + */ + String PAGINATION = "LIMIT"; + } + } + + interface Capacity { + /** + * bytes per kilobytes + */ + int BYTES_PER_KB = 1024; + + /** + * bytes per millionbytes + */ + int BYTES_PER_MB = BYTES_PER_KB * BYTES_PER_KB; + } + + interface Method { + String PREFIX_SET = "set"; + String PREFIX_GET = "get"; + String PREFIX_IS = "is"; + String GET_CLASS = "getClass"; + } + + interface File { + String CLASS = "class"; + String JPEG = "jpeg"; + String JPG = "jpg"; + String GIF = "gif"; + String JAR = "jar"; + String JAVA = "java"; + String EXE = "exe"; + String DEX = "dex"; + String AIDL = "aidl"; + String SO = "so"; + String XML = "xml"; + String CSV = "csv"; + String TXT = "txt"; + String APK = "apk"; + } + + interface Protocol { + String FILE = "file://"; + String HTTP = "http://"; + String FTP = "ftp://"; + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/DefaultFileCopyProcessor.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/DefaultFileCopyProcessor.java new file mode 100644 index 00000000..f20d4682 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/DefaultFileCopyProcessor.java @@ -0,0 +1,69 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +public class DefaultFileCopyProcessor implements FileUtil.FileCopyProcessor { + + /** + * copyFileToFileProcess + * + * @param from,maybe directory + * @param to,maybe directory + * @param isFile,maybe directory or file + * @return boolean, if true keep going copy,only active in directory so far + */ + public boolean copyFileToFileProcess(final String from, final String to, final boolean isFile) { + try { + if (isFile) { + String fromFile = new File(from).getAbsolutePath(); + String toFile = new File(to).getAbsolutePath(); + if (fromFile.equals(toFile)) { + toFile = toFile + "_copy"; + } + FileUtil.createFile(toFile); + InputStream inputStream = new FileInputStream(fromFile); + OutputStream outputStream = new FileOutputStream(toFile); + try { + byte[] buffer = new byte[Constant.Capacity.BYTES_PER_KB]; + int length = -1; + while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) { + outputStream.write(buffer, 0, length); + outputStream.flush(); + } + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + } else { + FileUtil.createDirectory(to); + } + } catch (Exception e) { + throw new FileCopyException(e); + } + return true; + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FakeRDotTxtEntry.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FakeRDotTxtEntry.java new file mode 100644 index 00000000..b8ac4575 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FakeRDotTxtEntry.java @@ -0,0 +1,30 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +/** + * An {@link RDotTxtEntry} with fake {@link #idValue}, useful for comparing two resource entries for + * equality, since {@link RDotTxtEntry#compareTo(RDotTxtEntry)} ignores the id value. + */ +public class FakeRDotTxtEntry extends RDotTxtEntry { + + private static final String FAKE_ID = "0x00000000"; + + public FakeRDotTxtEntry(IdType idType, RType type, String name) { + super(idType, type, name, FAKE_ID); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileCopyException.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileCopyException.java new file mode 100644 index 00000000..e7fb8a84 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileCopyException.java @@ -0,0 +1,47 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +public class FileCopyException extends RuntimeException { + + /** + * serialVersionUID + */ + private static final long serialVersionUID = -6670157031514003361L; + + /** + * @param message + */ + public FileCopyException(String message) { + super(message); + } + + /** + * @param cause + */ + public FileCopyException(Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + */ + public FileCopyException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileUtil.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileUtil.java new file mode 100644 index 00000000..ad2b5eb1 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/FileUtil.java @@ -0,0 +1,1286 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +public final class FileUtil { + + private static final FileCopyProcessor DEFAULT_FILE_COPY_PROCESSOR = new DefaultFileCopyProcessor(); + + private FileUtil() { + } + + /** + * is file exist,include directory or file + * + * @param path directory or file + * @return boolean + */ + public static boolean isExist(String path) { + File file = new File(path); + return file.exists(); + } + + /** + * is has file from directory + * + * @param directory + * @param fileSuffix + * @return boolean + */ + public static boolean isHasFile(String directory, String fileSuffix) { + boolean result = false; + File directoryFile = new File(directory); + Queue queue = new ConcurrentLinkedQueue(); + queue.add(directoryFile); + while (!queue.isEmpty()) { + File file = queue.poll(); + if (file.isDirectory()) { + File[] fileArray = file.listFiles(); + if (fileArray != null) { + queue.addAll(Arrays.asList(fileArray)); + } + } else if (file.isFile()) { + if (file.getName().toLowerCase().endsWith(fileSuffix.toLowerCase())) { + result = true; + break; + } + } + } + return result; + } + + /** + * create directory + * + * @param directoryPath + */ + public static void createDirectory(final String directoryPath) { + File file = new File(directoryPath); + if (!file.exists()) { + file.setReadable(true, false); + file.setWritable(true, true); + file.mkdirs(); + } + } + + /** + * create file,full filename,signle empty file. + * + * @param fullFilename + * @return boolean + */ + public static boolean createFile(final String fullFilename) { + boolean result = false; + File file = new File(fullFilename); + createDirectory(file.getParent()); + try { + file.setReadable(true, false); + file.setWritable(true, true); + result = file.createNewFile(); + } catch (Exception e) { + throw new FileUtilException(e); + } + return result; + } + + /** + * delete all file + * + * @param directory + */ + public static void deleteAllFile(String directory) { + List fileList = new ArrayList(); + File directoryFile = new File(directory); + Queue queue = new ConcurrentLinkedQueue(); + queue.add(directoryFile); + while (!queue.isEmpty()) { + File file = queue.poll(); + if (file.isDirectory()) { + File[] fileArray = file.listFiles(); + if (fileArray != null) { + queue.addAll(Arrays.asList(fileArray)); + } + } + fileList.add(file); + } + for (int i = fileList.size() - 1; i >= 0; i--) { + fileList.get(i).delete(); + } + } + + /** + * copy file,default path to path + * + * @param from + * @param to + */ + public static void copyFile(final String from, final String to) { + copyFile(from, to, FileCopyType.PATH_TO_PATH, DEFAULT_FILE_COPY_PROCESSOR); + } + + /** + * copy file + * + * @param from + * @param to + * @param fileCopyType + */ + public static void copyFile(final String from, final String to, final FileCopyType fileCopyType) { + copyFile(from, to, fileCopyType, DEFAULT_FILE_COPY_PROCESSOR); + } + + /** + * copy file + * + * @param from + * @param to + * @param fileCopyType + * @param fileCopyProcessor + */ + public static void copyFile(final String from, final String to, final FileCopyType fileCopyType, FileCopyProcessor fileCopyProcessor) { + switch (fileCopyType) { + case FILE_TO_PATH: + copyFileToPath(from, to, fileCopyProcessor); + break; + case FILE_TO_FILE: + copyFileToFile(from, to, fileCopyProcessor); + break; + case PATH_TO_PATH: + default: + copyPathToPath(from, to, fileCopyProcessor); + break; + } + } + + /** + * copy path to path,copy process include directory copy + * + * @param fromPath + * @param toPath + * @param fileCopyProcessor + */ + public static void copyPathToPath(final String fromPath, final String toPath, FileCopyProcessor fileCopyProcessor) { + File fromDirectoryFile = new File(fromPath); + File toDirectoryFile = new File(toPath); + String fromDirectoryPath = fromDirectoryFile.getAbsolutePath(); + String toDirectoryPath = toDirectoryFile.getAbsolutePath(); + if (fromDirectoryPath.equals(toDirectoryPath)) { + toDirectoryPath = toDirectoryPath + "_copy"; + } + Queue queue = new ConcurrentLinkedQueue(); + queue.add(fromDirectoryFile); + while (!queue.isEmpty()) { + File file = queue.poll(); + String fromFilePath = file.getAbsolutePath(); + String toFilePath = toDirectoryPath + fromFilePath.substring(fromDirectoryPath.length()); + if (file.isDirectory()) { + boolean result = true; + if (fileCopyProcessor != null) { + result = fileCopyProcessor.copyFileToFileProcess(fromFilePath, toFilePath, false); + } + if (result) { + File[] fileArray = file.listFiles(); + if (fileArray != null) { + queue.addAll(Arrays.asList(fileArray)); + } + } + } else if (file.isFile()) { + if (fileCopyProcessor != null) { + fileCopyProcessor.copyFileToFileProcess(fromFilePath, toFilePath, true); + } + } + } + } + + /** + * @param fromFile + * @param toPath + * @param fileCopyProcessor + */ + private static void copyFileToPath(final String fromFile, final String toPath, final FileCopyProcessor fileCopyProcessor) { + File from = new File(fromFile); + File to = new File(toPath); + if (from.exists() && from.isFile()) { + createDirectory(toPath); + String tempFromFile = from.getAbsolutePath(); + String tempToFile = to.getAbsolutePath() + File.separator + from.getName(); + copyFileToFile(tempFromFile, tempToFile, fileCopyProcessor); + } + } + + /** + * unzip + * + * @param zipFullFilename + * @param outputDirectory + * @return List + */ + public static List unzip(String zipFullFilename, String outputDirectory) { + return unzip(zipFullFilename, outputDirectory, null); + } + + /** + * unzip + * + * @param zipFullFilename + * @param outputDirectory + * @param zipEntryNameList,if it is null or empty,will unzip all + * @return List + */ + public static List unzip(String zipFullFilename, String outputDirectory, List zipEntryNameList) { + if (outputDirectory == null) { + throw new NullPointerException("out put directory can not be null."); + } + List storeFileList = null; + ZipFile zipFile = null; + try { + storeFileList = new ArrayList(); + zipFile = new ZipFile(zipFullFilename); + String outputDirectoryAbsolutePath = new File(outputDirectory).getAbsolutePath(); + Enumeration enumeration = zipFile.entries(); + while (enumeration.hasMoreElements()) { + ZipEntry zipEntry = enumeration.nextElement(); + String zipEntryName = zipEntry.getName(); + boolean contains = false; + if (zipEntryNameList == null || zipEntryNameList.isEmpty()) { + contains = true; + } else { + if (zipEntryNameList.contains(zipEntryName)) { + contains = true; + } + } + if (contains) { + InputStream inputStream = zipFile.getInputStream(zipEntry); + String outputFullFilename = outputDirectoryAbsolutePath + Constant.Symbol.SLASH_LEFT + zipEntryName; + if (zipEntry.isDirectory()) { + createDirectory(outputFullFilename); + } else { + createFile(outputFullFilename); + OutputStream outputStream = new FileOutputStream(outputFullFilename); + try { + byte[] buffer = new byte[Constant.Capacity.BYTES_PER_KB]; + int length = -1; + while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) { + outputStream.write(buffer, 0, length); + outputStream.flush(); + } + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + storeFileList.add(outputFullFilename); + } + } + } + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + try { + if (zipFile != null) { + zipFile.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return storeFileList; + } + + /** + * zip + * + * @param outputZipFullFilename + * @param directory + */ + public static void zip(String outputZipFullFilename, String directory) { + zip(outputZipFullFilename, directory, StringUtil.BLANK); + } + + /** + * zip + * + * @param outputZipFullFilename + * @param directory + * @param fileSuffix + */ + public static void zip(String outputZipFullFilename, String directory, String fileSuffix) { + List classFileList = FileUtil.findMatchFile(directory, fileSuffix); + if (classFileList != null && !classFileList.isEmpty()) { + List zipEntryPathList = new ArrayList(); + int classOutputFullFilenameLength = new File(directory).getAbsolutePath().length() + 1; + for (String classFile : classFileList) { + String zipEntryName = classFile.substring(classOutputFullFilenameLength, classFile.length()); + zipEntryName = zipEntryName.replace(Constant.Symbol.SLASH_RIGHT, Constant.Symbol.SLASH_LEFT); + zipEntryPathList.add(new ZipEntryPath(classFile, new ZipEntry(zipEntryName), true)); + } + zip(outputZipFullFilename, zipEntryPathList); + } + } + + /** + * zip + * + * @param outputZipFullFilename + * @param zipEntryPathList + */ + public static void zip(String outputZipFullFilename, List zipEntryPathList) { + zip(outputZipFullFilename, null, zipEntryPathList); + } + + /** + * zip + * + * @param outputZipFullFilename + * @param inputZipFullFilename,can null,the entry will not from the input file + * @param zipEntryPathList + */ + public static void zip(String outputZipFullFilename, String inputZipFullFilename, List zipEntryPathList) { + zip(outputZipFullFilename, inputZipFullFilename, zipEntryPathList, null); + } + + /** + * zip + * + * @param outputZipFullFilename + * @param inputZipFullFilename,can null,the entry will not from the input file + * @param zipProcessor + */ + public static void zip(String outputZipFullFilename, String inputZipFullFilename, ZipProcessor zipProcessor) { + zip(outputZipFullFilename, inputZipFullFilename, null, zipProcessor); + } + + /** + * zip + * + * @param outputZipFullFilename + * @param inputZipFullFilename,can null,the entry will not from the input file + * @param zipEntryPathList + * @param zipProcessor + */ + public static void zip(String outputZipFullFilename, String inputZipFullFilename, List zipEntryPathList, ZipProcessor zipProcessor) { + ZipOutputStream zipOutputStream = null; + ZipFile zipFile = null; + Map zipEntryPathMap = new HashMap(); + List needToAddEntryNameList = new CopyOnWriteArrayList(); + if (zipEntryPathList != null) { + for (ZipEntryPath zipEntryPath : zipEntryPathList) { + zipEntryPathMap.put(zipEntryPath.zipEntry.getName(), zipEntryPath); + needToAddEntryNameList.add(zipEntryPath.zipEntry.getName()); + } + } + try { + createFile(outputZipFullFilename); + zipOutputStream = new ZipOutputStream(new FileOutputStream(outputZipFullFilename)); + if (inputZipFullFilename != null) { + zipFile = new ZipFile(inputZipFullFilename); + Enumeration enumeration = zipFile.entries(); + while (enumeration.hasMoreElements()) { + ZipEntry zipEntry = enumeration.nextElement(); + String zipEntryName = zipEntry.getName(); + InputStream inputStream = null; + if (zipEntryPathMap.containsKey(zipEntryName)) { + ZipEntryPath zipEntryPath = zipEntryPathMap.get(zipEntryName); + needToAddEntryNameList.remove(zipEntryName); + if (zipEntryPath.replace) { + zipEntry = zipEntryPath.zipEntry; + inputStream = new FileInputStream(zipEntryPath.fullFilename); + } + } + if (inputStream == null) { + inputStream = zipFile.getInputStream(zipEntry); + if (zipProcessor != null) { + inputStream = zipProcessor.zipEntryProcess(zipEntryName, inputStream); + } + } + ZipEntry newZipEntry = new ZipEntry(zipEntryName); + addZipEntry(zipOutputStream, newZipEntry, inputStream); + } + } + for (String zipEntryName : needToAddEntryNameList) { + ZipEntryPath zipEntryPath = zipEntryPathMap.get(zipEntryName); + ZipEntry zipEntry = zipEntryPath.zipEntry; + InputStream inputStream = new FileInputStream(zipEntryPath.fullFilename); + if (zipProcessor != null) { + inputStream = zipProcessor.zipEntryProcess(zipEntry.getName(), inputStream); + } + addZipEntry(zipOutputStream, zipEntry, inputStream); + } + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + try { + if (zipOutputStream != null) { + zipOutputStream.finish(); + zipOutputStream.flush(); + zipOutputStream.close(); + } + if (zipFile != null) { + zipFile.close(); + } + } catch (Exception e) { + throw new FileUtilException(e); + } + } + } + + /** + * merge zip file + * + * @param zipOutputFullFilename + * @param mergeZipFullFilenameList + */ + public static void mergeZip(String zipOutputFullFilename, List mergeZipFullFilenameList) { + FileUtil.createFile(zipOutputFullFilename); + ZipOutputStream zipOutputStream = null; + try { + zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOutputFullFilename)); + if (mergeZipFullFilenameList != null) { + for (String zipFullFilename : mergeZipFullFilenameList) { + if (isExist(zipFullFilename)) { + ZipFile zipFile = new ZipFile(zipFullFilename); + Enumeration enumeration = zipFile.entries(); + while (enumeration.hasMoreElements()) { + ZipEntry zipEntry = enumeration.nextElement(); + InputStream inputStream = zipFile.getInputStream(zipEntry); + addZipEntry(zipOutputStream, zipEntry, inputStream); + } + zipFile.close(); + } + } + } + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + try { + if (zipOutputStream != null) { + zipOutputStream.close(); + } + } catch (Exception e) { + throw new FileUtilException(e); + } + } + } + + /** + * add zip entry + * + * @param zipOutputStream + * @param zipEntry + * @param inputStream + * @throws Exception + */ + public static void addZipEntry(ZipOutputStream zipOutputStream, ZipEntry zipEntry, InputStream inputStream) throws Exception { + try { + zipOutputStream.putNextEntry(zipEntry); + byte[] buffer = new byte[Constant.Capacity.BYTES_PER_KB]; + int length = -1; + while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) { + zipOutputStream.write(buffer, 0, length); + zipOutputStream.flush(); + } + } catch (ZipException e) { + // do nothing + } finally { + if (inputStream != null) { + inputStream.close(); + } + zipOutputStream.closeEntry(); + } + } + + /** + * read file + * + * @param fullFilename + * @return byte[] + */ + public static byte[] readFile(String fullFilename) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + InputStream inputStream = null; + try { + inputStream = new FileInputStream(fullFilename); + copyStream(inputStream, byteArrayOutputStream); + } catch (FileNotFoundException e) { + throw new FileUtilException(e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + if (byteArrayOutputStream != null) { + try { + byteArrayOutputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + return byteArrayOutputStream.toByteArray(); + } + + /** + * write file + * + * @param outputFullFilename + * @param byteArray + */ + public static void writeFile(String outputFullFilename, byte[] byteArray) { + InputStream inputStream = new ByteArrayInputStream(byteArray); + FileUtil.createFile(outputFullFilename); + OutputStream outputStream = null; + try { + outputStream = new FileOutputStream(outputFullFilename); + copyStream(inputStream, outputStream); + } catch (FileNotFoundException e) { + throw new FileUtilException(e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + } + + /** + * copy stream , from input to output,it don't close + * + * @param inputStream + * @param outputStream + */ + public static void copyStream(InputStream inputStream, OutputStream outputStream) { + if (inputStream != null && outputStream != null) { + try { + int length = -1; + byte[] buffer = new byte[Constant.Capacity.BYTES_PER_MB]; + while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) { + outputStream.write(buffer, 0, length); + outputStream.flush(); + } + } catch (Exception e) { + throw new FileUtilException(e); + } + } + } + + /** + * merge file + * + * @param outputFullFilename + * @param fullFilenameList + */ + public static void mergeFile(String outputFullFilename, List fullFilenameList) { + if (fullFilenameList != null && outputFullFilename != null) { + OutputStream outputStream = null; + try { + outputStream = new FileOutputStream(outputFullFilename); + for (String fullFilename : fullFilenameList) { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(fullFilename); + copyStream(inputStream, outputStream); + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + } + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + } + } + + /** + * find match file directory + * + * @param sourceDirectory + * @param fileSuffix + * @return List + */ + public static List findMatchFileDirectory(String sourceDirectory, String fileSuffix) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, null, false, true); + } + + /** + * find match file directory + * + * @param sourceDirectory + * @param fileSuffix + * @param includeHidden + * @return List + */ + public static List findMatchFileDirectory(String sourceDirectory, String fileSuffix, boolean includeHidden) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, null, false, includeHidden); + } + + /** + * find match file directory and append some string to rear + * + * @param sourceDirectory + * @param fileSuffix + * @param somethingAppendToRear + * @return List + */ + public static List findMatchFileDirectory(String sourceDirectory, String fileSuffix, String somethingAppendToRear) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, somethingAppendToRear, false, true); + } + + /** + * find match file directory and append some string to rear + * + * @param sourceDirectory + * @param fileSuffix + * @param somethingAppendToRear + * @param includeHidden + * @return List + */ + public static List findMatchFileDirectory(String sourceDirectory, String fileSuffix, String somethingAppendToRear, boolean includeHidden) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, somethingAppendToRear, false, includeHidden); + } + + /** + * find match file + * + * @param sourceDirectory + * @param fileSuffix + * @return List + */ + public static List findMatchFile(String sourceDirectory, String fileSuffix) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, null, true, true); + } + + /** + * find match file + * + * @param sourceDirectory + * @param fileSuffix + * @param includeHidden + * @return List + */ + public static List findMatchFile(String sourceDirectory, String fileSuffix, boolean includeHidden) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, null, true, includeHidden); + } + + /** + * find match file and append some string to rear + * + * @param sourceDirectory + * @param fileSuffix + * @param somethingAppendToRear + * @return List + */ + public static List findMatchFile(String sourceDirectory, String fileSuffix, String somethingAppendToRear) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, somethingAppendToRear, true, false); + } + + /** + * find match file and append some string to rear + * + * @param sourceDirectory + * @param fileSuffix + * @param somethingAppendToRear + * @param includeHidden + * @return List + */ + public static List findMatchFile(String sourceDirectory, String fileSuffix, String somethingAppendToRear, boolean includeHidden) { + return findMatchFileOrMatchFileDirectory(sourceDirectory, fileSuffix, somethingAppendToRear, true, includeHidden); + } + + /** + * find match file or match file directory + * + * @param sourceDirectory + * @param fileSuffix + * @param somethingAppendToRear + * @param isFindMatchFile + * @param includeHidden + * @return List + */ + private static List findMatchFileOrMatchFileDirectory(String sourceDirectory, String fileSuffix, String somethingAppendToRear, boolean isFindMatchFile, boolean includeHidden) { + fileSuffix = StringUtil.nullToBlank(fileSuffix); + somethingAppendToRear = StringUtil.nullToBlank(somethingAppendToRear); + List list = new ArrayList(); + File sourceDirectoryFile = new File(sourceDirectory); + Queue queue = new ConcurrentLinkedQueue(); + queue.add(sourceDirectoryFile); + while (!queue.isEmpty()) { + File file = queue.poll(); + boolean result = false; + if (!file.isHidden() || includeHidden) { + result = true; + } + if (result) { + if (file.isDirectory()) { + File[] fileArray = file.listFiles(); + if (fileArray != null) { + queue.addAll(Arrays.asList(fileArray)); + } + } else if (file.isFile()) { + if (file.getName().toLowerCase().endsWith(fileSuffix.toLowerCase())) { + if (isFindMatchFile) { + list.add(file.getAbsolutePath() + somethingAppendToRear); + } else { + String parentPath = file.getParent(); + parentPath = parentPath + somethingAppendToRear; + if (!list.contains(parentPath)) { + list.add(parentPath); + } + } + } + } + } + } + return list; + } + + /** + * get zip entry hash map + * + * @param zipFile + * @return Map + */ + private static Map getZipEntryHashMap(String zipFullFilename) { + ZipFile zipFile = null; + Map map = new HashMap(); + try { + zipFile = new ZipFile(zipFullFilename); + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry zipEntry = (ZipEntry) entries.nextElement(); + if (!zipEntry.isDirectory()) { + String key = zipEntry.getName(); + String value = zipEntry.getCrc() + Constant.Symbol.DOT + zipEntry.getSize(); + map.put(key, value); + } + } + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (zipFile != null) { + try { + zipFile.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + return map; + } + + /** + * differ zip + * + * @param differentOutputFullFilename + * @param oldZipFullFilename + * @param newZipFullFilename + */ + public static void differZip(String differentOutputFullFilename, String oldZipFullFilename, String newZipFullFilename) { + Map map = getZipEntryHashMap(oldZipFullFilename); + ZipFile newZipFile = null; + ZipOutputStream zipOutputStream = null; + try { + newZipFile = new ZipFile(newZipFullFilename); + Enumeration entries = newZipFile.entries(); + FileUtil.createFile(differentOutputFullFilename); + zipOutputStream = new ZipOutputStream(new FileOutputStream(differentOutputFullFilename)); + while (entries.hasMoreElements()) { + ZipEntry zipEntry = entries.nextElement(); + if (!zipEntry.isDirectory()) { + String zipEntryName = zipEntry.getName(); + String oldZipEntryHash = map.get(zipEntryName); + String newZipEntryHash = zipEntry.getCrc() + Constant.Symbol.DOT + zipEntry.getSize(); + // old zip entry hash not exist is a new zip entry,if exist + // is a modified zip entry + if (oldZipEntryHash == null || (!newZipEntryHash.equals(oldZipEntryHash))) { + System.out.println(String.format("found modified entry, key=%s(%s/%s)", new Object[]{zipEntryName, oldZipEntryHash, newZipEntryHash})); + addZipEntry(zipOutputStream, zipEntry, newZipFile.getInputStream(zipEntry)); + } + } + } + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (newZipFile != null) { + try { + newZipFile.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + if (zipOutputStream != null) { + try { + zipOutputStream.finish(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + } + + /** + * generate simple file + * + * @param templateFullFilename + * @param outputFullFilename + * @param valueMap + */ + public static void generateSimpleFile(String templateFullFilename, String outputFullFilename, Map valueMap) { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(templateFullFilename); + generateSimpleFile(inputStream, outputFullFilename, valueMap); + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + } + } + + /** + * generate simple file + * + * @param templateInputStream + * @param outputFullFilename + * @param valueMap + */ + public static void generateSimpleFile(InputStream templateInputStream, String outputFullFilename, Map valueMap) { + BufferedReader bufferedReader = null; + OutputStream outputStream = null; + try { + bufferedReader = new BufferedReader(new InputStreamReader(templateInputStream, Constant.Encoding.UTF8)); + StringBuilder content = new StringBuilder(); + String line = null; + Set> entrySet = valueMap.entrySet(); + while ((line = bufferedReader.readLine()) != null) { + for (Entry entry : entrySet) { + String key = entry.getKey(); + String value = entry.getValue(); + line = line.replace(key, value); + } + content.append(line); + content.append(StringUtil.CRLF_STRING); + } + createFile(outputFullFilename); + outputStream = new FileOutputStream(outputFullFilename); + outputStream.write(content.toString().getBytes(Constant.Encoding.UTF8)); + outputStream.flush(); + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException e) { + throw new FileUtilException(e); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (Exception e) { + throw new FileUtilException(e); + } + } + } + } + + /** + * find file list with cache + * + * @param sourceDirectoryList + * @param cacheProperties + * @param fileSuffix suffix it will search file in source directory list + * @param somethingAppendToRear + * @param isFile if true the return list is source file else is the source directory + * @return List + */ + public static List findFileListWithCache(List sourceDirectoryList, Properties cacheProperties, String fileSuffix, String somethingAppendToRear, boolean isFile) { + return findFileListWithCache(sourceDirectoryList, cacheProperties, fileSuffix, somethingAppendToRear, isFile, null); + } + + /** + * find file list with cache + * + * @param sourceDirectoryList + * @param cacheProperties + * @param fileSuffix + * @param somethingAppendToRear + * @param isFile + * @param cacheProcessor + * @return List + */ + public static List findFileListWithCache(List sourceDirectoryList, Properties cacheProperties, String fileSuffix, String somethingAppendToRear, boolean isFile, CacheProcessor cacheProcessor) { + return findFileListWithCache(sourceDirectoryList, cacheProperties, fileSuffix, somethingAppendToRear, isFile, false, cacheProcessor); + } + + /** + * find file list with cache + * + * @param sourceDirectoryList + * @param cacheProperties + * @param fileSuffix suffix it will search file in source directory list + * @param somethingAppendToRear + * @param isFile if true the return list is source file else is the source directory + * @param includeHidden + * @return List + */ + public static List findFileListWithCache(List sourceDirectoryList, Properties cacheProperties, String fileSuffix, String somethingAppendToRear, boolean isFile, boolean includeHidden, CacheProcessor cacheProcessor) { + List sourceList = new ArrayList(); + //no cache + if (cacheProperties == null) { + if (sourceDirectoryList != null && !sourceDirectoryList.isEmpty()) { + for (String sourceDirectory : sourceDirectoryList) { + if (isFile) { + sourceList.addAll(FileUtil.findMatchFile(sourceDirectory, fileSuffix, includeHidden)); + } else { + sourceList.addAll(FileUtil.findMatchFileDirectory(sourceDirectory, fileSuffix, somethingAppendToRear, includeHidden)); + } + } + } + } else if (cacheProperties.isEmpty()) { + List fileList = new ArrayList(); + if (sourceDirectoryList != null && !sourceDirectoryList.isEmpty()) { + for (String sourceDirectory : sourceDirectoryList) { + fileList.addAll(FileUtil.findMatchFile(sourceDirectory, fileSuffix, includeHidden)); + } + } + for (String fullFilename : fileList) { + String cacheKey = fullFilename; + if (cacheProcessor != null) { + cacheKey = cacheProcessor.keyProcess(cacheKey); + } + cacheProperties.setProperty(cacheKey, Generator.md5File(fullFilename)); + } + if (isFile) { + sourceList.addAll(fileList); + } else { + if (sourceDirectoryList != null && !sourceDirectoryList.isEmpty()) { + for (String sourceDirectory : sourceDirectoryList) { + sourceList.addAll(FileUtil.findMatchFileDirectory(sourceDirectory, fileSuffix, somethingAppendToRear, includeHidden)); + } + } + } + } else { + List fileList = new ArrayList(); + if (sourceDirectoryList != null && !sourceDirectoryList.isEmpty()) { + for (String sourceDirectory : sourceDirectoryList) { + fileList.addAll(FileUtil.findMatchFile(sourceDirectory, fileSuffix, includeHidden)); + } + } + for (String fullFilename : fileList) { + String cacheKey = fullFilename; + if (cacheProcessor != null) { + cacheKey = cacheProcessor.keyProcess(cacheKey); + } + String sourceFileMd5 = Generator.md5File(fullFilename); + if (cacheProperties.containsKey(cacheKey)) { + String md5 = cacheProperties.getProperty(cacheKey); + if (!sourceFileMd5.equals(md5)) { + sourceList.add(fullFilename); + cacheProperties.setProperty(cacheKey, sourceFileMd5); + } + } else { + sourceList.add(fullFilename); + cacheProperties.setProperty(cacheKey, sourceFileMd5); + } + } + } + return sourceList; + } + + /** + * deal with file cache + * + * @param propertiesFileMappingFullFilename + * @param noCacheFileFinder + * @param noCacheFileProcessor + * @return List + */ + public static List dealWithFileCache(String propertiesFileMappingFullFilename, NoCacheFileFinder noCacheFileFinder, NoCacheFileProcessor noCacheFileProcessor) { + Properties propertiesFileMapping = getPropertiesAutoCreate(propertiesFileMappingFullFilename); + List noCacheFileList = null; + if (noCacheFileFinder == null) { + throw new NullPointerException("noCacheFileFinder can not be null."); + } + noCacheFileList = noCacheFileFinder.findNoCacheFileList(propertiesFileMapping); + boolean saveCache = false; + if (noCacheFileProcessor != null) { + saveCache = noCacheFileProcessor.process(noCacheFileList); + } + if (saveCache) { + saveProperties(propertiesFileMapping, propertiesFileMappingFullFilename); + } + return noCacheFileList; + } + + /** + * get properties will auto create + * + * @param propertiesFullFilename + * @return Properties + */ + public static Properties getPropertiesAutoCreate(String propertiesFullFilename) { + if (!FileUtil.isExist(propertiesFullFilename)) { + FileUtil.createFile(propertiesFullFilename); + } + return getProperties(propertiesFullFilename); + } + + /** + * get properties + * + * @param propertiesFullFilename + * @return Properties + */ + public static Properties getProperties(String propertiesFullFilename) { + Properties properties = null; + if (propertiesFullFilename != null) { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(propertiesFullFilename); + properties = new Properties(); + properties.load(inputStream); + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Exception e) { + throw new FileUtilException(e); + } + } + } + } + return properties; + } + + /** + * get properties from properties file,will auto create + * + * @param file + * @return Properties + * @throws IOException + */ + public static Properties getProperties(File file) { + Properties properties = null; + if (file != null) { + properties = getProperties(file.getAbsolutePath()); + } + return properties; + } + + /** + * save properties + * + * @param properties + * @param outputFullFilename + */ + public static void saveProperties(Properties properties, String outputFullFilename) { + if (properties != null && outputFullFilename != null) { + OutputStream outputStream = null; + try { + outputStream = new FileOutputStream(outputFullFilename); + properties.store(outputStream, null); + } catch (Exception e) { + throw new FileUtilException(e); + } finally { + if (outputStream != null) { + try { + outputStream.flush(); + outputStream.close(); + } catch (Exception e) { + throw new FileUtilException(e); + } + } + } + } + } + + /** + * @param fromFile + * @param toFile + * @param fileCopyProcessor + */ + private static void copyFileToFile(final String fromFile, final String toFile, FileCopyProcessor fileCopyProcessor) { + if (fileCopyProcessor != null) { + createFile(toFile); + fileCopyProcessor.copyFileToFileProcess(fromFile, toFile, true); + } + } + + /** + * @param args + */ + public static void main(String[] args) { + String outputZipFullFilename = "/D:/a/b.zip"; + mergeZip(outputZipFullFilename, Arrays.asList("/D:/a.zip", "/D:/b.zip")); + } + + public enum FileCopyType { + PATH_TO_PATH, FILE_TO_PATH, FILE_TO_FILE + } + + public interface FileCopyProcessor { + + /** + * copyFileToFileProcess + * + * @param from,maybe directory + * @param to,maybe directory + * @param isFile,maybe directory or file + * @return boolean, if true keep going copy,only active in directory so + * far + */ + boolean copyFileToFileProcess(final String from, final String to, final boolean isFile); + + } + + public interface ZipProcessor { + + /** + * zip entry process + * + * @param zipEntryName + * @param inputStream + * @return InputStream + */ + InputStream zipEntryProcess(final String zipEntryName, InputStream inputStream); + } + + public interface CacheProcessor { + /** + * key process,can change key to save cache + * + * @param cacheKey + * @return String + */ + String keyProcess(final String key); + } + + public interface NoCacheFileProcessor { + /** + * process + * + * @param uncachedFileList + * @return boolean, true is save cache else false + */ + boolean process(List uncachedFileList); + } + + + public interface NoCacheFileFinder { + + /** + * find no cache file list + * + * @param cacheFileMapping + * @return List + */ + List findNoCacheFileList(Properties cacheFileMapping); + } + + public static class ZipEntryPath { + private String fullFilename = null; + private ZipEntry zipEntry = null; + private boolean replace = false; + + public ZipEntryPath(String fullFilename, ZipEntry zipEntry) { + this(fullFilename, zipEntry, false); + } + + public ZipEntryPath(String fullFilename, ZipEntry zipEntry, boolean replace) { + this.fullFilename = fullFilename; + this.zipEntry = zipEntry; + this.replace = replace; + } + } + + public static class FileUtilException extends RuntimeException { + private static final long serialVersionUID = 3884649425767533205L; + + public FileUtilException(Throwable cause) { + super(cause); + } + } + +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Generator.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Generator.java new file mode 100644 index 00000000..452349e3 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/Generator.java @@ -0,0 +1,76 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; + +public final class Generator { + + private static final char[] characters = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; + private static final String FONT_FAMILY_TIMES_NEW_ROMAN = "Times New Roman"; + + /** + * md5 file + * + * @param fullFilename + * @return String + */ + public static String md5File(String fullFilename) { + String result = null; + if (fullFilename != null) { + try { + result = md5File(new FileInputStream(fullFilename)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return result; + } + + /** + * md5 file + * + * @param inputStream + * @return String + */ + public static String md5File(final InputStream inputStream) { + String result = null; + if (inputStream != null) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] buffer = new byte[Constant.Capacity.BYTES_PER_KB]; + int readCount = 0; + while ((readCount = inputStream.read(buffer, 0, buffer.length)) != -1) { + md.update(buffer, 0, readCount); + } + result = StringUtil.byteToHexString(md.digest()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/JavaXmlUtil.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/JavaXmlUtil.java new file mode 100644 index 00000000..c6400b75 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/JavaXmlUtil.java @@ -0,0 +1,136 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import org.w3c.dom.Document; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +public final class JavaXmlUtil { + + /** + * get document builder + * + * @return DocumentBuilder + */ + private static DocumentBuilder getDocumentBuilder() { + DocumentBuilder documentBuilder = null; + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + try { + documentBuilder = documentBuilderFactory.newDocumentBuilder(); + } catch (Exception e) { + throw new JavaXmlUtilException(e); + } + return documentBuilder; + } + + public static Document getEmptyDocument() { + Document document = null; + try { + DocumentBuilder documentBuilder = getDocumentBuilder(); + document = documentBuilder.newDocument(); + document.normalize(); + } catch (Exception e) { + throw new JavaXmlUtilException(e); + } + return document; + } + + /** + * parse + * + * @param filename + * @return Document + */ + public static Document parse(final String filename) { + Document document = null; + try { + DocumentBuilder documentBuilder = getDocumentBuilder(); + document = documentBuilder.parse(new File(filename)); + document.normalize(); + } catch (Exception e) { + throw new JavaXmlUtilException(e); + } + return document; + } + + /** + * parse + * + * @param inputStream + * @return Document + */ + public static Document parse(final InputStream inputStream) { + Document document = null; + try { + DocumentBuilder documentBuilder = getDocumentBuilder(); + document = documentBuilder.parse(inputStream); + document.normalize(); + } catch (Exception e) { + throw new JavaXmlUtilException(e); + } + return document; + } + + /** + * save document + * + * @param document + * @param outputFullFilename + */ + public static void saveDocument(final Document document, final String outputFullFilename) { + OutputStream outputStream = null; + try { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + DOMSource domSource = new DOMSource(document); + transformer.setOutputProperty(OutputKeys.ENCODING, Constant.Encoding.UTF8); + outputStream = new FileOutputStream(outputFullFilename); + StreamResult result = new StreamResult(outputStream); + transformer.transform(domSource, result); + } catch (Exception e) { + throw new JavaXmlUtilException(e); + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (Exception e) { + throw new JavaXmlUtilException(e); + } + } + } + } + + public static class JavaXmlUtilException extends RuntimeException { + private static final long serialVersionUID = 4669527982017700891L; + + public JavaXmlUtilException(Throwable cause) { + super(cause); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ObjectUtil.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ObjectUtil.java new file mode 100644 index 00000000..ef7664a8 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ObjectUtil.java @@ -0,0 +1,118 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +/** + * reflect the object property and invoke the method + * + * @author Dandelion + * @since 2008-04-?? + */ +public final class ObjectUtil { + + private ObjectUtil() { + } + + /** + * when object is null return blank,when the object is not null it return object; + * + * @param object + * @return Object + */ + public static Object nullToBlank(Object object) { + if (object == null) { + return StringUtil.BLANK; + } + return object; + } + + /** + * equal + * + * @param a + * @param b + * @return boolean + */ + public static boolean equal(Object a, Object b) { + return a == b || (a != null && a.equals(b)); + } + + /** + * field name to method name + * + * @param methodPrefix + * @param fieldName + * @return methodName + */ + public static String fieldNameToMethodName(String methodPrefix, String fieldName) { + return fieldNameToMethodName(methodPrefix, fieldName, false); + } + + /** + * field name to method name + * + * @param methodPrefix + * @param fieldName + * @param ignoreFirstLetterCase + * @return methodName + */ + public static String fieldNameToMethodName(String methodPrefix, String fieldName, boolean ignoreFirstLetterCase) { + String methodName = null; + if (fieldName != null && fieldName.length() > 0) { + if (ignoreFirstLetterCase) { + methodName = methodPrefix + fieldName; + } else { + methodName = methodPrefix + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); + } + } else { + methodName = methodPrefix; + } + return methodName; + } + + /** + * method name to field name + * + * @param methodPrefix + * @param methodName + * @return fieldName + */ + public static String methodNameToFieldName(String methodPrefix, String methodName) { + return methodNameToFieldName(methodPrefix, methodName, false); + } + + /** + * method name to field name + * + * @param methodPrefix + * @param methodName + * @param ignoreFirstLetterCase + * @return fieldName + */ + public static String methodNameToFieldName(String methodPrefix, String methodName, boolean ignoreFirstLetterCase) { + String fieldName = null; + if (methodName != null && methodName.length() > methodPrefix.length()) { + int front = methodPrefix.length(); + if (ignoreFirstLetterCase) { + fieldName = methodName.substring(front, front + 1) + methodName.substring(front + 1); + } else { + fieldName = methodName.substring(front, front + 1).toLowerCase() + methodName.substring(front + 1); + } + } + return fieldName; + } +} \ No newline at end of file diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/PatchUtil.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/PatchUtil.java new file mode 100644 index 00000000..87f829f2 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/PatchUtil.java @@ -0,0 +1,198 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import com.tencent.tinker.build.aapt.RDotTxtEntry.IdType; +import com.tencent.tinker.build.aapt.RDotTxtEntry.RType; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class PatchUtil { + + /** + * read r txt + * + * @param rTxtFullFilename + * @return Map> + */ + public static Map> readRTxt(String rTxtFullFilename) { + //read base resource entry + Map> rTypeResourceMap = new HashMap>(); + if (StringUtil.isNotBlank(rTxtFullFilename) && FileUtil.isExist(rTxtFullFilename)) { + BufferedReader bufferedReader = null; + try { + final Pattern textSymbolLine = Pattern.compile("(\\S+) (\\S+) (\\S+) (.+)"); + bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(rTxtFullFilename))); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + Matcher matcher = textSymbolLine.matcher(line); + if (matcher.matches()) { + IdType idType = IdType.from(matcher.group(1)); + RType rType = RType.valueOf(matcher.group(2).toUpperCase()); + String name = matcher.group(3); + String idValue = matcher.group(4); + RDotTxtEntry rDotTxtEntry = new RDotTxtEntry(idType, rType, name, idValue); + Set hashSet = null; + if (rTypeResourceMap.containsKey(rType)) { + hashSet = rTypeResourceMap.get(rType); + } else { + hashSet = new HashSet(); + rTypeResourceMap.put(rType, hashSet); + } + hashSet.add(rDotTxtEntry); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + return rTypeResourceMap; + } + + /** + * generate public resource xml + * + * @param aaptResourceCollector + * @param outputIdsXmlFullFilename + * @param outputPublicXmlFullFilename + */ + public static void generatePublicResourceXml(AaptResourceCollector aaptResourceCollector, String outputIdsXmlFullFilename, String outputPublicXmlFullFilename) { + if (aaptResourceCollector == null) { + return; + } + FileUtil.createFile(outputIdsXmlFullFilename); + FileUtil.createFile(outputPublicXmlFullFilename); + PrintWriter idsWriter = null; + PrintWriter publicWriter = null; + try { + FileUtil.createFile(outputIdsXmlFullFilename); + FileUtil.createFile(outputPublicXmlFullFilename); + idsWriter = new PrintWriter(new FileOutputStream(outputIdsXmlFullFilename)); + publicWriter = new PrintWriter(new FileOutputStream(outputPublicXmlFullFilename)); + idsWriter.println(""); + publicWriter.println(""); + idsWriter.println(""); + publicWriter.println(""); + Map> map = aaptResourceCollector.getRTypeResourceMap(); + Iterator>> iterator = map.entrySet().iterator(); + while (iterator.hasNext()) { + Entry> entry = iterator.next(); + RType rType = entry.getKey(); + if (!rType.equals(RType.STYLEABLE)) { + Set set = entry.getValue(); + for (RDotTxtEntry rDotTxtEntry : set) { + if (rType.equals(RType.STYLE)) { + String rawName = aaptResourceCollector.getRawName(rDotTxtEntry.name); + if (StringUtil.isBlank(rawName)) { + System.err.println("Blank?" + rDotTxtEntry.name); + rawName = rDotTxtEntry.name; + } + publicWriter.println(""); + } else { + publicWriter.println(""); + } + } + Set ignoreIdSet = aaptResourceCollector.getIgnoreIdSet(); + for (RDotTxtEntry rDotTxtEntry : set) { + if (rType.equals(RType.ID) && !ignoreIdSet.contains(rDotTxtEntry.name)) { + idsWriter.println(""); + } else if (rType.equals(RType.STYLE)) { + + if (rDotTxtEntry.name.indexOf(Constant.Symbol.UNDERLINE) > 0) { +//idsWriter.println(""); + } + } + } + } + idsWriter.flush(); + publicWriter.flush(); + } + idsWriter.println(""); + publicWriter.println(""); + } catch (Exception e) { + throw new PatchUtilException(e); + } finally { + if (idsWriter != null) { + idsWriter.flush(); + idsWriter.close(); + } + if (publicWriter != null) { + publicWriter.flush(); + publicWriter.close(); + } + } + } + + public static class PublicResourceEntry { + private RType rType = null; + private String resourceName = null; + + public PublicResourceEntry(RType rType, String resourceName) { + this.rType = rType; + this.resourceName = resourceName; + } + + public boolean equals(Object obj) { + if (!(obj instanceof PublicResourceEntry)) { + return false; + } + PublicResourceEntry that = (PublicResourceEntry) obj; + return ObjectUtil.equal(this.rType, that.rType) && ObjectUtil.equal(this.resourceName, that.resourceName); + } + + public int hashCode() { + return Arrays.hashCode(new Object[]{this.rType, this.resourceName}); + } + } + + public static class PatchUtilException extends RuntimeException { + private static final long serialVersionUID = 5982003304074821184L; + + public PatchUtilException(String message) { + super(message); + } + + public PatchUtilException(Throwable cause) { + super(cause); + } + + public PatchUtilException(String message, Throwable cause) { + super(message, cause); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/RDotTxtEntry.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/RDotTxtEntry.java new file mode 100644 index 00000000..11e43aa8 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/RDotTxtEntry.java @@ -0,0 +1,146 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import com.google.common.base.Function; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.ComparisonChain; + +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Represents a row from a symbols file generated by {@code aapt}. + */ +public class RDotTxtEntry implements Comparable { + + private static final Pattern TEXT_SYMBOLS_LINE = Pattern.compile("(\\S+) (\\S+) (\\S+) (.+)"); + public static final Function TO_ENTRY = new Function() { + public RDotTxtEntry apply(String input) { + Optional entry = parse(input); + Preconditions.checkNotNull(entry.isPresent(), "Could not parse R.txt entry: '%s'", input); + return entry.get(); + } + }; + // A symbols file may look like: + // + // int id placeholder 0x7f020000 + // int string debug_http_proxy_dialog_title 0x7f030004 + // int string debug_http_proxy_hint 0x7f030005 + // int string debug_http_proxy_summary 0x7f030003 + // int string debug_http_proxy_title 0x7f030002 + // int string debug_ssl_cert_check_summary 0x7f030001 + // int string debug_ssl_cert_check_title 0x7f030000 + // + // Note that there are four columns of information: + // - the type of the resource id (always seems to be int or int[], in + // practice) + // - the type of the resource + // - the name of the resource + // - the value of the resource id + public final IdType idType; + public final RType type; + public final String name; + public String idValue; + public RDotTxtEntry(IdType idType, RType type, String name, String idValue) { + this.idType = Preconditions.checkNotNull(idType); + this.type = Preconditions.checkNotNull(type); + this.name = Preconditions.checkNotNull(name); + this.idValue = Preconditions.checkNotNull(idValue); + } + + public static Optional parse(String rDotTxtLine) { + Matcher matcher = TEXT_SYMBOLS_LINE.matcher(rDotTxtLine); + if (!matcher.matches()) { + return Optional.absent(); + } + + IdType idType = IdType.from(matcher.group(1)); + RType type = RType.valueOf(matcher.group(2).toUpperCase()); + String name = matcher.group(3); + String idValue = matcher.group(4); + + return Optional.of(new RDotTxtEntry(idType, type, name, idValue)); + } + + public RDotTxtEntry copyWithNewIdValue(String newIdValue) { + return new RDotTxtEntry(idType, type, name, newIdValue); + } + + /** + * A collection of Resources should be sorted such that Resources of the + * same type should be grouped together, and should be alphabetized within + * that group. + */ + public int compareTo(RDotTxtEntry that) { + return ComparisonChain.start().compare(this.type, that.type).compare(this.name, that.name).result(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof RDotTxtEntry)) { + return false; + } + + RDotTxtEntry that = (RDotTxtEntry) obj; + return Objects.equal(this.type, that.type) && Objects.equal(this.name, that.name); + } + + @Override + public int hashCode() { + return Arrays.hashCode(new Object[]{type, name}); + } + + @Override + public String toString() { + return Objects.toStringHelper(RDotTxtEntry.class).add("idType", idType).add("type", type).add("name", name).add("idValue", idValue).toString(); + } + + // Taken from http://developer.android.com/reference/android/R.html + // TRANSITION for api level 19 + public enum RType { + ANIM, ANIMATOR, ARRAY, ATTR, BOOL, COLOR, DIMEN, DRAWABLE, FRACTION, ID, INTEGER, INTERPOLATOR, LAYOUT, MENU, MIPMAP, PLURALS, RAW, STRING, STYLE, STYLEABLE, TRANSITION, XML; + + @Override + public String toString() { + return super.toString().toLowerCase(); + } + } + + public enum IdType { + INT, INT_ARRAY; + + public static IdType from(String raw) { + if (raw.equals("int")) { + return INT; + } else if (raw.equals("int[]")) { + return INT_ARRAY; + } + throw new IllegalArgumentException(String.format("'%s' is not a valid ID type.", raw)); + } + + public String toString() { + if (this.equals(INT)) { + return "int"; + } + return "int[]"; + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceDirectory.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceDirectory.java new file mode 100644 index 00000000..246ea2c1 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceDirectory.java @@ -0,0 +1,46 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class ResourceDirectory { + + public String directoryName = null; + public String resourceFullFilename = null; + public Set resourceEntrySet = new HashSet(); + + public ResourceDirectory(String directoryName, String resourceFullFilename) { + this.directoryName = directoryName; + this.resourceFullFilename = resourceFullFilename; + } + + public int hashCode() { + return Arrays.hashCode(new Object[]{this.directoryName, this.resourceFullFilename}); + } + + + public boolean equals(Object object) { + if (!(object instanceof ResourceDirectory)) { + return false; + } + ResourceDirectory that = (ResourceDirectory) object; + return ObjectUtil.equal(this.directoryName, that.directoryName) && ObjectUtil.equal(this.resourceFullFilename, that.resourceFullFilename); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceEntry.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceEntry.java new file mode 100644 index 00000000..9977be41 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/ResourceEntry.java @@ -0,0 +1,43 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import java.util.Arrays; + +public class ResourceEntry { + + public String name = null; + public String value = null; + + public ResourceEntry(String name, String value) { + this.name = name; + this.value = value; + } + + public int hashCode() { + return Arrays.hashCode(new Object[]{this.name}); + } + + + public boolean equals(Object object) { + if (!(object instanceof ResourceEntry)) { + return false; + } + ResourceEntry that = (ResourceEntry) object; + return ObjectUtil.equal(this.name, that.name); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/StringUtil.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/StringUtil.java new file mode 100644 index 00000000..2ffab31f --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/aapt/StringUtil.java @@ -0,0 +1,328 @@ +/* + * Copyright 2014-present Facebook, Inc. + * + * 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.build.aapt; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class StringUtil { + + public static final String BLANK = ""; + public static final String SPACE = " "; + public static final String NULL = "null"; + public static final String CRLF_STRING = "\r\n"; + public static final byte CR = '\r'; + public static final byte LF = '\n'; + public static final byte[] CRLF = {CR, LF}; + private static final String METCH_PATTERN_REGEX = "[\\*]+"; + private static final String METCH_PATTERN = Constant.Symbol.WILDCARD; + private static final String METCH_PATTERN_REPLACEMENT = "[\\\\S|\\\\s]*"; + private static final String ZERO = "0"; + + private StringUtil() { + } + + /** + * when string is null return blank,where the string is not null it return string.trim + * + * @param string + * @return String + */ + public static String trim(final String string) { + String result = null; + if (string == null) { + result = BLANK; + } else { + result = string.trim(); + } + return result; + } + + /** + * when string is null return blank string + * + * @param string + * @return String + */ + public static String nullToBlank(final String string) { + return string == null ? BLANK : string; + } + + /** + * when string[] is null return blank array + * + * @param stringArray + * @return String[]{} length==0 + */ + public static String[] nullToBlank(final String[] stringArray) { + String[] result = stringArray; + if (stringArray == null) { + result = new String[]{}; + } + return result; + } + + /** + *

    Checks if a String is whitespace, empty ("") or null.

    + *

    + *

    +     * StringUtils.isBlank(null)      = true
    +     * StringUtils.isBlank("")        = true
    +     * StringUtils.isBlank(" ")       = true
    +     * StringUtils.isBlank("bob")     = false
    +     * StringUtils.isBlank("  bob  ") = false
    +     * 
    + * + * @param string the String to check, may be null + * @return true if the String is null, empty or whitespace + */ + public static boolean isBlank(final String string) { + boolean result = false; + int strLen; + if (string == null || (strLen = string.length()) == 0) { + result = true; + } else { + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(string.charAt(i))) { + result = false; + break; + } + } + } + return result; + } + + /** + *

    + * Checks if a String is not empty (""), not null and not whitespace only. + *

    + *

    + *

    +     * StringUtils.isNotBlank(null)      = false
    +     * StringUtils.isNotBlank("")        = false
    +     * StringUtils.isNotBlank(" ")       = false
    +     * StringUtils.isNotBlank("bob")     = true
    +     * StringUtils.isNotBlank("  bob  ") = true
    +     * 
    + * + * @param string the String to check, may be null + * @return true if the String is not empty and not null and + * not whitespace + */ + public static boolean isNotBlank(final String string) { + return !isBlank(string); + } + + /** + * compare stringArray1 and stringArray2 return the different in str1 + * + * @param stringArray1 + * @param stringArray2 + * @return String[] + */ + public static String[] compareString(final String[] stringArray1, final String[] stringArray2) { + String[] differentString = null; + if (stringArray1 != null && stringArray2 != null) { + List list = new ArrayList(); + for (int i = 0; i < stringArray1.length; i++) { + boolean sign = false; + for (int j = 0; j < stringArray2.length; j++) { + if (stringArray1[i].equals(stringArray2[j])) { + sign = true; + break; + } + } + if (!sign) { + list.add(stringArray1[i]); + } + } + differentString = new String[list.size()]; + differentString = list.toArray(differentString); + } + return differentString; + } + + /** + *

    Method:only for '*' match pattern,return true of false

    + * + * @param string + * @param patternString + * @return boolean + */ + public static boolean isMatchPattern(final String string, final String patternString) { + boolean result = false; + if (string != null && patternString != null) { + if (patternString.indexOf(METCH_PATTERN) >= 0) { + String matchPattern = Constant.Symbol.XOR + patternString.replaceAll(METCH_PATTERN_REGEX, METCH_PATTERN_REPLACEMENT) + Constant.Symbol.DOLLAR; + result = isMatchRegex(string, matchPattern); + } else { + if (string.equals(patternString)) { + result = true; + } + } + } + return result; + } + + /** + *

    Method:only for regex

    + * + * @param string + * @param regex + * @return boolean + */ + public static boolean isMatchRegex(final String string, final String regex) { + boolean result = false; + if (string != null && regex != null) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(string); + result = matcher.find(); + } + return result; + } + + /** + *

    Method:only for regex,parse regex group when regex include group

    + * + * @param string + * @param regex + * @return List + */ + public static List parseRegexGroup(final String string, final String regex) { + List groupList = null; + if (string != null && regex != null) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(string); + int groupCount = matcher.groupCount(); + int count = 1; + groupList = new ArrayList(); + if (matcher.find()) { + while (count <= groupCount) { + groupList.add(matcher.group(count)); + count++; + } + } + } + return groupList; + } + + /** + *

    + * Method: check the string match the regex or not and return the match + * field value + * like {xxxx} can find xxxx + *

    + * + * @param string + * @param regex + * @param firstRegex + * @param firstRegexReplace + * @param lastRegexStringLength like {xxxx},last regex string is "}" so last regex string length equals 1 + * @return List + */ + public static List parseStringGroup(final String string, final String regex, final String firstRegex, final String firstRegexReplace, final int lastRegexStringLength) { + List list = null; + if (string != null) { + list = new ArrayList(); + int lastRegexLength = lastRegexStringLength < 0 ? 0 : lastRegexStringLength; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(string); + String group = null; + int start = 0; + while (matcher.find(start)) { + start = matcher.end(); + group = matcher.group(); + group = group.replaceFirst(firstRegex, firstRegexReplace); + group = group.substring(0, group.length() - lastRegexLength); + list.add(group); + } + } + return list; + } + + /** + * byte to hex string + * + * @param byteArray + * @return String + */ + public static String byteToHexString(byte[] byteArray) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < byteArray.length; i++) { + int byteCode = byteArray[i] & 0xFF; + if (byteCode < 0x10) { + builder.append(0); + } + builder.append(Integer.toHexString(byteCode)); + } + return builder.toString(); + } + + /** + * hex string to byte + * + * @param source + * @return byte + */ + public static byte[] hexStringToByte(final String source) { + byte[] bytes = null; + if (source != null) { + bytes = new byte[source.length() / 2]; + int i = 0; + while (i < bytes.length) { + bytes[i] = (byte) (Integer.parseInt(source.substring(i * 2, (i + 1) * 2), 16)); + i++; + } + } + return bytes; + } + + /** + * fill zero + * + * @param length + * @return String + */ + public static String fillZero(int length) { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < length; i++) { + stringBuilder.append(ZERO); + } + return stringBuilder.toString(); + } + + /** + *

    Method: string mod operator,return 0~(mod-1)

    + * + * @param string + * @param mod + * @return int + */ + public static int stringMod(String string, int mod) { + int hashCode = 0; + if (string != null) { + hashCode = string.hashCode(); + if (hashCode < 0) { + hashCode = Math.abs(hashCode); + hashCode = hashCode < 0 ? 0 : hashCode; + } + } + return hashCode % (mod > 0 ? mod : 1); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/apkparser/AndroidManifest.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/apkparser/AndroidManifest.java new file mode 100644 index 00000000..ea63940f --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/apkparser/AndroidManifest.java @@ -0,0 +1,142 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.apkparser; + +import net.dongliu.apk.parser.ApkParser; +import net.dongliu.apk.parser.bean.ApkMeta; +import net.dongliu.apk.parser.exception.ParserException; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +/** + * Created by zhangshaowen on 16/5/5. + */ +public class AndroidManifest { + public static final int TYPE_SERVICE = 1; + public static final int TYPE_ACTIVITY = 2; + public static final int TYPE_BROADCAST_RECEIVER = 3; + public static final int TYPE_CONTENT_PROVIDER = 4; + + public final List activities = new ArrayList<>(); + public final List receivers = new ArrayList<>(); + public final List services = new ArrayList<>(); + public final List providers = new ArrayList<>(); + public final ApkMeta apkMeta; + public final String xml; + + public final HashMap metaDatas = new HashMap<>(); + + + public AndroidManifest(ApkMeta apkMeta, String xml) throws ParserException { + this.apkMeta = apkMeta; + this.xml = xml; + parse(); + } + + public static AndroidManifest getAndroidManifest(File file) throws IOException, ParseException { + ApkParser apkParser = new ApkParser(file); + AndroidManifest androidManifest = new AndroidManifest(apkParser.getApkMeta(), apkParser.getManifestXml()); + return androidManifest; + } + + private static String getAttribute(NamedNodeMap namedNodeMap, String name) { + Node node = namedNodeMap.getNamedItem(name); + if (node == null) { + if (name.startsWith("android:")) { + name = name.substring("android:".length()); + } + node = namedNodeMap.getNamedItem(name); + if (node == null) { + return null; + } + } + return node.getNodeValue(); + } + + /** + * @return a list of all components + */ + public List getComponents() { + List components = new ArrayList<>(); + components.addAll(activities); + components.addAll(services); + components.addAll(receivers); + components.addAll(providers); + return components; + } + + private void parse() throws ParserException { + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + Document document; + try { + DocumentBuilder builder = builderFactory.newDocumentBuilder(); + document = builder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8"))); + Node manifestNode = document.getElementsByTagName("manifest").item(0); + NodeList nodes = manifestNode.getChildNodes(); + for (int i = 0; i < nodes.getLength(); i++) { + Node node = nodes.item(i); + String nodeName = node.getNodeName(); + if (nodeName.equals("application")) { + NodeList children = node.getChildNodes(); + for (int j = 0; j < children.getLength(); j++) { + Node child = children.item(j); + String childName = child.getNodeName(); + switch (childName) { + case "service": + services.add(getAndroidComponent(child, TYPE_SERVICE)); + break; + case "activity": + activities.add(getAndroidComponent(child, TYPE_ACTIVITY)); + break; + case "receiver": + receivers.add(getAndroidComponent(child, TYPE_BROADCAST_RECEIVER)); + break; + case "provider": + providers.add(getAndroidComponent(child, TYPE_CONTENT_PROVIDER)); + break; + case "meta-data": + NamedNodeMap attributes = child.getAttributes(); + metaDatas.put(getAttribute(attributes, "android:name"), getAttribute(attributes, "android:value")); + break; + } + } + } + } + } catch (Exception e) { + throw new ParserException("Error parsing AndroidManifest.xml", e); + } + } + + private String getAndroidComponent(Node node, int type) { + NamedNodeMap attributes = node.getAttributes(); + return getAttribute(attributes, "android:name"); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/builder/PatchBuilder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/builder/PatchBuilder.java new file mode 100644 index 00000000..df530e96 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/builder/PatchBuilder.java @@ -0,0 +1,157 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.builder; + + +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.FileOperation; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.TypedValue; + +import java.io.File; +import java.io.IOException; + +/** + * @author zhangshaowen + */ +public class PatchBuilder { + private static final String PATCH_NAME = "patch"; + private final Configuration config; + private File unSignedApk; + private File signedApk; + private File signedWith7ZipApk; + private File sevenZipOutPutDir; + + public PatchBuilder(Configuration config) { + this.config = config; + this.unSignedApk = new File(config.mOutFolder, PATCH_NAME + "_unsigned.apk"); + this.signedApk = new File(config.mOutFolder, PATCH_NAME + "_signed.apk"); + this.signedWith7ZipApk = new File(config.mOutFolder, PATCH_NAME + "_signed_7zip.apk"); + this.sevenZipOutPutDir = new File(config.mOutFolder, TypedValue.OUT_7ZIP_FILE_PATH); + } + + public void buildPatch() throws IOException, InterruptedException { + final File resultDir = config.mTempResultDir; + if (!resultDir.exists()) { + throw new IOException(String.format( + "Missing patch unzip files, path=%s\n", resultDir.getAbsolutePath())); + } + //no file change + if (resultDir.listFiles().length == 0) { + return; + } + generalUnsignedApk(unSignedApk); + signApk(unSignedApk, signedApk); + + use7zApk(signedApk, signedWith7ZipApk, sevenZipOutPutDir); + + if (!signedApk.exists()) { + Logger.e("Result: final unsigned patch result: %s, size=%d", unSignedApk.getAbsolutePath(), unSignedApk.length()); + } else { + long length = signedApk.length(); + Logger.e("Result: final signed patch result: %s, size=%d", signedApk.getAbsolutePath(), length); + if (signedWith7ZipApk.exists()) { + long length7zip = signedWith7ZipApk.length(); + Logger.e("Result: final signed with 7zip patch result: %s, size=%d", signedWith7ZipApk.getAbsolutePath(), length7zip); + if (length7zip > length) { + Logger.e("Warning: %s is bigger than %s %d byte, you should choose %s at these time!", + signedWith7ZipApk.getName(), + signedApk.getName(), + (length7zip - length), + signedApk.getName()); + } + } + } + + } + + /** + * @param input unsigned file input + * @param output signed file output + * @throws IOException + * @throws InterruptedException + */ + private void signApk(File input, File output) throws IOException, InterruptedException { + //sign apk + if (config.mUseSignAPk) { + Logger.d("Signing apk: %s", output.getName()); + if (output.exists()) { + output.delete(); + } + String cmd = "jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore " + config.mSignatureFile + + " -storepass " + config.mStorePass + + " -keypass " + config.mKeyPass + + " -signedjar " + output.getAbsolutePath() + + " " + input.getAbsolutePath() + + " " + config.mStoreAlias; + Process pro = Runtime.getRuntime().exec(cmd); + //destroy the stream + pro.waitFor(); + pro.destroy(); + + if (!output.exists()) { + throw new IOException("Can't Generate signed APK. Please check your sign info is correct."); + } + } + } + + /** + * @param output unsigned apk file output + * @throws IOException + */ + private void generalUnsignedApk(File output) throws IOException { + Logger.d("General unsigned apk: %s", output.getName()); + final File tempOutDir = config.mTempResultDir; + if (!tempOutDir.exists()) { + throw new IOException(String.format( + "Missing patch unzip files, path=%s\n", tempOutDir.getAbsolutePath())); + } + FileOperation.zipInputDir(tempOutDir, output); + + if (!output.exists()) { + throw new IOException(String.format( + "can not found the unsigned apk file path=%s", + output.getAbsolutePath())); + } + } + + private void use7zApk(File inputSignedFile, File out7zipFile, File tempFilesDir) throws IOException { + if (!config.mUseSignAPk) { + return; + } + if (!inputSignedFile.exists()) { + throw new IOException( + String.format("can not found the signed apk file to 7z, if you want to use 7z, " + + "you must fill the sign data in the config file path=%s", inputSignedFile.getAbsolutePath()) + ); + } + Logger.d("Try use 7za to compress the patch file: %s, will cost much more time", out7zipFile.getName()); + Logger.d("Current 7za path:%s", config.mSevenZipPath); + + FileOperation.unZipAPk(inputSignedFile.getAbsolutePath(), tempFilesDir.getAbsolutePath()); + //7zip may not enable + if (!FileOperation.sevenZipInputDir(tempFilesDir, out7zipFile, config)) { + return; + } + FileOperation.deleteDir(tempFilesDir); + if (!out7zipFile.exists()) { + throw new IOException(String.format( + "[use7zApk]7z repackage signed apk fail,you must install 7z command line version first, linux: p7zip, window: 7za, path=%s", + out7zipFile.getAbsolutePath())); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ApkDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ApkDecoder.java new file mode 100644 index 00000000..679f3e2f --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ApkDecoder.java @@ -0,0 +1,208 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + + +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.FileOperation; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.MD5; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; +import com.tencent.tinker.build.util.Utils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; + +/** + * Created by zhangshaowen on 16/3/15. + */ +public class ApkDecoder extends BaseDecoder { + private final File mOldApkDir; + private final File mNewApkDir; + + private final ManifestDecoder manifestDecoder; + private final UniqueDexDiffDecoder dexPatchDecoder; + private final BsDiffDecoder soPatchDecoder; + private final ResDiffDecoder resPatchDecoder; + + /** + * if resource's file is also contain in dex or library pattern, + * they won't change in new resources' apk, and we will just warn you. + */ + ArrayList resDuplicateFiles; + + public ApkDecoder(Configuration config) throws IOException { + super(config); + this.mNewApkDir = config.mTempUnzipNewDir; + this.mOldApkDir = config.mTempUnzipOldDir; + + this.manifestDecoder = new ManifestDecoder(config); + + //put meta files in assets + String prePath = TypedValue.FILE_ASSETS + File.separator; + dexPatchDecoder = new UniqueDexDiffDecoder(config, prePath + TypedValue.DEX_META_FILE, TypedValue.DEX_LOG_FILE); + soPatchDecoder = new BsDiffDecoder(config, prePath + TypedValue.SO_META_FILE, TypedValue.SO_LOG_FILE); + resPatchDecoder = new ResDiffDecoder(config, prePath + TypedValue.RES_META_TXT, TypedValue.RES_LOG_FILE); + resDuplicateFiles = new ArrayList<>(); + } + + private void unzipApkFile(File file, File destFile) throws TinkerPatchException, IOException { + String apkName = file.getName(); + if (!apkName.endsWith(TypedValue.FILE_APK)) { + throw new TinkerPatchException( + String.format("input apk file path must end with .apk, yours %s\n", apkName) + ); + } + + String destPath = destFile.getAbsolutePath(); + Logger.d("UnZipping apk to %s", destPath); + FileOperation.unZipAPk(file.getAbsoluteFile().getAbsolutePath(), destPath); + + } + + private void unzipApkFiles(File oldFile, File newFile) throws IOException, TinkerPatchException { + unzipApkFile(oldFile, this.mOldApkDir); + unzipApkFile(newFile, this.mNewApkDir); + } + + private void writeToLogFile(File oldFile, File newFile) throws IOException { + String line1 = "old apk: " + oldFile.getName() + ", size=" + FileOperation.getFileSizes(oldFile) + ", md5=" + MD5.getMD5(oldFile); + String line2 = "new apk: " + newFile.getName() + ", size=" + FileOperation.getFileSizes(newFile) + ", md5=" + MD5.getMD5(newFile); + Logger.d("Analyze old and new apk files:"); + Logger.d(line1); + Logger.d(line2); + Logger.d(""); + } + + @Override + public void onAllPatchesStart() throws IOException, TinkerPatchException { + manifestDecoder.onAllPatchesStart(); + dexPatchDecoder.onAllPatchesStart(); + soPatchDecoder.onAllPatchesStart(); + resPatchDecoder.onAllPatchesStart(); + } + + public boolean patch(File oldFile, File newFile) throws Exception { + writeToLogFile(oldFile, newFile); + //check manifest change first + manifestDecoder.patch(oldFile, newFile); + + unzipApkFiles(oldFile, newFile); + + Files.walkFileTree(mNewApkDir.toPath(), new ApkFilesVisitor(config, mNewApkDir.toPath(), mOldApkDir.toPath(), dexPatchDecoder, soPatchDecoder, resPatchDecoder)); + + //get all duplicate resource file + for (File duplicateRes : resDuplicateFiles) { +// resPatchDecoder.patch(duplicateRes, null); + Logger.e("Warning: res file %s is also match at dex or library pattern, " + + "we treat it as unchanged in the new resource_out.zip", getRelativeStringByOldDir(duplicateRes)); + } + + soPatchDecoder.onAllPatchesEnd(); + dexPatchDecoder.onAllPatchesEnd(); + manifestDecoder.onAllPatchesEnd(); + resPatchDecoder.onAllPatchesEnd(); + + //clean resources + dexPatchDecoder.clean(); + soPatchDecoder.clean(); + resPatchDecoder.clean(); + return true; + } + + @Override + public void onAllPatchesEnd() throws IOException, TinkerPatchException { + } + + class ApkFilesVisitor extends SimpleFileVisitor { + BaseDecoder dexDecoder; + BaseDecoder soDecoder; + BaseDecoder resDecoder; + Configuration config; + Path newApkPath; + Path oldApkPath; + + ApkFilesVisitor(Configuration config, Path newPath, Path oldPath, BaseDecoder dex, BaseDecoder so, BaseDecoder resDecoder) { + this.config = config; + this.dexDecoder = dex; + this.soDecoder = so; + this.resDecoder = resDecoder; + this.newApkPath = newPath; + this.oldApkPath = oldPath; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + + Path relativePath = newApkPath.relativize(file); + + Path oldPath = oldApkPath.resolve(relativePath); + + File oldFile = null; + //is a new file?! + if (oldPath.toFile().exists()) { + oldFile = oldPath.toFile(); + } + String patternKey = relativePath.toString().replace("\\", "/"); + + if (Utils.checkFileInPattern(config.mDexFilePattern, patternKey)) { + //also treat duplicate file as unchanged + if (Utils.checkFileInPattern(config.mResFilePattern, patternKey) && oldFile != null) { + resDuplicateFiles.add(oldFile); + } + + try { + dexDecoder.patch(oldFile, file.toFile()); + } catch (Exception e) { +// e.printStackTrace(); + throw new RuntimeException(e); + } + return FileVisitResult.CONTINUE; + } + if (Utils.checkFileInPattern(config.mSoFilePattern, patternKey)) { + //also treat duplicate file as unchanged + if (Utils.checkFileInPattern(config.mResFilePattern, patternKey) && oldFile != null) { + resDuplicateFiles.add(oldFile); + } + try { + soDecoder.patch(oldFile, file.toFile()); + } catch (Exception e) { +// e.printStackTrace(); + throw new RuntimeException(e); + } + return FileVisitResult.CONTINUE; + } + if (Utils.checkFileInPattern(config.mResFilePattern, patternKey)) { + try { + resDecoder.patch(oldFile, file.toFile()); + } catch (Exception e) { +// e.printStackTrace(); + throw new RuntimeException(e); + } + return FileVisitResult.CONTINUE; + } + return FileVisitResult.CONTINUE; + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BaseDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BaseDecoder.java new file mode 100644 index 00000000..d6550847 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BaseDecoder.java @@ -0,0 +1,90 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.TinkerPatchException; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; + +/** + * Created by zhangshaowen on 16/2/28. + */ +public abstract class BaseDecoder { + + protected final Configuration config; + protected final File outDir; + + protected final File resultDir; + + + public BaseDecoder(Configuration config) throws IOException { + this.config = config; + this.outDir = new File(config.mOutFolder); + + this.resultDir = config.mTempResultDir; + + } + + public Configuration getConfig() { + return config; + } + + + protected void clean() { + } + + public Path getRelativePath(File file) { + return config.mTempUnzipNewDir.toPath().relativize(file.toPath()); + } + + public Path getOutputPath(File file) { + return config.mTempResultDir.toPath().resolve(getRelativePath(file)); + } + + public String getRelativeString(File file) { + return config.mTempUnzipNewDir.toPath().relativize(file.toPath()).toString().replace("\\", "/"); + } + + public String getParentRelativeString(File file) { + return config.mTempUnzipNewDir.toPath().relativize(file.getParentFile().toPath()).toString().replace("\\", "/"); + } + + public String getRelativeStringByOldDir(File file) { + return config.mTempUnzipOldDir.toPath().relativize(file.toPath()).toString().replace("\\", "/"); + } + + public String getParentRelativeStringByOldDir(File file) { + return config.mTempUnzipOldDir.toPath().relativize(file.getParentFile().toPath()).toString().replace("\\", "/"); + } + + /** + * 就算前后两个文件都是一样,也会交到这个文件夹 + * + * @param oldFile 如果oldfile 为空,代表这是一个新的文件 + * @param newFile + * @throws IOException + * @throws TinkerPatchException + */ + abstract public boolean patch(File oldFile, File newFile) throws Exception; + + abstract public void onAllPatchesStart() throws Exception; + + abstract public void onAllPatchesEnd() throws Exception; +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BsDiffDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BsDiffDecoder.java new file mode 100644 index 00000000..48e27930 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/BsDiffDecoder.java @@ -0,0 +1,150 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + +import com.tencent.tinker.bsdiff.BSDiff; +import com.tencent.tinker.build.info.InfoWriter; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.FileOperation; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.MD5; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.Utils; + +import java.io.File; +import java.io.IOException; + +/** + * Created by zhangshaowen on 16/2/27. + */ +public class BsDiffDecoder extends BaseDecoder { + private final InfoWriter logWriter; + private final InfoWriter metaWriter; + + public BsDiffDecoder(Configuration config, String metaPath, String logPath) throws IOException { + super(config); + + if (metaPath != null) { + metaWriter = new InfoWriter(config, config.mTempResultDir + File.separator + metaPath); + } else { + metaWriter = null; + } + + if (logPath != null) { + logWriter = new InfoWriter(config, config.mOutFolder + File.separator + logPath); + } else { + logWriter = null; + } + } + + @Override + public void clean() { + logWriter.close(); + metaWriter.close(); + } + + @Override + public boolean patch(File oldFile, File newFile) throws IOException, TinkerPatchException { + //first of all, we should check input files + if (newFile == null || !newFile.exists()) { + return false; + } + //new add file + String newMd5 = MD5.getMD5(newFile); + File bsDiffFile = getOutputPath(newFile).toFile(); + + if (oldFile == null || !oldFile.exists()) { + FileOperation.copyFileUsingStream(newFile, bsDiffFile); + writeLogFiles(newFile, null, null, newMd5); + return true; + } + + //both file length is 0 + if (oldFile.length() == 0 && newFile.length() == 0) { + return false; + } + if (oldFile.length() == 0 || newFile.length() == 0) { + FileOperation.copyFileUsingStream(newFile, bsDiffFile); + writeLogFiles(newFile, null, null, newMd5); + return true; + } + + //new add file + String oldMd5 = MD5.getMD5(oldFile); + + if (oldMd5.equals(newMd5)) { + return false; + } + + if (!bsDiffFile.getParentFile().exists()) { + bsDiffFile.getParentFile().mkdirs(); + } + BSDiff.bsdiff(oldFile, newFile, bsDiffFile); + + if (Utils.checkBsDiffFileSize(bsDiffFile, newFile)) { + writeLogFiles(newFile, oldFile, bsDiffFile, newMd5); + } else { + FileOperation.copyFileUsingStream(newFile, bsDiffFile); + writeLogFiles(newFile, null, null, newMd5); + } + return true; + } + + @Override + public void onAllPatchesStart() throws IOException, TinkerPatchException { + + } + + @Override + public void onAllPatchesEnd() throws IOException, TinkerPatchException { + + } + + protected void writeLogFiles(File newFile, File oldFile, File bsDiff, String newMd5) throws IOException { + if (metaWriter == null && logWriter == null) { + return; + } + String parentRelative = getParentRelativeString(newFile); + String relative = getRelativeString(newFile); + + if (metaWriter != null) { + String fileName = newFile.getName(); + + String meta; + if (bsDiff == null || oldFile == null) { + meta = fileName + "," + parentRelative + "," + newMd5 + "," + 0 + "," + 0; + } else { + String oldCrc = FileOperation.getZipEntryCrc(config.mOldApkFile, relative); + if (oldCrc == null || oldCrc.equals("0")) { + throw new TinkerPatchException( + String.format("can't find zipEntry %s from old apk file %s", relative, config.mOldApkFile.getPath()) + ); + } + meta = fileName + "," + parentRelative + "," + newMd5 + "," + oldCrc + "," + MD5.getMD5(bsDiff); + } + Logger.d("BsDiffDecoder:write meta file data: %s", meta); + metaWriter.writeLineToInfoFile(meta); + } + + if (logWriter != null) { + String log = relative + ", oldSize=" + FileOperation.getFileSizes(oldFile) + ", newSize=" + + FileOperation.getFileSizes(newFile) + ", diffSize=" + FileOperation.getFileSizes(bsDiff); + + logWriter.writeLineToInfoFile(log); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/DexDiffDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/DexDiffDecoder.java new file mode 100644 index 00000000..c96a4830 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/DexDiffDecoder.java @@ -0,0 +1,685 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + + +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.DexFormat; +import com.tencent.tinker.android.dx.util.Hex; +import com.tencent.tinker.build.dexpatcher.DexPatchGenerator; +import com.tencent.tinker.build.dexpatcher.util.SmallDexPatchGenerator; +import com.tencent.tinker.build.info.InfoWriter; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.DexClassesComparator; +import com.tencent.tinker.build.util.DexClassesComparator.DexClassInfo; +import com.tencent.tinker.build.util.DexClassesComparator.DexGroup; +import com.tencent.tinker.build.util.ExcludedClassModifiedChecker; +import com.tencent.tinker.build.util.FileOperation; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.MD5; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; +import com.tencent.tinker.build.util.Utils; +import com.tencent.tinker.commons.dexpatcher.DexPatchApplier; +import com.tencent.tinker.commons.dexpatcher.DexPatcherLogger.IDexPatcherLogger; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.jar.JarFile; +import java.util.zip.ZipEntry; + +/** + * Created by zhangshaowen on 2016/3/23. + */ +public class DexDiffDecoder extends BaseDecoder { + private static final String TEST_DEX_PATH = "test.dex"; + private final InfoWriter logWriter; + private final InfoWriter metaWriter; + + private final ExcludedClassModifiedChecker excludedClassModifiedChecker; + + private final Map addedClassDescToDexNameMap; + private final Map deletedClassDescToDexNameMap; + + private final List> oldAndNewDexFilePairList; + + private final Map dexNameToRelatedInfoMap; + private boolean hasDexChanged = false; + private DexPatcherLoggerBridge dexPatcherLoggerBridge = null; + + public DexDiffDecoder(Configuration config, String metaPath, String logPath) throws IOException { + super(config); + + if (metaPath != null) { + metaWriter = new InfoWriter(config, config.mTempResultDir + File.separator + metaPath); + } else { + metaWriter = null; + } + + if (logPath != null) { + logWriter = new InfoWriter(config, config.mOutFolder + File.separator + logPath); + } else { + logWriter = null; + } + + if (logWriter != null) { + this.dexPatcherLoggerBridge = new DexPatcherLoggerBridge(logWriter); + } + + excludedClassModifiedChecker = new ExcludedClassModifiedChecker(config); + + addedClassDescToDexNameMap = new HashMap<>(); + deletedClassDescToDexNameMap = new HashMap<>(); + + oldAndNewDexFilePairList = new ArrayList<>(); + + dexNameToRelatedInfoMap = new HashMap<>(); + } + + @Override + public void onAllPatchesStart() throws IOException, TinkerPatchException { + + } + + @SuppressWarnings("NewApi") + @Override + public boolean patch(final File oldFile, final File newFile) throws IOException, TinkerPatchException { + // first of all, we should check input files if excluded classes were modified. + Logger.d("Check for loader classes in dex: %s", + (oldFile == null ? getRelativeString(newFile) : getRelativeString(oldFile)) + ); + + try { + excludedClassModifiedChecker.checkIfExcludedClassWasModifiedInNewDex(oldFile, newFile); + } catch (IOException e) { + throw new TinkerPatchException(e); + } catch (TinkerPatchException e) { + if (config.mIgnoreWarning) { + Logger.e("Warning:ignoreWarning is true, but we found %s", e.getMessage()); + } else { + Logger.e("Warning:ignoreWarning is false, but we found %s", e.getMessage()); + throw e; + } + } catch (Exception e) { + e.printStackTrace(); + } + + // If corresponding new dex was completely deleted, just return false. + // don't process 0 length dex + if (newFile == null || !newFile.exists() || newFile.length() == 0) { + return false; + } + + File dexDiffOut = getOutputPath(newFile).toFile(); + + final String newMd5 = MD5.getMD5(newFile); + + //new add file + if (oldFile == null || !oldFile.exists() || oldFile.length() == 0) { + hasDexChanged = true; + copyNewDexAndMarkInMeta(newFile, newMd5, dexDiffOut); + return true; + } + + final String oldMd5 = MD5.getMD5(oldFile); + + if (!oldMd5.equals(newMd5)) { + hasDexChanged = true; + checkAddedOrDeletedClasses(oldFile, newFile); + } + + RelatedInfo relatedInfo = new RelatedInfo(); + relatedInfo.oldMd5 = oldMd5; + relatedInfo.newMd5 = newMd5; + + // collect current old dex file and corresponding new dex file for further processing. + oldAndNewDexFilePairList.add(new AbstractMap.SimpleEntry<>(oldFile, newFile)); + + final String dexName = oldFile.getName(); + dexNameToRelatedInfoMap.put(dexName, relatedInfo); + + return true; + } + + @SuppressWarnings("NewApi") + @Override + public void onAllPatchesEnd() throws Exception { + if (!hasDexChanged) { + Logger.d("No dexes were changed, nothing needs to be done next."); + return; + } + + File tempFullPatchDexPath = new File(config.mOutFolder + File.separator + TypedValue.DEX_TEMP_PATCH_DIR + File.separator + "full"); + ensureDirectoryExist(tempFullPatchDexPath); + File tempSmallPatchDexPath = new File(config.mOutFolder + File.separator + TypedValue.DEX_TEMP_PATCH_DIR + File.separator + "small"); + ensureDirectoryExist(tempSmallPatchDexPath); + + // Generate dex diff out and full patched dex if a pair of dex is different. + for (AbstractMap.SimpleEntry oldAndNewDexFilePair : oldAndNewDexFilePairList) { + File oldFile = oldAndNewDexFilePair.getKey(); + File newFile = oldAndNewDexFilePair.getValue(); + final String dexName = oldFile.getName(); + RelatedInfo relatedInfo = dexNameToRelatedInfoMap.get(dexName); + + if (!relatedInfo.oldMd5.equals(relatedInfo.newMd5)) { + File dexDiffOut = getOutputPath(newFile).toFile(); + ensureDirectoryExist(dexDiffOut.getParentFile()); + + try { + DexPatchGenerator dexPatchGen = new DexPatchGenerator(oldFile, newFile); + dexPatchGen.setAdditionalRemovingClassPatterns(config.mDexLoaderPattern); + + logWriter.writeLineToInfoFile( + String.format( + "Start diff between [%s] as old and [%s] as new:", + getRelativeStringBy(oldFile, config.mTempUnzipOldDir), + getRelativeStringBy(newFile, config.mTempUnzipNewDir) + ) + ); + + dexPatchGen.executeAndSaveTo(dexDiffOut); + } catch (Exception e) { + throw new TinkerPatchException(e); + } + + if (!dexDiffOut.exists()) { + throw new TinkerPatchException("can not find the diff file:" + dexDiffOut.getAbsolutePath()); + } + + relatedInfo.dexDiffFile = dexDiffOut; + relatedInfo.dexDiffMd5 = MD5.getMD5(dexDiffOut); + + File tempFullPatchedDexFile = new File(tempFullPatchDexPath, dexName); + + try { + new DexPatchApplier(oldFile, dexDiffOut).executeAndSaveTo(tempFullPatchedDexFile); + + Logger.d( + String.format("Verifying if patched new dex is logically the same as original new dex: %s ...", getRelativeStringBy(newFile, config.mTempUnzipNewDir)) + ); + + Dex origNewDex = new Dex(newFile); + Dex patchedNewDex = new Dex(tempFullPatchedDexFile); + checkDexChange(origNewDex, patchedNewDex); + + relatedInfo.newOrFullPatchedFile = tempFullPatchedDexFile; + relatedInfo.newOrFullPatchedMd5 = MD5.getMD5(tempFullPatchedDexFile); + } catch (Exception e) { + e.printStackTrace(); + throw new TinkerPatchException( + "Failed to generate temporary patched dex, which makes MD5 generating procedure of new dex failed, either.", e + ); + } + + if (!tempFullPatchedDexFile.exists()) { + throw new TinkerPatchException("can not find the temporary full patched dex file:" + tempFullPatchedDexFile.getAbsolutePath()); + } + Logger.e("Gen %s for dalvik full dex file:%s, size:%d, md5:%s", dexName, tempFullPatchedDexFile.getAbsolutePath(), tempFullPatchedDexFile.length(), relatedInfo.newOrFullPatchedMd5); + } else { + // In this case newDexFile is the same as oldDexFile, but we still + // need to treat it as patched dex file so that the SmallPatchGenerator + // can analyze which class of this dex should be kept in small patch. + relatedInfo.newOrFullPatchedFile = newFile; + relatedInfo.newOrFullPatchedMd5 = relatedInfo.newMd5; + } + } + + Set classNOldDexFiles = new HashSet<>(); + + for (AbstractMap.SimpleEntry oldAndNewDexFilePair : oldAndNewDexFilePairList) { + File oldFile = oldAndNewDexFilePair.getKey(); + final String dexName = oldFile.getName(); + + if (isDexNameMatchesClassNPattern(dexName)) { + classNOldDexFiles.add(oldFile); + } + } + + // If we meet a case like: + // classes.dex, classes2.dex, classes4.dex, classes5.dex + // Since classes3.dex is missing, according to the logic in AOSP, we should not treat + // rest dexes as part of class N dexes. + Map dexNameToClassNOldDexFileMap = new HashMap<>(); + for (File classNOldDex : classNOldDexFiles) { + dexNameToClassNOldDexFileMap.put(classNOldDex.getName(), classNOldDex); + } + + boolean isRestDexNotInClassN = false; + for (int i = 0; i < classNOldDexFiles.size(); ++i) { + final String expectedDexName = (i == 0 ? DexFormat.DEX_IN_JAR_NAME : "classes" + (i + 1) + ".dex"); + if (!dexNameToClassNOldDexFileMap.containsKey(expectedDexName)) { + isRestDexNotInClassN = true; + } else { + if (isRestDexNotInClassN) { + File mistakenClassNOldDexFile = dexNameToClassNOldDexFileMap.get(expectedDexName); + classNOldDexFiles.remove(mistakenClassNOldDexFile); + } + } + } + + File tempSmallPatchInfoFile = new File(config.mTempResultDir, TypedValue.DEX_SMALLPATCH_INFO_FILE); + ensureDirectoryExist(tempSmallPatchInfoFile.getParentFile()); + + // So far we know whether a pair of dex is belong to class N dexes or other dexes. + // Then we collect class N dex pairs and other dex pairs by separate their old dex + // and full patched dex into different list. + SmallDexPatchGenerator smallDexPatchGenerator = new SmallDexPatchGenerator(); + smallDexPatchGenerator.setLoaderClassPatterns(config.mDexLoaderPattern); + smallDexPatchGenerator.setLogger(dexPatcherLoggerBridge); + + logWriter.writeLineToInfoFile("\nStart collecting old dex and full patched dex..."); + + List classNOldDexFileList = new ArrayList<>(); + List classNFullPatchedDexFileList = new ArrayList<>(); + List otherOldDexFileList = new ArrayList<>(); + List otherFullPatchedDexFileList = new ArrayList<>(); + for (AbstractMap.SimpleEntry oldAndNewDexFilePair : oldAndNewDexFilePairList) { + File oldFile = oldAndNewDexFilePair.getKey(); + final String dexName = oldFile.getName(); + File fullPatchedFile = dexNameToRelatedInfoMap.get(dexName).newOrFullPatchedFile; + if (classNOldDexFiles.contains(oldFile)) { + classNOldDexFileList.add(oldFile); + classNFullPatchedDexFileList.add(fullPatchedFile); + } else { + otherOldDexFileList.add(oldFile); + otherFullPatchedDexFileList.add(fullPatchedFile); + } + } + + logWriter.writeLineToInfoFile(String.format("\nCollected class N old dexes: %s", classNOldDexFileList)); + logWriter.writeLineToInfoFile(String.format("Collected class N full patched dexes: %s", classNFullPatchedDexFileList)); + logWriter.writeLineToInfoFile(String.format("\nCollected other old dexes: %s", otherOldDexFileList)); + logWriter.writeLineToInfoFile(String.format("Collected other full patched dexes: %s", otherFullPatchedDexFileList)); + + smallDexPatchGenerator.appendDexGroup(DexGroup.wrap(classNOldDexFileList), DexGroup.wrap(classNFullPatchedDexFileList)); + + if (!otherOldDexFileList.isEmpty()) { + smallDexPatchGenerator.appendDexGroup(DexGroup.wrap(otherOldDexFileList), DexGroup.wrap(otherFullPatchedDexFileList)); + } + + try { + Logger.d("Start generating small patch info file..."); + smallDexPatchGenerator.executeAndSaveTo(tempSmallPatchInfoFile); + } catch (Exception e) { + throw new TinkerPatchException("\nFailed to generate small patch info file.", e); + } + if (!tempSmallPatchInfoFile.exists()) { + throw new TinkerPatchException("can not find the small patch info file:" + tempSmallPatchInfoFile.getAbsolutePath()); + } + + SmallPatchedDexItemFile smallPatchedDexItemFile = new SmallPatchedDexItemFile(tempSmallPatchInfoFile); + + // Generate small patched dex and write meta. + for (AbstractMap.SimpleEntry oldAndNewDexFilePair : oldAndNewDexFilePairList) { + File oldFile = oldAndNewDexFilePair.getKey(); + File newFile = oldAndNewDexFilePair.getValue(); + final String dexName = oldFile.getName(); + final String oldDexSignStr = Hex.toHexString(new Dex(oldFile).computeSignature(false)); + File tempSmallPatchedFile = new File(tempSmallPatchDexPath, dexName); + RelatedInfo relatedInfo = dexNameToRelatedInfoMap.get(dexName); + File dexDiffFile = relatedInfo.dexDiffFile; + + if (!smallPatchedDexItemFile.isSmallPatchedDexEmpty(oldDexSignStr)) { + try { + new DexPatchApplier(oldFile, dexDiffFile, smallPatchedDexItemFile).executeAndSaveTo(tempSmallPatchedFile); + } catch (Exception e) { + e.printStackTrace(); + throw new TinkerPatchException( + "Failed to generate temporary small patched dex, which makes MD5 generating procedure of small patched dex failed, either.", e + ); + } + if (!tempSmallPatchedFile.exists()) { + throw new TinkerPatchException("can not find the temporary small patched dex file:" + tempSmallPatchInfoFile.getAbsolutePath()); + } + relatedInfo.smallPatchedMd5 = MD5.getMD5(tempSmallPatchedFile); + Logger.e("Gen %s for art small dex file:%s, size:%d, md5:%s", dexName, tempSmallPatchedFile.getAbsolutePath(), tempSmallPatchedFile.length(), relatedInfo.smallPatchedMd5); + + if (relatedInfo.oldMd5.equals(relatedInfo.newMd5)) { + // Unmodified dex, which has no dexDiffFile, and is ignored in dvm environment. + // So we pass zero string to destMd5InDvm and dexDiffMd5. + writeLogFiles(newFile, oldFile, relatedInfo.dexDiffFile, "0", relatedInfo.smallPatchedMd5, "0"); + } else { + writeLogFiles(newFile, oldFile, relatedInfo.dexDiffFile, relatedInfo.newOrFullPatchedMd5, relatedInfo.smallPatchedMd5, relatedInfo.dexDiffMd5); + } + } + } + + addTestDex(); + + // Here we will check if any classes that were deleted in one dex + // would be added to another dex. e.g. classA is deleted in dex0 and + // added in dex1. + // Since DexClassesComparator will guarantee that a class can be either 'added' + // or 'deleted' between two files it compares. We can achieve our checking works + // by calculating the intersection of deletedClassDescs and addedClassDescs. + Set deletedClassDescs = new HashSet(deletedClassDescToDexNameMap.keySet()); + Set addedClassDescs = new HashSet(addedClassDescToDexNameMap.keySet()); + deletedClassDescs.retainAll(addedClassDescs); + + // So far deletedClassNames only contains the intersect elements between + // deletedClassNames and addedClassNames. + Set movedCrossFilesClassDescs = deletedClassDescs; + if (!movedCrossFilesClassDescs.isEmpty()) { + Logger.e("Warning:Class Moved. Some classes are just moved from one dex to another. " + + "This behavior may leads to unnecessary enlargement of patch file. you should try to check them:"); + + for (String classDesc : movedCrossFilesClassDescs) { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + sb.append("classDesc:").append(classDesc).append(','); + sb.append("from:").append(deletedClassDescToDexNameMap.get(classDesc)).append(','); + sb.append("to:").append(addedClassDescToDexNameMap.get(classDesc)); + sb.append('}'); + Logger.e(sb.toString()); + } + } + } + + @Override + public void clean() { + metaWriter.close(); + logWriter.close(); + } + + private void ensureDirectoryExist(File dir) { + if (!dir.exists()) { + if (!dir.mkdirs()) { + throw new TinkerPatchException("failed to create directory: " + dir); + } + } + } + + private boolean isDexNameMatchesClassNPattern(String dexName) { + return (dexName.matches("^classes[0-9]*\\.dex$")); + } + + private void copyNewDexAndMarkInMeta(File newFile, String newMd5, File output) throws IOException { + newMd5 = checkNewDexAndMd5(newMd5, newFile); + FileOperation.copyFileUsingStream(newFile, output); + writeLogFiles(newFile, null, null, newMd5, newMd5, "0"); + } + + private void checkAddedOrDeletedClasses(File oldFile, File newFile) throws IOException { + // Before starting real diff works, we collect added class descriptor + // and deleted class descriptor for further analysing. + Dex oldDex = new Dex(oldFile); + Dex newDex = new Dex(newFile); + + Set oldClassDescs = new HashSet<>(); + for (ClassDef oldClassDef : oldDex.classDefs()) { + oldClassDescs.add(oldDex.typeNames().get(oldClassDef.typeIndex)); + } + + Set newClassDescs = new HashSet<>(); + for (ClassDef newClassDef : newDex.classDefs()) { + newClassDescs.add(newDex.typeNames().get(newClassDef.typeIndex)); + } + + Set addedClassDescs = new HashSet<>(newClassDescs); + addedClassDescs.removeAll(oldClassDescs); + + Set deletedClassDescs = new HashSet<>(oldClassDescs); + deletedClassDescs.removeAll(newClassDescs); + + for (String addedClassDesc : addedClassDescs) { + if (addedClassDescToDexNameMap.containsKey(addedClassDesc)) { + throw new TinkerPatchException( + String.format( + "Class Duplicate. Class [%s] is added in both new dex: [%s] and [%s]. Please check your newly apk.", + addedClassDesc, + addedClassDescToDexNameMap.get(addedClassDesc), + newFile.toString() + ) + ); + } else { + addedClassDescToDexNameMap.put(addedClassDesc, newFile.toString()); + } + } + + for (String deletedClassDesc : deletedClassDescs) { + if (deletedClassDescToDexNameMap.containsKey(deletedClassDesc)) { + throw new TinkerPatchException( + String.format( + "Class Duplicate. Class [%s] is deleted in both old dex: [%s] and [%s]. Please check your base apk.", + deletedClassDesc, + addedClassDescToDexNameMap.get(deletedClassDesc), + oldFile.toString() + ) + ); + } else { + deletedClassDescToDexNameMap.put(deletedClassDesc, newFile.toString()); + } + } + } + + private void checkDexChange(Dex originDex, Dex newDex) { + DexClassesComparator classesCmptor = new DexClassesComparator("*"); + classesCmptor.setIgnoredRemovedClassDescPattern(config.mDexLoaderPattern); + classesCmptor.startCheck(originDex, newDex); + + List addedClassInfos = classesCmptor.getAddedClassInfos(); + boolean isNoClassesAdded = addedClassInfos.isEmpty(); + + Map changedClassDescToClassInfosMap; + boolean isNoClassesChanged; + + if (isNoClassesAdded) { + changedClassDescToClassInfosMap = classesCmptor.getChangedClassDescToInfosMap(); + isNoClassesChanged = changedClassDescToClassInfosMap.isEmpty(); + } else { + throw new TinkerPatchException( + "some classes was unexpectedly added in patched new dex, check if there's any bugs in " + + "patch algorithm. Related classes: " + Utils.collectionToString(addedClassInfos) + ); + } + + if (isNoClassesChanged) { + List deletedClassInfos = classesCmptor.getDeletedClassInfos(); + if (!deletedClassInfos.isEmpty()) { + throw new TinkerPatchException( + "some classes that are not matched to loader class pattern " + + "was unexpectedly deleted in patched new dex, check if there's any bugs in " + + "patch algorithm. Related classes: " + + Utils.collectionToString(deletedClassInfos) + ); + } + } else { + throw new TinkerPatchException( + "some classes was unexpectedly changed in patched new dex, check if there's any bugs in " + + "patch algorithm. Related classes: " + + Utils.collectionToString(changedClassDescToClassInfosMap.keySet()) + ); + } + } + + private void addTestDex() throws IOException { + //write test dex + String dexMode = "jar"; + if (config.mDexRaw) { + dexMode = "raw"; + } + + final InputStream is = DexDiffDecoder.class.getResourceAsStream("/" + TEST_DEX_PATH); + String md5 = MD5.getMD5(is, 1024); + is.close(); + + String meta = TEST_DEX_PATH + "," + "" + "," + md5 + "," + md5 + "," + 0 + "," + 0 + "," + dexMode; + + File dest = new File(config.mTempResultDir + "/" + TEST_DEX_PATH); + FileOperation.copyResourceUsingStream(TEST_DEX_PATH, dest); + Logger.d("Add test install result dex: %s, size:%d", dest.getAbsolutePath(), dest.length()); + Logger.d("DexDecoder:write test dex meta file data: %s", meta); + + metaWriter.writeLineToInfoFile(meta); + } + + private String checkNewDexAndMd5(String md5, File dexFile) { + String name = dexFile.getName(); + if (name.endsWith(".dex")) { + return md5; + } else { + try { + final JarFile dexJar = new JarFile(dexFile); + ZipEntry classesDex = dexJar.getEntry(DexFormat.DEX_IN_JAR_NAME); + // no code + if (null == classesDex) { + throw new TinkerPatchException( + String.format("dex jar file %s do not contain 'classes.dex', it is not a correct dex jar file!", dexFile.getAbsolutePath()) + ); + } + + return MD5.getMD5(dexJar.getInputStream(classesDex), 1024 * 100); + } catch (IOException e) { + throw new TinkerPatchException( + String.format("dex file %s is not end with '.dex', but it is not a correct dex jar file also!", dexFile.getAbsolutePath()), e + ); + } + } + } + + private String getRelativeStringBy(File file, File reference) { + File actualReference = reference.getParentFile(); + if (actualReference == null) { + actualReference = reference; + } + return actualReference.toPath().relativize(file.toPath()).toString().replace("\\", "/"); + } + + /** + * Construct dex meta-info and write it to meta file and log. + * + * @param newOrFullPatchedFile + * New dex file or full patched dex file. + * @param oldFile + * Old dex file. + * @param dexDiffFile + * Dex diff file. (Generated by DexPatchGenerator.) + * @param destMd5InDvm + * Md5 of output dex in dvm environment, could be full patched dex md5 or new dex. + * @param destMd5InArt + * Md5 of output dex in dvm environment, could be small patched dex md5 or new dex. + * @param dexDiffMd5 + * Md5 of dex patch info file. + * + * @throws IOException + */ + protected void writeLogFiles(File newOrFullPatchedFile, File oldFile, File dexDiffFile, String destMd5InDvm, String destMd5InArt, String dexDiffMd5) throws IOException { + if (metaWriter == null && logWriter == null) { + return; + } + String parentRelative = getParentRelativeString(newOrFullPatchedFile); + String relative = getRelativeString(newOrFullPatchedFile); + + if (metaWriter != null) { + String fileName = newOrFullPatchedFile.getName(); + String dexMode = "jar"; + if (config.mDexRaw) { + dexMode = "raw"; + } + + //new file + String oldCrc; + if (oldFile == null) { + oldCrc = "0"; + Logger.d("DexDecoder:add newly dex file: %s", parentRelative); + } else { + oldCrc = FileOperation.getZipEntryCrc(config.mOldApkFile, relative); + if (oldCrc == null || oldCrc.equals("0")) { + throw new TinkerPatchException( + String.format("can't find zipEntry %s from old apk file %s", relative, config.mOldApkFile.getPath()) + ); + } + } + + String meta = fileName + "," + parentRelative + "," + destMd5InDvm + "," + destMd5InArt + "," + dexDiffMd5 + "," + oldCrc + "," + dexMode; + + Logger.d("DexDecoder:write meta file data: %s", meta); + metaWriter.writeLineToInfoFile(meta); + } + + if (logWriter != null) { + String log = relative + ", oldSize=" + FileOperation.getFileSizes(oldFile) + ", newSize=" + + FileOperation.getFileSizes(newOrFullPatchedFile) + ", diffSize=" + FileOperation.getFileSizes(dexDiffFile); + + logWriter.writeLineToInfoFile(log); + } + } + + private final class RelatedInfo { + File newOrFullPatchedFile = null; + /** + * This field could be null if old dex and new dex + * are the same. + */ + File dexDiffFile = null; + String oldMd5 = "0"; + String newMd5 = "0"; + String dexDiffMd5 = "0"; + /** + * This field could be one of the following value: + * fullPatchedDex md5, if old dex and new dex are different; + * newDex md5, if new dex is marked to be copied directly; + */ + String newOrFullPatchedMd5 = "0"; + String smallPatchedMd5 = "0"; + } + + private final class DexPatcherLoggerBridge implements IDexPatcherLogger { + private final InfoWriter logWritter; + + DexPatcherLoggerBridge(InfoWriter logWritter) { + this.logWritter = logWritter; + } + + @Override + public void v(String msg) { + this.logWritter.writeLineToInfoFile(msg); + } + + @Override + public void d(String msg) { + this.logWritter.writeLineToInfoFile(msg); + } + + @Override + public void i(String msg) { + this.logWritter.writeLineToInfoFile(msg); + } + + @Override + public void w(String msg) { + this.logWritter.writeLineToInfoFile(msg); + } + + @Override + public void e(String msg) { + this.logWritter.writeLineToInfoFile(msg); + } + } +} + + diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ManifestDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ManifestDecoder.java new file mode 100644 index 00000000..d21414ee --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ManifestDecoder.java @@ -0,0 +1,105 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + + +import com.tencent.tinker.build.apkparser.AndroidManifest; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.List; + +/** + * Created by zhangshaowen on 16/4/6. + */ + +public class ManifestDecoder extends BaseDecoder { + + public ManifestDecoder(Configuration config) throws IOException { + super(config); + } + + @Override + public boolean patch(File oldFile, File newFile) throws IOException, TinkerPatchException { + final boolean ignoreWarning = config.mIgnoreWarning; + try { + AndroidManifest oldAndroidManifest = AndroidManifest.getAndroidManifest(oldFile); + AndroidManifest newAndroidManifest = AndroidManifest.getAndroidManifest(newFile); + //check minSdkVersion + int minSdkVersion = Integer.parseInt(oldAndroidManifest.apkMeta.getMinSdkVersion()); + + if (minSdkVersion < TypedValue.ANDROID_40_API_LEVEL) { + if (config.mDexRaw) { + if (ignoreWarning) { + //ignoreWarning, just log + Logger.e("Warning:ignoreWarning is true, but your old apk's minSdkVersion %d is below 14, you should set the dexMode to 'jar', otherwise, it will be crash at some times", minSdkVersion); + } else { + Logger.e("Warning:ignoreWarning is false, but your old apk's minSdkVersion %d is below 14, you should set the dexMode to 'jar', otherwise, it will be crash at some times", minSdkVersion); + + throw new TinkerPatchException( + String.format("ignoreWarning is false, but your old apk's minSdkVersion %d is below 14, you should set the dexMode to 'jar', otherwise, it will be crash at some times", minSdkVersion) + ); + } + } + } + + //check whether there is any new Android Component + List oldAndroidComponent = oldAndroidManifest.getComponents(); + List newAndroidComponent = newAndroidManifest.getComponents(); + + for (String newComponentName : newAndroidComponent) { + boolean found = false; + for (String oldComponentName : oldAndroidComponent) { + if (newComponentName.equals(oldComponentName)) { + found = true; + break; + } + } + if (!found) { + if (ignoreWarning) { + Logger.e("Warning:ignoreWarning is true, but we found a new AndroidComponent %s, it will be crash at some times", newComponentName); + } else { + Logger.e("Warning:ignoreWarning is false, but we found a new AndroidComponent %s, it will be crash at some times", newComponentName); + throw new TinkerPatchException( + String.format("ignoreWarning is false, but we found a new AndroidComponent %s, it will be crash at some times", newComponentName) + ); + } + } + } + + } catch (ParseException e) { + e.printStackTrace(); + throw new TinkerPatchException("parse android manifest error!"); + } + return false; + } + + @Override + public void onAllPatchesStart() throws IOException, TinkerPatchException { + + } + + @Override + public void onAllPatchesEnd() throws IOException, TinkerPatchException { + + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ResDiffDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ResDiffDecoder.java new file mode 100644 index 00000000..193b41c1 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/ResDiffDecoder.java @@ -0,0 +1,407 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + +import com.tencent.tinker.bsdiff.BSDiff; +import com.tencent.tinker.build.info.InfoWriter; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.FileOperation; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.MD5; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; +import com.tencent.tinker.build.util.Utils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +/** + * Created by zhangshaowen on 16/8/8. + */ +public class ResDiffDecoder extends BaseDecoder { + + private static final String TEMP_RES_ZIP = "temp_res.zip"; + private static final String TEMP_RES_7ZIP = "temp_res_7ZIP.zip"; + private final InfoWriter logWriter; + private final InfoWriter metaWriter; + private ArrayList addedSet; + private ArrayList modifiedSet; + private ArrayList largeModifiedSet; + private HashMap largeModifiedMap; + private ArrayList deletedSet; + + public ResDiffDecoder(Configuration config, String metaPath, String logPath) throws IOException { + super(config); + + if (metaPath != null) { + metaWriter = new InfoWriter(config, config.mTempResultDir + File.separator + metaPath); + } else { + metaWriter = null; + } + + if (logPath != null) { + logWriter = new InfoWriter(config, config.mOutFolder + File.separator + logPath); + } else { + logWriter = null; + } + addedSet = new ArrayList<>(); + modifiedSet = new ArrayList<>(); + largeModifiedSet = new ArrayList<>(); + largeModifiedMap = new HashMap<>(); + deletedSet = new ArrayList<>(); + } + + @Override + public void clean() { + metaWriter.close(); + logWriter.close(); + } + + private boolean checkLargeModFile(File file) { + long lenght = file.length(); + if (lenght > config.mLargeModSize * TypedValue.K_BYTES) { + return true; + } + return false; + } + + @Override + public boolean patch(File oldFile, File newFile) throws IOException, TinkerPatchException { + //actually, it won't go below + if (newFile == null || !newFile.exists()) { + String name = getRelativeStringByOldDir(oldFile); + if (Utils.checkFileInPattern(config.mResIgnoreChangePattern, name)) { + Logger.e("found delete resource: " + name + " ,but it match ignore change pattern, just ignore!"); + return false; + } + deletedSet.add(name); + writeResLog(newFile, oldFile, TypedValue.DEL); + return true; + } + + File outputFile = getOutputPath(newFile).toFile(); + + if (oldFile == null || !oldFile.exists()) { + String name = getRelativeString(newFile); + if (Utils.checkFileInPattern(config.mResIgnoreChangePattern, name)) { + Logger.e("found add resource: " + name + " ,but it match ignore change pattern, just ignore!"); + return false; + } + FileOperation.copyFileUsingStream(newFile, outputFile); + addedSet.add(name); + writeResLog(newFile, oldFile, TypedValue.ADD); + return true; + } + //both file length is 0 + if (oldFile.length() == 0 && newFile.length() == 0) { + return false; + } + //new add file + String newMd5 = MD5.getMD5(newFile); + String oldMd5 = MD5.getMD5(oldFile); + + //oldFile or newFile may be 0b length + if (oldMd5 != null && oldMd5.equals(newMd5)) { + return false; + } + String name = getRelativeString(newFile); + if (Utils.checkFileInPattern(config.mResIgnoreChangePattern, name)) { + Logger.e("found modify resource: " + name + " ,but it match ignore change pattern, just ignore!"); + return false; + } + if (name.equals(TypedValue.RES_MANIFEST)) { + Logger.e("found modify resource: " + name + " ,but it is AndroidManifest.xml, just ignore!"); + return false; + } + if (checkLargeModFile(newFile)) { + if (!outputFile.getParentFile().exists()) { + outputFile.getParentFile().mkdirs(); + } + BSDiff.bsdiff(oldFile, newFile, outputFile); + //treat it as normal modify + if (Utils.checkBsDiffFileSize(outputFile, newFile)) { + LargeModeInfo largeModeInfo = new LargeModeInfo(); + largeModeInfo.path = newFile; + largeModeInfo.crc = FileOperation.getFileCrc32(newFile); + largeModeInfo.md5 = newMd5; + largeModifiedSet.add(name); + largeModifiedMap.put(name, largeModeInfo); + writeResLog(newFile, oldFile, TypedValue.LARGE_MOD); + return true; + } + } + modifiedSet.add(name); + FileOperation.copyFileUsingStream(newFile, outputFile); + writeResLog(newFile, oldFile, TypedValue.MOD); + return true; + } + + private void writeResLog(File newFile, File oldFile, int mode) throws IOException { + if (logWriter != null) { + String log = ""; + String relative; + switch (mode) { + case TypedValue.ADD: + relative = getRelativeString(newFile); + Logger.d("Found add resource: " + relative); + log = "add resource: " + relative + ", oldSize=" + FileOperation.getFileSizes(oldFile) + ", newSize=" + + FileOperation.getFileSizes(newFile); + break; + case TypedValue.MOD: + relative = getRelativeString(newFile); + Logger.d("Found modify resource: " + relative); + log = "modify resource: " + relative + ", oldSize=" + FileOperation.getFileSizes(oldFile) + ", newSize=" + + FileOperation.getFileSizes(newFile); + break; + case TypedValue.DEL: + relative = getRelativeStringByOldDir(oldFile); + Logger.d("Found deleted resource: " + relative); + log = "deleted resource: " + relative + ", oldSize=" + FileOperation.getFileSizes(oldFile) + ", newSize=" + + FileOperation.getFileSizes(newFile); + break; + case TypedValue.LARGE_MOD: + relative = getRelativeString(newFile); + Logger.d("Found large modify resource: " + relative + " size:" + newFile.length()); + log = "large modify resource: " + relative + ", oldSize=" + FileOperation.getFileSizes(oldFile) + ", newSize=" + + FileOperation.getFileSizes(newFile); + break; + } + logWriter.writeLineToInfoFile(log); + } + } + + @Override + public void onAllPatchesStart() throws IOException, TinkerPatchException { + + } + + @Override + public void onAllPatchesEnd() throws IOException, TinkerPatchException { + //only there is only deleted set, we just ignore + if (addedSet.isEmpty() && modifiedSet.isEmpty() && largeModifiedSet.isEmpty()) { + return; + } + + if (!config.mResRawPattern.contains(TypedValue.RES_ARSC)) { + throw new TinkerPatchException("resource must contain resources.arsc pattern"); + } + if (!config.mResRawPattern.contains(TypedValue.RES_MANIFEST)) { + throw new TinkerPatchException("resource must contain AndroidManifest.xml pattern"); + } + + //check gradle build + if (config.mUsingGradle) { + final boolean resourceArscChanged = modifiedSet.contains(TypedValue.RES_ARSC) + || largeModifiedSet.contains(TypedValue.RES_ARSC); + final boolean ignoreWarning = config.mIgnoreWarning; + + if (resourceArscChanged && !config.mUseApplyResource) { + if (ignoreWarning) { + //ignoreWarning, just log + Logger.e("Warning:ignoreWarning is true, but resources.arsc is changed, you should use applyResourceMapping mode to build the new apk, otherwise, it may be crash at some times"); + } else { + Logger.e("Warning:ignoreWarning is false, but resources.arsc is changed, you should use applyResourceMapping mode to build the new apk, otherwise, it may be crash at some times"); + + throw new TinkerPatchException( + String.format("ignoreWarning is false, but resources.arsc is changed, you should use applyResourceMapping mode to build the new apk, otherwise, it may be crash at some times") + ); + } + } /*else if (config.mUseApplyResource) { + int totalChangeSize = addedSet.size() + modifiedSet.size() + largeModifiedSet.size(); + if (totalChangeSize == 1 && resourceArscChanged) { + Logger.e("Warning: we are using applyResourceMapping mode to build the new apk, but there is only resources.arsc changed, you should ensure there is actually resource changed!"); + } + }*/ + } + //add delete set + deletedSet.addAll(getDeletedResource(config.mTempUnzipOldDir, config.mTempUnzipNewDir)); + + //we can't modify AndroidManifest file + addedSet.remove(TypedValue.RES_MANIFEST); + deletedSet.remove(TypedValue.RES_MANIFEST); + modifiedSet.remove(TypedValue.RES_MANIFEST); + largeModifiedSet.remove(TypedValue.RES_MANIFEST); + //remove add, delete or modified if they are in ignore change pattern also + removeIgnoreChangeFile(modifiedSet); + removeIgnoreChangeFile(deletedSet); + removeIgnoreChangeFile(addedSet); + removeIgnoreChangeFile(largeModifiedSet); + + File tempResZip = new File(config.mOutFolder + File.separator + TEMP_RES_ZIP); + final File tempResFiles = config.mTempResultDir; + + //gen zip resources_out.zip + FileOperation.zipInputDir(tempResFiles, tempResZip); + File extractToZip = new File(config.mOutFolder + File.separator + TypedValue.RES_OUT); + + String resZipMd5 = Utils.genResOutputFile(extractToZip, tempResZip, config, + addedSet, modifiedSet, deletedSet, largeModifiedSet, largeModifiedMap); + + Logger.e("final normal zip resource: %s, size=%d, md5=%s", extractToZip.getName(), extractToZip.length(), resZipMd5); + logWriter.writeLineToInfoFile( + String.format("final normal zip resource: %s, size=%d, md5=%s", extractToZip.getName(), extractToZip.length(), resZipMd5) + ); + //delete temp file + FileOperation.deleteFile(tempResZip); + + //gen zip resources_out_7z.zip + File extractTo7Zip = new File(config.mOutFolder + File.separator + TypedValue.RES_OUT_7ZIP); + File tempRes7Zip = new File(config.mOutFolder + File.separator + TEMP_RES_7ZIP); + + //ensure 7zip is enable + if (FileOperation.sevenZipInputDir(tempResFiles, tempRes7Zip, config)) { + //7zip whether actual exist + if (tempRes7Zip.exists()) { + + String res7zipMd5 = Utils.genResOutputFile(extractTo7Zip, tempRes7Zip, config, + addedSet, modifiedSet, deletedSet, largeModifiedSet, largeModifiedMap); + //delete temp file + FileOperation.deleteFile(tempRes7Zip); + Logger.e("final 7zip resource: %s, size=%d, md5=%s", extractTo7Zip.getName(), extractTo7Zip.length(), res7zipMd5); + logWriter.writeLineToInfoFile( + String.format("final 7zip resource: %s, size=%d, md5=%s", extractTo7Zip.getName(), extractTo7Zip.length(), res7zipMd5) + ); + } + } + //first, write resource meta first + //use resources.arsc's base crc to identify base.apk + String arscBaseCrc = FileOperation.getZipEntryCrc(config.mOldApkFile, TypedValue.RES_ARSC); + String arscMd5 = FileOperation.getZipEntryMd5(extractToZip, TypedValue.RES_ARSC); + if (arscBaseCrc == null || arscMd5 == null) { + throw new TinkerPatchException("can't find resources.arsc's base crc or md5"); + } + + String resourceMeta = Utils.getResourceMeta(arscBaseCrc, arscMd5); + writeMetaFile(resourceMeta); + + //pattern + String patternMeta = TypedValue.PATTERN_TITLE; + HashSet patterns = new HashSet<>(config.mResRawPattern); + //we will process them separate + patterns.remove(TypedValue.RES_MANIFEST); + + writeMetaFile(patternMeta + patterns.size()); + //write pattern + for (String item : patterns) { + writeMetaFile(item); + } + //write meta file, write large modify first + writeMetaFile(largeModifiedSet, TypedValue.LARGE_MOD); + writeMetaFile(modifiedSet, TypedValue.MOD); + writeMetaFile(addedSet, TypedValue.ADD); + writeMetaFile(deletedSet, TypedValue.DEL); + } + + private void removeIgnoreChangeFile(ArrayList array) { + ArrayList removeList = new ArrayList<>(); + for (String name : array) { + if (Utils.checkFileInPattern(config.mResIgnoreChangePattern, name)) { + Logger.e("ignore change resource file: " + name); + removeList.add(name); + } + } + array.removeAll(removeList); + } + + private void writeMetaFile(String line) { + metaWriter.writeLineToInfoFile(line); + } + + private void writeMetaFile(ArrayList set, int mode) { + if (!set.isEmpty()) { + String title = ""; + switch (mode) { + case TypedValue.ADD: + title = TypedValue.ADD_TITLE + set.size(); + break; + case TypedValue.MOD: + title = TypedValue.MOD_TITLE + set.size(); + break; + case TypedValue.LARGE_MOD: + title = TypedValue.LARGE_MOD_TITLE + set.size(); + break; + case TypedValue.DEL: + title = TypedValue.DEL_TITLE + set.size(); + break; + } + metaWriter.writeLineToInfoFile(title); + for (String name : set) { + String line = name; + if (mode == TypedValue.LARGE_MOD) { + LargeModeInfo info = largeModifiedMap.get(name); + line = name + "," + info.md5 + "," + info.crc; + } + metaWriter.writeLineToInfoFile(line); + } + } + } + + public ArrayList getDeletedResource(File oldApkDir, File newApkDir) throws IOException { + //get deleted resource + DeletedResVisitor deletedResVisitor = new DeletedResVisitor(config, newApkDir.toPath(), oldApkDir.toPath()); + Files.walkFileTree(oldApkDir.toPath(), deletedResVisitor); + return deletedResVisitor.deletedFiles; + } + + public class LargeModeInfo { + public File path = null; + public long crc; + public String md5 = null; + } + + class DeletedResVisitor extends SimpleFileVisitor { + Configuration config; + Path newApkPath; + Path oldApkPath; + ArrayList deletedFiles; + + DeletedResVisitor(Configuration config, Path newPath, Path oldPath) { + this.config = config; + this.newApkPath = newPath; + this.oldApkPath = oldPath; + this.deletedFiles = new ArrayList<>(); + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + + Path relativePath = oldApkPath.relativize(file); + + Path newPath = newApkPath.resolve(relativePath); + + String patternKey = relativePath.toString().replace("\\", "/"); + + if (Utils.checkFileInPattern(config.mResFilePattern, patternKey)) { + //not contain in new path, is deleted + if (!newPath.toFile().exists()) { + deletedFiles.add(relativePath.toString()); + writeResLog(newPath.toFile(), file.toFile(), TypedValue.DEL); + } + return FileVisitResult.CONTINUE; + } + return FileVisitResult.CONTINUE; + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/UniqueDexDiffDecoder.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/UniqueDexDiffDecoder.java new file mode 100644 index 00000000..46a61f7c --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/decoder/UniqueDexDiffDecoder.java @@ -0,0 +1,51 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.decoder; + +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.TinkerPatchException; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +/** + * Created by zhangshaowen on 16/3/9. + */ +public class UniqueDexDiffDecoder extends DexDiffDecoder { + private ArrayList addedDexFiles; + + public UniqueDexDiffDecoder(Configuration config, String metaPath, String logPath) throws IOException { + super(config, metaPath, logPath); + addedDexFiles = new ArrayList<>(); + } + + @Override + public boolean patch(File oldFile, File newFile) throws IOException, TinkerPatchException { + boolean added = super.patch(oldFile, newFile); + if (added) { + String name = newFile.getName(); + if (addedDexFiles.contains(name)) { + throw new TinkerPatchException("illegal dex name, dex name should be unique, dex:" + name); + } else { + addedDexFiles.add(name); + } + } + return added; + } + +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/DexPatchGenerator.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/DexPatchGenerator.java new file mode 100644 index 00000000..8bbe973b --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/DexPatchGenerator.java @@ -0,0 +1,720 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.StringData; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.AnnotationSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.AnnotationSetRefListSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.AnnotationSetSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.AnnotationsDirectorySectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.ClassDataSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.ClassDefSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.CodeSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.DebugInfoItemSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.DexSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.FieldIdSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.MethodIdSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.ProtoIdSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.StaticValueSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.StringDataSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.TypeIdSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.algorithms.diff.TypeListSectionDiffAlgorithm; +import com.tencent.tinker.build.dexpatcher.util.PatternUtils; +import com.tencent.tinker.commons.dexpatcher.DexPatcherLogger; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.PatchOperation; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class DexPatchGenerator { + private static final String TAG = "DexPatchGenerator"; + + private final Dex oldDex; + private final Dex newDex; + private final DexPatcherLogger logger = new DexPatcherLogger(); + private DexSectionDiffAlgorithm stringDataSectionDiffAlg; + private DexSectionDiffAlgorithm typeIdSectionDiffAlg; + private DexSectionDiffAlgorithm protoIdSectionDiffAlg; + private DexSectionDiffAlgorithm fieldIdSectionDiffAlg; + private DexSectionDiffAlgorithm methodIdSectionDiffAlg; + private DexSectionDiffAlgorithm classDefSectionDiffAlg; + private DexSectionDiffAlgorithm typeListSectionDiffAlg; + private DexSectionDiffAlgorithm annotationSetRefListSectionDiffAlg; + private DexSectionDiffAlgorithm annotationSetSectionDiffAlg; + private DexSectionDiffAlgorithm classDataSectionDiffAlg; + private DexSectionDiffAlgorithm codeSectionDiffAlg; + private DexSectionDiffAlgorithm debugInfoSectionDiffAlg; + private DexSectionDiffAlgorithm annotationSectionDiffAlg; + private DexSectionDiffAlgorithm encodedArraySectionDiffAlg; + private DexSectionDiffAlgorithm annotationsDirectorySectionDiffAlg; + private Set additionalRemovingClassPatternSet; + private int patchedHeaderOffset = 0; + private int patchedStringIdsOffset = 0; + private int patchedTypeIdsOffset = 0; + private int patchedProtoIdsOffset = 0; + private int patchedFieldIdsOffset = 0; + private int patchedMethodIdsOffset = 0; + private int patchedClassDefsOffset = 0; + private int patchedTypeListsOffset = 0; + private int patchedAnnotationItemsOffset = 0; + private int patchedAnnotationSetItemsOffset = 0; + private int patchedAnnotationSetRefListItemsOffset = 0; + private int patchedAnnotationsDirectoryItemsOffset = 0; + private int patchedDebugInfoItemsOffset = 0; + private int patchedCodeItemsOffset = 0; + private int patchedClassDataItemsOffset = 0; + private int patchedStringDataItemsOffset = 0; + private int patchedEncodedArrayItemsOffset = 0; + private int patchedMapListOffset = 0; + private int patchedDexSize = 0; + + public DexPatchGenerator(File oldDexFile, File newDexFile) throws IOException { + this(new Dex(oldDexFile), new Dex(newDexFile)); + } + + /** + * Notice: you should close inputstream manually. + */ + public DexPatchGenerator(File oldDexFile, InputStream newDexStream) throws IOException { + this(new Dex(oldDexFile), new Dex(newDexStream)); + } + + /** + * Notice: you should close inputstream manually. + */ + public DexPatchGenerator(InputStream oldDexStream, InputStream newDexStream) throws IOException { + this(new Dex(oldDexStream), new Dex(newDexStream)); + } + + public DexPatchGenerator(Dex oldDex, Dex newDex) { + this.oldDex = oldDex; + this.newDex = newDex; + + IndexMap oldToNewIndexMap = new IndexMap(); + IndexMap oldToPatchedIndexMap = new IndexMap(); + IndexMap newToPatchedIndexMap = new IndexMap(); + IndexMap selfIndexMapForSkip = new IndexMap(); + + additionalRemovingClassPatternSet = new HashSet<>(); + + this.stringDataSectionDiffAlg = new StringDataSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.typeIdSectionDiffAlg = new TypeIdSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.protoIdSectionDiffAlg = new ProtoIdSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.fieldIdSectionDiffAlg = new FieldIdSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.methodIdSectionDiffAlg = new MethodIdSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.classDefSectionDiffAlg = new ClassDefSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.typeListSectionDiffAlg = new TypeListSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.annotationSetRefListSectionDiffAlg = new AnnotationSetRefListSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.annotationSetSectionDiffAlg = new AnnotationSetSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.classDataSectionDiffAlg = new ClassDataSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.codeSectionDiffAlg = new CodeSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.debugInfoSectionDiffAlg = new DebugInfoItemSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.annotationSectionDiffAlg = new AnnotationSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.encodedArraySectionDiffAlg = new StaticValueSectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + this.annotationsDirectorySectionDiffAlg = new AnnotationsDirectorySectionDiffAlgorithm( + oldDex, newDex, + oldToNewIndexMap, + oldToPatchedIndexMap, + newToPatchedIndexMap, + selfIndexMapForSkip + ); + } + + public void addAdditionalRemovingClassPattern(String pattern) { + this.additionalRemovingClassPatternSet.add( + PatternUtils.dotClassNamePatternToDescriptorRegEx(pattern) + ); + } + + public void setAdditionalRemovingClassPatterns(Collection patterns) { + for (String pattern : patterns) { + this.additionalRemovingClassPatternSet.add( + PatternUtils.dotClassNamePatternToDescriptorRegEx(pattern) + ); + } + } + + public void clearAdditionalRemovingClassPatterns() { + this.additionalRemovingClassPatternSet.clear(); + } + + public void setLogger(DexPatcherLogger.IDexPatcherLogger logger) { + this.logger.setLoggerImpl(logger); + } + + public void executeAndSaveTo(File file) throws IOException { + OutputStream os = null; + try { + os = new BufferedOutputStream(new FileOutputStream(file)); + executeAndSaveTo(os); + } finally { + if (os != null) { + try { + os.close(); + } catch (Exception e) { + // ignored. + } + } + } + } + + public void executeAndSaveTo(OutputStream out) throws IOException { + // Firstly, collect information of items we want to remove additionally + // in new dex and set them to corresponding diff algorithm implementations. + Pattern[] classNamePatterns = new Pattern[this.additionalRemovingClassPatternSet.size()]; + int classNamePatternCount = 0; + for (String regExStr : this.additionalRemovingClassPatternSet) { + classNamePatterns[classNamePatternCount++] = Pattern.compile(regExStr); + } + + List typeIdOfClassDefsToRemove = new ArrayList<>(classNamePatternCount); + List offsetOfClassDatasToRemove = new ArrayList<>(classNamePatternCount); + for (ClassDef classDef : this.newDex.classDefs()) { + String typeName = this.newDex.typeNames().get(classDef.typeIndex); + for (Pattern pattern : classNamePatterns) { + if (pattern.matcher(typeName).matches()) { + typeIdOfClassDefsToRemove.add(classDef.typeIndex); + offsetOfClassDatasToRemove.add(classDef.classDataOffset); + break; + } + } + } + + ((ClassDefSectionDiffAlgorithm) this.classDefSectionDiffAlg) + .setTypeIdOfClassDefsToRemove(typeIdOfClassDefsToRemove); + ((ClassDataSectionDiffAlgorithm) this.classDataSectionDiffAlg) + .setOffsetOfClassDatasToRemove(offsetOfClassDatasToRemove); + + // Then, run diff algorithms according to sections' dependencies. + + // Use size calculated by algorithms above or from dex file definition to + // calculate sections' offset and patched dex size. + + // Calculate header and id sections size, so that we can work out + // the base offset of typeLists Section. + int patchedheaderSize = SizeOf.HEADER_ITEM; + int patchedStringIdsSize = newDex.getTableOfContents().stringIds.size * SizeOf.STRING_ID_ITEM; + int patchedTypeIdsSize = newDex.getTableOfContents().typeIds.size * SizeOf.TYPE_ID_ITEM; + + // Although simulatePatchOperation can calculate this value, since protoIds section + // depends on typeLists section, we can't run protoIds Section's simulatePatchOperation + // method so far. Instead we calculate protoIds section's size using information in newDex + // directly. + int patchedProtoIdsSize = newDex.getTableOfContents().protoIds.size * SizeOf.PROTO_ID_ITEM; + + int patchedFieldIdsSize = newDex.getTableOfContents().fieldIds.size * SizeOf.MEMBER_ID_ITEM; + int patchedMethodIdsSize = newDex.getTableOfContents().methodIds.size * SizeOf.MEMBER_ID_ITEM; + int patchedClassDefsSize = newDex.getTableOfContents().classDefs.size * SizeOf.CLASS_DEF_ITEM; + + int patchedIdSectionSize = + patchedStringIdsSize + + patchedTypeIdsSize + + patchedProtoIdsSize + + patchedFieldIdsSize + + patchedMethodIdsSize + + patchedClassDefsSize; + + this.patchedHeaderOffset = 0; + + // The diff works on each sections obey such procedure: + // 1. Execute diff algorithms to calculate indices of items we need to add, del and replace. + // 2. Execute patch algorithm simulation to calculate indices and offsets mappings that is + // necessary to next section's diff works. + + // Immediately do the patch simulation so that we can know: + // 1. Indices and offsets mapping between old dex and patched dex. + // 2. Indices and offsets mapping between new dex and patched dex. + // These information will be used to do next diff works. + this.patchedStringIdsOffset = patchedHeaderOffset + patchedheaderSize; + if (this.oldDex.getTableOfContents().stringIds.isElementFourByteAligned) { + this.patchedStringIdsOffset + = SizeOf.roundToTimesOfFour(this.patchedStringIdsOffset); + } + this.stringDataSectionDiffAlg.execute(); + this.patchedStringDataItemsOffset = patchedheaderSize + patchedIdSectionSize; + if (this.oldDex.getTableOfContents().stringDatas.isElementFourByteAligned) { + this.patchedStringDataItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedStringDataItemsOffset); + } + this.stringDataSectionDiffAlg.simulatePatchOperation(this.patchedStringDataItemsOffset); + + this.typeIdSectionDiffAlg.execute(); + this.patchedTypeIdsOffset = this.patchedStringIdsOffset + patchedStringIdsSize; + if (this.oldDex.getTableOfContents().typeIds.isElementFourByteAligned) { + this.patchedTypeIdsOffset + = SizeOf.roundToTimesOfFour(this.patchedTypeIdsOffset); + } + this.typeIdSectionDiffAlg.simulatePatchOperation(this.patchedTypeIdsOffset); + + this.typeListSectionDiffAlg.execute(); + this.patchedTypeListsOffset + = patchedheaderSize + + patchedIdSectionSize + + this.stringDataSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().typeLists.isElementFourByteAligned) { + this.patchedTypeListsOffset + = SizeOf.roundToTimesOfFour(this.patchedTypeListsOffset); + } + this.typeListSectionDiffAlg.simulatePatchOperation(this.patchedTypeListsOffset); + + this.protoIdSectionDiffAlg.execute(); + this.patchedProtoIdsOffset = this.patchedTypeIdsOffset + patchedTypeIdsSize; + if (this.oldDex.getTableOfContents().protoIds.isElementFourByteAligned) { + this.patchedProtoIdsOffset = SizeOf.roundToTimesOfFour(this.patchedProtoIdsOffset); + } + this.protoIdSectionDiffAlg.simulatePatchOperation(this.patchedProtoIdsOffset); + + this.fieldIdSectionDiffAlg.execute(); + this.patchedFieldIdsOffset = this.patchedProtoIdsOffset + patchedProtoIdsSize; + if (this.oldDex.getTableOfContents().fieldIds.isElementFourByteAligned) { + this.patchedFieldIdsOffset = SizeOf.roundToTimesOfFour(this.patchedFieldIdsOffset); + } + this.fieldIdSectionDiffAlg.simulatePatchOperation(this.patchedFieldIdsOffset); + + this.methodIdSectionDiffAlg.execute(); + this.patchedMethodIdsOffset = this.patchedFieldIdsOffset + patchedFieldIdsSize; + if (this.oldDex.getTableOfContents().methodIds.isElementFourByteAligned) { + this.patchedMethodIdsOffset = SizeOf.roundToTimesOfFour(this.patchedMethodIdsOffset); + } + this.methodIdSectionDiffAlg.simulatePatchOperation(this.patchedMethodIdsOffset); + + this.annotationSectionDiffAlg.execute(); + this.patchedAnnotationItemsOffset + = this.patchedTypeListsOffset + + this.typeListSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().annotations.isElementFourByteAligned) { + this.patchedAnnotationItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedAnnotationItemsOffset); + } + this.annotationSectionDiffAlg.simulatePatchOperation(this.patchedAnnotationItemsOffset); + + this.annotationSetSectionDiffAlg.execute(); + this.patchedAnnotationSetItemsOffset + = this.patchedAnnotationItemsOffset + + this.annotationSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().annotationSets.isElementFourByteAligned) { + this.patchedAnnotationSetItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedAnnotationSetItemsOffset); + } + this.annotationSetSectionDiffAlg.simulatePatchOperation( + this.patchedAnnotationSetItemsOffset + ); + + this.annotationSetRefListSectionDiffAlg.execute(); + this.patchedAnnotationSetRefListItemsOffset + = this.patchedAnnotationSetItemsOffset + + this.annotationSetSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().annotationSetRefLists.isElementFourByteAligned) { + this.patchedAnnotationSetRefListItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedAnnotationSetRefListItemsOffset); + } + this.annotationSetRefListSectionDiffAlg.simulatePatchOperation( + this.patchedAnnotationSetRefListItemsOffset + ); + + this.annotationsDirectorySectionDiffAlg.execute(); + this.patchedAnnotationsDirectoryItemsOffset + = this.patchedAnnotationSetRefListItemsOffset + + this.annotationSetRefListSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().annotationsDirectories.isElementFourByteAligned) { + this.patchedAnnotationsDirectoryItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedAnnotationsDirectoryItemsOffset); + } + this.annotationsDirectorySectionDiffAlg.simulatePatchOperation( + this.patchedAnnotationsDirectoryItemsOffset + ); + + this.debugInfoSectionDiffAlg.execute(); + this.patchedDebugInfoItemsOffset + = this.patchedAnnotationsDirectoryItemsOffset + + this.annotationsDirectorySectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().debugInfos.isElementFourByteAligned) { + this.patchedDebugInfoItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedDebugInfoItemsOffset); + } + this.debugInfoSectionDiffAlg.simulatePatchOperation(this.patchedDebugInfoItemsOffset); + + this.codeSectionDiffAlg.execute(); + this.patchedCodeItemsOffset + = this.patchedDebugInfoItemsOffset + + this.debugInfoSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().codes.isElementFourByteAligned) { + this.patchedCodeItemsOffset = SizeOf.roundToTimesOfFour(this.patchedCodeItemsOffset); + } + this.codeSectionDiffAlg.simulatePatchOperation(this.patchedCodeItemsOffset); + + this.classDataSectionDiffAlg.execute(); + this.patchedClassDataItemsOffset + = this.patchedCodeItemsOffset + + this.codeSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().classDatas.isElementFourByteAligned) { + this.patchedClassDataItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedClassDataItemsOffset); + } + this.classDataSectionDiffAlg.simulatePatchOperation(this.patchedClassDataItemsOffset); + + this.encodedArraySectionDiffAlg.execute(); + this.patchedEncodedArrayItemsOffset + = this.patchedClassDataItemsOffset + + this.classDataSectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().encodedArrays.isElementFourByteAligned) { + this.patchedEncodedArrayItemsOffset + = SizeOf.roundToTimesOfFour(this.patchedEncodedArrayItemsOffset); + } + this.encodedArraySectionDiffAlg.simulatePatchOperation(this.patchedEncodedArrayItemsOffset); + + this.classDefSectionDiffAlg.execute(); + this.patchedClassDefsOffset = this.patchedMethodIdsOffset + patchedMethodIdsSize; + if (this.oldDex.getTableOfContents().classDefs.isElementFourByteAligned) { + this.patchedClassDefsOffset = SizeOf.roundToTimesOfFour(this.patchedClassDefsOffset); + } + + // Calculate any values we still know nothing about them. + this.patchedMapListOffset + = this.patchedEncodedArrayItemsOffset + + this.encodedArraySectionDiffAlg.getPatchedSectionSize(); + if (this.oldDex.getTableOfContents().mapList.isElementFourByteAligned) { + this.patchedMapListOffset = SizeOf.roundToTimesOfFour(this.patchedMapListOffset); + } + int patchedMapListSize = newDex.getTableOfContents().mapList.byteCount; + + this.patchedDexSize + = this.patchedMapListOffset + + patchedMapListSize; + + // Finally, write results to patch file. + writeResultToStream(out); + } + + private void writeResultToStream(OutputStream os) throws IOException { + DexDataBuffer buffer = new DexDataBuffer(); + buffer.write(DexPatchFile.MAGIC); + buffer.writeShort(DexPatchFile.CURRENT_VERSION); + buffer.writeInt(this.patchedDexSize); + // we will return here to write firstChunkOffset later. + int posOfFirstChunkOffsetField = buffer.position(); + buffer.writeInt(0); + buffer.writeInt(this.patchedStringIdsOffset); + buffer.writeInt(this.patchedTypeIdsOffset); + buffer.writeInt(this.patchedProtoIdsOffset); + buffer.writeInt(this.patchedFieldIdsOffset); + buffer.writeInt(this.patchedMethodIdsOffset); + buffer.writeInt(this.patchedClassDefsOffset); + buffer.writeInt(this.patchedMapListOffset); + buffer.writeInt(this.patchedTypeListsOffset); + buffer.writeInt(this.patchedAnnotationSetRefListItemsOffset); + buffer.writeInt(this.patchedAnnotationSetItemsOffset); + buffer.writeInt(this.patchedClassDataItemsOffset); + buffer.writeInt(this.patchedCodeItemsOffset); + buffer.writeInt(this.patchedStringDataItemsOffset); + buffer.writeInt(this.patchedDebugInfoItemsOffset); + buffer.writeInt(this.patchedAnnotationItemsOffset); + buffer.writeInt(this.patchedEncodedArrayItemsOffset); + buffer.writeInt(this.patchedAnnotationsDirectoryItemsOffset); + buffer.write(this.oldDex.computeSignature(false)); + int firstChunkOffset = buffer.position(); + buffer.position(posOfFirstChunkOffsetField); + buffer.writeInt(firstChunkOffset); + buffer.position(firstChunkOffset); + + new PatchOperationsWriter(this.stringDataSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, StringData item) { + buffer.writeStringData(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.typeIdSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, Integer item) { + buffer.writeInt(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.typeListSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, TypeList item) { + buffer.writeTypeList(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.protoIdSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, ProtoId item) { + buffer.writeProtoId(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.fieldIdSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, FieldId item) { + buffer.writeFieldId(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.methodIdSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, MethodId item) { + buffer.writeMethodId(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.annotationSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, Annotation item) { + buffer.writeAnnotation(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.annotationSetSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, AnnotationSet item) { + buffer.writeAnnotationSet(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.annotationSetRefListSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, AnnotationSetRefList item) { + buffer.writeAnnotationSetRefList(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.annotationsDirectorySectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, AnnotationsDirectory item) { + buffer.writeAnnotationsDirectory(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.debugInfoSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, DebugInfoItem item) { + buffer.writeDebugInfoItem(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.codeSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, Code item) { + buffer.writeCode(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.classDataSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, ClassData item) { + buffer.writeClassData(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.encodedArraySectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, EncodedValue item) { + buffer.writeEncodedArray(item); + } + }.writeToBuffer(buffer); + + new PatchOperationsWriter(this.classDefSectionDiffAlg.getPatchOperationList()) { + @Override + protected void writeItem(DexDataBuffer buffer, ClassDef item) { + buffer.writeClassDef(item); + } + }.writeToBuffer(buffer); + + byte[] bufferData = buffer.array(); + os.write(bufferData); + os.flush(); + } + + private abstract class PatchOperationsWriter { + private final List> patchOperationList; + + PatchOperationsWriter(List> patchOperationList) { + this.patchOperationList = patchOperationList; + } + + protected abstract void writeItem(DexDataBuffer buffer, T item); + + public final void writeToBuffer(DexDataBuffer buffer) { + List delOpIndexList = new ArrayList<>(patchOperationList.size()); + List addOpIndexList = new ArrayList<>(patchOperationList.size()); + List replaceOpIndexList = new ArrayList<>(patchOperationList.size()); + List newItemList = new ArrayList<>(patchOperationList.size()); + + for (PatchOperation patchOperation : patchOperationList) { + switch (patchOperation.op) { + case PatchOperation.OP_DEL: { + delOpIndexList.add(patchOperation.index); + break; + } + case PatchOperation.OP_ADD: { + addOpIndexList.add(patchOperation.index); + newItemList.add(patchOperation.newItem); + break; + } + case PatchOperation.OP_REPLACE: { + replaceOpIndexList.add(patchOperation.index); + newItemList.add(patchOperation.newItem); + break; + } + } + } + + buffer.writeUleb128(delOpIndexList.size()); + int lastIndex = 0; + for (Integer index : delOpIndexList) { + buffer.writeSleb128(index - lastIndex); + lastIndex = index; + } + + buffer.writeUleb128(addOpIndexList.size()); + lastIndex = 0; + for (Integer index : addOpIndexList) { + buffer.writeSleb128(index - lastIndex); + lastIndex = index; + } + + buffer.writeUleb128(replaceOpIndexList.size()); + lastIndex = 0; + for (Integer index : replaceOpIndexList) { + buffer.writeSleb128(index - lastIndex); + lastIndex = index; + } + + for (T newItem : newItemList) { + writeItem(buffer, newItem); + } + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSectionDiffAlgorithm.java new file mode 100644 index 00000000..3d07d29e --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class AnnotationSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public AnnotationSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotations; + } + + @Override + protected Annotation nextItem(DexDataBuffer section) { + return section.readAnnotation(); + } + + @Override + protected int getItemSize(Annotation item) { + return item.byteCountInDex(); + } + + @Override + protected Annotation adjustItem(IndexMap indexMap, Annotation item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetRefListSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetRefListSectionDiffAlgorithm.java new file mode 100644 index 00000000..b8561637 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetRefListSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class AnnotationSetRefListSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public AnnotationSetRefListSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotationSetRefLists; + } + + @Override + protected AnnotationSetRefList nextItem(DexDataBuffer section) { + return section.readAnnotationSetRefList(); + } + + @Override + protected int getItemSize(AnnotationSetRefList item) { + return item.byteCountInDex(); + } + + @Override + protected AnnotationSetRefList adjustItem(IndexMap indexMap, AnnotationSetRefList item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationSetRefListOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationSetRefListDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetSectionDiffAlgorithm.java new file mode 100644 index 00000000..98f02533 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationSetSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class AnnotationSetSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public AnnotationSetSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotationSets; + } + + @Override + protected AnnotationSet nextItem(DexDataBuffer section) { + return section.readAnnotationSet(); + } + + @Override + protected int getItemSize(AnnotationSet item) { + return item.byteCountInDex(); + } + + @Override + protected AnnotationSet adjustItem(IndexMap indexMap, AnnotationSet item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationSetOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationSetDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationsDirectorySectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationsDirectorySectionDiffAlgorithm.java new file mode 100644 index 00000000..a72a15ca --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/AnnotationsDirectorySectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class AnnotationsDirectorySectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public AnnotationsDirectorySectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotationsDirectories; + } + + @Override + protected AnnotationsDirectory nextItem(DexDataBuffer section) { + return section.readAnnotationsDirectory(); + } + + @Override + protected int getItemSize(AnnotationsDirectory item) { + return item.byteCountInDex(); + } + + @Override + protected AnnotationsDirectory adjustItem(IndexMap indexMap, AnnotationsDirectory item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationsDirectoryOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationsDirectoryDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDataSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDataSectionDiffAlgorithm.java new file mode 100644 index 00000000..addf7b0d --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDataSectionDiffAlgorithm.java @@ -0,0 +1,91 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class ClassDataSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + private Set offsetOfClassDataToRemoveSet = new HashSet<>(); + + public ClassDataSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + public void setOffsetOfClassDatasToRemove(Collection offsetOfClassDatasToRemove) { + this.offsetOfClassDataToRemoveSet.clear(); + this.offsetOfClassDataToRemoveSet.addAll(offsetOfClassDatasToRemove); + } + + public void clearTypeIdOfClassDefsToRemove() { + this.offsetOfClassDataToRemoveSet.clear(); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().classDatas; + } + + @Override + protected ClassData nextItem(DexDataBuffer section) { + return section.readClassData(); + } + + @Override + protected int getItemSize(ClassData item) { + return item.byteCountInDex(); + } + + @Override + protected ClassData adjustItem(IndexMap indexMap, ClassData item) { + return indexMap.adjust(item); + } + + @Override + public int getPatchedSectionSize() { + // assume each uleb128 field's length may be inflate by 2 bytes. + return super.getPatchedSectionSize() + newDex.getTableOfContents().classDatas.size * SizeOf.USHORT; + } + + @Override + protected boolean shouldSkipInNewDex(ClassData newItem) { + return this.offsetOfClassDataToRemoveSet.contains(newItem.off); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapClassDataOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markClassDataDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDefSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDefSectionDiffAlgorithm.java new file mode 100644 index 00000000..ebb558c7 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ClassDefSectionDiffAlgorithm.java @@ -0,0 +1,73 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class ClassDefSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + private Set typeIdOfClassDefToRemoveSet = new HashSet<>(); + + public ClassDefSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + public void setTypeIdOfClassDefsToRemove(Collection typeIdOfClassDefsToRemove) { + this.typeIdOfClassDefToRemoveSet.clear(); + this.typeIdOfClassDefToRemoveSet.addAll(typeIdOfClassDefsToRemove); + } + + public void clearTypeIdOfClassDefsToRemove() { + this.typeIdOfClassDefToRemoveSet.clear(); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().classDefs; + } + + @Override + protected ClassDef nextItem(DexDataBuffer section) { + return section.readClassDef(); + } + + @Override + protected boolean shouldSkipInNewDex(ClassDef newItem) { + return this.typeIdOfClassDefToRemoveSet.contains(newItem.typeIndex); + } + + @Override + protected int getItemSize(ClassDef item) { + return SizeOf.CLASS_DEF_ITEM; + } + + @Override + protected ClassDef adjustItem(IndexMap indexMap, ClassDef item) { + return indexMap.adjust(item); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/CodeSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/CodeSectionDiffAlgorithm.java new file mode 100644 index 00000000..2672f9ca --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/CodeSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class CodeSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public CodeSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().codes; + } + + @Override + protected Code nextItem(DexDataBuffer section) { + return section.readCode(); + } + + @Override + protected int getItemSize(Code item) { + return item.byteCountInDex(); + } + + @Override + protected Code adjustItem(IndexMap indexMap, Code item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapCodeOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markCodeDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DebugInfoItemSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DebugInfoItemSectionDiffAlgorithm.java new file mode 100644 index 00000000..5c329203 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DebugInfoItemSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class DebugInfoItemSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public DebugInfoItemSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().debugInfos; + } + + @Override + protected DebugInfoItem nextItem(DexDataBuffer section) { + return section.readDebugInfoItem(); + } + + @Override + protected int getItemSize(DebugInfoItem item) { + return item.byteCountInDex(); + } + + @Override + protected DebugInfoItem adjustItem(IndexMap indexMap, DebugInfoItem item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapDebugInfoItemOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markDebugInfoItemDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DexSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DexSectionDiffAlgorithm.java new file mode 100644 index 00000000..9bf57a8e --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/DexSectionDiffAlgorithm.java @@ -0,0 +1,450 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.TableOfContents.Section.Item; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dex.util.CompareUtils; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.PatchOperation; + +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Created by tangyinsheng on 2016/6/29. + */ +public abstract class DexSectionDiffAlgorithm> { + private static final AbstractMap.SimpleEntry[] EMPTY_ENTRY_ARRAY = new AbstractMap.SimpleEntry[0]; + protected final Dex oldDex; + protected final Dex newDex; + /** + * IndexMap for mapping items between old dex and new dex. + * e.g. item.oldIndex => item.newIndex + */ + private final IndexMap oldToNewIndexMap; + /** + * IndexMap for mapping items between old dex and patched dex. + * e.g. item.oldIndex => item.patchedIndex + */ + private final IndexMap oldToPatchedIndexMap; + /** + * IndexMap for mapping items between new dex and patched dex. + * e.g. item.newIndex => item.newIndexInPatchedDex + */ + private final IndexMap newToPatchedIndexMap; + /** + * IndexMap for mapping items in new dex when skip items. + */ + private final IndexMap selfIndexMapForSkip; + private final List> patchOperationList; + private final Map> indexToDelOperationMap = new HashMap<>(); + private final Map> indexToAddOperationMap = new HashMap<>(); + private final Map> indexToReplaceOperationMap = new HashMap<>(); + private final Map oldIndexToNewIndexMap = new HashMap<>(); + private final Map oldOffsetToNewOffsetMap = new HashMap<>(); + private int patchedSectionSize; + private Comparator> comparatorForItemDiff = new Comparator>() { + @Override + public int compare(AbstractMap.SimpleEntry o1, AbstractMap.SimpleEntry o2) { + return o1.getValue().compareTo(o2.getValue()); + } + }; + private Comparator> comparatorForPatchOperationOpt = new Comparator>() { + @Override + public int compare(PatchOperation o1, PatchOperation o2) { + if (o1.index != o2.index) { + return CompareUtils.sCompare(o1.index, o2.index); + } + int o1OrderId; + switch (o1.op) { + case PatchOperation.OP_DEL: + o1OrderId = 0; + break; + case PatchOperation.OP_ADD: + o1OrderId = 1; + break; + case PatchOperation.OP_REPLACE: + o1OrderId = 2; + break; + default: + throw new IllegalStateException("unexpected patch operation code: " + o1.op); + } + int o2OrderId; + switch (o2.op) { + case PatchOperation.OP_DEL: + o2OrderId = 0; + break; + case PatchOperation.OP_ADD: + o2OrderId = 1; + break; + case PatchOperation.OP_REPLACE: + o2OrderId = 2; + break; + default: + throw new IllegalStateException("unexpected patch operation code: " + o2.op); + } + return CompareUtils.sCompare(o1OrderId, o2OrderId); + } + }; + private AbstractMap.SimpleEntry[] adjustedOldIndexedItemsWithOrigOrder = null; + private int oldItemCount = 0; + private int newItemCount = 0; + + public DexSectionDiffAlgorithm( + Dex oldDex, + Dex newDex, + IndexMap oldToNewIndexMap, + IndexMap oldToPatchedIndexMap, + IndexMap newToPatchedIndexMap, + IndexMap selfIndexMapForSkip + ) { + this.oldDex = oldDex; + this.newDex = newDex; + this.oldToNewIndexMap = oldToNewIndexMap; + this.oldToPatchedIndexMap = oldToPatchedIndexMap; + this.newToPatchedIndexMap = newToPatchedIndexMap; + this.selfIndexMapForSkip = selfIndexMapForSkip; + this.patchOperationList = new ArrayList<>(); + this.patchedSectionSize = 0; + } + + public List> getPatchOperationList() { + return this.patchOperationList; + } + + public int getPatchedSectionSize() { + return this.patchedSectionSize; + } + + /** + * Get {@code Section} in {@code TableOfContents}. + */ + protected abstract TableOfContents.Section getTocSection(Dex dex); + + /** + * Get next item in {@code section}. + */ + protected abstract T nextItem(DexDataBuffer section); + + /** + * Get item size. + */ + protected abstract int getItemSize(T item); + + /** + * Adjust {@code item} using specific {@code indexMap} + */ + protected T adjustItem(IndexMap indexMap, T item) { + return item; + } + + /** + * Indicate if {@code item} should be skipped in new dex. + */ + protected boolean shouldSkipInNewDex(T newItem) { + return false; + } + + /** + * Update index or offset mapping in {@code indexMap}. + */ + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + // Should override by subclass if needed. + } + + /** + * Mark deleted index or offset in {@code indexMap}. + */ + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + // Should override by subclass if needed. + } + + /** + * Adapter method for item's offset fetching, if an item is not + * inherited from {@code Item} (which means it is a simple item in dex section + * that doesn't need multiple members to describe), this method + * return {@code index} instead. + */ + private int getItemOffsetOrIndex(int index, T item) { + if (item instanceof Item) { + return ((Item) item).off; + } else { + return index; + } + } + + @SuppressWarnings("unchecked,NewApi") + private AbstractMap.SimpleEntry[] collectSectionItems(Dex dex, boolean isOldDex) { + TableOfContents.Section tocSec = getTocSection(dex); + if (!tocSec.exists()) { + return EMPTY_ENTRY_ARRAY; + } + Dex.Section dexSec = dex.openSection(tocSec); + int itemCount = tocSec.size; + List> result = new ArrayList<>(itemCount); + if (isOldDex) { + for (int i = 0; i < itemCount; ++i) { + T nextItem = nextItem(dexSec); + T adjustedItem = adjustItem(oldToPatchedIndexMap, nextItem); + result.add(new AbstractMap.SimpleEntry<>(i, adjustedItem)); + } + } else { + int i = 0; + while (i < itemCount) { + T nextItem = nextItem(dexSec); + int indexBeforeSkip = i; + int offsetBeforeSkip = getItemOffsetOrIndex(indexBeforeSkip, nextItem); + int indexAfterSkip = indexBeforeSkip; + while (indexAfterSkip < itemCount && shouldSkipInNewDex(nextItem)) { + if (indexAfterSkip + 1 >= itemCount) { + // after skipping last item, nextItem will be null. + nextItem = null; + } else { + nextItem = nextItem(dexSec); + } + ++indexAfterSkip; + } + if (nextItem != null) { + int offsetAfterSkip = getItemOffsetOrIndex(indexAfterSkip, nextItem); + T adjustedItem = adjustItem(newToPatchedIndexMap, adjustItem(selfIndexMapForSkip, nextItem)); + int currentOutIndex = result.size(); + result.add(new AbstractMap.SimpleEntry<>(currentOutIndex, adjustedItem)); + updateIndexOrOffset(selfIndexMapForSkip, indexBeforeSkip, offsetBeforeSkip, indexAfterSkip, offsetAfterSkip); + } + i = indexAfterSkip; + ++i; + } + } + return result.toArray(new AbstractMap.SimpleEntry[0]); + } + + public void execute() { + this.patchOperationList.clear(); + + this.adjustedOldIndexedItemsWithOrigOrder = collectSectionItems(this.oldDex, true); + this.oldItemCount = this.adjustedOldIndexedItemsWithOrigOrder.length; + + AbstractMap.SimpleEntry[] adjustedOldIndexedItems = new AbstractMap.SimpleEntry[this.oldItemCount]; + System.arraycopy(this.adjustedOldIndexedItemsWithOrigOrder, 0, adjustedOldIndexedItems, 0, this.oldItemCount); + Arrays.sort(adjustedOldIndexedItems, this.comparatorForItemDiff); + + AbstractMap.SimpleEntry[] adjustedNewIndexedItems = collectSectionItems(this.newDex, false); + this.newItemCount = adjustedNewIndexedItems.length; + Arrays.sort(adjustedNewIndexedItems, this.comparatorForItemDiff); + + int oldCursor = 0; + int newCursor = 0; + while (oldCursor < this.oldItemCount || newCursor < this.newItemCount) { + if (oldCursor >= this.oldItemCount) { + // rest item are all newItem. + while (newCursor < this.newItemCount) { + AbstractMap.SimpleEntry newIndexedItem = adjustedNewIndexedItems[newCursor++]; + this.patchOperationList.add(new PatchOperation<>(PatchOperation.OP_ADD, newIndexedItem.getKey(), newIndexedItem.getValue())); + } + } else + if (newCursor >= newItemCount) { + // rest item are all oldItem. + while (oldCursor < oldItemCount) { + AbstractMap.SimpleEntry oldIndexedItem = adjustedOldIndexedItems[oldCursor++]; + int deletedIndex = oldIndexedItem.getKey(); + int deletedOffset = getItemOffsetOrIndex(deletedIndex, oldIndexedItem.getValue()); + this.patchOperationList.add(new PatchOperation(PatchOperation.OP_DEL, deletedIndex)); + markDeletedIndexOrOffset(this.oldToPatchedIndexMap, deletedIndex, deletedOffset); + } + } else { + AbstractMap.SimpleEntry oldIndexedItem = adjustedOldIndexedItems[oldCursor]; + AbstractMap.SimpleEntry newIndexedItem = adjustedNewIndexedItems[newCursor]; + int cmpRes = oldIndexedItem.getValue().compareTo(newIndexedItem.getValue()); + if (cmpRes < 0) { + int deletedIndex = oldIndexedItem.getKey(); + int deletedOffset = getItemOffsetOrIndex(deletedIndex, oldIndexedItem.getValue()); + this.patchOperationList.add(new PatchOperation(PatchOperation.OP_DEL, deletedIndex)); + markDeletedIndexOrOffset(this.oldToPatchedIndexMap, deletedIndex, deletedOffset); + ++oldCursor; + } else + if (cmpRes > 0) { + this.patchOperationList.add(new PatchOperation<>(PatchOperation.OP_ADD, newIndexedItem.getKey(), newIndexedItem.getValue())); + ++newCursor; + } else { + int oldIndex = oldIndexedItem.getKey(); + int newIndex = newIndexedItem.getKey(); + int oldOffset = getItemOffsetOrIndex(oldIndexedItem.getKey(), oldIndexedItem.getValue()); + int newOffset = getItemOffsetOrIndex(newIndexedItem.getKey(), newIndexedItem.getValue()); + + if (oldIndex != newIndex) { + this.oldIndexToNewIndexMap.put(oldIndex, newIndex); + } + + if (oldOffset != newOffset) { + this.oldOffsetToNewOffsetMap.put(oldOffset, newOffset); + } + + ++oldCursor; + ++newCursor; + } + } + } + + // So far all diff works are done. Then we perform some optimize works. + // detail: {OP_DEL idx} followed by {OP_ADD the_same_idx newItem} + // will be replaced by {OP_REPLACE idx newItem} + Collections.sort(this.patchOperationList, comparatorForPatchOperationOpt); + + Iterator> patchOperationIt = this.patchOperationList.iterator(); + PatchOperation prevPatchOperation = null; + while (patchOperationIt.hasNext()) { + PatchOperation patchOperation = patchOperationIt.next(); + if (prevPatchOperation != null + && prevPatchOperation.op == PatchOperation.OP_DEL + && patchOperation.op == PatchOperation.OP_ADD + ) { + if (prevPatchOperation.index == patchOperation.index) { + prevPatchOperation.op = PatchOperation.OP_REPLACE; + prevPatchOperation.newItem = patchOperation.newItem; + patchOperationIt.remove(); + prevPatchOperation = null; + } else { + prevPatchOperation = patchOperation; + } + } else { + prevPatchOperation = patchOperation; + } + } + + // Finally we record some information for the final calculations. + patchOperationIt = this.patchOperationList.iterator(); + while (patchOperationIt.hasNext()) { + PatchOperation patchOperation = patchOperationIt.next(); + switch (patchOperation.op) { + case PatchOperation.OP_DEL: { + indexToDelOperationMap.put(patchOperation.index, patchOperation); + break; + } + case PatchOperation.OP_ADD: { + indexToAddOperationMap.put(patchOperation.index, patchOperation); + break; + } + case PatchOperation.OP_REPLACE: { + indexToReplaceOperationMap.put(patchOperation.index, patchOperation); + break; + } + } + } + } + + public void simulatePatchOperation(int baseOffset) { + boolean isNeedToMakeAlign = getTocSection(this.oldDex).isElementFourByteAligned; + int oldIndex = 0; + int patchedIndex = 0; + int patchedOffset = baseOffset; + while (oldIndex < this.oldItemCount || patchedIndex < this.newItemCount) { + if (this.indexToAddOperationMap.containsKey(patchedIndex)) { + PatchOperation patchOperation = this.indexToAddOperationMap.get(patchedIndex); + if (isNeedToMakeAlign) { + patchedOffset = SizeOf.roundToTimesOfFour(patchedOffset); + } + T newItem = patchOperation.newItem; + int itemSize = getItemSize(newItem); + updateIndexOrOffset( + this.newToPatchedIndexMap, + 0, + getItemOffsetOrIndex(patchOperation.index, newItem), + 0, + patchedOffset + ); + ++patchedIndex; + patchedOffset += itemSize; + } else + if (this.indexToReplaceOperationMap.containsKey(patchedIndex)) { + PatchOperation patchOperation = this.indexToReplaceOperationMap.get(patchedIndex); + if (isNeedToMakeAlign) { + patchedOffset = SizeOf.roundToTimesOfFour(patchedOffset); + } + T newItem = patchOperation.newItem; + int itemSize = getItemSize(newItem); + updateIndexOrOffset( + this.newToPatchedIndexMap, + 0, + getItemOffsetOrIndex(patchOperation.index, newItem), + 0, + patchedOffset + ); + ++patchedIndex; + patchedOffset += itemSize; + } else + if (this.indexToDelOperationMap.containsKey(oldIndex)) { + ++oldIndex; + } else + if (this.indexToReplaceOperationMap.containsKey(oldIndex)) { + ++oldIndex; + } else + if (oldIndex < this.oldItemCount) { + if (isNeedToMakeAlign) { + patchedOffset = SizeOf.roundToTimesOfFour(patchedOffset); + } + + T oldItem = this.adjustedOldIndexedItemsWithOrigOrder[oldIndex].getValue(); + int itemSize = getItemSize(oldItem); + + int oldOffset = getItemOffsetOrIndex(oldIndex, oldItem); + + updateIndexOrOffset( + this.oldToPatchedIndexMap, + oldIndex, + oldOffset, + patchedIndex, + patchedOffset + ); + + int newIndex = oldIndex; + if (this.oldIndexToNewIndexMap.containsKey(oldIndex)) { + newIndex = this.oldIndexToNewIndexMap.get(oldIndex); + } + + int newOffset = oldOffset; + if (this.oldOffsetToNewOffsetMap.containsKey(oldOffset)) { + newOffset = this.oldOffsetToNewOffsetMap.get(oldOffset); + } + + updateIndexOrOffset( + this.newToPatchedIndexMap, + newIndex, + newOffset, + patchedIndex, + patchedOffset + ); + + ++oldIndex; + ++patchedIndex; + patchedOffset += itemSize; + } + } + + this.patchedSectionSize = SizeOf.roundToTimesOfFour(patchedOffset - baseOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/FieldIdSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/FieldIdSectionDiffAlgorithm.java new file mode 100644 index 00000000..f1751361 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/FieldIdSectionDiffAlgorithm.java @@ -0,0 +1,65 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class FieldIdSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public FieldIdSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().fieldIds; + } + + @Override + protected FieldId nextItem(DexDataBuffer section) { + return section.readFieldId(); + } + + @Override + protected int getItemSize(FieldId item) { + return SizeOf.MEMBER_ID_ITEM; + } + + @Override + protected FieldId adjustItem(IndexMap indexMap, FieldId item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapFieldIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markFieldIdDeleted(deletedIndex); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/MethodIdSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/MethodIdSectionDiffAlgorithm.java new file mode 100644 index 00000000..4456dacb --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/MethodIdSectionDiffAlgorithm.java @@ -0,0 +1,65 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class MethodIdSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public MethodIdSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().methodIds; + } + + @Override + protected MethodId nextItem(DexDataBuffer section) { + return section.readMethodId(); + } + + @Override + protected int getItemSize(MethodId item) { + return SizeOf.MEMBER_ID_ITEM; + } + + @Override + protected MethodId adjustItem(IndexMap indexMap, MethodId item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapMethodIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markMethodIdDeleted(deletedIndex); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ProtoIdSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ProtoIdSectionDiffAlgorithm.java new file mode 100644 index 00000000..fcec419b --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/ProtoIdSectionDiffAlgorithm.java @@ -0,0 +1,65 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class ProtoIdSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public ProtoIdSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().protoIds; + } + + @Override + protected ProtoId nextItem(DexDataBuffer section) { + return section.readProtoId(); + } + + @Override + protected int getItemSize(ProtoId item) { + return SizeOf.PROTO_ID_ITEM; + } + + @Override + protected ProtoId adjustItem(IndexMap indexMap, ProtoId item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapProtoIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markProtoIdDeleted(deletedIndex); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StaticValueSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StaticValueSectionDiffAlgorithm.java new file mode 100644 index 00000000..51e7a223 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StaticValueSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class StaticValueSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public StaticValueSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().encodedArrays; + } + + @Override + protected EncodedValue nextItem(DexDataBuffer section) { + return section.readEncodedArray(); + } + + @Override + protected int getItemSize(EncodedValue item) { + return item.byteCountInDex(); + } + + @Override + protected EncodedValue adjustItem(IndexMap indexMap, EncodedValue item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapStaticValuesOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markStaticValuesDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StringDataSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StringDataSectionDiffAlgorithm.java new file mode 100644 index 00000000..e75a9c37 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/StringDataSectionDiffAlgorithm.java @@ -0,0 +1,59 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.StringData; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class StringDataSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public StringDataSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().stringDatas; + } + + @Override + protected StringData nextItem(DexDataBuffer section) { + return section.readStringData(); + } + + @Override + protected int getItemSize(StringData item) { + return item.byteCountInDex(); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapStringIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markStringIdDeleted(deletedIndex); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeIdSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeIdSectionDiffAlgorithm.java new file mode 100644 index 00000000..e9b3dd75 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeIdSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class TypeIdSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public TypeIdSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().typeIds; + } + + @Override + protected Integer nextItem(DexDataBuffer section) { + return section.readInt(); + } + + @Override + protected int getItemSize(Integer item) { + return SizeOf.UINT; + } + + @Override + protected Integer adjustItem(IndexMap indexMap, Integer item) { + return indexMap.adjustStringIndex(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapTypeIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markTypeIdDeleted(deletedIndex); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeListSectionDiffAlgorithm.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeListSectionDiffAlgorithm.java new file mode 100644 index 00000000..2562600e --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/algorithms/diff/TypeListSectionDiffAlgorithm.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.algorithms.diff; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class TypeListSectionDiffAlgorithm extends DexSectionDiffAlgorithm { + public TypeListSectionDiffAlgorithm(Dex oldDex, Dex newDex, IndexMap oldToNewIndexMap, IndexMap oldToPatchedIndexMap, IndexMap newToPatchedIndexMap, IndexMap selfIndexMapForSkip) { + super(oldDex, newDex, oldToNewIndexMap, oldToPatchedIndexMap, newToPatchedIndexMap, selfIndexMapForSkip); + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().typeLists; + } + + @Override + protected TypeList nextItem(DexDataBuffer section) { + return section.readTypeList(); + } + + @Override + protected int getItemSize(TypeList item) { + return item.byteCountInDex(); + } + + @Override + protected TypeList adjustItem(IndexMap indexMap, TypeList item) { + return indexMap.adjust(item); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapTypeListOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markTypeListDeleted(deletedOffset); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/OffsetToIndexConverter.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/OffsetToIndexConverter.java new file mode 100644 index 00000000..80673a8a --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/OffsetToIndexConverter.java @@ -0,0 +1,187 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.util; + +import com.tencent.tinker.android.dex.Dex; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by tangyinsheng on 2016/9/11. + */ +public final class OffsetToIndexConverter { + private final Map typeListOffsetToIndexMap = new HashMap<>(); + private final Map classDataOffsetToIndexMap = new HashMap<>(); + private final Map encodedArrayOffsetToIndexMap = new HashMap<>(); + private final Map annotationOffsetToIndexMap = new HashMap<>(); + private final Map annotationSetOffsetToIndexMap = new HashMap<>(); + private final Map annotationSetRefListOffsetToIndexMap = new HashMap<>(); + private final Map annotationsDirectoryOffsetToIndexMap = new HashMap<>(); + private final Map codeOffsetToIndexMap = new HashMap<>(); + private final Map debugInfoItemOffsetToIndexMap = new HashMap<>(); + + public OffsetToIndexConverter(Dex dex) { + if (dex == null) { + throw new IllegalArgumentException("dex is null."); + } + + if (dex.getTableOfContents().typeLists.exists()) { + Dex.Section typeListSec = dex.openSection(dex.getTableOfContents().typeLists); + int typeListCount = dex.getTableOfContents().typeLists.size; + for (int i = 0; i < typeListCount; ++i) { + typeListOffsetToIndexMap.put(typeListSec.readTypeList().off, i); + } + } + + if (dex.getTableOfContents().classDatas.exists()) { + Dex.Section classDataSec = dex.openSection(dex.getTableOfContents().classDatas); + int classDataCount = dex.getTableOfContents().classDatas.size; + for (int i = 0; i < classDataCount; ++i) { + classDataOffsetToIndexMap.put(classDataSec.readClassData().off, i); + } + } + + if (dex.getTableOfContents().encodedArrays.exists()) { + Dex.Section encodedArraySec = dex.openSection(dex.getTableOfContents().encodedArrays); + int encodedArrayCount = dex.getTableOfContents().encodedArrays.size; + for (int i = 0; i < encodedArrayCount; ++i) { + encodedArrayOffsetToIndexMap.put(encodedArraySec.readEncodedArray().off, i); + } + } + + if (dex.getTableOfContents().annotations.exists()) { + Dex.Section annotationSec = dex.openSection(dex.getTableOfContents().annotations); + int annotationCount = dex.getTableOfContents().annotations.size; + for (int i = 0; i < annotationCount; ++i) { + annotationOffsetToIndexMap.put(annotationSec.readAnnotation().off, i); + } + } + + if (dex.getTableOfContents().annotationSets.exists()) { + Dex.Section annotationSetSec = dex.openSection(dex.getTableOfContents().annotationSets); + int annotationSetCount = dex.getTableOfContents().annotationSets.size; + for (int i = 0; i < annotationSetCount; ++i) { + annotationSetOffsetToIndexMap.put(annotationSetSec.readAnnotationSet().off, i); + } + } + + if (dex.getTableOfContents().annotationSetRefLists.exists()) { + Dex.Section annotationSetRefListSec = dex.openSection(dex.getTableOfContents().annotationSetRefLists); + int annotationSetRefListCount = dex.getTableOfContents().annotationSetRefLists.size; + for (int i = 0; i < annotationSetRefListCount; ++i) { + annotationSetRefListOffsetToIndexMap.put(annotationSetRefListSec.readAnnotationSetRefList().off, i); + } + } + + if (dex.getTableOfContents().annotationsDirectories.exists()) { + Dex.Section annotationsDirectorySec = dex.openSection(dex.getTableOfContents().annotationsDirectories); + int annotationsDirectoryCount = dex.getTableOfContents().annotationsDirectories.size; + for (int i = 0; i < annotationsDirectoryCount; ++i) { + annotationsDirectoryOffsetToIndexMap.put(annotationsDirectorySec.readAnnotationsDirectory().off, i); + } + } + + if (dex.getTableOfContents().codes.exists()) { + Dex.Section codeSec = dex.openSection(dex.getTableOfContents().codes); + int codeCount = dex.getTableOfContents().codes.size; + for (int i = 0; i < codeCount; ++i) { + codeOffsetToIndexMap.put(codeSec.readCode().off, i); + } + } + + if (dex.getTableOfContents().debugInfos.exists()) { + Dex.Section debugInfoItemSec = dex.openSection(dex.getTableOfContents().debugInfos); + int debugInfoItemCount = dex.getTableOfContents().debugInfos.size; + for (int i = 0; i < debugInfoItemCount; ++i) { + debugInfoItemOffsetToIndexMap.put(debugInfoItemSec.readDebugInfoItem().off, i); + } + } + } + + public int getTypeListIndexByOffset(int offset) { + if (typeListOffsetToIndexMap.containsKey(offset)) { + return typeListOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getClassDataIndexByOffset(int offset) { + if (classDataOffsetToIndexMap.containsKey(offset)) { + return classDataOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getEncodedArrayIndexByOffset(int offset) { + if (encodedArrayOffsetToIndexMap.containsKey(offset)) { + return encodedArrayOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getAnnotationIndexByOffset(int offset) { + if (annotationOffsetToIndexMap.containsKey(offset)) { + return annotationOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getAnnotationSetIndexByOffset(int offset) { + if (annotationSetOffsetToIndexMap.containsKey(offset)) { + return annotationSetOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getAnnotationSetRefListIndexByOffset(int offset) { + if (annotationSetRefListOffsetToIndexMap.containsKey(offset)) { + return annotationSetRefListOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getAnnotationsDirectoryIndexByOffset(int offset) { + if (annotationsDirectoryOffsetToIndexMap.containsKey(offset)) { + return annotationsDirectoryOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getCodeIndexByOffset(int offset) { + if (codeOffsetToIndexMap.containsKey(offset)) { + return codeOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } + + public int getDebugInfoItemIndexByOffset(int offset) { + if (debugInfoItemOffsetToIndexMap.containsKey(offset)) { + return debugInfoItemOffsetToIndexMap.get(offset); + } else { + throw new IllegalArgumentException("cannot find corresponding index of offset: " + offset); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/PatternUtils.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/PatternUtils.java new file mode 100644 index 00000000..988290c2 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/PatternUtils.java @@ -0,0 +1,89 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.util; + +/** + * Created by tangyinsheng on 2016/4/8. + */ +public class PatternUtils { + + public static String dotClassNamePatternToDescriptorRegEx(String dotPattern) { + if (dotPattern.startsWith("L") && dotPattern.endsWith(";") || dotPattern.startsWith("[")) { + return dotPattern.replace('.', '/').replace("[", "\\["); + } + + String descriptor = dotPattern.replace('.', '/'); + + StringBuilder sb = new StringBuilder(); + + int i; + for (i = dotPattern.length() - 1; i >= 1; i -= 2) { + char ch = dotPattern.charAt(i); + char prevCh = dotPattern.charAt(i - 1); + if (prevCh == '[' && ch == ']') { + sb.append("\\["); + } else { + break; + } + } + + descriptor = descriptor.substring(0, i + 1); + + if ("void".equals(descriptor)) { + descriptor = "V"; + sb.append(descriptor); + } else if ("boolean".equals(descriptor)) { + descriptor = "Z"; + sb.append(descriptor); + } else if ("byte".equals(descriptor)) { + descriptor = "B"; + sb.append(descriptor); + } else if ("short".equals(descriptor)) { + descriptor = "S"; + sb.append(descriptor); + } else if ("char".equals(descriptor)) { + descriptor = "C"; + sb.append(descriptor); + } else if ("int".equals(descriptor)) { + descriptor = "I"; + sb.append(descriptor); + } else if ("long".equals(descriptor)) { + descriptor = "J"; + sb.append(descriptor); + } else if ("float".equals(descriptor)) { + descriptor = "F"; + sb.append(descriptor); + } else if ("double".equals(descriptor)) { + descriptor = "D"; + sb.append(descriptor); + } else { + sb.append('L').append(descriptor); + + if (!descriptor.endsWith(";")) { + sb.append(';'); + } + } + + String regEx = sb.toString(); + regEx = regEx.replace("*", ".*"); + regEx = regEx.replace("?", ".?"); + regEx = regEx.replace("$", "\\$"); + regEx = '^' + regEx + '$'; + + return regEx; + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/SmallDexPatchGenerator.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/SmallDexPatchGenerator.java new file mode 100644 index 00000000..dd805303 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/dexpatcher/util/SmallDexPatchGenerator.java @@ -0,0 +1,1965 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.dexpatcher.util; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.DexException; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.EncodedValueReader; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.Leb128; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.StringData; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dex.util.ByteInput; +import com.tencent.tinker.android.dx.instruction.InstructionCodec; +import com.tencent.tinker.android.dx.instruction.InstructionReader; +import com.tencent.tinker.android.dx.instruction.InstructionVisitor; +import com.tencent.tinker.android.dx.instruction.ShortArrayCodeInput; +import com.tencent.tinker.android.dx.util.Hex; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.build.util.DexClassesComparator; +import com.tencent.tinker.build.util.DexClassesComparator.DexClassInfo; +import com.tencent.tinker.build.util.DexClassesComparator.DexGroup; +import com.tencent.tinker.commons.dexpatcher.DexPatcherLogger; +import com.tencent.tinker.commons.dexpatcher.DexPatcherLogger.IDexPatcherLogger; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created by tangyinsheng on 2016/8/8. + */ +public final class SmallDexPatchGenerator { + private static final String TAG = "SmallDexPatchGenerator"; + + private final List oldDexGroups = new ArrayList<>(); + private final List patchedDexGroups = new ArrayList<>(); + + private final Map> + patchedDexToCollectedStringIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedTypeIdIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedTypeListIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedProtoIdIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedFieldIdIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedMethodIdIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedAnnotationIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedAnnotationSetIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedAnnotationSetRefListIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedAnnotationsDirectoryIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedEncodedArrayIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedDebugInfoIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedCodeIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedClassDataIndicesMap = new HashMap<>(); + private final Map> + patchedDexToCollectedClassDefIndicesMap = new HashMap<>(); + + private final Map + patchedDexToSmallPatchedStringIdOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedTypeIdOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedProtoIdOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedFieldIdOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedMethodIdOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedClassDefOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedMapListOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedTypeListOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedAnnotationSetRefListOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedAnnotationSetOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedClassDataOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedCodeOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedStringDataOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedDebugInfoOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedAnnotationOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedEncodedArrayOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedAnnotationsDirectoryOffsetMap = new HashMap<>(); + private final Map + patchedDexToSmallPatchedDexSizeMap = new HashMap<>(); + + private final Set loaderClassPatterns = new HashSet<>(); + + private final DexPatcherLogger logger = new DexPatcherLogger(); + + public void addLoaderClassPattern(String pattern) { + this.loaderClassPatterns.add(pattern); + } + + public void setLoaderClassPatterns(Collection patterns) { + this.loaderClassPatterns.clear(); + this.loaderClassPatterns.addAll(patterns); + } + + public void clearLoaderClassPatterns() { + this.loaderClassPatterns.clear(); + } + + public void setLogger(IDexPatcherLogger logger) { + this.logger.setLoggerImpl(logger); + } + + public SmallDexPatchGenerator appendDexGroup(DexGroup oldDexGroup, DexGroup patchedDexGroup) { + if (oldDexGroup == null) { + throw new IllegalArgumentException("oldDexGroup is null."); + } + if (patchedDexGroup == null) { + throw new IllegalArgumentException("patchedDexGroup is null."); + } + + this.oldDexGroups.add(oldDexGroup); + this.patchedDexGroups.add(patchedDexGroup); + + // Build map between patched dex and old dex, which is used in next logic. + if (oldDexGroup.dexes.length != patchedDexGroup.dexes.length) { + throw new IllegalArgumentException( + "dex count in oldDexGroup is not matched to dex count in patchedDexGroup." + ); + } + + return this; + } + + public void executeAndSaveTo(File out) throws IOException { + OutputStream os = null; + try { + os = new BufferedOutputStream(new FileOutputStream(out)); + executeAndSaveTo(os); + } finally { + if (os != null) { + try { + os.close(); + } catch (Exception e) { + // ignored. + } + } + } + } + + public void executeAndSaveTo(OutputStream os) throws IOException { + int dexGroupCount = this.oldDexGroups.size(); + + // Collect all items that should be exist in small patched dex. + for (int i = 0; i < dexGroupCount; ++i) { + DexGroup oldDexGroup = oldDexGroups.get(i); + DexGroup patchedDexGroup = patchedDexGroups.get(i); + + collectItemIndicesFromDexGroup(oldDexGroup, patchedDexGroup); + calculateSmallPatchedSectionOffsets(oldDexGroup, patchedDexGroup); + } + + saveToStream(os); + } + + private void calculateSmallPatchedSectionOffsets( + DexGroup oldDexGroup, DexGroup patchedDexGroup + ) { + if (oldDexGroup.dexes.length != patchedDexGroup.dexes.length) { + throw new IllegalStateException("dex group contains different amount of dexes."); + } + int dexCount = oldDexGroup.dexes.length; + for (int dexId = 0; dexId < dexCount; ++dexId) { + Dex oldDex = oldDexGroup.dexes[dexId]; + Dex patchedDex = patchedDexGroup.dexes[dexId]; + + final String currOldDexSignStr = Hex.toHexString(oldDex.computeSignature(false)); + + IndexMap fullToSmallPatchIndexMap = new IndexMap(); + + // For calculating size of mapList soon. + // Initialize it to 2 means a dex must contains two sections: header + // and mapList. + int smallPatchedSectionCount = 2; + + // In next steps we do a bunch of simulations to calculate actual sizes of + // each section in small patched dex. + + // First, calculate header and id sections size, so that we can work out + // base offsets of data sections soon. + int smallPatchedHeaderSize = SizeOf.HEADER_ITEM; + int collectedStringIndicesCount = getCollectedIndicesCountSafely( + patchedDexToCollectedStringIndicesMap, patchedDex + ); + int smallPatchedStringIdsSize = collectedStringIndicesCount * SizeOf.STRING_ID_ITEM; + if (smallPatchedHeaderSize > 0) { + ++smallPatchedSectionCount; + } + int collectedTypeIndicesCount = getCollectedIndicesCountSafely( + patchedDexToCollectedTypeIdIndicesMap, patchedDex + ); + int smallPatchedTypeIdsSize = collectedTypeIndicesCount * SizeOf.TYPE_ID_ITEM; + if (smallPatchedTypeIdsSize > 0) { + ++smallPatchedSectionCount; + } + + // Although simulatePatchOperation can calculate this value, since protoIds section + // depends on typeLists section, we can't run protoIds Section's simulatePatchOperation + // method so far. Instead we calculate protoIds section's size using information we known + // directly. + int collectedProtoIdsIndicesCount = getCollectedIndicesCountSafely( + patchedDexToCollectedProtoIdIndicesMap, patchedDex + ); + int smallPatchedProtoIdsSize = collectedProtoIdsIndicesCount * SizeOf.PROTO_ID_ITEM; + if (smallPatchedProtoIdsSize > 0) { + ++smallPatchedSectionCount; + } + + int collectedFieldIdsIndicesCount = getCollectedIndicesCountSafely( + patchedDexToCollectedFieldIdIndicesMap, patchedDex + ); + int smallPatchedFieldIdsSize = collectedFieldIdsIndicesCount * SizeOf.MEMBER_ID_ITEM; + if (smallPatchedFieldIdsSize > 0) { + ++smallPatchedSectionCount; + } + int collectedMethodIdsIndicesCount = getCollectedIndicesCountSafely( + patchedDexToCollectedMethodIdIndicesMap, patchedDex + ); + int smallPatchedMethodIdsSize = collectedMethodIdsIndicesCount * SizeOf.MEMBER_ID_ITEM; + if (smallPatchedMethodIdsSize > 0) { + ++smallPatchedSectionCount; + } + int collectedClassDefsIndicesCount = getCollectedIndicesCountSafely( + patchedDexToCollectedClassDefIndicesMap, patchedDex + ); + int smallPatchedClassDefsSize = collectedClassDefsIndicesCount * SizeOf.CLASS_DEF_ITEM; + if (smallPatchedClassDefsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedIdSectionSize = + smallPatchedStringIdsSize + + smallPatchedTypeIdsSize + + smallPatchedProtoIdsSize + + smallPatchedFieldIdsSize + + smallPatchedMethodIdsSize + + smallPatchedClassDefsSize; + + int smallPatchedHeaderOffset = 0; + + int smallPatchedStringIdsOffset = smallPatchedHeaderOffset + smallPatchedHeaderSize; + if (oldDex.getTableOfContents().stringIds.isElementFourByteAligned) { + smallPatchedStringIdsOffset = SizeOf.roundToTimesOfFour(smallPatchedStringIdsOffset); + } + patchedDexToSmallPatchedStringIdOffsetMap.put(patchedDex, smallPatchedStringIdsOffset); + + int smallPatchedStringDatasOffset = smallPatchedHeaderSize + smallPatchedIdSectionSize; + if (oldDex.getTableOfContents().stringDatas.isElementFourByteAligned) { + smallPatchedStringDatasOffset + = SizeOf.roundToTimesOfFour(smallPatchedStringDatasOffset); + } + patchedDexToSmallPatchedStringDataOffsetMap.put(patchedDex, smallPatchedStringDatasOffset); + int smallPatchedStringDataItemsSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().stringDatas, + fullToSmallPatchIndexMap, + patchedDexToCollectedStringIndicesMap.get(patchedDex) + ).simulate(smallPatchedStringDatasOffset); + if (smallPatchedStringDataItemsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedTypeIdsOffset + = smallPatchedStringIdsOffset + smallPatchedStringIdsSize; + if (oldDex.getTableOfContents().typeIds.isElementFourByteAligned) { + smallPatchedTypeIdsOffset = SizeOf.roundToTimesOfFour(smallPatchedTypeIdsOffset); + } + patchedDexToSmallPatchedTypeIdOffsetMap.put(patchedDex, smallPatchedTypeIdsOffset); + + int smallPatchedTypeListsOffset + = smallPatchedHeaderSize + + smallPatchedIdSectionSize + + smallPatchedStringDataItemsSize; + if (oldDex.getTableOfContents().typeLists.isElementFourByteAligned) { + smallPatchedTypeListsOffset = SizeOf.roundToTimesOfFour(smallPatchedTypeListsOffset); + } + patchedDexToSmallPatchedTypeListOffsetMap.put( + patchedDex, smallPatchedTypeListsOffset + ); + int smallPatchedTypeListsSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().typeLists, + fullToSmallPatchIndexMap, + patchedDexToCollectedTypeListIndicesMap.get(patchedDex) + ).simulate(smallPatchedTypeListsOffset); + if (smallPatchedTypeListsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedProtoIdsOffset + = smallPatchedTypeIdsOffset + smallPatchedTypeIdsSize; + if (oldDex.getTableOfContents().protoIds.isElementFourByteAligned) { + smallPatchedProtoIdsOffset = SizeOf.roundToTimesOfFour(smallPatchedProtoIdsOffset); + } + patchedDexToSmallPatchedProtoIdOffsetMap.put( + patchedDex, smallPatchedProtoIdsOffset + ); + + int smallPatchedFieldIdsOffset + = smallPatchedProtoIdsOffset + smallPatchedProtoIdsSize; + if (oldDex.getTableOfContents().fieldIds.isElementFourByteAligned) { + smallPatchedFieldIdsOffset = SizeOf.roundToTimesOfFour(smallPatchedFieldIdsOffset); + } + patchedDexToSmallPatchedFieldIdOffsetMap.put( + patchedDex, smallPatchedFieldIdsOffset + ); + + int smallPatchedMethodIdsOffset + = smallPatchedFieldIdsOffset + smallPatchedFieldIdsSize; + if (oldDex.getTableOfContents().methodIds.isElementFourByteAligned) { + smallPatchedMethodIdsOffset + = SizeOf.roundToTimesOfFour(smallPatchedMethodIdsOffset); + } + patchedDexToSmallPatchedMethodIdOffsetMap.put( + patchedDex, smallPatchedMethodIdsOffset + ); + + int smallPatchedAnnotationsOffset + = smallPatchedTypeListsOffset + smallPatchedTypeListsSize; + if (oldDex.getTableOfContents().annotations.isElementFourByteAligned) { + smallPatchedAnnotationsOffset + = SizeOf.roundToTimesOfFour(smallPatchedAnnotationsOffset); + } + patchedDexToSmallPatchedAnnotationOffsetMap.put( + patchedDex, smallPatchedAnnotationsOffset + ); + int smallPatchedAnnotationsSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().annotations, + fullToSmallPatchIndexMap, + patchedDexToCollectedAnnotationIndicesMap.get(patchedDex) + ).simulate(smallPatchedAnnotationsOffset); + if (smallPatchedAnnotationsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedAnnotationSetsOffset + = smallPatchedAnnotationsOffset + smallPatchedAnnotationsSize; + if (oldDex.getTableOfContents().annotationSets.isElementFourByteAligned) { + smallPatchedAnnotationSetsOffset + = SizeOf.roundToTimesOfFour(smallPatchedAnnotationSetsOffset); + } + patchedDexToSmallPatchedAnnotationSetOffsetMap.put( + patchedDex, smallPatchedAnnotationSetsOffset + ); + int smallPatchedAnnotationSetsSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().annotationSets, + fullToSmallPatchIndexMap, + patchedDexToCollectedAnnotationSetIndicesMap.get(patchedDex) + ).simulate(smallPatchedAnnotationSetsOffset); + if (smallPatchedAnnotationSetsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedAnnotationSetRefListsOffset + = smallPatchedAnnotationSetsOffset + + smallPatchedAnnotationSetsSize; + if (oldDex.getTableOfContents().annotationSetRefLists.isElementFourByteAligned) { + smallPatchedAnnotationSetRefListsOffset + = SizeOf.roundToTimesOfFour(smallPatchedAnnotationSetRefListsOffset); + } + patchedDexToSmallPatchedAnnotationSetRefListOffsetMap.put( + patchedDex, smallPatchedAnnotationSetRefListsOffset + ); + int smallPatchedAnnotationSetRefListsSize + = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().annotationSetRefLists, + fullToSmallPatchIndexMap, + patchedDexToCollectedAnnotationSetRefListIndicesMap.get(patchedDex) + ).simulate(smallPatchedAnnotationSetRefListsOffset); + if (smallPatchedAnnotationSetRefListsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedAnnotationsDirectoriesOffset + = smallPatchedAnnotationSetRefListsOffset + + smallPatchedAnnotationSetRefListsSize; + if (oldDex.getTableOfContents().annotationsDirectories.isElementFourByteAligned) { + smallPatchedAnnotationsDirectoriesOffset + = SizeOf.roundToTimesOfFour(smallPatchedAnnotationsDirectoriesOffset); + } + patchedDexToSmallPatchedAnnotationsDirectoryOffsetMap.put( + patchedDex, smallPatchedAnnotationsDirectoriesOffset + ); + int smallPatchedAnnotationsDirectoriesSize + = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().annotationsDirectories, + fullToSmallPatchIndexMap, + patchedDexToCollectedAnnotationsDirectoryIndicesMap.get(patchedDex) + ).simulate(smallPatchedAnnotationsDirectoriesOffset); + if (smallPatchedAnnotationsDirectoriesSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedDebugInfoItemsOffset + = smallPatchedAnnotationsDirectoriesOffset + + smallPatchedAnnotationsDirectoriesSize; + if (oldDex.getTableOfContents().debugInfos.isElementFourByteAligned) { + smallPatchedDebugInfoItemsOffset + = SizeOf.roundToTimesOfFour(smallPatchedDebugInfoItemsOffset); + } + patchedDexToSmallPatchedDebugInfoOffsetMap.put( + patchedDex, smallPatchedDebugInfoItemsOffset + ); + int smallPatchedDebugInfoItemsSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().debugInfos, + fullToSmallPatchIndexMap, + patchedDexToCollectedDebugInfoIndicesMap.get(patchedDex) + ).simulate(smallPatchedDebugInfoItemsOffset); + if (smallPatchedDebugInfoItemsSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedCodesOffset + = smallPatchedDebugInfoItemsOffset + + smallPatchedDebugInfoItemsSize; + if (oldDex.getTableOfContents().codes.isElementFourByteAligned) { + smallPatchedCodesOffset + = SizeOf.roundToTimesOfFour(smallPatchedCodesOffset); + } + patchedDexToSmallPatchedCodeOffsetMap.put( + patchedDex, smallPatchedCodesOffset + ); + int smallPatchedCodesSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().codes, + fullToSmallPatchIndexMap, + patchedDexToCollectedCodeIndicesMap.get(patchedDex) + ).simulate(smallPatchedCodesOffset); + if (smallPatchedCodesSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedClassDatasOffset + = smallPatchedCodesOffset + + smallPatchedCodesSize; + if (oldDex.getTableOfContents().classDatas.isElementFourByteAligned) { + smallPatchedClassDatasOffset + = SizeOf.roundToTimesOfFour(smallPatchedClassDatasOffset); + } + patchedDexToSmallPatchedClassDataOffsetMap.put( + patchedDex, smallPatchedClassDatasOffset + ); + int smallPatchedClassDatasSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().classDatas, + fullToSmallPatchIndexMap, + patchedDexToCollectedClassDataIndicesMap.get(patchedDex) + ).simulate(smallPatchedClassDatasOffset); + if (smallPatchedClassDatasSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedEncodedArraysOffset + = smallPatchedClassDatasOffset + + smallPatchedClassDatasSize; + if (oldDex.getTableOfContents().encodedArrays.isElementFourByteAligned) { + smallPatchedEncodedArraysOffset + = SizeOf.roundToTimesOfFour(smallPatchedEncodedArraysOffset); + } + patchedDexToSmallPatchedEncodedArrayOffsetMap.put( + patchedDex, smallPatchedEncodedArraysOffset + ); + int smallPatchedEncodedArraysSize = new SmallPatchSimulator( + patchedDex, + patchedDex.getTableOfContents().encodedArrays, + fullToSmallPatchIndexMap, + patchedDexToCollectedEncodedArrayIndicesMap.get(patchedDex) + ).simulate(smallPatchedEncodedArraysOffset); + if (smallPatchedEncodedArraysSize > 0) { + ++smallPatchedSectionCount; + } + + int smallPatchedClassDefsOffset + = smallPatchedMethodIdsOffset + + smallPatchedMethodIdsSize; + if (oldDex.getTableOfContents().classDefs.isElementFourByteAligned) { + smallPatchedClassDefsOffset + = SizeOf.roundToTimesOfFour(smallPatchedClassDefsOffset); + } + patchedDexToSmallPatchedClassDefOffsetMap.put( + patchedDex, smallPatchedClassDefsOffset + ); + + // Calculate any values we still know nothing about them. + int smallPatchedMapListOffset + = smallPatchedEncodedArraysOffset + + smallPatchedEncodedArraysSize; + if (oldDex.getTableOfContents().mapList.isElementFourByteAligned) { + smallPatchedMapListOffset + = SizeOf.roundToTimesOfFour(smallPatchedMapListOffset); + } + patchedDexToSmallPatchedMapListOffsetMap.put( + patchedDex, smallPatchedMapListOffset + ); + int smallPatchedMapListSize + = SizeOf.UINT + SizeOf.MAP_ITEM * smallPatchedSectionCount; + + int smallPatchedDexSize + = smallPatchedMapListOffset + + smallPatchedMapListSize; + patchedDexToSmallPatchedDexSizeMap.put(patchedDex, smallPatchedDexSize); + } + } + + private int getCollectedIndicesCountSafely( + Map> collectedIndicesMap, Dex patchedDex + ) { + Set indices = collectedIndicesMap.get(patchedDex); + if (indices == null) { + return 0; + } else { + return indices.size(); + } + } + + private void saveToStream(OutputStream os) throws IOException { + DexDataBuffer buffer = new DexDataBuffer(); + + // Write header + buffer.write(SmallPatchedDexItemFile.MAGIC); + buffer.writeShort(SmallPatchedDexItemFile.CURRENT_VERSION); + // Take the field 'firstChunkOffset' into header's size account. + buffer.writeInt(buffer.position() + SizeOf.UINT); + + // Gather old dexes + List oldDexes = new ArrayList<>(); + int oldDexGroupCount = this.oldDexGroups.size(); + for (int i = 0; i < oldDexGroupCount; ++i) { + DexGroup oldDexGroup = oldDexGroups.get(i); + for (Dex oldDex : oldDexGroup.dexes) { + oldDexes.add(oldDex); + } + } + + // Gather patched dexes + List patchedDexes = new ArrayList<>(); + int patchedDexGroupCount = this.patchedDexGroups.size(); + for (int i = 0; i < patchedDexGroupCount; ++i) { + DexGroup patchedDexGroup = patchedDexGroups.get(i); + for (Dex patchedDex : patchedDexGroup.dexes) { + patchedDexes.add(patchedDex); + } + } + + // Dex sign chunk + int oldDexSignCount = oldDexes.size(); + buffer.writeUleb128(oldDexSignCount); + + Map oldDexSignToIdxInSignList = new HashMap<>(); + for (int i = 0; i < oldDexSignCount; ++i) { + final byte[] signBytes = oldDexes.get(i).computeSignature(false); + final String signStr = Hex.toHexString(signBytes); + buffer.write(signBytes); + oldDexSignToIdxInSignList.put(signStr, i); + } + + for (Dex patchedDex : patchedDexes) { + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedStringIdOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedTypeIdOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedProtoIdOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedFieldIdOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedMethodIdOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedClassDefOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedStringDataOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedTypeListOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedAnnotationOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedAnnotationSetOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedAnnotationSetRefListOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedAnnotationsDirectoryOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedDebugInfoOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedCodeOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedClassDataOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedEncodedArrayOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedMapListOffsetMap + ); + writeSmallPatchedSectionOffset( + buffer, patchedDex, patchedDexToSmallPatchedDexSizeMap + ); + } + + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedStringIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedTypeIdIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedTypeListIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedProtoIdIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedFieldIdIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedMethodIdIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedAnnotationIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedAnnotationSetIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedAnnotationSetRefListIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedAnnotationsDirectoryIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedEncodedArrayIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedDebugInfoIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedCodeIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedClassDataIndicesMap); + writeDataChunk(buffer, patchedDexes, patchedDexToCollectedClassDefIndicesMap); + + os.write(buffer.array()); + os.flush(); + } + + private void writeSmallPatchedSectionOffset( + DexDataBuffer buffer, + Dex patchedDex, + Map patchedDexToSmallPatchedSectionOffsetMap + ) { + Integer offset = patchedDexToSmallPatchedSectionOffsetMap.get(patchedDex); + if (offset != null) { + buffer.writeInt(offset); + } else { + throw new IllegalStateException("section offset is missing."); + } + } + + private void writeDataChunk( + DexDataBuffer buffer, + List patchedDexList, + Map> patchedDexToCollectedItemIndicesMap + ) { + for (Dex patchedDex : patchedDexList) { + Set itemIndices = patchedDexToCollectedItemIndicesMap.get(patchedDex); + if (itemIndices == null) { + buffer.writeUleb128(0); + } else { + int indexCount = itemIndices.size(); + Integer[] itemIndexArr = new Integer[indexCount]; + itemIndices.toArray(itemIndexArr); + Arrays.sort(itemIndexArr); + buffer.writeUleb128(indexCount); + int prevIndex = 0; + for (int j = 0; j < indexCount; ++j) { + buffer.writeSleb128(itemIndexArr[j] - prevIndex); + prevIndex = itemIndexArr[j]; + } + } + } + } + + private boolean isClassMethodReferenceToRefAffectedClass( + Dex owner, + ClassData.Method[] methods, + Collection affectedClassDescs + ) { + if (affectedClassDescs.isEmpty() || methods == null || methods.length == 0) { + return false; + } + + for (ClassData.Method method : methods) { + if (method.codeOffset == 0) { + continue; + } + Code code = owner.readCode(method); + RefToRefAffectedClassInsnVisitor refInsnVisitor = + new RefToRefAffectedClassInsnVisitor(owner, method, affectedClassDescs); + InstructionReader insnReader = + new InstructionReader(new ShortArrayCodeInput(code.instructions)); + try { + insnReader.accept(refInsnVisitor); + if (refInsnVisitor.isMethodReferencedToRefAffectedClass) { + return true; + } + } catch (EOFException e) { + throw new IllegalStateException(e); + } + } + + return false; + } + + private void collectItemIndicesFromDexGroup( + DexGroup oldDexGroup, + DexGroup patchedDexGroup + ) { + DexClassesComparator dexClassesCmp = new DexClassesComparator("*"); + dexClassesCmp.setCompareMode(DexClassesComparator.COMPARE_MODE_CAUSE_REF_CHANGE_ONLY); + dexClassesCmp.setIgnoredRemovedClassDescPattern(this.loaderClassPatterns); + dexClassesCmp.startCheck(oldDexGroup, patchedDexGroup); + + Set refAffectedClassDescs + = dexClassesCmp.getChangedClassDescToInfosMap().keySet(); + + Set classInfosInPatchedDexGroup + = patchedDexGroup.getClassInfosInDexesWithDuplicateCheck(); + + Set patchedClassInfosForItemIndexCollecting = new HashSet<>(); + + for (DexClassInfo patchedClassInfo : classInfosInPatchedDexGroup) { + if (patchedClassInfo.classDef.classDataOffset == 0) { + continue; + } + ClassData patchedClassData + = patchedClassInfo.owner.readClassData(patchedClassInfo.classDef); + + boolean shouldAdd = isClassMethodReferenceToRefAffectedClass( + patchedClassInfo.owner, + patchedClassData.directMethods, + refAffectedClassDescs + ); + + if (!shouldAdd) { + shouldAdd = isClassMethodReferenceToRefAffectedClass( + patchedClassInfo.owner, + patchedClassData.virtualMethods, + refAffectedClassDescs + ); + } + + if (shouldAdd) { + logger.i(TAG, "Add class %s to small patched dex.", patchedClassInfo.classDesc); + patchedClassInfosForItemIndexCollecting.add(patchedClassInfo); + } + } + + // So far we get descriptors of classes we need to add additionally, + // while we still need to do a fully compare to collect added classes + // and replaced classes since they may use items in their owner dex which + // is not modified. + dexClassesCmp.setCompareMode(DexClassesComparator.COMPARE_MODE_NORMAL); + dexClassesCmp.startCheck(oldDexGroup, patchedDexGroup); + + Collection addedClassInfos = dexClassesCmp.getAddedClassInfos(); + for (DexClassInfo addClassInfo : addedClassInfos) { + logger.i(TAG, "Add class %s to small patched dex.", addClassInfo.classDesc); + patchedClassInfosForItemIndexCollecting.add(addClassInfo); + } + + Collection changedOldPatchedClassInfos = + dexClassesCmp.getChangedClassDescToInfosMap().values(); + + // changedOldPatchedClassInfo[1] means changedPatchedClassInfo + for (DexClassInfo[] changedOldPatchedClassInfo : changedOldPatchedClassInfos) { + logger.i(TAG, "Add class %s to small patched dex.", changedOldPatchedClassInfo[1].classDesc); + patchedClassInfosForItemIndexCollecting.add(changedOldPatchedClassInfo[1]); + } + + // Finally we collect all elements' indices of collected class. + + Map dexToOffsetToIndexConverterMap = new HashMap<>(); + + for (DexClassInfo classInfo : patchedClassInfosForItemIndexCollecting) { + Dex owner = classInfo.owner; + OffsetToIndexConverter offsetToIndexConverter = + dexToOffsetToIndexConverterMap.get(owner); + + if (offsetToIndexConverter == null) { + offsetToIndexConverter = new OffsetToIndexConverter(owner); + dexToOffsetToIndexConverterMap.put(owner, offsetToIndexConverter); + } + + collectItemIndicesFromClassInfo(classInfo, offsetToIndexConverter); + } + } + + private void collectItemIndicesFromClassInfo( + DexClassInfo classInfo, + OffsetToIndexConverter offsetToIndexConverter + ) { + Dex owner = classInfo.owner; + + putValueIntoSetMap( + patchedDexToCollectedClassDefIndicesMap, + owner, + classInfo.classDefIndex + ); + + collectItemIndicesFromTypeIndex( + owner, classInfo.classDef.typeIndex, offsetToIndexConverter + ); + + collectItemIndicesFromTypeIndex( + owner, classInfo.classDef.supertypeIndex, offsetToIndexConverter + ); + + collectItemIndicesFromTypeList( + owner, classInfo.classDef.interfacesOffset, offsetToIndexConverter + ); + + collectItemIndicesFromStringIndex( + owner, classInfo.classDef.sourceFileIndex, offsetToIndexConverter + ); + + collectItemIndicesFromAnnotationsDirectory( + owner, classInfo.classDef.annotationsOffset, offsetToIndexConverter + ); + + collectItemIndicesFromClassData( + owner, classInfo.classDef.classDataOffset, offsetToIndexConverter + ); + + collectItemIndicesFromEncodedArray( + owner, classInfo.classDef.staticValuesOffset, offsetToIndexConverter + ); + } + + private void collectItemIndicesFromStringIndex( + Dex owner, + int stringIndex, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (stringIndex == ClassDef.NO_INDEX) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedStringIndicesMap, + owner, + stringIndex + ); + } + + private void collectItemIndicesFromTypeList( + Dex owner, + int typeListOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (typeListOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedTypeListIndicesMap, + owner, + offsetToIndexConverter.getTypeListIndexByOffset(typeListOffset) + ); + + TypeList typeList = owner.openSection(typeListOffset).readTypeList(); + for (int typeIndex : typeList.types) { + collectItemIndicesFromTypeIndex( + owner, typeIndex, offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromTypeIndex( + Dex owner, + int typeIndex, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (typeIndex == ClassDef.NO_INDEX) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedTypeIdIndicesMap, + owner, + typeIndex + ); + + collectItemIndicesFromStringIndex( + owner, owner.typeIds().get(typeIndex), offsetToIndexConverter + ); + } + + private void collectItemIndicesFromFieldIndex( + Dex owner, + int fieldIndex, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (fieldIndex == ClassDef.NO_INDEX) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedFieldIdIndicesMap, + owner, + fieldIndex + ); + + FieldId fieldId = owner.fieldIds().get(fieldIndex); + collectItemIndicesFromStringIndex(owner, fieldId.nameIndex, offsetToIndexConverter); + collectItemIndicesFromTypeIndex( + owner, fieldId.declaringClassIndex, offsetToIndexConverter + ); + collectItemIndicesFromTypeIndex(owner, fieldId.typeIndex, offsetToIndexConverter); + } + + private void collectItemIndicesFromMethodIndex( + Dex owner, + int methodIndex, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (methodIndex == ClassDef.NO_INDEX) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedMethodIdIndicesMap, + owner, + methodIndex + ); + + MethodId methodId = owner.methodIds().get(methodIndex); + collectItemIndicesFromStringIndex( + owner, methodId.nameIndex, offsetToIndexConverter + ); + collectItemIndicesFromTypeIndex( + owner, methodId.declaringClassIndex, offsetToIndexConverter + ); + collectItemIndicesFromProtoIndex( + owner, methodId.protoIndex, offsetToIndexConverter + ); + } + + private void collectItemIndicesFromProtoIndex( + Dex owner, + int protoIndex, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (protoIndex == ClassDef.NO_INDEX) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedProtoIdIndicesMap, + owner, + protoIndex + ); + + ProtoId protoId = owner.protoIds().get(protoIndex); + + collectItemIndicesFromStringIndex( + owner, protoId.shortyIndex, offsetToIndexConverter + ); + collectItemIndicesFromTypeIndex( + owner, protoId.returnTypeIndex, offsetToIndexConverter + ); + collectItemIndicesFromTypeList( + owner, protoId.parametersOffset, offsetToIndexConverter + ); + } + + private void collectItemIndicesFromAnnotationsDirectory( + Dex owner, + int annotationsDirectoryOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (annotationsDirectoryOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedAnnotationsDirectoryIndicesMap, + owner, + offsetToIndexConverter.getAnnotationsDirectoryIndexByOffset( + annotationsDirectoryOffset + ) + ); + + AnnotationsDirectory annotationsDirectory = + owner.openSection(annotationsDirectoryOffset).readAnnotationsDirectory(); + + collectItemIndicesFromAnnotationSet( + owner, + annotationsDirectory.classAnnotationsOffset, + offsetToIndexConverter + ); + + for (int[] fieldAnnoPair : annotationsDirectory.fieldAnnotations) { + collectItemIndicesFromFieldIndex( + owner, fieldAnnoPair[0], offsetToIndexConverter + ); + collectItemIndicesFromAnnotationSet( + owner, fieldAnnoPair[1], offsetToIndexConverter + ); + } + for (int[] methodAnnoPair : annotationsDirectory.methodAnnotations) { + collectItemIndicesFromMethodIndex( + owner, methodAnnoPair[0], offsetToIndexConverter + ); + collectItemIndicesFromAnnotationSet( + owner, methodAnnoPair[1], offsetToIndexConverter + ); + } + for (int[] paramAnnoPair : annotationsDirectory.parameterAnnotations) { + collectItemIndicesFromMethodIndex( + owner, paramAnnoPair[0], offsetToIndexConverter + ); + collectItemIndicesFromAnnotationSetRefList( + owner, paramAnnoPair[1], offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromAnnotationSetRefList( + Dex owner, + int annotationSetRefListOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (annotationSetRefListOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedAnnotationSetRefListIndicesMap, + owner, + offsetToIndexConverter.getAnnotationSetRefListIndexByOffset( + annotationSetRefListOffset + ) + ); + + AnnotationSetRefList annotationSetRefList = + owner.openSection(annotationSetRefListOffset).readAnnotationSetRefList(); + + for (int annotationSetOffset : annotationSetRefList.annotationSetRefItems) { + collectItemIndicesFromAnnotationSet( + owner, annotationSetOffset, offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromAnnotationSet( + Dex owner, + int annotationSetOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (annotationSetOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedAnnotationSetIndicesMap, + owner, + offsetToIndexConverter.getAnnotationSetIndexByOffset( + annotationSetOffset + ) + ); + + AnnotationSet annotationSet = owner.openSection(annotationSetOffset).readAnnotationSet(); + + for (int annotationOffset : annotationSet.annotationOffsets) { + collectItemIndicesFromAnnotation( + owner, annotationOffset, offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromAnnotation( + Dex owner, + int annotationOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (annotationOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedAnnotationIndicesMap, + owner, + offsetToIndexConverter.getAnnotationIndexByOffset( + annotationOffset + ) + ); + + Annotation annotation = + owner.openSection(annotationOffset).readAnnotation(); + + EncodedValueReader annotationReader = annotation.getReader(); + + collectItemIndicesFromAnnotationReader( + owner, + annotationReader, + offsetToIndexConverter + ); + } + + private void collectItemIndicesFromAnnotationReader( + Dex owner, + EncodedValueReader annotationReader, + OffsetToIndexConverter offsetToIndexConverter + ) { + int fieldCount = annotationReader.readAnnotation(); + + collectItemIndicesFromTypeIndex( + owner, annotationReader.getAnnotationType(), offsetToIndexConverter + ); + + for (int i = 0; i < fieldCount; ++i) { + int annotationNameIndex = annotationReader.readAnnotationName(); + collectItemIndicesFromStringIndex( + owner, annotationNameIndex, offsetToIndexConverter + ); + collectItemIndicesFromEncodedValueReader( + owner, annotationReader, offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromEncodedArrayReader( + Dex owner, + EncodedValueReader arrayReader, + OffsetToIndexConverter offsetToIndexConverter + ) { + int size = arrayReader.readArray(); + for (int i = 0; i < size; ++i) { + collectItemIndicesFromEncodedValueReader( + owner, arrayReader, offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromEncodedValueReader( + Dex owner, + EncodedValueReader encodedValueReader, + OffsetToIndexConverter offsetToIndexConverter + ) { + switch (encodedValueReader.peek()) { + case EncodedValueReader.ENCODED_BYTE: + // Skip value. + encodedValueReader.readByte(); + break; + case EncodedValueReader.ENCODED_SHORT: + // Skip value. + encodedValueReader.readShort(); + break; + case EncodedValueReader.ENCODED_INT: + // Skip value. + encodedValueReader.readInt(); + break; + case EncodedValueReader.ENCODED_LONG: + // Skip value. + encodedValueReader.readLong(); + break; + case EncodedValueReader.ENCODED_CHAR: + // Skip value. + encodedValueReader.readChar(); + break; + case EncodedValueReader.ENCODED_FLOAT: + // Skip value. + encodedValueReader.readFloat(); + break; + case EncodedValueReader.ENCODED_DOUBLE: + // Skip value. + encodedValueReader.readDouble(); + break; + case EncodedValueReader.ENCODED_STRING: + collectItemIndicesFromStringIndex( + owner, + encodedValueReader.readString(), + offsetToIndexConverter + ); + break; + case EncodedValueReader.ENCODED_TYPE: + collectItemIndicesFromTypeIndex( + owner, + encodedValueReader.readType(), + offsetToIndexConverter + ); + break; + case EncodedValueReader.ENCODED_FIELD: + collectItemIndicesFromFieldIndex( + owner, + encodedValueReader.readField(), + offsetToIndexConverter + ); + break; + case EncodedValueReader.ENCODED_ENUM: + collectItemIndicesFromFieldIndex( + owner, + encodedValueReader.readEnum(), + offsetToIndexConverter + ); + break; + case EncodedValueReader.ENCODED_METHOD: + collectItemIndicesFromMethodIndex( + owner, + encodedValueReader.readMethod(), + offsetToIndexConverter + ); + break; + case EncodedValueReader.ENCODED_ARRAY: + collectItemIndicesFromEncodedArrayReader( + owner, + encodedValueReader, + offsetToIndexConverter + ); + break; + case EncodedValueReader.ENCODED_ANNOTATION: + collectItemIndicesFromAnnotationReader( + owner, + encodedValueReader, + offsetToIndexConverter + + ); + break; + case EncodedValueReader.ENCODED_NULL: + // Skip value. + encodedValueReader.readNull(); + break; + case EncodedValueReader.ENCODED_BOOLEAN: + // Skip value. + encodedValueReader.readBoolean(); + break; + default: + throw new DexException( + "Unexpected type: " + Integer.toHexString(encodedValueReader.peek()) + ); + } + } + + private void collectItemIndicesFromClassData( + Dex owner, + int classDataOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (classDataOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedClassDataIndicesMap, + owner, + offsetToIndexConverter.getClassDataIndexByOffset(classDataOffset) + ); + + ClassData classData = owner.openSection(classDataOffset).readClassData(); + + for (ClassData.Field field : classData.instanceFields) { + collectItemIndicesFromFieldIndex( + owner, field.fieldIndex, offsetToIndexConverter + ); + } + + for (ClassData.Field field : classData.staticFields) { + collectItemIndicesFromFieldIndex( + owner, field.fieldIndex, offsetToIndexConverter + ); + } + + for (ClassData.Method method : classData.directMethods) { + collectItemIndicesFromMethodIndex( + owner, method.methodIndex, offsetToIndexConverter + ); + collectItemIndicesFromCode( + owner, method.codeOffset, offsetToIndexConverter + ); + } + + for (ClassData.Method method : classData.virtualMethods) { + collectItemIndicesFromMethodIndex( + owner, method.methodIndex, offsetToIndexConverter + ); + collectItemIndicesFromCode( + owner, method.codeOffset, offsetToIndexConverter + ); + } + } + + private void collectItemIndicesFromCode( + Dex owner, + int codeOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (codeOffset == ClassDef.NO_OFFSET) { + return; + } + + + putValueIntoSetMap( + patchedDexToCollectedCodeIndicesMap, + owner, + offsetToIndexConverter.getCodeIndexByOffset(codeOffset) + ); + + Code code = owner.openSection(codeOffset).readCode(); + + collectItemIndicesFromDebugInfoItem( + owner, + code.debugInfoOffset, + offsetToIndexConverter + ); + + InstructionReader ir = new InstructionReader(new ShortArrayCodeInput(code.instructions)); + try { + ir.accept(new IndicesCollectorInsnVisitor( + owner, offsetToIndexConverter + )); + } catch (EOFException e) { + throw new IllegalStateException(e); + } + + for (Code.CatchHandler catchHandler : code.catchHandlers) { + for (int typeIndex : catchHandler.typeIndexes) { + collectItemIndicesFromTypeIndex( + owner, + typeIndex, + offsetToIndexConverter + ); + } + } + } + + private void collectItemIndicesFromDebugInfoItem( + Dex owner, + int debugInfoItemOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (debugInfoItemOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedDebugInfoIndicesMap, + owner, + offsetToIndexConverter.getDebugInfoItemIndexByOffset(debugInfoItemOffset) + ); + + DebugInfoItem debugInfoItem = owner.openSection(debugInfoItemOffset).readDebugInfoItem(); + + for (int stringIndex : debugInfoItem.parameterNames) { + collectItemIndicesFromStringIndex( + owner, stringIndex, offsetToIndexConverter + ); + } + + final ByteArrayInputStream bais = new ByteArrayInputStream(debugInfoItem.infoSTM); + ByteInput inAdapter = new ByteInput() { + @Override + public byte readByte() { + return (byte) (bais.read() & 0xFF); + } + }; + + outside_whileloop: + while (true) { + int opcode = bais.read() & 0xFF; + switch (opcode) { + case DebugInfoItem.DBG_END_SEQUENCE: { + break outside_whileloop; + } + case DebugInfoItem.DBG_ADVANCE_PC: { + // Skip addrDiff. + int addrDiff = Leb128.readUnsignedLeb128(inAdapter); + break; + } + case DebugInfoItem.DBG_ADVANCE_LINE: { + // Skip lineDiff. + int lineDiff = Leb128.readSignedLeb128(inAdapter); + break; + } + case DebugInfoItem.DBG_START_LOCAL: + case DebugInfoItem.DBG_START_LOCAL_EXTENDED: { + // Skip registerNum. + int registerNum = Leb128.readUnsignedLeb128(inAdapter); + + int nameIndex = Leb128.readUnsignedLeb128p1(inAdapter); + collectItemIndicesFromStringIndex( + owner, nameIndex, offsetToIndexConverter + ); + + int typeIndex = Leb128.readUnsignedLeb128p1(inAdapter); + collectItemIndicesFromTypeIndex( + owner, typeIndex, offsetToIndexConverter + ); + + if (opcode == DebugInfoItem.DBG_START_LOCAL_EXTENDED) { + int sigIndex = Leb128.readUnsignedLeb128p1(inAdapter); + collectItemIndicesFromStringIndex( + owner, sigIndex, offsetToIndexConverter + ); + } + break; + } + case DebugInfoItem.DBG_END_LOCAL: + case DebugInfoItem.DBG_RESTART_LOCAL: { + // Skip registerNum. + int registerNum = Leb128.readUnsignedLeb128(inAdapter); + break; + } + case DebugInfoItem.DBG_SET_FILE: { + int nameIndex = Leb128.readUnsignedLeb128p1(inAdapter); + collectItemIndicesFromStringIndex( + owner, nameIndex, offsetToIndexConverter + ); + break; + } + case DebugInfoItem.DBG_SET_PROLOGUE_END: + case DebugInfoItem.DBG_SET_EPILOGUE_BEGIN: + default: { + break; + } + } + } + } + + private void collectItemIndicesFromEncodedArray( + Dex owner, + int encodedArrayOffset, + OffsetToIndexConverter offsetToIndexConverter + ) { + if (encodedArrayOffset == ClassDef.NO_OFFSET) { + return; + } + + putValueIntoSetMap( + patchedDexToCollectedEncodedArrayIndicesMap, + owner, + offsetToIndexConverter.getEncodedArrayIndexByOffset(encodedArrayOffset) + ); + + EncodedValue arrayVal = owner.openSection(encodedArrayOffset).readEncodedArray(); + EncodedValueReader arrayReader = + new EncodedValueReader(arrayVal, EncodedValueReader.ENCODED_ARRAY); + + collectItemIndicesFromEncodedArrayReader( + owner, arrayReader, offsetToIndexConverter + ); + } + + private void putValueIntoSetMap(Map> map, K key, V value) { + Set valueSet = map.get(key); + if (valueSet == null) { + valueSet = new HashSet<>(); + map.put(key, valueSet); + } + valueSet.add(value); + } + + private class SmallPatchSimulator> { + private final TableOfContents.Section tocSec; + private final Dex.Section patchedSection; + private final int patchedItemCount; + private final IndexMap fullToSmallPatchMap; + private final Set collectedIndices; + + SmallPatchSimulator( + Dex patchedDex, + TableOfContents.Section tocSec, + IndexMap fullToSmallPatchMap, + Set collectedIndices + ) { + if (tocSec.exists()) { + this.tocSec = tocSec; + this.patchedSection = patchedDex.openSection(tocSec); + this.patchedItemCount = tocSec.size; + this.fullToSmallPatchMap = fullToSmallPatchMap; + this.collectedIndices = collectedIndices; + } else { + this.tocSec = null; + this.patchedSection = null; + this.patchedItemCount = 0; + this.fullToSmallPatchMap = null; + this.collectedIndices = null; + } + } + + private int getItemIndexOrOffset(T item, int index) { + if (item instanceof TableOfContents.Section.Item) { + return ((TableOfContents.Section.Item) item).off; + } else { + return index; + } + } + + @SuppressWarnings("unchecked") + private T nextItem(DexDataBuffer buffer) { + switch (this.tocSec.type) { + case TableOfContents.SECTION_TYPE_TYPEIDS: { + return (T) (Integer) buffer.readInt(); + } + case TableOfContents.SECTION_TYPE_PROTOIDS: { + return (T) buffer.readProtoId(); + } + case TableOfContents.SECTION_TYPE_FIELDIDS: { + return (T) buffer.readFieldId(); + } + case TableOfContents.SECTION_TYPE_METHODIDS: { + return (T) buffer.readMethodId(); + } + case TableOfContents.SECTION_TYPE_CLASSDEFS: { + return (T) buffer.readClassDef(); + } + case TableOfContents.SECTION_TYPE_STRINGDATAS: { + return (T) buffer.readStringData(); + } + case TableOfContents.SECTION_TYPE_TYPELISTS: { + return (T) buffer.readTypeList(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONS: { + return (T) buffer.readAnnotation(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETS: { + return (T) buffer.readAnnotationSet(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETREFLISTS: { + return (T) buffer.readAnnotationSetRefList(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSDIRECTORIES: { + return (T) buffer.readAnnotationsDirectory(); + } + case TableOfContents.SECTION_TYPE_DEBUGINFOS: { + return (T) buffer.readDebugInfoItem(); + } + case TableOfContents.SECTION_TYPE_CODES: { + return (T) buffer.readCode(); + } + case TableOfContents.SECTION_TYPE_ENCODEDARRAYS: { + return (T) buffer.readEncodedArray(); + } + case TableOfContents.SECTION_TYPE_CLASSDATA: { + return (T) buffer.readClassData(); + } + default: + throw new IllegalStateException("unknown section type: " + this.tocSec.type); + } + } + + private int getItemSize(T item) { + if (item instanceof TableOfContents.Section.Item) { + return ((TableOfContents.Section.Item) item).byteCountInDex(); + } else { + if (item instanceof Integer) { + return SizeOf.UINT; + } else { + throw new IllegalStateException( + "unexpected item type: " + item.getClass().getName() + ); + } + } + } + + @SuppressWarnings("unchecked") + private T adjustItem(IndexMap indexMap, T item) { + switch (this.tocSec.type) { + case TableOfContents.SECTION_TYPE_TYPEIDS: { + return (T) (Integer) indexMap.adjustStringIndex((Integer) item); + } + case TableOfContents.SECTION_TYPE_PROTOIDS: { + return (T) indexMap.adjust((ProtoId) item); + } + case TableOfContents.SECTION_TYPE_FIELDIDS: { + return (T) indexMap.adjust((FieldId) item); + } + case TableOfContents.SECTION_TYPE_METHODIDS: { + return (T) indexMap.adjust((MethodId) item); + } + case TableOfContents.SECTION_TYPE_CLASSDEFS: { + return (T) indexMap.adjust((ClassDef) item); + } + case TableOfContents.SECTION_TYPE_STRINGDATAS: { + // nothing to do. + return item; + } + case TableOfContents.SECTION_TYPE_TYPELISTS: { + return (T) indexMap.adjust((TypeList) item); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONS: { + return (T) indexMap.adjust((Annotation) item); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETS: { + return (T) indexMap.adjust((AnnotationSet) item); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETREFLISTS: { + return (T) indexMap.adjust((AnnotationSetRefList) item); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSDIRECTORIES: { + return (T) indexMap.adjust((AnnotationsDirectory) item); + } + case TableOfContents.SECTION_TYPE_DEBUGINFOS: { + return (T) indexMap.adjust((DebugInfoItem) item); + } + case TableOfContents.SECTION_TYPE_CODES: { + return (T) indexMap.adjust((Code) item); + } + case TableOfContents.SECTION_TYPE_ENCODEDARRAYS: { + return (T) indexMap.adjust((EncodedValue) item); + } + case TableOfContents.SECTION_TYPE_CLASSDATA: { + return (T) indexMap.adjust((ClassData) item); + } + default: + throw new IllegalStateException("unknown section type: " + this.tocSec.type); + } + } + + @SuppressWarnings("unchecked") + private void updateIndexOrOffset( + IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset + ) { + switch (this.tocSec.type) { + case TableOfContents.SECTION_TYPE_TYPEIDS: { + indexMap.mapTypeIds(oldIndex, newIndex); + break; + } + case TableOfContents.SECTION_TYPE_PROTOIDS: { + indexMap.mapProtoIds(oldIndex, newIndex); + break; + } + case TableOfContents.SECTION_TYPE_FIELDIDS: { + indexMap.mapFieldIds(oldIndex, newIndex); + break; + } + case TableOfContents.SECTION_TYPE_METHODIDS: { + indexMap.mapMethodIds(oldIndex, newIndex); + break; + } + case TableOfContents.SECTION_TYPE_CLASSDEFS: { + // nothing to do. + break; + } + case TableOfContents.SECTION_TYPE_STRINGDATAS: { + indexMap.mapStringIds(oldIndex, newIndex); + break; + } + case TableOfContents.SECTION_TYPE_TYPELISTS: { + indexMap.mapTypeListOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_ANNOTATIONS: { + indexMap.mapAnnotationOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETS: { + indexMap.mapAnnotationSetOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETREFLISTS: { + indexMap.mapAnnotationSetRefListOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSDIRECTORIES: { + indexMap.mapAnnotationsDirectoryOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_DEBUGINFOS: { + indexMap.mapDebugInfoItemOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_CODES: { + indexMap.mapCodeOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_ENCODEDARRAYS: { + indexMap.mapStaticValuesOffset(oldOffset, newOffset); + break; + } + case TableOfContents.SECTION_TYPE_CLASSDATA: { + indexMap.mapClassDataOffset(oldOffset, newOffset); + break; + } + default: + throw new IllegalStateException("unknown section type: " + this.tocSec.type); + } + } + + public int simulate(int smallPatchBaseOffset) { + if (patchedSection == null) { + return 0; + } + if (collectedIndices == null || collectedIndices.isEmpty()) { + return 0; + } + int smallPatchedIndex = 0; + int smallPatchOffset = smallPatchBaseOffset; + for (int fullPatchedItemIndex = 0; + fullPatchedItemIndex < this.patchedItemCount; + ++fullPatchedItemIndex + ) { + T fullPatchedItemInSmallPatch = adjustItem( + this.fullToSmallPatchMap, nextItem(this.patchedSection) + ); + if (collectedIndices.contains(fullPatchedItemIndex)) { + if (this.tocSec.isElementFourByteAligned) { + smallPatchOffset = SizeOf.roundToTimesOfFour(smallPatchOffset); + } + + int fullPatchedOffset = getItemIndexOrOffset( + fullPatchedItemInSmallPatch, fullPatchedItemIndex + ); + + if (fullPatchedItemIndex != smallPatchedIndex + || fullPatchedOffset != smallPatchOffset) { + updateIndexOrOffset( + this.fullToSmallPatchMap, + fullPatchedItemIndex, + fullPatchedOffset, + smallPatchedIndex, + smallPatchOffset + ); + } + + ++smallPatchedIndex; + smallPatchOffset += getItemSize(fullPatchedItemInSmallPatch); + } + } + return smallPatchOffset - smallPatchBaseOffset; + } + } + + private class RefToRefAffectedClassInsnVisitor extends InstructionVisitor { + private final Dex methodOwner; + private final ClassData.Method method; + private final Collection refAffectedClassDefs; + private boolean isMethodReferencedToRefAffectedClass; + + RefToRefAffectedClassInsnVisitor(Dex methodOwner, ClassData.Method method, Collection refAffectedClassDefs) { + super(null); + this.methodOwner = methodOwner; + this.method = method; + this.refAffectedClassDefs = refAffectedClassDefs; + this.isMethodReferencedToRefAffectedClass = false; + } + + @Override + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + processIndexByType(index, indexType); + } + + @Override + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + processIndexByType(index, indexType); + } + + @Override + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + processIndexByType(index, indexType); + } + + @Override + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + processIndexByType(index, indexType); + } + + @Override + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + processIndexByType(index, indexType); + } + + @Override + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + processIndexByType(index, indexType); + } + + @Override + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + processIndexByType(index, indexType); + } + + private void processIndexByType(int index, int indexType) { + String typeName = null; + String refInfoInLog = null; + switch (indexType) { + case InstructionCodec.INDEX_TYPE_TYPE_REF: { + typeName = methodOwner.typeNames().get(index); + refInfoInLog = "init ref-changed class"; + break; + } + case InstructionCodec.INDEX_TYPE_FIELD_REF: { + final FieldId fieldId = methodOwner.fieldIds().get(index); + typeName = methodOwner.typeNames().get(fieldId.declaringClassIndex); + refInfoInLog = "referencing to field: " + methodOwner.strings().get(fieldId.nameIndex); + break; + } + case InstructionCodec.INDEX_TYPE_METHOD_REF: { + final MethodId methodId = methodOwner.methodIds().get(index); + typeName = methodOwner.typeNames().get(methodId.declaringClassIndex); + refInfoInLog = "invoking method: " + getMethodProtoTypeStr(methodId); + break; + } + } + if (typeName != null && refAffectedClassDefs.contains(typeName)) { + MethodId methodId = methodOwner.methodIds().get(method.methodIndex); + logger.i( + TAG, + "Method %s in class %s referenced ref-changed class %s by %s", + getMethodProtoTypeStr(methodId), + methodOwner.typeNames().get(methodId.declaringClassIndex), + typeName, + refInfoInLog + ); + isMethodReferencedToRefAffectedClass = true; + } + } + + private String getMethodProtoTypeStr(MethodId methodId) { + StringBuilder strBuilder = new StringBuilder(); + strBuilder.append(methodOwner.strings().get(methodId.nameIndex)); + ProtoId protoId = methodOwner.protoIds().get(methodId.protoIndex); + strBuilder.append('('); + short[] paramTypeIds = methodOwner.parameterTypeIndicesFromMethodId(methodId); + for (short typeId : paramTypeIds) { + strBuilder.append(methodOwner.typeNames().get(typeId)); + } + strBuilder.append(')').append(methodOwner.typeNames().get(protoId.returnTypeIndex)); + return strBuilder.toString(); + } + } + + private class IndicesCollectorInsnVisitor extends InstructionVisitor { + private final Dex ownerDex; + private final OffsetToIndexConverter offsetToIndexConverter; + + IndicesCollectorInsnVisitor( + Dex ownerDex, OffsetToIndexConverter offsetToIndexConverter + ) { + super(null); + this.ownerDex = ownerDex; + this.offsetToIndexConverter = offsetToIndexConverter; + } + + @Override + public void visitZeroRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal) { + processIndexByType(index, indexType); + } + + @Override + public void visitOneRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a) { + processIndexByType(index, indexType); + } + + @Override + public void visitTwoRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b) { + processIndexByType(index, indexType); + } + + @Override + public void visitThreeRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c) { + processIndexByType(index, indexType); + } + + @Override + public void visitFourRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d) { + processIndexByType(index, indexType); + } + + @Override + public void visitFiveRegisterInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int b, int c, int d, int e) { + processIndexByType(index, indexType); + } + + @Override + public void visitRegisterRangeInsn(int currentAddress, int opcode, int index, int indexType, int target, long literal, int a, int registerCount) { + processIndexByType(index, indexType); + } + + private void processIndexByType(int index, int indexType) { + switch (indexType) { + case InstructionCodec.INDEX_TYPE_STRING_REF: { + collectItemIndicesFromStringIndex( + ownerDex, index, offsetToIndexConverter + ); + break; + } + case InstructionCodec.INDEX_TYPE_TYPE_REF: { + collectItemIndicesFromTypeIndex( + ownerDex, index, offsetToIndexConverter + ); + break; + } + case InstructionCodec.INDEX_TYPE_FIELD_REF: { + collectItemIndicesFromFieldIndex( + ownerDex, index, offsetToIndexConverter + ); + break; + } + case InstructionCodec.INDEX_TYPE_METHOD_REF: { + collectItemIndicesFromMethodIndex( + ownerDex, index, offsetToIndexConverter + ); + break; + } + } + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/InfoWriter.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/InfoWriter.java new file mode 100644 index 00000000..98ecb677 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/InfoWriter.java @@ -0,0 +1,99 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.info; + +import com.tencent.tinker.build.patch.Configuration; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.List; + +/** + * Created by zhangshaowen on 16/3/8. + */ +public class InfoWriter { + protected final Configuration config; + /** + * infoFile, output info + */ + protected final String infoPath; + protected final File infoFile; + + /** + * 首次使用时初始化 + */ + protected Writer infoWrite; + + public InfoWriter(Configuration config, String infoPath) throws IOException { + this.config = config; + this.infoPath = infoPath; + + if (infoPath != null) { + this.infoFile = new File(infoPath); + if (!infoFile.getParentFile().exists()) { + infoFile.getParentFile().mkdirs(); + } + } else { + this.infoFile = null; + } + + } + + public Configuration getConfig() { + return config; + } + + + public void writeLinesToInfoFile(List lines) throws IOException { + for (String line : lines) { + writeLineToInfoFile(line); + } + } + + public void writeLineToInfoFile(String line) { + if (infoPath == null || line == null || line.length() == 0) { + return; + } + try { + checkWriter(); + infoWrite.write(line); + infoWrite.write("\n"); + infoWrite.flush(); + } catch (Exception e) { + throw new RuntimeException("write info file error, infoPath:" + infoPath + " content:" + line, e); + } + } + + private void checkWriter() throws IOException { + if (infoWrite == null) { + this.infoWrite = new BufferedWriter(new FileWriter(infoFile, false)); + } + + } + + public void close() { + try { + if (infoWrite != null) infoWrite.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfo.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfo.java new file mode 100644 index 00000000..2adf51a4 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfo.java @@ -0,0 +1,45 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.info; + +import com.tencent.tinker.build.patch.Configuration; + +/** + * Created by zhangshaowen on 16/3/8. + */ +public class PatchInfo { + + private final Configuration config; + + private final PatchInfoGen infoGen; + + + public PatchInfo(Configuration config) { + this.config = config; + infoGen = new PatchInfoGen(config); + } + + + /** + * gen the meta file txt + * such as rev, version ... + * file version, hotpatch version class + */ + public void gen() throws Exception { + infoGen.gen(); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfoGen.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfoGen.java new file mode 100644 index 00000000..a097f658 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/info/PatchInfoGen.java @@ -0,0 +1,75 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.info; + +import com.tencent.tinker.build.apkparser.AndroidManifest; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.ParseException; +import java.util.Properties; + +/** + * Created by zhangshaowen on 16/3/8. + */ +public class PatchInfoGen { + private final Configuration config; + private final File packageInfoFile; + + public PatchInfoGen(Configuration config) { + this.config = config; + packageInfoFile = new File(config.mTempResultDir + File.separator + "assets" + File.separator + TypedValue.PACKAGE_META_FILE); + } + + private void addTinkerID() throws IOException, ParseException { + if (!config.mPackageFields.containsKey(TypedValue.TINKER_ID)) { + AndroidManifest oldAndroidManifest = AndroidManifest.getAndroidManifest(config.mOldApkFile); + String tinkerID = oldAndroidManifest.metaDatas.get(TypedValue.TINKER_ID); + + if (tinkerID == null) { + throw new TinkerPatchException("can't find TINKER_ID from the old apk manifest file, it must be set!"); + } + config.mPackageFields.put(TypedValue.TINKER_ID, tinkerID); + } + + if (!config.mPackageFields.containsKey(TypedValue.NEW_TINKER_ID)) { + AndroidManifest newAndroidManifest = AndroidManifest.getAndroidManifest(config.mNewApkFile); + String tinkerID = newAndroidManifest.metaDatas.get(TypedValue.TINKER_ID); + + if (tinkerID == null) { + throw new TinkerPatchException("can't find TINKER_ID from the new apk manifest file, it must be set!"); + } + config.mPackageFields.put(TypedValue.NEW_TINKER_ID, tinkerID); + } + } + + public void gen() throws Exception { + addTinkerID(); + Properties newProperties = new Properties(); + for (String key : config.mPackageFields.keySet()) { + newProperties.put(key, config.mPackageFields.get(key)); + } + + String comment = "base package config field"; + newProperties.store(new FileOutputStream(packageInfoFile, false), comment); + + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Configuration.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Configuration.java new file mode 100644 index 00000000..9b359eb5 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Configuration.java @@ -0,0 +1,576 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.patch; + +import com.tencent.tinker.build.util.FileOperation; +import com.tencent.tinker.build.util.TinkerPatchException; +import com.tencent.tinker.build.util.TypedValue; +import com.tencent.tinker.build.util.Utils; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.regex.Pattern; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +/** + * @author zhangshaowen + * do not use Logger here + */ +public class Configuration { + + protected static final String TAG_ISSUE = "issue"; + protected static final String DEX_ISSUE = "dex"; + protected static final String SO_ISSUE = "lib"; + protected static final String RES_ISSUE = "resource"; + + protected static final String SIGN_ISSUE = "sign"; + protected static final String PACKAGE_CONFIG_ISSUE = "packageConfig"; + protected static final String PROPERTY_ISSUE = "property"; + + protected static final String ATTR_ID = "id"; + protected static final String ATTR_VALUE = "value"; + protected static final String ATTR_NAME = "name"; + + protected static final String ATTR_IGNORE_WARNING = "ignoreWarning"; + protected static final String ATTR_USE_SIGN = "useSign"; + protected static final String ATTR_SEVEN_ZIP_PATH = "sevenZipPath"; + protected static final String ATTR_DEX_MODE = "dexMode"; + protected static final String ATTR_PATTERN = "pattern"; + protected static final String ATTR_RES_IGNORE_CHANGE = "ignoreChange"; + protected static final String ATTR_RES_LARGE_MOD = "largeModSize"; + + protected static final String ATTR_LOADER = "loader"; + protected static final String ATTR_CONFIG_FIELD = "configField"; + + protected static final String ATTR_SIGN_FILE_PATH = "path"; + protected static final String ATTR_SIGN_FILE_KEYPASS = "keypass"; + protected static final String ATTR_SIGN_FILE_STOREPASS = "storepass"; + protected static final String ATTR_SIGN_FILE_ALIAS = "alias"; + /** + * base config data + */ + public String mOldApkPath; + public String mNewApkPath; + public String mOutFolder; + public File mOldApkFile; + public File mNewApkFile; + public boolean mIgnoreWarning; + /** + * lib config + */ + public HashSet mSoFilePattern; + /** + * dex config + */ + public HashSet mDexFilePattern; + public HashSet mDexLoaderPattern; + public boolean mDexRaw; + /** + * resource config + */ + public HashSet mResFilePattern; + public HashSet mResIgnoreChangePattern; + public HashSet mResRawPattern; + public int mLargeModSize; + /** + * only gradle have the param + */ + public boolean mUseApplyResource; + + /** + * package file config + */ + public HashMap mPackageFields; + /** + * sevenZip path config + */ + public String mSevenZipPath; + /** + * sign data + */ + public boolean mUseSignAPk; + public File mSignatureFile; + public String mKeyPass; + public String mStoreAlias; + public String mStorePass; + + /** + * temp files + */ + public File mTempResultDir; + public File mTempUnzipOldDir; + public File mTempUnzipNewDir; + + public boolean mUsingGradle; + + + /** + * use by command line with xml config + */ + public Configuration(File config, File outputFile, File oldApkFile, File newApkFile) + throws IOException, ParserConfigurationException, SAXException, TinkerPatchException { + mUsingGradle = false; + mSoFilePattern = new HashSet<>(); + mDexFilePattern = new HashSet<>(); + mDexLoaderPattern = new HashSet<>(); + + mResFilePattern = new HashSet<>(); + mResRawPattern = new HashSet<>(); + mResIgnoreChangePattern = new HashSet<>(); + + mPackageFields = new HashMap<>(); + mOutFolder = outputFile.getAbsolutePath(); + FileOperation.cleanDir(outputFile); + + mOldApkFile = oldApkFile; + mOldApkPath = oldApkFile.getAbsolutePath(); + + mNewApkFile = newApkFile; + mNewApkPath = newApkFile.getAbsolutePath(); + mLargeModSize = 100; + readXmlConfig(config); + createTempDirectory(); + checkInputPatternParameter(); + } + + + /** + * use by gradle + */ + public Configuration(InputParam param) throws IOException, TinkerPatchException { + mUsingGradle = true; + mSoFilePattern = new HashSet<>(); + mDexFilePattern = new HashSet<>(); + mDexLoaderPattern = new HashSet<>(); + + mResFilePattern = new HashSet<>(); + mResRawPattern = new HashSet<>(); + mResIgnoreChangePattern = new HashSet<>(); + + mPackageFields = new HashMap<>(); + + for (String item : param.soFilePattern) { + addToPatterns(item, mSoFilePattern); + } + + for (String item : param.dexFilePattern) { + addToPatterns(item, mDexFilePattern); + } + + for (String item : param.resourceFilePattern) { + mResRawPattern.add(item); + addToPatterns(item, mResFilePattern); + } + + for (String item : param.resourceIgnoreChangePattern) { + addToPatterns(item, mResIgnoreChangePattern); + } + mLargeModSize = param.largeModSize; + //only gradle have the param + mUseApplyResource = param.useApplyResource; + + mDexLoaderPattern.addAll(param.dexLoaderPattern); + + //can be only raw or jar + if (param.dexMode.equals("raw")) { + mDexRaw = true; + } + + mOldApkPath = param.oldApk; + mOldApkFile = new File(mOldApkPath); + + mNewApkPath = param.newApk; + mNewApkFile = new File(mNewApkPath); + + mOutFolder = param.outFolder; + + mIgnoreWarning = param.ignoreWarning; + mSevenZipPath = param.sevenZipPath; + mPackageFields = param.configFields; + + mUseSignAPk = param.useSign; + setSignData(param.signFile, param.keypass, param.storealias, param.storepass); + + FileOperation.cleanDir(new File(mOutFolder)); + + createTempDirectory(); + checkInputPatternParameter(); + + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("configuration: \n"); + sb.append("oldApk:" + mOldApkPath + "\n"); + sb.append("newApk:" + mNewApkPath + "\n"); + sb.append("outputFolder:" + mOutFolder + "\n"); + sb.append("isIgnoreWarning:" + mIgnoreWarning + "\n"); + sb.append("7-ZipPath:" + mSevenZipPath + "\n"); + sb.append("useSignAPk:" + mUseSignAPk + "\n"); + + sb.append("package meta fields: \n"); + + for (String name : mPackageFields.keySet()) { + sb.append("filed name:" + name + ", filed value:" + mPackageFields.get(name) + "\n"); + } + + sb.append("dex configs: \n"); + if (mDexRaw) { + sb.append("dexMode: raw" + "\n"); + } else { + sb.append("dexMode: jar" + "\n"); + } + for (Pattern name : mDexFilePattern) { + sb.append("dexPattern:" + name.toString() + "\n"); + } + for (String name : mDexLoaderPattern) { + sb.append("dex loader:" + name + "\n"); + } + + sb.append("lib configs: \n"); + for (Pattern name : mSoFilePattern) { + sb.append("libPattern:" + name.toString() + "\n"); + } + + sb.append("resource configs: \n"); + for (Pattern name : mResFilePattern) { + sb.append("resPattern:" + name.toString() + "\n"); + } + for (Pattern name : mResIgnoreChangePattern) { + sb.append("resIgnore change:" + name.toString() + "\n"); + } + sb.append("largeModSize:" + mLargeModSize + "kb\n"); + sb.append("useApplyResource:" + mUseApplyResource + "\n"); + return sb.toString(); + } + + private void createTempDirectory() throws TinkerPatchException { + mTempResultDir = new File(mOutFolder + File.separator + TypedValue.PATH_PATCH_FILES); + FileOperation.deleteDir(mTempResultDir); + if (!mTempResultDir.exists()) { + mTempResultDir.mkdir(); + } + + String oldApkName = mOldApkFile.getName(); + if (!oldApkName.endsWith(TypedValue.FILE_APK)) { + throw new TinkerPatchException( + String.format("input apk file path must end with .apk, yours %s\n", oldApkName) + ); + } + + String newApkName = mNewApkFile.getName(); + if (!newApkName.endsWith(TypedValue.FILE_APK)) { + throw new TinkerPatchException( + String.format("input apk file path must end with .apk, yours %s\n", newApkName) + ); + } + + String tempOldName = oldApkName.substring(0, oldApkName.indexOf(TypedValue.FILE_APK)); + + + String tempNewName = newApkName.substring(0, newApkName.indexOf(TypedValue.FILE_APK)); + + if (tempNewName.equals(tempOldName)) { + tempOldName += "-old"; + tempNewName += "-new"; + } + + mTempUnzipOldDir = new File(mOutFolder, tempOldName); + mTempUnzipNewDir = new File(mOutFolder, tempNewName); + } + + public void setSignData(File signatureFile, String keypass, String storealias, String storepass) throws IOException { + if (mUseSignAPk) { + mSignatureFile = signatureFile; + if (!mSignatureFile.exists()) { + throw new IOException( + String.format("the signature file do not exit, raw path= %s\n", mSignatureFile.getAbsolutePath()) + ); + } + mKeyPass = keypass; + mStoreAlias = storealias; + mStorePass = storepass; + } + } + + private void checkInputPatternParameter() throws TinkerPatchException { + if (mSoFilePattern.isEmpty() && mDexFilePattern.isEmpty() && mResFilePattern.isEmpty()) { + throw new TinkerPatchException("no dex, so or resource pattern are found"); + } + if (mLargeModSize <= 0) { + throw new TinkerPatchException("largeModSize must be larger than 0"); + } + + } + + /** + * read args from xml + **/ + void readXmlConfig(File xmlConfigFile) + throws IOException, ParserConfigurationException, SAXException { + if (!xmlConfigFile.exists()) { + return; + } + + System.out.printf("reading config file, %s\n", xmlConfigFile.getAbsolutePath()); + BufferedInputStream input = null; + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + input = new BufferedInputStream(new FileInputStream(xmlConfigFile)); + InputSource source = new InputSource(input); + factory.setNamespaceAware(false); + factory.setValidating(false); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(source); + NodeList issues = document.getElementsByTagName(TAG_ISSUE); + for (int i = 0, count = issues.getLength(); i < count; i++) { + Node node = issues.item(i); + + Element element = (Element) node; + String id = element.getAttribute(ATTR_ID); + if (id.length() == 0) { + System.err.println("Invalid config file: Missing required issue id attribute"); + continue; + } + if (id.equals(PROPERTY_ISSUE)) { + readPropertyFromXml(node); + } else if (id.equals(DEX_ISSUE)) { + readDexPatternsFromXml(node); + } else if (id.equals(SO_ISSUE)) { + readLibPatternsFromXml(node); + } else if (id.equals(RES_ISSUE)) { + readResPatternsFromXml(node); + } else if (id.equals(PACKAGE_CONFIG_ISSUE)) { + readPackageConfigFromXml(node); + } else if (id.equals(SIGN_ISSUE)) { + if (mUseSignAPk) { + readSignFromXml(node); + } + } else { + System.err.println("unknown issue " + id); + } + } + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + System.exit(-1); + } + } + } + } + + private void readPropertyFromXml(Node node) throws IOException { + NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() > 0) { + for (int j = 0, n = childNodes.getLength(); j < n; j++) { + Node child = childNodes.item(j); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element check = (Element) child; + String tagName = check.getTagName(); + String value = check.getAttribute(ATTR_VALUE); + if (value.length() == 0) { + throw new IOException( + String.format("Invalid config file: Missing required attribute %s\n", ATTR_VALUE) + ); + } + if (tagName.equals(ATTR_IGNORE_WARNING)) { + mIgnoreWarning = value.equals("true"); + } else if (tagName.equals(ATTR_USE_SIGN)) { + mUseSignAPk = value.equals("true"); + } else if (tagName.equals(ATTR_SEVEN_ZIP_PATH)) { + File sevenZipFile = new File(value); + if (sevenZipFile.exists()) { + mSevenZipPath = value; + } else { + mSevenZipPath = "7za"; + } + } else { + System.err.println("unknown property tag " + tagName); + } + } + } + } + } + + + private void readSignFromXml(Node node) throws IOException { + if (mSignatureFile != null) { + System.err.println("already set the sign info from command line, ignore this"); + return; + } + NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() > 0) { + for (int j = 0, n = childNodes.getLength(); j < n; j++) { + Node child = childNodes.item(j); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element check = (Element) child; + String tagName = check.getTagName(); + String value = check.getAttribute(ATTR_VALUE); + if (value.length() == 0) { + throw new IOException( + String.format("Invalid config file: Missing required attribute %s\n", ATTR_VALUE) + ); + } + + if (tagName.equals(ATTR_SIGN_FILE_PATH)) { + mSignatureFile = new File(value); + if (!mSignatureFile.exists()) { + throw new IOException( + String.format("the signature file do not exit, raw path= %s\n", mSignatureFile.getAbsolutePath()) + ); + } + } else if (tagName.equals(ATTR_SIGN_FILE_STOREPASS)) { + mStorePass = value; + mStorePass = mStorePass.trim(); + } else if (tagName.equals(ATTR_SIGN_FILE_KEYPASS)) { + mKeyPass = value; + mKeyPass = mKeyPass.trim(); + } else if (tagName.equals(ATTR_SIGN_FILE_ALIAS)) { + mStoreAlias = value; + mStoreAlias = mStoreAlias.trim(); + } else { + System.err.println("unknown sign tag " + tagName); + } + } + } + } + + } + + private void readDexPatternsFromXml(Node node) throws IOException { + NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() > 0) { + for (int j = 0, n = childNodes.getLength(); j < n; j++) { + Node child = childNodes.item(j); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element check = (Element) child; + String tagName = check.getTagName(); + + String value = check.getAttribute(ATTR_VALUE); + if (tagName.equals(ATTR_DEX_MODE)) { + if (value.equals("raw")) { + mDexRaw = true; + } + } else if (tagName.equals(ATTR_PATTERN)) { + addToPatterns(value, mDexFilePattern); + } else if (tagName.equals(ATTR_LOADER)) { + mDexLoaderPattern.add(value); + } else { + System.err.println("unknown dex tag " + tagName); + } + } + } + } + } + + private void readLibPatternsFromXml(Node node) throws IOException { + NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() > 0) { + for (int j = 0, n = childNodes.getLength(); j < n; j++) { + Node child = childNodes.item(j); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element check = (Element) child; + String tagName = check.getTagName(); + + String value = check.getAttribute(ATTR_VALUE); + if (tagName.equals(ATTR_PATTERN)) { + addToPatterns(value, mSoFilePattern); + } else { + System.err.println("unknown dex tag " + tagName); + } + } + } + } + } + + private void readResPatternsFromXml(Node node) throws IOException { + NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() > 0) { + for (int j = 0, n = childNodes.getLength(); j < n; j++) { + Node child = childNodes.item(j); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element check = (Element) child; + String tagName = check.getTagName(); + + String value = check.getAttribute(ATTR_VALUE); + if (tagName.equals(ATTR_PATTERN)) { + mResRawPattern.add(value); + addToPatterns(value, mResFilePattern); + } else if (tagName.equals(ATTR_RES_IGNORE_CHANGE)) { + addToPatterns(value, mResIgnoreChangePattern); + } else if (tagName.equals(ATTR_RES_LARGE_MOD)) { + mLargeModSize = Integer.valueOf(value); + } else { + System.err.println("unknown dex tag " + tagName); + } + } + } + } + } + + private void readPackageConfigFromXml(Node node) throws IOException { + NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() > 0) { + for (int j = 0, n = childNodes.getLength(); j < n; j++) { + Node child = childNodes.item(j); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Element check = (Element) child; + String tagName = check.getTagName(); + + String value = check.getAttribute(ATTR_VALUE); + String name = check.getAttribute(ATTR_NAME); + + if (tagName.equals(ATTR_CONFIG_FIELD)) { + mPackageFields.put(name, value); + } else { + System.err.println("unknown package config tag " + tagName); + } + } + } + } + } + + private void addToPatterns(String value, HashSet patterns) throws IOException { + if (value.length() == 0) { + throw new IOException( + String.format("Invalid config file: Missing required attribute %s\n", ATTR_VALUE) + ); + } + value = Utils.convertToPatternString(value); + Pattern pattern = Pattern.compile(value); + patterns.add(pattern); + } + +} + diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/InputParam.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/InputParam.java new file mode 100644 index 00000000..6a217f47 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/InputParam.java @@ -0,0 +1,295 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.patch; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by zhangshaowen on 1/9/16. + */ +public class InputParam { + /** + * tinkerPatch + */ + public final String oldApk; + public final String newApk; + public final String outFolder; + public final File signFile; + public final String keypass; + public final String storealias; + public final String storepass; + public final boolean ignoreWarning; + public final boolean useSign; + + /** + * tinkerPatch.dex + */ + public final ArrayList dexFilePattern; + public final ArrayList dexLoaderPattern; + public final String dexMode; + /** + * tinkerPatch.lib + */ + public final ArrayList soFilePattern; + /** + * tinkerPatch.resource pattern + */ + public final ArrayList resourceFilePattern; + /** + * tinkerPath.resource ignoreChange + */ + public final ArrayList resourceIgnoreChangePattern; + /** + * tinkerPath.resource largeModSize + */ + public final int largeModSize; + /** + * tinkerPath.buildConfig applyResourceMapping + */ + public final boolean useApplyResource; + /** + * tinkerPatch.packageConfig + */ + public final HashMap configFields; + /** + * tinkerPatch.sevenZip + */ + public final String sevenZipPath; + + private InputParam( + String oldApk, + String newApk, + String outFolder, + File signFile, + String keypass, + String storealias, + String storepass, + boolean ignoreWarning, + boolean useSign, + + ArrayList dexFilePattern, + ArrayList dexLoaderPattern, + String dexMode, + ArrayList soFilePattern, + ArrayList resourceFilePattern, + ArrayList resourceIgnoreChangePattern, + int largeModSize, + boolean useApplyResource, + HashMap configFields, + + String sevenZipPath + ) { + this.oldApk = oldApk; + this.newApk = newApk; + this.outFolder = outFolder; + this.signFile = signFile; + this.keypass = keypass; + this.storealias = storealias; + this.storepass = storepass; + this.ignoreWarning = ignoreWarning; + this.useSign = useSign; + + this.dexFilePattern = dexFilePattern; + this.dexLoaderPattern = dexLoaderPattern; + this.dexMode = dexMode; + + this.soFilePattern = soFilePattern; + this.resourceFilePattern = resourceFilePattern; + this.resourceIgnoreChangePattern = resourceIgnoreChangePattern; + this.largeModSize = largeModSize; + this.useApplyResource = useApplyResource; + + this.configFields = configFields; + + this.sevenZipPath = sevenZipPath; + } + + public static class Builder { + /** + * tinkerPatch + */ + private String oldApk; + private String newApk; + private String outFolder; + private File signFile; + private String keypass; + private String storealias; + private String storepass; + private boolean ignoreWarning; + private boolean useSign; + + /** + * tinkerPatch.dex + */ + private ArrayList dexFilePattern; + private ArrayList dexLoaderPattern; + private String dexMode; + /** + * tinkerPatch.lib + */ + private ArrayList soFilePattern; + /** + * tinkerPath.resource pattern + */ + private ArrayList resourceFilePattern; + /** + * tinkerPath.resource ignoreChange + */ + private ArrayList resourceIgnoreChangePattern; + /** + * tinkerPath.resource largeModSize + */ + private int largeModSize; + /** + * tinkerPath.buildConfig applyResourceMapping + */ + private boolean useApplyResource; + /** + * tinkerPatch.packageConfig + */ + private HashMap configFields; + /** + * tinkerPatch.sevenZip + */ + private String sevenZipPath; + + + public Builder() { + } + + public Builder setOldApk(String oldApk) { + this.oldApk = oldApk; + return this; + } + + public Builder setNewApk(String newApk) { + this.newApk = newApk; + return this; + } + + public Builder setSoFilePattern(ArrayList soFilePattern) { + this.soFilePattern = soFilePattern; + return this; + } + + public Builder setResourceFilePattern(ArrayList resourceFilePattern) { + this.resourceFilePattern = resourceFilePattern; + return this; + } + + public Builder setResourceIgnoreChangePattern(ArrayList resourceIgnoreChangePattern) { + this.resourceIgnoreChangePattern = resourceIgnoreChangePattern; + return this; + } + + public Builder setResourceLargeModSize(int largeModSize) { + this.largeModSize = largeModSize; + return this; + } + + public Builder setUseApplyResource(boolean useApplyResource) { + this.useApplyResource = useApplyResource; + return this; + } + + public Builder setDexFilePattern(ArrayList dexFilePattern) { + this.dexFilePattern = dexFilePattern; + return this; + } + + public Builder setOutBuilder(String outFolder) { + this.outFolder = outFolder; + return this; + } + + public Builder setSignFile(File signFile) { + this.signFile = signFile; + return this; + } + + public Builder setKeypass(String keypass) { + this.keypass = keypass; + return this; + } + + public Builder setStorealias(String storealias) { + this.storealias = storealias; + return this; + } + + public Builder setStorepass(String storepass) { + this.storepass = storepass; + return this; + } + + public Builder setIgnoreWarning(boolean ignoreWarning) { + this.ignoreWarning = ignoreWarning; + return this; + } + + public Builder setDexLoaderPattern(ArrayList dexLoaderPattern) { + this.dexLoaderPattern = dexLoaderPattern; + return this; + } + + public Builder setDexMode(String dexMode) { + this.dexMode = dexMode; + return this; + } + + public Builder setConfigFields(HashMap configFields) { + this.configFields = configFields; + return this; + } + + public Builder setSevenZipPath(String sevenZipPath) { + this.sevenZipPath = sevenZipPath; + return this; + } + + public Builder setUseSign(boolean useSign) { + this.useSign = useSign; + return this; + } + + public InputParam create() { + return new InputParam( + oldApk, + newApk, + outFolder, + signFile, + keypass, + storealias, + storepass, + ignoreWarning, + useSign, + dexFilePattern, + dexLoaderPattern, + dexMode, + soFilePattern, + resourceFilePattern, + resourceIgnoreChangePattern, + largeModSize, + useApplyResource, + configFields, + sevenZipPath + ); + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Runner.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Runner.java new file mode 100644 index 00000000..78648b06 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/patch/Runner.java @@ -0,0 +1,105 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.patch; + +import com.tencent.tinker.build.builder.PatchBuilder; +import com.tencent.tinker.build.decoder.ApkDecoder; +import com.tencent.tinker.build.info.PatchInfo; +import com.tencent.tinker.build.util.Logger; +import com.tencent.tinker.build.util.TinkerPatchException; + +import java.io.IOException; + +/** + * Created by zhangshaowen on 2/26/16. + */ +public class Runner { + + public static final int ERRNO_ERRORS = 1; + public static final int ERRNO_USAGE = 2; + + protected static long mBeginTime; + protected Configuration config; + + public static void gradleRun(InputParam inputParam) { + mBeginTime = System.currentTimeMillis(); + Runner m = new Runner(); + m.run(inputParam); + } + + private void run(InputParam inputParam) { + loadConfigFromGradle(inputParam); + try { + Logger.initLogger(config); + tinkerPatch(); + } catch (IOException e) { + e.printStackTrace(); + goToError(); + } finally { + Logger.closeLogger(); + } + } + + protected void tinkerPatch() { + Logger.d("-----------------------Tinker patch begin-----------------------"); + + Logger.d(config.toString()); + try { + //gen patch + ApkDecoder decoder = new ApkDecoder(config); + decoder.onAllPatchesStart(); + decoder.patch(config.mOldApkFile, config.mNewApkFile); + decoder.onAllPatchesEnd(); + + //gen meta file and version file + PatchInfo info = new PatchInfo(config); + info.gen(); + + //build patch + PatchBuilder builder = new PatchBuilder(config); + builder.buildPatch(); + + } catch (Throwable e) { + e.printStackTrace(); + goToError(); + } + + Logger.d("Tinker patch done, total time cost: %fs", diffTimeFromBegin()); + Logger.d("Tinker patch done, you can go to file to find the output %s", config.mOutFolder); + Logger.d("-----------------------Tinker patch end-------------------------"); + } + + private void loadConfigFromGradle(InputParam inputParam) { + try { + config = new Configuration(inputParam); + } catch (IOException e) { + e.printStackTrace(); + } catch (TinkerPatchException e) { + e.printStackTrace(); + } + } + + public void goToError() { + System.exit(ERRNO_USAGE); + } + + public double diffTimeFromBegin() { + long end = System.currentTimeMillis(); + return (end - mBeginTime) / 1000.0; + } + +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/DexClassesComparator.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/DexClassesComparator.java new file mode 100644 index 00000000..fe55d9a9 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/DexClassesComparator.java @@ -0,0 +1,1534 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.ClassData.Field; +import com.tencent.tinker.android.dex.ClassData.Method; +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.EncodedValueReader; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.instruction.InstructionComparator; +import com.tencent.tinker.build.dexpatcher.util.PatternUtils; +import com.tencent.tinker.commons.dexpatcher.DexPatcherLogger; +import com.tencent.tinker.commons.dexpatcher.DexPatcherLogger.IDexPatcherLogger; + +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * Created by tangyinsheng on 2016/4/14. + */ +public final class DexClassesComparator { + public static final int COMPARE_MODE_NORMAL = 0; + public static final int COMPARE_MODE_CAUSE_REF_CHANGE_ONLY = 1; + private static final String TAG = "DexClassesComparator"; + private static final int DBG_FIRST_SPECIAL = 0x0A; // the smallest special opcode + private static final int DBG_LINE_BASE = -4; // the smallest line number increment + private static final int DBG_LINE_RANGE = 15; // the number of line increments represented + private final List addedClassInfoList = new ArrayList<>(); + private final List deletedClassInfoList = new ArrayList<>(); + // classDesc => [oldClassInfo, newClassInfo] + private final Map changedClassDescToClassInfosMap = new HashMap<>(); + private final Set patternsOfClassDescToCheck = new HashSet<>(); + private final Set patternsOfIgnoredRemovedClassDesc = new HashSet<>(); + private final Set oldDescriptorOfClassesToCheck = new HashSet<>(); + private final Set newDescriptorOfClassesToCheck = new HashSet<>(); + private final Map oldClassDescriptorToClassInfoMap = new HashMap<>(); + private final Map newClassDescriptorToClassInfoMap = new HashMap<>(); + // Record class descriptors whose references key (index or offset) of methods and fields + // are changed. + private final Set refAffectedClassDescs = new HashSet<>(); + private final DexPatcherLogger logger = new DexPatcherLogger(); + private int compareMode = COMPARE_MODE_NORMAL; + + public DexClassesComparator(String patternStringOfClassDescToCheck) { + patternsOfClassDescToCheck.add( + Pattern.compile( + PatternUtils.dotClassNamePatternToDescriptorRegEx(patternStringOfClassDescToCheck) + ) + ); + } + + public DexClassesComparator(String... patternStringsOfClassDescToCheck) { + for (String patternStr : patternStringsOfClassDescToCheck) { + patternsOfClassDescToCheck.add( + Pattern.compile( + PatternUtils.dotClassNamePatternToDescriptorRegEx(patternStr) + ) + ); + } + } + + public DexClassesComparator(Collection patternStringsOfClassDescToCheck) { + for (String patternStr : patternStringsOfClassDescToCheck) { + patternsOfClassDescToCheck.add( + Pattern.compile( + PatternUtils.dotClassNamePatternToDescriptorRegEx(patternStr) + ) + ); + } + } + + public void setIgnoredRemovedClassDescPattern(String... patternStringsOfLoaderClassDesc) { + patternsOfIgnoredRemovedClassDesc.clear(); + for (String patternStr : patternStringsOfLoaderClassDesc) { + patternsOfIgnoredRemovedClassDesc.add( + Pattern.compile( + PatternUtils.dotClassNamePatternToDescriptorRegEx(patternStr) + ) + ); + } + } + + public void setIgnoredRemovedClassDescPattern(Collection patternStringsOfLoaderClassDesc) { + patternsOfIgnoredRemovedClassDesc.clear(); + for (String patternStr : patternStringsOfLoaderClassDesc) { + patternsOfIgnoredRemovedClassDesc.add( + Pattern.compile( + PatternUtils.dotClassNamePatternToDescriptorRegEx(patternStr) + ) + ); + } + } + + public void setCompareMode(int mode) { + if (mode == COMPARE_MODE_NORMAL || mode == COMPARE_MODE_CAUSE_REF_CHANGE_ONLY) { + this.compareMode = mode; + } else { + throw new IllegalArgumentException("bad compare mode: " + mode); + } + } + + public void setLogger(IDexPatcherLogger logger) { + this.logger.setLoggerImpl(logger); + } + + public List getAddedClassInfos() { + return Collections.unmodifiableList(addedClassInfoList); + } + + public List getDeletedClassInfos() { + return Collections.unmodifiableList(deletedClassInfoList); + } + + public Map getChangedClassDescToInfosMap() { + return Collections.unmodifiableMap(changedClassDescToClassInfosMap); + } + + public void startCheck(File oldDexFile, File newDexFile) throws IOException { + startCheck(new Dex(oldDexFile), new Dex(newDexFile)); + } + + public void startCheck(Dex oldDex, Dex newDex) { + startCheck(DexGroup.wrap(oldDex), DexGroup.wrap(newDex)); + } + + public void startCheck(DexGroup oldDexGroup, DexGroup newDexGroup) { + // Init assist structures. + addedClassInfoList.clear(); + deletedClassInfoList.clear(); + changedClassDescToClassInfosMap.clear(); + oldDescriptorOfClassesToCheck.clear(); + newDescriptorOfClassesToCheck.clear(); + oldClassDescriptorToClassInfoMap.clear(); + newClassDescriptorToClassInfoMap.clear(); + refAffectedClassDescs.clear(); + + // Map classDesc and typeIndex to classInfo + // and collect typeIndex of classes to check in oldDexes. + for (Dex oldDex : oldDexGroup.dexes) { + int classDefIndex = 0; + for (ClassDef oldClassDef : oldDex.classDefs()) { + String desc = oldDex.typeNames().get(oldClassDef.typeIndex); + if (Utils.isStringMatchesPatterns(desc, patternsOfClassDescToCheck)) { + if (!oldDescriptorOfClassesToCheck.add(desc)) { + throw new IllegalStateException( + String.format( + "duplicate class descriptor [%s] in different old dexes.", + desc + ) + ); + } + } + DexClassInfo classInfo = new DexClassInfo(desc, classDefIndex, oldClassDef, oldDex); + ++classDefIndex; + oldClassDescriptorToClassInfoMap.put(desc, classInfo); + } + } + + // Map classDesc and typeIndex to classInfo + // and collect typeIndex of classes to check in newDexes. + for (Dex newDex : newDexGroup.dexes) { + int classDefIndex = 0; + for (ClassDef newClassDef : newDex.classDefs()) { + String desc = newDex.typeNames().get(newClassDef.typeIndex); + if (Utils.isStringMatchesPatterns(desc, patternsOfClassDescToCheck)) { + if (!newDescriptorOfClassesToCheck.add(desc)) { + throw new IllegalStateException( + String.format( + "duplicate class descriptor [%s] in different new dexes.", + desc + ) + ); + } + } + DexClassInfo classInfo = new DexClassInfo(desc, classDefIndex, newClassDef, newDex); + ++classDefIndex; + newClassDescriptorToClassInfoMap.put(desc, classInfo); + } + } + + Set deletedClassDescs = new HashSet<>(oldDescriptorOfClassesToCheck); + deletedClassDescs.removeAll(newDescriptorOfClassesToCheck); + + for (String desc : deletedClassDescs) { + // These classes are deleted as we expect to, so we remove them + // from result. + if (Utils.isStringMatchesPatterns(desc, patternsOfIgnoredRemovedClassDesc)) { + logger.i(TAG, "Ignored deleted class: %s", desc); + continue; + } else { + logger.i(TAG, "Deleted class: %s", desc); + } + deletedClassInfoList.add(oldClassDescriptorToClassInfoMap.get(desc)); + } + + Set addedClassDescs = new HashSet<>(newDescriptorOfClassesToCheck); + addedClassDescs.removeAll(oldDescriptorOfClassesToCheck); + + for (String desc : addedClassDescs) { + logger.i(TAG, "Added class: %s", desc); + addedClassInfoList.add(newClassDescriptorToClassInfoMap.get(desc)); + } + + Set mayBeChangedClassDescs = new HashSet<>(oldDescriptorOfClassesToCheck); + mayBeChangedClassDescs.retainAll(newDescriptorOfClassesToCheck); + + for (String desc : mayBeChangedClassDescs) { + DexClassInfo oldClassInfo = oldClassDescriptorToClassInfoMap.get(desc); + DexClassInfo newClassInfo = newClassDescriptorToClassInfoMap.get(desc); + switch (compareMode) { + case COMPARE_MODE_NORMAL: { + if (!isSameClass( + oldClassInfo.owner, + newClassInfo.owner, + oldClassInfo.classDef, + newClassInfo.classDef + )) { + logger.i(TAG, "Changed class: %s", desc); + changedClassDescToClassInfosMap.put( + desc, new DexClassInfo[]{oldClassInfo, newClassInfo} + ); + } + break; + } + case COMPARE_MODE_CAUSE_REF_CHANGE_ONLY: { + if (isClassChangeAffectedToRef( + oldClassInfo.owner, + newClassInfo.owner, + oldClassInfo.classDef, + newClassInfo.classDef + )) { + logger.i(TAG, "Ref-changed class: %s", desc); + changedClassDescToClassInfosMap.put( + desc, new DexClassInfo[]{oldClassInfo, newClassInfo} + ); + } + break; + } + } + } + } + + private boolean isClassChangeAffectedToRef( + Dex oldDex, + Dex newDex, + ClassDef oldClassDef, + ClassDef newClassDef + ) { + boolean result = false; + + String classDesc = oldDex.typeNames().get(oldClassDef.typeIndex); + + do { + if (refAffectedClassDescs.contains(classDesc)) { + result = true; + return result; + } + + // Any changes on superclass could affect refs of members in current class. + if (isTypeChangeAffectedToRef( + oldDex, newDex, oldClassDef.supertypeIndex, newClassDef.supertypeIndex + )) { + result = true; + break; + } + + // Any changes on current class's interface list could affect refs + // of members in current class. + short[] oldInterfaceTypeIds = oldDex.interfaceTypeIndicesFromClassDef(oldClassDef); + short[] newInterfaceTypeIds = newDex.interfaceTypeIndicesFromClassDef(newClassDef); + if (isTypeIdsChangeAffectedToRef( + oldDex, newDex, oldInterfaceTypeIds, newInterfaceTypeIds, false + )) { + result = true; + break; + } + + // Any changes on current class's member lists could affect refs + // of members in current class. + ClassData oldClassData = + (oldClassDef.classDataOffset != 0 ? oldDex.readClassData(oldClassDef) : null); + ClassData newClassData = + (newClassDef.classDataOffset != 0 ? newDex.readClassData(newClassDef) : null); + if (isClassDataChangeAffectedToRef( + oldDex, newDex, oldClassData, newClassData + )) { + result = true; + break; + } + } while (false); + + if (result) { + refAffectedClassDescs.add(classDesc); + } + + return result; + } + + private boolean isTypeChangeAffectedToRef( + Dex oldDex, Dex newDex, int oldTypeId, int newTypeId + ) { + if (oldTypeId != ClassDef.NO_INDEX && newTypeId != ClassDef.NO_INDEX) { + String oldClassDesc = oldDex.typeNames().get(oldTypeId); + String newClassDesc = newDex.typeNames().get(newTypeId); + if (!oldClassDesc.equals(newClassDesc)) { + return true; + } + + final DexClassInfo oldClassInfo = oldClassDescriptorToClassInfoMap.get(oldClassDesc); + final DexClassInfo newClassInfo = newClassDescriptorToClassInfoMap.get(newClassDesc); + ClassDef oldClassDef = (oldClassInfo != null ? oldClassInfo.classDef : null); + ClassDef newClassDef = (newClassInfo != null ? newClassInfo.classDef : null); + if (oldClassDef != null && newClassDef != null) { + return isClassChangeAffectedToRef(oldClassInfo.owner, newClassInfo.owner, oldClassDef, newClassDef); + } else + if (oldClassDef == null && newClassDef == null) { + return false; + } else { + // If current comparing class is ignored, since it must be removed + // in patched dexes as we expected, here we ignore this kind of changes. + return !Utils.isStringMatchesPatterns(oldClassDesc, patternsOfIgnoredRemovedClassDesc); + } + } else { + if (!(oldTypeId == ClassDef.NO_INDEX && newTypeId == ClassDef.NO_INDEX)) { + return true; + } + } + return false; + } + + private boolean isTypeIdsChangeAffectedToRef( + Dex oldDex, + Dex newDex, + short[] oldTypeIds, + short[] newTypeIds, + boolean compareNameOnly + ) { + if (oldTypeIds.length != newTypeIds.length) { + return true; + } + + int typeIdCount = oldTypeIds.length; + for (int i = 0; i < typeIdCount; ++i) { + if (compareNameOnly) { + String oldTypeName = oldDex.typeNames().get(oldTypeIds[i]); + String newTypeName = newDex.typeNames().get(newTypeIds[i]); + if (!oldTypeName.equals(newTypeName)) { + return true; + } + } else { + if (isTypeChangeAffectedToRef(oldDex, newDex, oldTypeIds[i], newTypeIds[i])) { + return true; + } + } + } + + return false; + } + + private boolean isClassDataChangeAffectedToRef( + Dex oldDex, + Dex newDex, + ClassData oldClassData, + ClassData newClassData + ) { + if (oldClassData != null && newClassData != null) { + if (isFieldsChangeAffectedToRef( + oldDex, newDex, oldClassData.instanceFields, newClassData.instanceFields + )) { + return true; + } + + if (isFieldsChangeAffectedToRef( + oldDex, newDex, oldClassData.staticFields, newClassData.staticFields + )) { + return true; + } + + if (isMethodsChangeAffectedToRef( + oldDex, newDex, oldClassData.directMethods, newClassData.directMethods + )) { + return true; + } + + if (isMethodsChangeAffectedToRef( + oldDex, newDex, oldClassData.virtualMethods, newClassData.virtualMethods + )) { + return true; + } + } else { + if (!(oldClassData == null && newClassData == null)) { + return true; + } + } + return false; + } + + private boolean isFieldsChangeAffectedToRef( + Dex oldDex, + Dex newDex, + Field[] oldFields, + Field[] newFields + ) { + if (oldFields.length != newFields.length) { + return true; + } + + int fieldCount = oldFields.length; + for (int i = 0; i < fieldCount; ++i) { + Field oldField = oldFields[i]; + Field newField = newFields[i]; + + if (oldField.accessFlags != newField.accessFlags) { + return true; + } + + FieldId oldFieldId = oldDex.fieldIds().get(oldField.fieldIndex); + FieldId newFieldId = newDex.fieldIds().get(newField.fieldIndex); + + String oldFieldName = oldDex.strings().get(oldFieldId.nameIndex); + String newFieldName = newDex.strings().get(newFieldId.nameIndex); + if (!oldFieldName.equals(newFieldName)) { + return true; + } + + String oldFieldTypeName = oldDex.typeNames().get(oldFieldId.typeIndex); + String newFieldTypeName = newDex.typeNames().get(newFieldId.typeIndex); + if (!oldFieldTypeName.equals(newFieldTypeName)) { + return true; + } + } + + return false; + } + + private boolean isMethodsChangeAffectedToRef( + Dex oldDex, + Dex newDex, + Method[] oldMethods, + Method[] newMethods + ) { + if (oldMethods.length != newMethods.length) { + return true; + } + + int methodCount = oldMethods.length; + for (int i = 0; i < methodCount; ++i) { + Method oldMethod = oldMethods[i]; + Method newMethod = newMethods[i]; + + if (oldMethod.accessFlags != newMethod.accessFlags) { + return true; + } + + MethodId oldMethodId = oldDex.methodIds().get(oldMethod.methodIndex); + MethodId newMethodId = newDex.methodIds().get(newMethod.methodIndex); + + String oldMethodName = oldDex.strings().get(oldMethodId.nameIndex); + String newMethodName = newDex.strings().get(newMethodId.nameIndex); + if (!oldMethodName.equals(newMethodName)) { + return true; + } + + ProtoId oldProtoId = oldDex.protoIds().get(oldMethodId.protoIndex); + ProtoId newProtoId = newDex.protoIds().get(newMethodId.protoIndex); + + String oldMethodShorty = oldDex.strings().get(oldProtoId.shortyIndex); + String newMethodShorty = newDex.strings().get(newProtoId.shortyIndex); + if (!oldMethodShorty.equals(newMethodShorty)) { + return true; + } + + String oldMethodReturnTypeName = oldDex.typeNames().get(oldProtoId.returnTypeIndex); + String newMethodReturnTypeName = newDex.typeNames().get(newProtoId.returnTypeIndex); + if (!oldMethodReturnTypeName.equals(newMethodReturnTypeName)) { + return true; + } + + short[] oldParameterIds = oldDex.parameterTypeIndicesFromMethodId(oldMethodId); + short[] newParameterIds = newDex.parameterTypeIndicesFromMethodId(newMethodId); + if (isTypeIdsChangeAffectedToRef( + oldDex, newDex, oldParameterIds, newParameterIds, true + )) { + return true; + } + } + return false; + } + + private boolean isSameClass( + Dex oldDex, + Dex newDex, + ClassDef oldClassDef, + ClassDef newClassDef + ) { + if (oldClassDef.accessFlags != newClassDef.accessFlags) { + return false; + } + + if (!isSameClassDesc( + oldDex, newDex, oldClassDef.supertypeIndex, newClassDef.supertypeIndex + )) { + return false; + } + + short[] oldInterfaceIndices = oldDex.interfaceTypeIndicesFromClassDef(oldClassDef); + short[] newInterfaceIndices = newDex.interfaceTypeIndicesFromClassDef(newClassDef); + if (oldInterfaceIndices.length != newInterfaceIndices.length) { + return false; + } else { + for (int i = 0; i < oldInterfaceIndices.length; ++i) { + if (!isSameClassDesc(oldDex, newDex, oldInterfaceIndices[i], newInterfaceIndices[i])) { + return false; + } + } + } + + if (!isSameName(oldDex, newDex, oldClassDef.sourceFileIndex, newClassDef.sourceFileIndex)) { + return false; + } + + if (!isSameAnnotationDirectory( + oldDex, + newDex, + oldClassDef.annotationsOffset, + newClassDef.annotationsOffset + )) { + return false; + } + + if (!isSameClassData( + oldDex, + newDex, + oldClassDef.classDataOffset, + newClassDef.classDataOffset + )) { + return false; + } + + return isSameStaticValue( + oldDex, + newDex, + oldClassDef.staticValuesOffset, + newClassDef.staticValuesOffset + ); + } + + private boolean isSameStaticValue( + Dex oldDex, + Dex newDex, + int oldStaticValueOffset, + int newStaticValueOffset + ) { + if (oldStaticValueOffset == 0 && newStaticValueOffset == 0) { + return true; + } + + if (oldStaticValueOffset == 0 || newStaticValueOffset == 0) { + return false; + } + + EncodedValue oldStaticValue = + oldDex.openSection(oldStaticValueOffset).readEncodedArray(); + EncodedValue newStaticValue = + newDex.openSection(newStaticValueOffset).readEncodedArray(); + EncodedValueReader oldReader = + new EncodedValueReader(oldStaticValue, EncodedValueReader.ENCODED_ARRAY); + EncodedValueReader newReader = + new EncodedValueReader(newStaticValue, EncodedValueReader.ENCODED_ARRAY); + + return isSameEncodedValue(oldDex, newDex, oldReader, newReader); + } + + private boolean isSameClassDesc(Dex oldDex, Dex newDex, int oldTypeId, int newTypeId) { + String oldClassDesc = oldDex.typeNames().get(oldTypeId); + String newClassDesc = newDex.typeNames().get(newTypeId); + return oldClassDesc.equals(newClassDesc); + } + + private boolean isSameName(Dex oldDex, Dex newDex, int oldStringId, int newStringId) { + if (oldStringId == TableOfContents.Section.UNDEF_INDEX + && newStringId == TableOfContents.Section.UNDEF_INDEX) { + return true; + } + if (oldStringId == TableOfContents.Section.UNDEF_INDEX + || newStringId == TableOfContents.Section.UNDEF_INDEX) { + return false; + } + + return oldDex.strings().get(oldStringId).equals(newDex.strings().get(newStringId)); + } + + private boolean isSameAnnotationDirectory( + Dex oldDex, + Dex newDex, + int oldAnnotationDirectoryOffset, + int newAnnotationDirectoryOffset + ) { + if (oldAnnotationDirectoryOffset == 0 && newAnnotationDirectoryOffset == 0) { + return true; + } + + if (oldAnnotationDirectoryOffset == 0 || newAnnotationDirectoryOffset == 0) { + return false; + } + + AnnotationsDirectory oldAnnotationsDirectory = + oldDex.openSection(oldAnnotationDirectoryOffset).readAnnotationsDirectory(); + AnnotationsDirectory newAnnotationsDirectory = + newDex.openSection(newAnnotationDirectoryOffset).readAnnotationsDirectory(); + + if (!isSameAnnotationSet( + oldDex, + newDex, + oldAnnotationsDirectory.classAnnotationsOffset, + newAnnotationsDirectory.classAnnotationsOffset + )) { + return false; + } + + int[][] oldFieldAnnotations = oldAnnotationsDirectory.fieldAnnotations; + int[][] newFieldAnnotations = newAnnotationsDirectory.fieldAnnotations; + if (oldFieldAnnotations.length != newFieldAnnotations.length) { + return false; + } + for (int i = 0; i < oldFieldAnnotations.length; ++i) { + if (!isSameFieldId( + oldDex, newDex, oldFieldAnnotations[i][0], newFieldAnnotations[i][0] + )) { + return false; + } + if (!isSameAnnotationSet( + oldDex, newDex, oldFieldAnnotations[i][1], newFieldAnnotations[i][1] + )) { + return false; + } + } + + int[][] oldMethodAnnotations = oldAnnotationsDirectory.methodAnnotations; + int[][] newMethodAnnotations = newAnnotationsDirectory.methodAnnotations; + if (oldMethodAnnotations.length != newMethodAnnotations.length) { + return false; + } + for (int i = 0; i < oldMethodAnnotations.length; ++i) { + if (!isSameMethodId( + oldDex, newDex, oldMethodAnnotations[i][0], newMethodAnnotations[i][0] + )) { + return false; + } + if (!isSameAnnotationSet( + oldDex, newDex, oldMethodAnnotations[i][1], newMethodAnnotations[i][1] + )) { + return false; + } + } + + int[][] oldParameterAnnotations = oldAnnotationsDirectory.parameterAnnotations; + int[][] newParameterAnnotations = newAnnotationsDirectory.parameterAnnotations; + if (oldParameterAnnotations.length != newParameterAnnotations.length) { + return false; + } + for (int i = 0; i < oldParameterAnnotations.length; ++i) { + if (!isSameMethodId( + oldDex, newDex, oldParameterAnnotations[i][0], newParameterAnnotations[i][0] + )) { + return false; + } + if (!isSameAnnotationSetRefList( + oldDex, newDex, oldParameterAnnotations[i][1], newParameterAnnotations[i][1] + )) { + return false; + } + } + + return true; + } + + private boolean isSameFieldId(Dex oldDex, Dex newDex, int oldFieldIdIdx, int newFieldIdIdx) { + FieldId oldFieldId = oldDex.fieldIds().get(oldFieldIdIdx); + FieldId newFieldId = newDex.fieldIds().get(newFieldIdIdx); + + if (!isSameClassDesc( + oldDex, newDex, oldFieldId.declaringClassIndex, newFieldId.declaringClassIndex + )) { + return false; + } + + if (!isSameClassDesc( + oldDex, newDex, oldFieldId.typeIndex, newFieldId.typeIndex + )) { + return false; + } + + String oldName = oldDex.strings().get(oldFieldId.nameIndex); + String newName = newDex.strings().get(newFieldId.nameIndex); + return oldName.equals(newName); + } + + private boolean isSameMethodId(Dex oldDex, Dex newDex, int oldMethodIdIdx, int newMethodIdIdx) { + MethodId oldMethodId = oldDex.methodIds().get(oldMethodIdIdx); + MethodId newMethodId = newDex.methodIds().get(newMethodIdIdx); + + if (!isSameClassDesc( + oldDex, newDex, oldMethodId.declaringClassIndex, newMethodId.declaringClassIndex + )) { + return false; + } + + if (!isSameProtoId(oldDex, newDex, oldMethodId.protoIndex, newMethodId.protoIndex)) { + return false; + } + + String oldName = oldDex.strings().get(oldMethodId.nameIndex); + String newName = newDex.strings().get(newMethodId.nameIndex); + return oldName.equals(newName); + } + + private boolean isSameProtoId(Dex oldDex, Dex newDex, int oldProtoIdIdx, int newProtoIdIdx) { + ProtoId oldProtoId = oldDex.protoIds().get(oldProtoIdIdx); + ProtoId newProtoId = newDex.protoIds().get(newProtoIdIdx); + + String oldShorty = oldDex.strings().get(oldProtoId.shortyIndex); + String newShorty = newDex.strings().get(newProtoId.shortyIndex); + + if (!oldShorty.equals(newShorty)) { + return false; + } + + if (!isSameClassDesc( + oldDex, newDex, oldProtoId.returnTypeIndex, newProtoId.returnTypeIndex + )) { + return false; + } + + return isSameParameters( + oldDex, newDex, oldProtoId.parametersOffset, newProtoId.parametersOffset + ); + } + + private boolean isSameParameters( + Dex oldDex, Dex newDex, int oldParametersOffset, int newParametersOffset + ) { + if (oldParametersOffset == 0 && newParametersOffset == 0) { + return true; + } + + if (oldParametersOffset == 0 || newParametersOffset == 0) { + return false; + } + + TypeList oldParameters = oldDex.openSection(oldParametersOffset).readTypeList(); + TypeList newParameters = newDex.openSection(newParametersOffset).readTypeList(); + + if (oldParameters.types.length != newParameters.types.length) { + return false; + } + + for (int i = 0; i < oldParameters.types.length; ++i) { + if (!isSameClassDesc( + oldDex, newDex, oldParameters.types[i], newParameters.types[i] + )) { + return false; + } + } + + return true; + } + + private boolean isSameAnnotationSetRefList( + Dex oldDex, + Dex newDex, + int oldAnnotationSetRefListOffset, + int newAnnotationSetRefListOffset + ) { + if (oldAnnotationSetRefListOffset == 0 && newAnnotationSetRefListOffset == 0) { + return true; + } + + if (oldAnnotationSetRefListOffset == 0 || newAnnotationSetRefListOffset == 0) { + return false; + } + + AnnotationSetRefList oldAnnotationSetRefList = oldDex.openSection( + oldAnnotationSetRefListOffset + ).readAnnotationSetRefList(); + + AnnotationSetRefList newAnnotationSetRefList = newDex.openSection( + newAnnotationSetRefListOffset + ).readAnnotationSetRefList(); + + int oldAnnotationSetRefListCount = oldAnnotationSetRefList.annotationSetRefItems.length; + int newAnnotationSetRefListCount = newAnnotationSetRefList.annotationSetRefItems.length; + if (oldAnnotationSetRefListCount != newAnnotationSetRefListCount) { + return false; + } + + for (int i = 0; i < oldAnnotationSetRefListCount; ++i) { + if (!isSameAnnotationSet( + oldDex, + newDex, + oldAnnotationSetRefList.annotationSetRefItems[i], + newAnnotationSetRefList.annotationSetRefItems[i] + )) { + return false; + } + } + + return true; + } + + private boolean isSameAnnotationSet( + Dex oldDex, Dex newDex, int oldAnnotationSetOffset, int newAnnotationSetOffset + ) { + if (oldAnnotationSetOffset == 0 && newAnnotationSetOffset == 0) { + return true; + } + + if (oldAnnotationSetOffset == 0 || newAnnotationSetOffset == 0) { + return false; + } + + AnnotationSet oldClassAnnotationSet = + oldDex.openSection(oldAnnotationSetOffset).readAnnotationSet(); + AnnotationSet newClassAnnotationSet = + newDex.openSection(newAnnotationSetOffset).readAnnotationSet(); + + int oldAnnotationOffsetCount = oldClassAnnotationSet.annotationOffsets.length; + int newAnnotationOffsetCount = newClassAnnotationSet.annotationOffsets.length; + if (oldAnnotationOffsetCount != newAnnotationOffsetCount) { + return false; + } + + for (int i = 0; i < oldAnnotationOffsetCount; ++i) { + if (!isSameAnnotation( + oldDex, + newDex, + oldClassAnnotationSet.annotationOffsets[i], + newClassAnnotationSet.annotationOffsets[i] + )) { + return false; + } + } + + return true; + } + + private boolean isSameAnnotation( + Dex oldDex, Dex newDex, int oldAnnotationOffset, int newAnnotationOffset + ) { + Annotation oldAnnotation = oldDex.openSection(oldAnnotationOffset).readAnnotation(); + Annotation newAnnotation = newDex.openSection(newAnnotationOffset).readAnnotation(); + + if (oldAnnotation.visibility != newAnnotation.visibility) { + return false; + } + + EncodedValueReader oldAnnoReader = oldAnnotation.getReader(); + EncodedValueReader newAnnoReader = newAnnotation.getReader(); + + return isSameAnnotationByReader(oldDex, newDex, oldAnnoReader, newAnnoReader); + } + + private boolean isSameAnnotationByReader( + Dex oldDex, + Dex newDex, + EncodedValueReader oldAnnoReader, + EncodedValueReader newAnnoReader + ) { + int oldFieldCount = oldAnnoReader.readAnnotation(); + int newFieldCount = newAnnoReader.readAnnotation(); + if (oldFieldCount != newFieldCount) { + return false; + } + + int oldAnnoType = oldAnnoReader.getAnnotationType(); + int newAnnoType = newAnnoReader.getAnnotationType(); + if (!isSameClassDesc(oldDex, newDex, oldAnnoType, newAnnoType)) { + return false; + } + + for (int i = 0; i < oldFieldCount; ++i) { + int oldAnnoNameIdx = oldAnnoReader.readAnnotationName(); + int newAnnoNameIdx = newAnnoReader.readAnnotationName(); + if (!isSameName(oldDex, newDex, oldAnnoNameIdx, newAnnoNameIdx)) { + return false; + } + if (!isSameEncodedValue(oldDex, newDex, oldAnnoReader, newAnnoReader)) { + return false; + } + } + + return true; + } + + private boolean isSameEncodedValue( + Dex oldDex, + Dex newDex, + EncodedValueReader oldAnnoReader, + EncodedValueReader newAnnoReader + ) { + int oldAnnoItemType = oldAnnoReader.peek(); + int newAnnoItemType = newAnnoReader.peek(); + + if (oldAnnoItemType != newAnnoItemType) { + return false; + } + + switch (oldAnnoItemType) { + case EncodedValueReader.ENCODED_BYTE: { + byte oldByte = oldAnnoReader.readByte(); + byte newByte = newAnnoReader.readByte(); + return oldByte == newByte; + } + case EncodedValueReader.ENCODED_SHORT: { + short oldShort = oldAnnoReader.readShort(); + short newShort = newAnnoReader.readShort(); + return oldShort == newShort; + } + case EncodedValueReader.ENCODED_INT: { + int oldInt = oldAnnoReader.readInt(); + int newInt = newAnnoReader.readInt(); + return oldInt == newInt; + } + case EncodedValueReader.ENCODED_LONG: { + long oldLong = oldAnnoReader.readLong(); + long newLong = newAnnoReader.readLong(); + return oldLong == newLong; + } + case EncodedValueReader.ENCODED_CHAR: { + char oldChar = oldAnnoReader.readChar(); + char newChar = newAnnoReader.readChar(); + return oldChar == newChar; + } + case EncodedValueReader.ENCODED_FLOAT: { + float oldFloat = oldAnnoReader.readFloat(); + float newFloat = newAnnoReader.readFloat(); + return oldFloat == newFloat; + } + case EncodedValueReader.ENCODED_DOUBLE: { + double oldDouble = oldAnnoReader.readDouble(); + double newDouble = newAnnoReader.readDouble(); + return oldDouble == newDouble; + } + case EncodedValueReader.ENCODED_STRING: { + int oldStringIdx = oldAnnoReader.readString(); + int newStringIdx = newAnnoReader.readString(); + return isSameName(oldDex, newDex, oldStringIdx, newStringIdx); + } + case EncodedValueReader.ENCODED_TYPE: { + int oldTypeId = oldAnnoReader.readType(); + int newTypeId = newAnnoReader.readType(); + return isSameClassDesc(oldDex, newDex, oldTypeId, newTypeId); + } + case EncodedValueReader.ENCODED_FIELD: { + int oldFieldId = oldAnnoReader.readField(); + int newFieldId = newAnnoReader.readField(); + return isSameFieldId(oldDex, newDex, oldFieldId, newFieldId); + } + case EncodedValueReader.ENCODED_ENUM: { + int oldFieldId = oldAnnoReader.readEnum(); + int newFieldId = newAnnoReader.readEnum(); + return isSameFieldId(oldDex, newDex, oldFieldId, newFieldId); + } + case EncodedValueReader.ENCODED_METHOD: { + int oldMethodId = oldAnnoReader.readMethod(); + int newMethodId = newAnnoReader.readMethod(); + return isSameMethodId(oldDex, newDex, oldMethodId, newMethodId); + } + case EncodedValueReader.ENCODED_ARRAY: { + int oldArrSize = oldAnnoReader.readArray(); + int newArrSize = newAnnoReader.readArray(); + if (oldArrSize != newArrSize) { + return false; + } + for (int i = 0; i < oldArrSize; ++i) { + if (!isSameEncodedValue(oldDex, newDex, oldAnnoReader, newAnnoReader)) { + return false; + } + } + return true; + } + case EncodedValueReader.ENCODED_ANNOTATION: { + return isSameAnnotationByReader(oldDex, newDex, oldAnnoReader, newAnnoReader); + } + case EncodedValueReader.ENCODED_NULL: { + oldAnnoReader.readNull(); + newAnnoReader.readNull(); + return true; + } + case EncodedValueReader.ENCODED_BOOLEAN: { + boolean oldBool = oldAnnoReader.readBoolean(); + boolean newBool = newAnnoReader.readBoolean(); + return oldBool == newBool; + } + default: { + throw new IllegalStateException( + "Unexpected annotation value type: " + Integer.toHexString(oldAnnoItemType) + ); + } + } + } + + private boolean isSameClassData( + Dex oldDex, Dex newDex, int oldClassDataOffset, int newClassDataOffset + ) { + if (oldClassDataOffset == 0 && newClassDataOffset == 0) { + return true; + } + + if (oldClassDataOffset == 0 || newClassDataOffset == 0) { + return false; + } + + ClassData oldClassData = oldDex.openSection(oldClassDataOffset).readClassData(); + ClassData newClassData = newDex.openSection(newClassDataOffset).readClassData(); + + ClassData.Field[] oldInstanceFields = oldClassData.instanceFields; + ClassData.Field[] newInstanceFields = newClassData.instanceFields; + if (oldInstanceFields.length != newInstanceFields.length) { + return false; + } + for (int i = 0; i < oldInstanceFields.length; ++i) { + if (!isSameField(oldDex, newDex, oldInstanceFields[i], newInstanceFields[i])) { + return false; + } + } + + ClassData.Field[] oldStaticFields = oldClassData.staticFields; + ClassData.Field[] newStaticFields = newClassData.staticFields; + if (oldStaticFields.length != newStaticFields.length) { + return false; + } + for (int i = 0; i < oldStaticFields.length; ++i) { + if (!isSameField(oldDex, newDex, oldStaticFields[i], newStaticFields[i])) { + return false; + } + } + + ClassData.Method[] oldDirectMethods = oldClassData.directMethods; + ClassData.Method[] newDirectMethods = newClassData.directMethods; + if (oldDirectMethods.length != newDirectMethods.length) { + return false; + } + for (int i = 0; i < oldDirectMethods.length; ++i) { + if (!isSameMethod(oldDex, newDex, oldDirectMethods[i], newDirectMethods[i])) { + return false; + } + } + + ClassData.Method[] oldVirtualMethods = oldClassData.virtualMethods; + ClassData.Method[] newVirtualMethods = newClassData.virtualMethods; + if (oldVirtualMethods.length != newVirtualMethods.length) { + return false; + } + for (int i = 0; i < oldVirtualMethods.length; ++i) { + if (!isSameMethod(oldDex, newDex, oldVirtualMethods[i], newVirtualMethods[i])) { + return false; + } + } + + return true; + } + + private boolean isSameField( + Dex oldDex, Dex newDex, ClassData.Field oldField, ClassData.Field newField + ) { + if (oldField.accessFlags != newField.accessFlags) { + return false; + } + return isSameFieldId(oldDex, newDex, oldField.fieldIndex, newField.fieldIndex); + } + + private boolean isSameMethod( + Dex oldDex, Dex newDex, ClassData.Method oldMethod, ClassData.Method newMethod + ) { + if (oldMethod.accessFlags != newMethod.accessFlags) { + return false; + } + + if (!isSameMethodId(oldDex, newDex, oldMethod.methodIndex, newMethod.methodIndex)) { + return false; + } + + return isSameCode(oldDex, newDex, oldMethod.codeOffset, newMethod.codeOffset); + } + + private boolean isSameCode( + final Dex oldDex, final Dex newDex, int oldCodeOffset, int newCodeOffset + ) { + if (oldCodeOffset == 0 && newCodeOffset == 0) { + return true; + } + + if (oldCodeOffset == 0 || newCodeOffset == 0) { + return false; + } + + Code oldCode = oldDex.openSection(oldCodeOffset).readCode(); + Code newCode = newDex.openSection(newCodeOffset).readCode(); + + if (oldCode.registersSize != newCode.registersSize) { + return false; + } + + if (oldCode.insSize != newCode.insSize) { + return false; + } + + final InstructionComparator insnComparator = new InstructionComparator( + oldCode.instructions, + newCode.instructions + ) { + @Override + protected boolean compareString(int stringIndex1, int stringIndex2) { + return isSameName(oldDex, newDex, stringIndex1, stringIndex2); + } + + @Override + protected boolean compareType(int typeIndex1, int typeIndex2) { + return isSameClassDesc(oldDex, newDex, typeIndex1, typeIndex2); + } + + @Override + protected boolean compareField(int fieldIndex1, int fieldIndex2) { + return isSameFieldId(oldDex, newDex, fieldIndex1, fieldIndex2); + } + + @Override + protected boolean compareMethod(int methodIndex1, int methodIndex2) { + return isSameMethodId(oldDex, newDex, methodIndex1, methodIndex2); + } + }; + + if (!insnComparator.compare()) { + return false; + } + + if (!isSameDebugInfo( + oldDex, newDex, oldCode.debugInfoOffset, newCode.debugInfoOffset, insnComparator + )) { + return false; + } + + if (!isSameTries(oldDex, newDex, oldCode.tries, newCode.tries, insnComparator)) { + return false; + } + + return isSameCatchHandlers( + oldDex, newDex, oldCode.catchHandlers, newCode.catchHandlers, insnComparator + ); + } + + private boolean isSameDebugInfo( + Dex oldDex, + Dex newDex, + int oldDebugInfoOffset, + int newDebugInfoOffset, + InstructionComparator insnComparator + ) { + if (oldDebugInfoOffset == 0 && newDebugInfoOffset == 0) { + return true; + } + + if (oldDebugInfoOffset == 0 || newDebugInfoOffset == 0) { + return false; + } + + DebugInfoItem oldDebugInfoItem = + oldDex.openSection(oldDebugInfoOffset).readDebugInfoItem(); + DebugInfoItem newDebugInfoItem = + newDex.openSection(newDebugInfoOffset).readDebugInfoItem(); + + if (oldDebugInfoItem.lineStart != newDebugInfoItem.lineStart) { + return false; + } + + if (oldDebugInfoItem.parameterNames.length != newDebugInfoItem.parameterNames.length) { + return false; + } + + for (int i = 0; i < oldDebugInfoItem.parameterNames.length; ++i) { + int oldNameIdx = oldDebugInfoItem.parameterNames[i]; + int newNameIdx = newDebugInfoItem.parameterNames[i]; + if (!isSameName(oldDex, newDex, oldNameIdx, newNameIdx)) { + return false; + } + } + + DexDataBuffer oldDbgInfoBuffer = + new DexDataBuffer(ByteBuffer.wrap(oldDebugInfoItem.infoSTM)); + DexDataBuffer newDbgInfoBuffer = + new DexDataBuffer(ByteBuffer.wrap(newDebugInfoItem.infoSTM)); + + int oldLine = oldDebugInfoItem.lineStart; + int oldAddress = 0; + + int newLine = newDebugInfoItem.lineStart; + int newAddress = 0; + + while (oldDbgInfoBuffer.available() > 0 && newDbgInfoBuffer.available() > 0) { + int oldOpCode = oldDbgInfoBuffer.readUnsignedByte(); + int newOpCode = newDbgInfoBuffer.readUnsignedByte(); + + if (oldOpCode != newOpCode) { + if (oldOpCode < DBG_FIRST_SPECIAL || newOpCode < DBG_FIRST_SPECIAL) { + return false; + } + } + + int currOpCode = oldOpCode; + + switch (currOpCode) { + case DebugInfoItem.DBG_END_SEQUENCE: { + break; + } + case DebugInfoItem.DBG_ADVANCE_PC: { + int oldAddrDiff = oldDbgInfoBuffer.readUleb128(); + int newAddrDiff = newDbgInfoBuffer.readUleb128(); + oldAddress += oldAddrDiff; + newAddress += newAddrDiff; + if (!insnComparator.isSameInstruction(oldAddress, newAddress)) { + return false; + } + break; + } + case DebugInfoItem.DBG_ADVANCE_LINE: { + int oldLineDiff = oldDbgInfoBuffer.readSleb128(); + int newLineDiff = newDbgInfoBuffer.readSleb128(); + oldLine += oldLineDiff; + newLine += newLineDiff; + if (oldLine != newLine) { + return false; + } + break; + } + case DebugInfoItem.DBG_START_LOCAL: + case DebugInfoItem.DBG_START_LOCAL_EXTENDED: { + int oldRegisterNum = oldDbgInfoBuffer.readUleb128(); + int newRegisterNum = newDbgInfoBuffer.readUleb128(); + if (oldRegisterNum != newRegisterNum) { + return false; + } + + int oldNameIndex = oldDbgInfoBuffer.readUleb128p1(); + int newNameIndex = newDbgInfoBuffer.readUleb128p1(); + if (!isSameName(oldDex, newDex, oldNameIndex, newNameIndex)) { + return false; + } + + int oldTypeIndex = oldDbgInfoBuffer.readUleb128p1(); + int newTypeIndex = newDbgInfoBuffer.readUleb128p1(); + if (!isSameClassDesc(oldDex, newDex, oldTypeIndex, newTypeIndex)) { + return false; + } + + if (currOpCode == DebugInfoItem.DBG_START_LOCAL_EXTENDED) { + int oldSigIndex = oldDbgInfoBuffer.readUleb128p1(); + int newSigIndex = newDbgInfoBuffer.readUleb128p1(); + if (!isSameName(oldDex, newDex, oldSigIndex, newSigIndex)) { + return false; + } + } + break; + } + case DebugInfoItem.DBG_END_LOCAL: + case DebugInfoItem.DBG_RESTART_LOCAL: { + int oldRegisterNum = oldDbgInfoBuffer.readUleb128(); + int newRegisterNum = newDbgInfoBuffer.readUleb128(); + if (oldRegisterNum != newRegisterNum) { + return false; + } + + break; + } + case DebugInfoItem.DBG_SET_FILE: { + int oldNameIndex = oldDbgInfoBuffer.readUleb128p1(); + int newNameIndex = newDbgInfoBuffer.readUleb128p1(); + if (!isSameName(oldDex, newDex, oldNameIndex, newNameIndex)) { + return false; + } + + break; + } + case DebugInfoItem.DBG_SET_PROLOGUE_END: + case DebugInfoItem.DBG_SET_EPILOGUE_BEGIN: { + break; + } + default: { + int oldAdjustedOpcode = oldOpCode - DBG_FIRST_SPECIAL; + oldLine += DBG_LINE_BASE + (oldAdjustedOpcode % DBG_LINE_RANGE); + oldAddress += (oldAdjustedOpcode / DBG_LINE_RANGE); + + int newAdjustedOpcode = newOpCode - DBG_FIRST_SPECIAL; + newLine += DBG_LINE_BASE + (newAdjustedOpcode % DBG_LINE_RANGE); + newAddress += (newAdjustedOpcode / DBG_LINE_RANGE); + + if (oldLine != newLine) { + return false; + } + if (!insnComparator.isSameInstruction(oldAddress, newAddress)) { + return false; + } + break; + } + } + } + + if (oldDbgInfoBuffer.available() > 0 || newDbgInfoBuffer.available() > 0) { + return false; + } + + return true; + } + + private boolean isSameTries( + Dex oldDex, + Dex newDex, + Code.Try[] oldTries, + Code.Try[] newTries, + InstructionComparator insnComparator + ) { + if (oldTries.length != newTries.length) { + return false; + } + + for (int i = 0; i < oldTries.length; ++i) { + Code.Try oldTry = oldTries[i]; + Code.Try newTry = newTries[i]; + if (oldTry.instructionCount != newTry.instructionCount) { + return false; + } + if (oldTry.catchHandlerIndex != newTry.catchHandlerIndex) { + return false; + } + if (!insnComparator.isSameInstruction(oldTry.startAddress, newTry.startAddress)) { + return false; + } + } + + return true; + } + + private boolean isSameCatchHandlers( + Dex oldDex, + Dex newDex, + Code.CatchHandler[] oldCatchHandlers, + Code.CatchHandler[] newCatchHandlers, + InstructionComparator insnComparator + ) { + if (oldCatchHandlers.length != newCatchHandlers.length) { + return false; + } + + for (int i = 0; i < oldCatchHandlers.length; ++i) { + Code.CatchHandler oldCatchHandler = oldCatchHandlers[i]; + Code.CatchHandler newCatchHandler = newCatchHandlers[i]; + + int oldTypeAddrPairCount = oldCatchHandler.typeIndexes.length; + int newTypeAddrPairCount = newCatchHandler.typeIndexes.length; + if (oldTypeAddrPairCount != newTypeAddrPairCount) { + return false; + } + + if (oldCatchHandler.catchAllAddress != -1 && newCatchHandler.catchAllAddress != -1) { + return insnComparator.isSameInstruction( + oldCatchHandler.catchAllAddress, newCatchHandler.catchAllAddress + ); + } else { + if (!(oldCatchHandler.catchAllAddress == -1 && newCatchHandler.catchAllAddress == -1)) { + return false; + } + } + + for (int j = 0; j < oldTypeAddrPairCount; ++j) { + if (!isSameClassDesc( + oldDex, + newDex, + oldCatchHandler.typeIndexes[j], + newCatchHandler.typeIndexes[j] + )) { + return false; + } + + if (!insnComparator.isSameInstruction( + oldCatchHandler.addresses[j], newCatchHandler.addresses[j] + )) { + return false; + } + } + } + + return true; + } + + public static final class DexClassInfo { + public String classDesc = null; + public int classDefIndex = ClassDef.NO_INDEX; + public ClassDef classDef = null; + public Dex owner = null; + + private DexClassInfo(String classDesc, int classDefIndex, ClassDef classDef, Dex owner) { + this.classDesc = classDesc; + this.classDef = classDef; + this.classDefIndex = classDefIndex; + this.owner = owner; + } + + private DexClassInfo() { + throw new UnsupportedOperationException(); + } + + @Override + public String toString() { + return classDesc; + } + + @Override + public boolean equals(Object obj) { + DexClassInfo other = (DexClassInfo) obj; + if (!classDesc.equals(other.classDesc)) { + return false; + } + return owner.computeSignature(false).equals(other.owner.computeSignature(false)); + } + } + + public static final class DexGroup { + public final Dex[] dexes; + + private DexGroup(Dex... dexes) { + if (dexes == null || dexes.length == 0) { + throw new IllegalArgumentException("dexes is null or empty."); + } + this.dexes = new Dex[dexes.length]; + System.arraycopy(dexes, 0, this.dexes, 0, dexes.length); + } + + private DexGroup(File... dexFiles) throws IOException { + if (dexFiles == null || dexFiles.length == 0) { + throw new IllegalArgumentException("dexFiles is null or empty."); + } + this.dexes = new Dex[dexFiles.length]; + for (int i = 0; i < dexFiles.length; ++i) { + this.dexes[i] = new Dex(dexFiles[i]); + } + } + + private DexGroup(List dexFileList) throws IOException { + if (dexFileList == null || dexFileList.isEmpty()) { + throw new IllegalArgumentException("dexFileList is null or empty."); + } + this.dexes = new Dex[dexFileList.size()]; + for (int i = 0; i < this.dexes.length; ++i) { + this.dexes[i] = new Dex(dexFileList.get(i)); + } + } + + private DexGroup() { + throw new UnsupportedOperationException(); + } + + public static DexGroup wrap(Dex... dexes) { + return new DexGroup(dexes); + } + + public static DexGroup wrap(File... dexFiles) throws IOException { + return new DexGroup(dexFiles); + } + + public static DexGroup wrap(List dexFileList) throws IOException { + return new DexGroup(dexFileList); + } + + public Set getClassInfosInDexesWithDuplicateCheck() { + Map classDescToInfoMap = new HashMap<>(); + for (Dex dex : dexes) { + int classDefIndex = 0; + for (ClassDef classDef : dex.classDefs()) { + String classDesc = dex.typeNames().get(classDef.typeIndex); + if (!classDescToInfoMap.containsKey(classDesc)) { + classDescToInfoMap.put(classDesc, new DexClassInfo(classDesc, classDefIndex, classDef, dex)); + ++classDefIndex; + } else { + throw new IllegalStateException( + String.format( + "duplicate class descriptor [%s] in different dexes.", classDesc + ) + ); + } + } + } + return new HashSet<>(classDescToInfoMap.values()); + } + } +} + diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/ExcludedClassModifiedChecker.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/ExcludedClassModifiedChecker.java new file mode 100644 index 00000000..e87132ff --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/ExcludedClassModifiedChecker.java @@ -0,0 +1,209 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.DexFormat; +import com.tencent.tinker.build.dexpatcher.util.PatternUtils; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.build.util.DexClassesComparator.DexClassInfo; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * Created by tangyinsheng on 2016/4/14. + */ +public final class ExcludedClassModifiedChecker { + private static final int STMCODE_START = 0x00; + private static final int STMCODE_ERROR_PRIMARY_OLD_DEX_IS_MISSING = 0x01; + private static final int STMCODE_ERROR_PRIMARY_NEW_DEX_IS_MISSING = 0x02; + private static final int STMCODE_ERROR_LOADER_CLASS_NOT_IN_PRIMARY_OLD_DEX = 0x03; + private static final int STMCODE_ERROR_LOADER_CLASS_IN_PRIMARY_DEX_MISMATCH = 0x04; + private static final int STMCODE_ERROR_LOADER_CLASS_FOUND_IN_SECONDARY_OLD_DEX = 0x05; + private static final int STMCODE_ERROR_LOADER_CLASS_FOUND_IN_SECONDARY_NEW_DEX = 0x06; + private static final int STMCODE_ERROR_LOADER_CLASS_CHANGED = 0x07; + private static final int STMCODE_END = 0x08; + private final Configuration config; + private final DexClassesComparator dexCmptor; + private Dex oldDex = null; + private Dex newDex = null; + private List deletedClassInfos = null; + private List addedClassInfos = null; + private Map changedClassInfosMap = null; + private Set oldClassesDescToCheck = new HashSet<>(); + private Set newClassesDescToCheck = new HashSet<>(); + + public ExcludedClassModifiedChecker(Configuration config) { + this.config = config; + this.dexCmptor = new DexClassesComparator(config.mDexLoaderPattern); + } + + public void checkIfExcludedClassWasModifiedInNewDex(File oldFile, File newFile) throws IOException, TinkerPatchException { + if (oldFile == null && newFile == null) { + throw new TinkerPatchException("both oldFile and newFile are null."); + } + + oldDex = (oldFile != null ? new Dex(oldFile) : null); + newDex = (newFile != null ? new Dex(newFile) : null); + + int stmCode = STMCODE_START; + + while (stmCode != STMCODE_END) { + switch (stmCode) { + /** + * Check rule: + * Loader classes must only appear in primary dex and each of them in primary old dex should keep + * completely consistent in new primary dex. + * + * An error is announced when any of these conditions below is fit: + * 1. Primary old dex is missing. + * 2. Primary new dex is missing. + * 3. There are not any loader classes in primary old dex. + * 4. There are some new loader classes added in new primary dex. + * 5. Loader classes in old primary dex are modified, deleted in new primary dex. + * 6. Loader classes are found in secondary old dexes. + * 7. Loader classes are found in secondary new dexes. + */ + case STMCODE_START: { + boolean isPrimaryDex = isPrimaryDex((oldFile == null ? newFile : oldFile)); + + if (isPrimaryDex) { + if (oldFile == null) { + stmCode = STMCODE_ERROR_PRIMARY_OLD_DEX_IS_MISSING; + } else if (newFile == null) { + stmCode = STMCODE_ERROR_PRIMARY_NEW_DEX_IS_MISSING; + } else { + dexCmptor.startCheck(oldDex, newDex); + deletedClassInfos = dexCmptor.getDeletedClassInfos(); + addedClassInfos = dexCmptor.getAddedClassInfos(); + changedClassInfosMap = dexCmptor.getChangedClassDescToInfosMap(); + + // All loader classes are in new dex, while none of them in old one. + if (deletedClassInfos.isEmpty() && changedClassInfosMap.isEmpty() && !addedClassInfos.isEmpty()) { + stmCode = STMCODE_ERROR_LOADER_CLASS_NOT_IN_PRIMARY_OLD_DEX; + } else { + if (deletedClassInfos.isEmpty() && addedClassInfos.isEmpty()) { + // class descriptor is completely matches, see if any contents changes. + if (changedClassInfosMap.isEmpty()) { + stmCode = STMCODE_END; + } else { + stmCode = STMCODE_ERROR_LOADER_CLASS_CHANGED; + } + } else { + stmCode = STMCODE_ERROR_LOADER_CLASS_IN_PRIMARY_DEX_MISMATCH; + } + } + } + } else { + Set patternsOfClassDescToCheck = new HashSet<>(); + for (String patternStr : config.mDexLoaderPattern) { + patternsOfClassDescToCheck.add( + Pattern.compile( + PatternUtils.dotClassNamePatternToDescriptorRegEx(patternStr) + ) + ); + } + + if (oldDex != null) { + oldClassesDescToCheck.clear(); + for (ClassDef classDef : oldDex.classDefs()) { + String desc = oldDex.typeNames().get(classDef.typeIndex); + if (Utils.isStringMatchesPatterns(desc, patternsOfClassDescToCheck)) { + oldClassesDescToCheck.add(desc); + } + } + if (!oldClassesDescToCheck.isEmpty()) { + stmCode = STMCODE_ERROR_LOADER_CLASS_FOUND_IN_SECONDARY_OLD_DEX; + break; + } + } + + if (newDex != null) { + newClassesDescToCheck.clear(); + for (ClassDef classDef : newDex.classDefs()) { + String desc = newDex.typeNames().get(classDef.typeIndex); + if (Utils.isStringMatchesPatterns(desc, patternsOfClassDescToCheck)) { + newClassesDescToCheck.add(desc); + } + } + if (!newClassesDescToCheck.isEmpty()) { + stmCode = STMCODE_ERROR_LOADER_CLASS_FOUND_IN_SECONDARY_NEW_DEX; + break; + } + } + + stmCode = STMCODE_END; + } + break; + } + case STMCODE_ERROR_PRIMARY_OLD_DEX_IS_MISSING: { + throw new TinkerPatchException("old primary dex is missing."); + } + case STMCODE_ERROR_PRIMARY_NEW_DEX_IS_MISSING: { + throw new TinkerPatchException("new primary dex is missing."); + } + case STMCODE_ERROR_LOADER_CLASS_NOT_IN_PRIMARY_OLD_DEX: { + throw new TinkerPatchException("all loader classes don't appear in old primary dex."); + } + case STMCODE_ERROR_LOADER_CLASS_IN_PRIMARY_DEX_MISMATCH: { + throw new TinkerPatchException( + "loader classes in old primary dex are mismatched to those in new primary dex, \n" + + "if deleted classes is not empty, check if your dex division strategy is fine. \n" + + "added classes: " + Utils.collectionToString(addedClassInfos) + "\n" + + "deleted classes: " + Utils.collectionToString(deletedClassInfos) + ); + } + case STMCODE_ERROR_LOADER_CLASS_FOUND_IN_SECONDARY_OLD_DEX: { + throw new TinkerPatchException("loader classes are found in old secondary dex. Found classes: " + Utils.collectionToString(oldClassesDescToCheck)); + } + case STMCODE_ERROR_LOADER_CLASS_FOUND_IN_SECONDARY_NEW_DEX: { + throw new TinkerPatchException("loader classes are found in new secondary dex. Found classes: " + Utils.collectionToString(newClassesDescToCheck)); + } + case STMCODE_ERROR_LOADER_CLASS_CHANGED: { + String msg = + "some loader class has been changed in new dex." + + " Such these changes will not take effect!!" + + " related classes: " + + Utils.collectionToString(changedClassInfosMap.keySet()); + throw new TinkerPatchException(msg); + } + default: { + Logger.e("internal-error: unexpected stmCode."); + stmCode = STMCODE_END; + break; + } + } + } + } + + public boolean isPrimaryDex(File dexFile) { + Path dexFilePath = dexFile.toPath(); + Path parentPath = config.mTempUnzipOldDir.toPath(); + if (!dexFilePath.startsWith(parentPath)) { + parentPath = config.mTempUnzipNewDir.toPath(); + } + return DexFormat.DEX_IN_JAR_NAME.equals(parentPath.relativize(dexFilePath).toString().replace('\\', '/')); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/FileOperation.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/FileOperation.java new file mode 100644 index 00000000..62fa8630 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/FileOperation.java @@ -0,0 +1,401 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +import com.tencent.tinker.build.patch.Configuration; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.CRC32; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +public class FileOperation { + public static final boolean fileExists(String filePath) { + if (filePath == null) { + return false; + } + + File file = new File(filePath); + if (file.exists()) { + return true; + } + return false; + } + + public static final boolean deleteFile(String filePath) { + if (filePath == null) { + return true; + } + + File file = new File(filePath); + if (file.exists()) { + return file.delete(); + } + return true; + } + + public static final boolean deleteFile(File file) { + if (file == null) { + return true; + } + if (file.exists()) { + return file.delete(); + } + return true; + } + + public static boolean isLegalFile(String path) { + if (path == null) { + return false; + } + File file = new File(path); + return file.exists() && file.isFile() && file.length() > 0; + } + + public static long getFileSizes(File f) { + if (f == null) { + return 0; + } + long size = 0; + if (f.exists() && f.isFile()) { + FileInputStream fis = null; + try { + fis = new FileInputStream(f); + size = fis.available(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (fis != null) { + fis.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return size; + } + + public static final boolean deleteDir(File file) { + if (file == null || (!file.exists())) { + return false; + } + if (file.isFile()) { + file.delete(); + } else if (file.isDirectory()) { + File[] files = file.listFiles(); + for (int i = 0; i < files.length; i++) { + deleteDir(files[i]); + } + } + file.delete(); + return true; + } + + public static void cleanDir(File dir) { + if (dir.exists()) { + FileOperation.deleteDir(dir); + dir.mkdirs(); + } + } + + public static void copyResourceUsingStream(String name, File dest) throws IOException { + FileOutputStream os = null; + File parent = dest.getParentFile(); + if (parent != null && (!parent.exists())) { + parent.mkdirs(); + } + InputStream is = null; + + try { + is = FileOperation.class.getResourceAsStream("/" + name); + os = new FileOutputStream(dest, false); + + byte[] buffer = new byte[TypedValue.BUFFER_SIZE]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } finally { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } + } + + public static void copyFileUsingStream(File source, File dest) throws IOException { + FileInputStream is = null; + FileOutputStream os = null; + File parent = dest.getParentFile(); + if (parent != null && (!parent.exists())) { + parent.mkdirs(); + } + try { + is = new FileInputStream(source); + os = new FileOutputStream(dest, false); + + byte[] buffer = new byte[TypedValue.BUFFER_SIZE]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } finally { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } + } + + public static boolean checkDirectory(String dir) { + File dirObj = new File(dir); + deleteDir(dirObj); + + if (!dirObj.exists()) { + dirObj.mkdirs(); + } + return true; + } + + @SuppressWarnings("rawtypes") + public static void unZipAPk(String fileName, String filePath) throws IOException { + checkDirectory(filePath); + + ZipFile zipFile = new ZipFile(fileName); + Enumeration enumeration = zipFile.entries(); + try { + while (enumeration.hasMoreElements()) { + ZipEntry entry = (ZipEntry) enumeration.nextElement(); + if (entry.isDirectory()) { + new File(filePath, entry.getName()).mkdirs(); + continue; + } + BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry)); + + File file = new File(filePath + File.separator + entry.getName()); + + File parentFile = file.getParentFile(); + if (parentFile != null && (!parentFile.exists())) { + parentFile.mkdirs(); + } + FileOutputStream fos = null; + BufferedOutputStream bos = null; + try { + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos, TypedValue.BUFFER_SIZE); + + byte[] buf = new byte[TypedValue.BUFFER_SIZE]; + int len; + while ((len = bis.read(buf, 0, TypedValue.BUFFER_SIZE)) != -1) { + fos.write(buf, 0, len); + } + } finally { + if (bos != null) { + bos.flush(); + bos.close(); + } + if (bis != null) { + bis.close(); + } + } + } + } finally { + if (zipFile != null) { + zipFile.close(); + } + } + } + + /** + * zip list of file + * + * @param resFileList file(dir) list + * @param zipFile output zip file + * @throws IOException + */ + public static void zipFiles(Collection resFileList, File zipFile) throws IOException { + ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile), TypedValue.BUFFER_SIZE)); + for (File resFile : resFileList) { + if (resFile.exists()) { + zipFile(resFile, zipout, ""); + } + } + zipout.close(); + } + + private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath) throws IOException { + rootpath = rootpath + (rootpath.trim().length() == 0 ? "" : File.separator) + resFile.getName(); + if (resFile.isDirectory()) { + File[] fileList = resFile.listFiles(); + for (File file : fileList) { + zipFile(file, zipout, rootpath); + } + } else { + final byte[] fileContents = readContents(resFile); + //linux format!! + if (rootpath.contains("\\")) { + rootpath = rootpath.replace("\\", "/"); + } + ZipEntry entry = new ZipEntry(rootpath); +// if (compressMethod == ZipEntry.DEFLATED) { + entry.setMethod(ZipEntry.DEFLATED); +// } else { +// entry.setMethod(ZipEntry.STORED); +// entry.setSize(fileContents.length); +// final CRC32 checksumCalculator = new CRC32(); +// checksumCalculator.update(fileContents); +// entry.setCrc(checksumCalculator.getValue()); +// } + zipout.putNextEntry(entry); + zipout.write(fileContents); + zipout.flush(); + zipout.closeEntry(); + } + } + + private static byte[] readContents(final File file) throws IOException { + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + final int bufferSize = TypedValue.BUFFER_SIZE; + try { + final FileInputStream in = new FileInputStream(file); + final BufferedInputStream bIn = new BufferedInputStream(in); + int length; + byte[] buffer = new byte[bufferSize]; + byte[] bufferCopy; + while ((length = bIn.read(buffer, 0, bufferSize)) != -1) { + bufferCopy = new byte[length]; + System.arraycopy(buffer, 0, bufferCopy, 0, length); + output.write(bufferCopy); + } + bIn.close(); + } finally { + output.close(); + } + return output.toByteArray(); + } + + public static long getFileCrc32(File file) throws IOException { + InputStream inputStream = new FileInputStream(file); + CRC32 crc = new CRC32(); + int cnt; + while ((cnt = inputStream.read()) != -1) { + crc.update(cnt); + } + return crc.getValue(); + } + + public static String getZipEntryCrc(File file, String entryName) { + ZipFile zipFile = null; + try { + zipFile = new ZipFile(file); + ZipEntry entry = zipFile.getEntry(entryName); + if (entry == null) { + return null; + } + return String.valueOf(entry.getCrc()); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (zipFile != null) { + try { + zipFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + public static String getZipEntryMd5(File file, String entryName) { + ZipFile zipFile = null; + try { + zipFile = new ZipFile(file); + ZipEntry entry = zipFile.getEntry(entryName); + if (entry == null) { + return null; + } + return MD5.getMD5(zipFile.getInputStream(entry), 1024 * 100); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (zipFile != null) { + try { + zipFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + public static void zipInputDir(File inputDir, File outputFile) throws IOException { + File[] unzipFiles = inputDir.listFiles(); + List collectFiles = new ArrayList<>(); + for (File f : unzipFiles) { + collectFiles.add(f); + } + + FileOperation.zipFiles(collectFiles, outputFile); + } + + public static boolean sevenZipInputDir(File inputDir, File outputFile, Configuration config) { + String outPath = inputDir.getAbsolutePath(); + String path = outPath + File.separator + "*"; + String cmd = config.mSevenZipPath; + + ProcessBuilder pb = new ProcessBuilder(cmd, "a", "-tzip", outputFile.getAbsolutePath(), path, "-mx9"); + Process pro; + try { + pro = pb.start(); + InputStreamReader ir = new InputStreamReader(pro.getInputStream()); + LineNumberReader input = new LineNumberReader(ir); + while (input.readLine() != null) { + } + //destroy the stream + pro.waitFor(); + pro.destroy(); + } catch (IOException | InterruptedException e) { +// e.printStackTrace(); + FileOperation.deleteFile(outputFile); + Logger.e("7a patch file failed, you should set the zipArtifact, or set the path directly"); + return false; + } + return true; + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Logger.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Logger.java new file mode 100644 index 00000000..965b87c8 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Logger.java @@ -0,0 +1,71 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +import com.tencent.tinker.build.info.InfoWriter; +import com.tencent.tinker.build.patch.Configuration; + +import java.io.File; +import java.io.IOException; + +/** + * Created by zhangshaowen on 16/4/7. + */ +public class Logger { + private static InfoWriter logWriter; + + public static void initLogger(Configuration config) throws IOException { + String logPath = config.mOutFolder + File.separator + TypedValue.FILE_LOG; + logWriter = new InfoWriter(config, logPath); + } + + public static void closeLogger() { + logWriter.close(); + } + + public static void d(final String msg) { + Logger.d(msg, new Object[]{}); + } + + public static void d(final String format, final Object... obj) { + + String log = obj.length == 0 ? format : String.format(format, obj); + if (log == null) { + log = ""; + } + //add \n + System.out.printf(log + "\n"); + + logWriter.writeLineToInfoFile(log); + } + + public static void e(final String msg) { + Logger.e(msg, new Object[]{}); + } + + public static void e(final String format, final Object... obj) { + String log = obj.length == 0 ? format : String.format(format, obj); + if (log == null) { + log = ""; + } + //add \n + System.err.printf(log + "\n"); + logWriter.writeLineToInfoFile(log); + + } + +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/MD5.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/MD5.java new file mode 100644 index 00000000..a7106ec6 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/MD5.java @@ -0,0 +1,299 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; + +/** + *
    MD5 digest wrapper
    + *
    MD5计算封装
    + * + * @author zhaoyuan + */ +public final class MD5 { + + private MD5() { + + } + + /** + * get md5 string for input buffer + * + * @param buffer data to be calculated + * @return md5 result in string format + */ + public static String getMessageDigest(byte[] buffer) { + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(buffer); + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + return null; + } + } + + /** + * get md5 in byte array + * + * @param buffer data to be calculated + * @return md5 result in byte array format + */ + public static byte[] getRawDigest(byte[] buffer) { + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(buffer); + return mdTemp.digest(); + + } catch (Exception e) { + return null; + } + } + + /** + * Get the md5 for inputStream. + * This method cost less memory. It read bufLen bytes from the FileInputStream once. + * + * @param is + * @param bufLen bytes number read from the stream once. + * The less bufLen is the more times getMD5() method takes. Also the less bufLen is the less memory cost. + */ + public static String getMD5(final InputStream is, final int bufLen, final int offset, final int length) { + return getMD5ExtendBytes(is, bufLen, offset, length, null); + } + + /** + * Get the md5 for inputStream. + * This method cost less memory. It read bufLen bytes from the FileInputStream once. + * + * @param is + * @param bufLen + * @param offset + * @param length + * @param extendBytes extend bytes which would be add to the end of input stream for MD5 calculating + */ + public static String getMD5ExtendBytes(final InputStream is, final int bufLen, final int offset, final int length, final byte[] extendBytes) { + if (is == null || bufLen <= 0 || offset < 0 || length <= 0) { + return null; + } + try { + long skipLen = is.skip(offset); + if (skipLen < offset) { // reach the end + return null; + } + + MessageDigest md = MessageDigest.getInstance("MD5"); + StringBuilder md5Str = new StringBuilder(32); + + byte[] buf = new byte[bufLen]; + int readCount = 0; + int totalRead = 0; + while ((readCount = is.read(buf)) != -1 && totalRead < length) { + if (totalRead + readCount <= length) { + md.update(buf, 0, readCount); + totalRead += readCount; + + } else { + md.update(buf, 0, length - totalRead); + totalRead = length; + } + } + if (extendBytes != null && extendBytes.length > 0) { + md.update(extendBytes); + } + + byte[] hashValue = md.digest(); + + for (int i = 0; i < hashValue.length; i++) { + md5Str.append(Integer.toString((hashValue[i] & 0xff) + 0x100, 16).substring(1)); + } + return md5Str.toString(); + } catch (Exception e) { + return null; + } + } + + /** + * Get the md5 for inputStream. + * This method cost less memory. It read bufLen bytes from the FileInputStream once. + * + * @param is + * @param bufLen bytes number read from the stream once. + * The less bufLen is the more times getMD5() method takes. Also the less bufLen is the less memory cost. + */ + public static String getMD5(final InputStream is, final int bufLen) { + if (is == null || bufLen <= 0) { + return null; + } + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + StringBuilder md5Str = new StringBuilder(32); + + byte[] buf = new byte[bufLen]; + int readCount = 0; + while ((readCount = is.read(buf)) != -1) { + md.update(buf, 0, readCount); + } + + byte[] hashValue = md.digest(); + + for (int i = 0; i < hashValue.length; i++) { + md5Str.append(Integer.toString((hashValue[i] & 0xff) + 0x100, 16).substring(1)); + } + return md5Str.toString(); + } catch (Exception e) { + return null; + } + } + + /** + * Get the md5 for the file, using less memory. + */ + public static String getMD5(final String file) { + if (file == null) { + return null; + } + + File f = new File(file); + if (f.exists()) { + return getMD5(f, 1024 * 100); + } + return null; + } + + /** + * Get the md5 for the file, using less memory. + */ + public static String getMD5(final File file) { + return getMD5(file, 1024 * 100); + } + + /** + * Get the md5 for the file. call getMD5(FileInputStream is, int bufLen) inside. + * + * @param file + * @param bufLen bytes number read from the stream once. + * The less bufLen is the more times getMD5() method takes. Also the less bufLen cost less memory. + */ + public static String getMD5(final File file, final int bufLen) { + if (file == null || bufLen <= 0 || !file.exists()) { + return null; + } + + FileInputStream fin = null; + try { + fin = new FileInputStream(file); + String md5 = MD5.getMD5(fin, (int) (bufLen <= file.length() ? bufLen : file.length())); + fin.close(); + return md5; + + } catch (Exception e) { + return null; + + } finally { + try { + if (fin != null) { + fin.close(); + } + } catch (IOException e) { + + } + } + } + + /** + * Get the md5 for the file, using less memory. + */ + public static String getMD5(final String file, final int offset, final int length) { + if (file == null) { + return null; + } + + File f = new File(file); + if (f.exists()) { + return getMD5(f, offset, length); + } + return null; + } + + /** + * Get the md5 for the file, using less memory. + */ + public static String getMD5(final File file, final int offset, final int length) { + if (file == null || !file.exists() || offset < 0 || length <= 0) { + return null; + } + + FileInputStream fin = null; + try { + fin = new FileInputStream(file); + String md5 = MD5.getMD5(fin, 1024 * 100, offset, length); + fin.close(); + return md5; + + } catch (Exception e) { + return null; + + } finally { + try { + if (fin != null) { + fin.close(); + } + } catch (IOException e) { + + } + } + } + + public static String getMD5ExtendBytes(final File file, final int offset, final int length, byte[] extend) { + if (file == null || !file.exists() || offset < 0 || length <= 0) { + return null; + } + + FileInputStream fin = null; + try { + fin = new FileInputStream(file); + String md5 = MD5.getMD5ExtendBytes(fin, 1024 * 100, offset, length, extend); + fin.close(); + return md5; + + } catch (Exception e) { + return null; + + } finally { + try { + if (fin != null) { + fin.close(); + } + } catch (IOException e) { + } + } + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TinkerPatchException.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TinkerPatchException.java new file mode 100644 index 00000000..6fb6ca26 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TinkerPatchException.java @@ -0,0 +1,40 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + + +/** + * @author zhangshaowen + */ +public class TinkerPatchException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public TinkerPatchException() { + } + + public TinkerPatchException(String message) { + super(message); + } + + public TinkerPatchException(String message, Throwable cause) { + super(message, cause); + } + + public TinkerPatchException(Throwable cause) { + super(cause); + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TypedValue.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TypedValue.java new file mode 100644 index 00000000..8d815700 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/TypedValue.java @@ -0,0 +1,74 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +/** + * Container for a dynamically typed data value. Primarily used with + */ +public class TypedValue { + public static final int BUFFER_SIZE = 16384; + + public static final int K_BYTES = 1024; + + public static final String FILE_TXT = ".txt"; + public static final String FILE_XML = ".xml"; + public static final String FILE_APK = ".apk"; + public static final String FILE_CONFIG = "config.xml"; + public static final String FILE_LOG = "log.txt"; + public static final String SO_LOG_FILE = "so_log.txt"; + public static final String SO_META_FILE = "so_meta.txt"; + public static final String DEX_LOG_FILE = "dex_log.txt"; + public static final String DEX_META_FILE = "dex_meta.txt"; + public static final String DEX_TEMP_PATCH_DIR = "tempPatchedDexes"; + public static final String DEX_SMALLPATCH_INFO_FILE = "smallpatch_info.ddextra"; + public static final String RES_LOG_FILE = "res_log.txt"; + public static final String RES_META_TXT = "res_meta.txt"; + + public static final String FILE_ASSETS = "assets"; + + public static final String TINKER_ID = "TINKER_ID"; + public static final String NEW_TINKER_ID = "NEW_TINKER_ID"; + + public static final String PACKAGE_META_FILE = "package_meta.txt"; + + public static final String PATH_DEFAULT_OUTPUT = "tinkerPatch"; + + public static final String PATH_PATCH_FILES = "tinker_result"; + public static final String OUT_7ZIP_FILE_PATH = "out_7zip"; + + public static final int ANDROID_40_API_LEVEL = 14; + public static final double DEX_PATCH_MAX_RATIO = 0.6; + public static final double DEX_JAR_PATCH_MAX_RATIO = 1.0; + public static final double BSDIFF_PATCH_MAX_RATIO = 0.8; + + public static final String RES_ARSC = "resources.arsc"; + public static final String RES_MANIFEST = "AndroidManifest.xml"; + public static final String RES_OUT = "resources_out.zip"; + public static final String RES_OUT_7ZIP = "resources_out_7z.zip"; + public static final String RES_OUT_MD5_TAG = "%RES_OUT_MD5_TAG%"; + + public static final int ADD = 1; + public static final int MOD = 2; + public static final int DEL = 3; + public static final int LARGE_MOD = 4; + + public static final String ADD_TITLE = "add:"; + public static final String MOD_TITLE = "modify:"; + public static final String LARGE_MOD_TITLE = "large modify:"; + public static final String DEL_TITLE = "delete:"; + public static final String PATTERN_TITLE = "pattern:"; +} diff --git a/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Utils.java b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Utils.java new file mode 100644 index 00000000..bcc20917 --- /dev/null +++ b/tinker-build/tinker-patch-lib/src/main/java/com/tencent/tinker/build/util/Utils.java @@ -0,0 +1,213 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.build.util; + +import com.tencent.tinker.build.decoder.ResDiffDecoder; +import com.tencent.tinker.build.patch.Configuration; +import com.tencent.tinker.commons.resutil.ResUtil; +import com.tencent.tinker.commons.ziputil.TinkerZipEntry; +import com.tencent.tinker.commons.ziputil.TinkerZipFile; +import com.tencent.tinker.commons.ziputil.TinkerZipOutputStream; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.regex.Pattern; + +/** + * Created by sun on 1/9/16. + */ +public class Utils { + public static boolean isPresent(String str) { + return str != null && str.length() > 0; + } + + public static boolean isBlank(String str) { + return !isPresent(str); + } + + public static boolean isPresent(Iterator iterator) { + return iterator != null && iterator.hasNext(); + } + + public static boolean isBlank(Iterator iterator) { + return !isPresent(iterator); + } + + public static String convertToPatternString(String input) { + //convert \\. + if (input.contains(".")) { + input = input.replaceAll("\\.", "\\\\."); + } + //convert ?to . + if (input.contains("?")) { + input = input.replaceAll("\\?", "\\."); + } + //convert * to.* + if (input.contains("*")) { + input = input.replace("*", ".*"); + } + return input; + } + + public static boolean isStringMatchesPatterns(String str, Collection patterns) { + for (Pattern pattern : patterns) { + if (pattern.matcher(str).matches()) { + return true; + } + } + return false; + } + + public static String collectionToString(Collection collection) { + StringBuilder sb = new StringBuilder(); + sb.append('{'); + boolean isFirstElement = true; + for (T element : collection) { + if (isFirstElement) { + isFirstElement = false; + } else { + sb.append(','); + } + sb.append(element); + } + sb.append('}'); + return sb.toString(); + } + + public static boolean checkFileInPattern(HashSet patterns, String key) { + if (!patterns.isEmpty()) { + for (Iterator it = patterns.iterator(); it.hasNext();) { + Pattern p = it.next(); + if (p.matcher(key).matches()) { + return true; + } + } + } + return false; + } + + public static String genResOutputFile(File output, File newZipFile, Configuration config, + ArrayList addedSet, ArrayList modifiedSet, ArrayList deletedSet, + ArrayList largeModifiedSet, HashMap largeModifiedMap) throws IOException { + TinkerZipFile oldApk = new TinkerZipFile(config.mOldApkFile); + TinkerZipFile newApk = new TinkerZipFile(newZipFile); + TinkerZipOutputStream out = new TinkerZipOutputStream(new BufferedOutputStream(new FileOutputStream(output))); + + try { + final Enumeration entries = oldApk.entries(); + while (entries.hasMoreElements()) { + TinkerZipEntry zipEntry = entries.nextElement(); + if (zipEntry == null) { + throw new TinkerPatchException( + String.format("zipEntry is null when get from oldApk") + ); + } + String name = zipEntry.getName(); + if (Utils.checkFileInPattern(config.mResFilePattern, name)) { + //won't contain in add set. + if (!deletedSet.contains(name) + && !modifiedSet.contains(name) + && !largeModifiedSet.contains(name) + && !name.equals(TypedValue.RES_MANIFEST)) { + ResUtil.extractTinkerEntry(oldApk, zipEntry, out); + } + } + } + //process manifest + TinkerZipEntry manifestZipEntry = oldApk.getEntry(TypedValue.RES_MANIFEST); + if (manifestZipEntry == null) { + throw new TinkerPatchException( + String.format("can't found resource file %s from old apk file %s", TypedValue.RES_MANIFEST, config.mOldApkFile.getAbsolutePath()) + ); + } + ResUtil.extractTinkerEntry(oldApk, manifestZipEntry, out); + + for (String name : largeModifiedSet) { + TinkerZipEntry largeZipEntry = oldApk.getEntry(name); + if (largeZipEntry == null) { + throw new TinkerPatchException( + String.format("can't found resource file %s from old apk file %s", name, config.mOldApkFile.getAbsolutePath()) + ); + } + ResDiffDecoder.LargeModeInfo largeModeInfo = largeModifiedMap.get(name); + ResUtil.extractLargeModifyFile(largeZipEntry, largeModeInfo.path, largeModeInfo.crc, out); + } + + for (String name : addedSet) { + TinkerZipEntry addZipEntry = newApk.getEntry(name); + if (addZipEntry == null) { + throw new TinkerPatchException( + String.format("can't found add resource file %s from new apk file %s", name, config.mNewApkFile.getAbsolutePath()) + ); + } + ResUtil.extractTinkerEntry(newApk, addZipEntry, out); + } + + for (String name : modifiedSet) { + TinkerZipEntry modZipEntry = newApk.getEntry(name); + if (modZipEntry == null) { + throw new TinkerPatchException( + String.format("can't found add resource file %s from new apk file %s", name, config.mNewApkFile.getAbsolutePath()) + ); + } + ResUtil.extractTinkerEntry(newApk, modZipEntry, out); + } + } finally { + out.close(); + oldApk.close(); + newApk.close(); + } + return MD5.getMD5(output); + } + + public static String getResourceMeta(String baseCrc, String md5) { + return TypedValue.RES_OUT + "," + baseCrc + "," + md5; + } + + /** + * if bsDiff result is too larger, just treat it as newly file + * @param bsDiffFile + * @param newFile + * @return + */ + public static boolean checkBsDiffFileSize(File bsDiffFile, File newFile) { + if (!bsDiffFile.exists()) { + throw new TinkerPatchException("can not find the bsDiff file:" + bsDiffFile.getAbsolutePath()); + } + + //check bsDiffFile file size + double ratio = bsDiffFile.length() / (double) newFile.length(); + if (ratio > TypedValue.BSDIFF_PATCH_MAX_RATIO) { + Logger.e("bsDiff patch file:%s, size:%dk, new file:%s, size:%dk. patch file is too large, treat it as newly file to save patch time!", + bsDiffFile.getName(), + bsDiffFile.length() / 1024, + newFile.getName(), + newFile.length() / 1024 + ); + return false; + } + return true; + } +} diff --git a/tinker-build/tinker-patch-lib/src/main/resources/test.dex b/tinker-build/tinker-patch-lib/src/main/resources/test.dex new file mode 100644 index 0000000000000000000000000000000000000000..e620dcc3d2bbbc79f5c2eac70dcd1a106ea806e9 GIT binary patch literal 584 zcmZWnJxjw-6uoI`Q$%d5j$KV4LOu+NtMW6^A0&SoV z+yVChwu{zIfinP^S{%9b>w=Kj?cStMFbw0$wW&Ym4QC%C7PLj&;Ac>ig+>7^%{cGXK?r)F_FMsgo= y;s;NjctQ_2H&hyPdc&S3{;5;Y&_nJPXkn@}LOIJGkCdf%qPxEok|KSgOJW*Nz literal 0 HcmV?d00001 diff --git a/tinker-commons/.gitignore b/tinker-commons/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/tinker-commons/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tinker-commons/NOTICE.txt b/tinker-commons/NOTICE.txt new file mode 100644 index 00000000..a513af6c --- /dev/null +++ b/tinker-commons/NOTICE.txt @@ -0,0 +1,190 @@ + 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 + diff --git a/tinker-commons/build.gradle b/tinker-commons/build.gradle new file mode 100644 index 00000000..eb94594d --- /dev/null +++ b/tinker-commons/build.gradle @@ -0,0 +1,24 @@ +apply plugin: 'java' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile project(':third-party:aosp-dexutils') + compile project(':third-party:bsdiff-util') +} + +task buildSdk(type: Copy, dependsOn: [build]) { + from('build/libs') { + include '*.jar' + exclude '*javadoc.jar' + exclude '*-sources.jar' + } + into(rootProject.file("buildSdk/android")) +} + +apply from: rootProject.file('gradle/java-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') \ No newline at end of file diff --git a/tinker-commons/gradle.properties b/tinker-commons/gradle.properties new file mode 100644 index 00000000..2f2fe324 --- /dev/null +++ b/tinker-commons/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=tinker-commons +POM_NAME=Tinker Common libs +POM_PACKAGING=jar \ No newline at end of file diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatchApplier.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatchApplier.java new file mode 100644 index 00000000..0d37fdcb --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatchApplier.java @@ -0,0 +1,403 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.StringData; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.util.CompareUtils; +import com.tencent.tinker.android.dx.util.Hex; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.AnnotationSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.AnnotationSetRefListSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.AnnotationSetSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.AnnotationsDirectorySectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.ClassDataSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.ClassDefSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.CodeSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.DebugInfoItemSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.DexSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.FieldIdSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.MethodIdSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.ProtoIdSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.StaticValueSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.StringDataSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.TypeIdSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.algorithms.patch.TypeListSectionPatchAlgorithm; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +/** + * Created by tangyinsheng on 2016/6/30. + */ +public class DexPatchApplier { + private final Dex oldDex; + private final Dex patchedDex; + private final DexPatchFile patchFile; + private final SmallPatchedDexItemFile extraInfoFile; + private final IndexMap oldToFullPatchedIndexMap; + private final IndexMap patchedToSmallPatchedIndexMap; + + private final String oldDexSignStr; + + private DexSectionPatchAlgorithm stringDataSectionPatchAlg; + private DexSectionPatchAlgorithm typeIdSectionPatchAlg; + private DexSectionPatchAlgorithm protoIdSectionPatchAlg; + private DexSectionPatchAlgorithm fieldIdSectionPatchAlg; + private DexSectionPatchAlgorithm methodIdSectionPatchAlg; + private DexSectionPatchAlgorithm classDefSectionPatchAlg; + private DexSectionPatchAlgorithm typeListSectionPatchAlg; + private DexSectionPatchAlgorithm annotationSetRefListSectionPatchAlg; + private DexSectionPatchAlgorithm annotationSetSectionPatchAlg; + private DexSectionPatchAlgorithm classDataSectionPatchAlg; + private DexSectionPatchAlgorithm codeSectionPatchAlg; + private DexSectionPatchAlgorithm debugInfoSectionPatchAlg; + private DexSectionPatchAlgorithm annotationSectionPatchAlg; + private DexSectionPatchAlgorithm encodedArraySectionPatchAlg; + private DexSectionPatchAlgorithm annotationsDirectorySectionPatchAlg; + + public DexPatchApplier(File oldDexIn, File patchFileIn) throws IOException { + this( + new Dex(oldDexIn), + (patchFileIn != null ? new DexPatchFile(patchFileIn) : null), + null + ); + } + + public DexPatchApplier(InputStream oldDexIn, InputStream patchFileIn) throws IOException { + this( + new Dex(oldDexIn), + (patchFileIn != null ? new DexPatchFile(patchFileIn) : null), + null + ); + } + + public DexPatchApplier(InputStream oldDexIn, int initDexSize, InputStream patchFileIn) throws IOException { + this( + new Dex(oldDexIn, initDexSize), + (patchFileIn != null ? new DexPatchFile(patchFileIn) : null), + null + ); + } + + public DexPatchApplier( + File oldDexIn, + File patchFileIn, + SmallPatchedDexItemFile extraInfoFile + ) throws IOException { + this( + new Dex(oldDexIn), + (patchFileIn != null ? new DexPatchFile(patchFileIn) : null), + extraInfoFile + ); + } + + public DexPatchApplier( + InputStream oldDexIn, + InputStream patchFileIn, + SmallPatchedDexItemFile extraInfoFile + ) throws IOException { + this( + new Dex(oldDexIn), + (patchFileIn != null ? new DexPatchFile(patchFileIn) : null), + extraInfoFile + ); + } + + public DexPatchApplier( + InputStream oldDexIn, + int initDexSize, + InputStream patchFileIn, + SmallPatchedDexItemFile extraInfoFile + ) throws IOException { + this( + new Dex(oldDexIn, initDexSize), + (patchFileIn != null ? new DexPatchFile(patchFileIn) : null), + extraInfoFile + ); + } + + public DexPatchApplier( + Dex oldDexIn, + DexPatchFile patchFileIn, + SmallPatchedDexItemFile extraAddedDexElementsFile + ) { + this.oldDex = oldDexIn; + this.oldDexSignStr = Hex.toHexString(oldDexIn.computeSignature(false)); + this.patchFile = patchFileIn; + if (extraAddedDexElementsFile == null) { + this.patchedDex = new Dex(patchFileIn.getPatchedDexSize()); + } else { + this.patchedDex = new Dex( + extraAddedDexElementsFile.getPatchedDexSizeByOldDexSign(this.oldDexSignStr) + ); + } + this.oldToFullPatchedIndexMap = new IndexMap(); + this.patchedToSmallPatchedIndexMap = (extraAddedDexElementsFile != null ? new IndexMap() : null); + this.extraInfoFile = extraAddedDexElementsFile; + + if ((patchFileIn == null) && (extraAddedDexElementsFile == null + || extraAddedDexElementsFile.isAffectedOldDex(this.oldDexSignStr))) { + throw new UnsupportedOperationException( + "patchFileIn is null, and extraAddedDexElementFile" + + "(smallPatchInfo) is null or does not mention " + + "oldDexIn. Consider copy oldDexIn instead." + ); + } + } + + public void executeAndSaveTo(OutputStream out) throws IOException { + // Before executing, we should check if this patch can be applied to + // old dex we passed in. + byte[] oldDexSign = this.oldDex.computeSignature(false); + if (oldDexSign == null) { + throw new IOException("failed to compute old dex's signature."); + } + + byte[] oldDexSignInPatchFile = this.patchFile.getOldDexSignature(); + if (CompareUtils.uArrCompare(oldDexSign, oldDexSignInPatchFile) != 0) { + throw new IOException( + String.format( + "old dex signature mismatch! expected: %s, actual: %s", + Arrays.toString(oldDexSign), + Arrays.toString(oldDexSignInPatchFile) + ) + ); + } + + String oldDexSignStr = Hex.toHexString(oldDexSign); + + // Firstly, set sections' offset after patched, sort according to their offset so that + // the dex lib of aosp can calculate section size. + TableOfContents patchedToc = this.patchedDex.getTableOfContents(); + + patchedToc.header.off = 0; + patchedToc.header.size = 1; + patchedToc.mapList.size = 1; + + if (extraInfoFile == null || !extraInfoFile.isAffectedOldDex(this.oldDexSignStr)) { + patchedToc.stringIds.off + = this.patchFile.getPatchedStringIdSectionOffset(); + patchedToc.typeIds.off + = this.patchFile.getPatchedTypeIdSectionOffset(); + patchedToc.typeLists.off + = this.patchFile.getPatchedTypeListSectionOffset(); + patchedToc.protoIds.off + = this.patchFile.getPatchedProtoIdSectionOffset(); + patchedToc.fieldIds.off + = this.patchFile.getPatchedFieldIdSectionOffset(); + patchedToc.methodIds.off + = this.patchFile.getPatchedMethodIdSectionOffset(); + patchedToc.classDefs.off + = this.patchFile.getPatchedClassDefSectionOffset(); + patchedToc.mapList.off + = this.patchFile.getPatchedMapListSectionOffset(); + patchedToc.stringDatas.off + = this.patchFile.getPatchedStringDataSectionOffset(); + patchedToc.annotations.off + = this.patchFile.getPatchedAnnotationSectionOffset(); + patchedToc.annotationSets.off + = this.patchFile.getPatchedAnnotationSetSectionOffset(); + patchedToc.annotationSetRefLists.off + = this.patchFile.getPatchedAnnotationSetRefListSectionOffset(); + patchedToc.annotationsDirectories.off + = this.patchFile.getPatchedAnnotationsDirectorySectionOffset(); + patchedToc.encodedArrays.off + = this.patchFile.getPatchedEncodedArraySectionOffset(); + patchedToc.debugInfos.off + = this.patchFile.getPatchedDebugInfoSectionOffset(); + patchedToc.codes.off + = this.patchFile.getPatchedCodeSectionOffset(); + patchedToc.classDatas.off + = this.patchFile.getPatchedClassDataSectionOffset(); + patchedToc.fileSize + = this.patchFile.getPatchedDexSize(); + } else { + patchedToc.stringIds.off + = this.extraInfoFile.getPatchedStringIdOffsetByOldDexSign(oldDexSignStr); + patchedToc.typeIds.off + = this.extraInfoFile.getPatchedTypeIdOffsetByOldDexSign(oldDexSignStr); + patchedToc.typeLists.off + = this.extraInfoFile.getPatchedTypeListOffsetByOldDexSign(oldDexSignStr); + patchedToc.protoIds.off + = this.extraInfoFile.getPatchedProtoIdOffsetByOldDexSign(oldDexSignStr); + patchedToc.fieldIds.off + = this.extraInfoFile.getPatchedFieldIdOffsetByOldDexSign(oldDexSignStr); + patchedToc.methodIds.off + = this.extraInfoFile.getPatchedMethodIdOffsetByOldDexSign(oldDexSignStr); + patchedToc.classDefs.off + = this.extraInfoFile.getPatchedClassDefOffsetByOldDexSign(oldDexSignStr); + patchedToc.mapList.off + = this.extraInfoFile.getPatchedMapListOffsetByOldDexSign(oldDexSignStr); + patchedToc.stringDatas.off + = this.extraInfoFile.getPatchedStringDataOffsetByOldDexSign(oldDexSignStr); + patchedToc.annotations.off + = this.extraInfoFile.getPatchedAnnotationOffsetByOldDexSign(oldDexSignStr); + patchedToc.annotationSets.off + = this.extraInfoFile.getPatchedAnnotationSetOffsetByOldDexSign(oldDexSignStr); + patchedToc.annotationSetRefLists.off + = this.extraInfoFile.getPatchedAnnotationSetRefListOffsetByOldDexSign(oldDexSignStr); + patchedToc.annotationsDirectories.off + = this.extraInfoFile.getPatchedAnnotationsDirectoryOffsetByOldDexSign(oldDexSignStr); + patchedToc.encodedArrays.off + = this.extraInfoFile.getPatchedEncodedArrayOffsetByOldDexSign(oldDexSignStr); + patchedToc.debugInfos.off + = this.extraInfoFile.getPatchedDebugInfoOffsetByOldDexSign(oldDexSignStr); + patchedToc.codes.off + = this.extraInfoFile.getPatchedCodeOffsetByOldDexSign(oldDexSignStr); + patchedToc.classDatas.off + = this.extraInfoFile.getPatchedClassDataOffsetByOldDexSign(oldDexSignStr); + patchedToc.fileSize + = this.extraInfoFile.getPatchedDexSizeByOldDexSign(oldDexSignStr); + } + + Arrays.sort(patchedToc.sections); + + patchedToc.computeSizesFromOffsets(); + + // Secondly, run patch algorithms according to sections' dependencies. + this.stringDataSectionPatchAlg = new StringDataSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.typeIdSectionPatchAlg = new TypeIdSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.protoIdSectionPatchAlg = new ProtoIdSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.fieldIdSectionPatchAlg = new FieldIdSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.methodIdSectionPatchAlg = new MethodIdSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.classDefSectionPatchAlg = new ClassDefSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.typeListSectionPatchAlg = new TypeListSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.annotationSetRefListSectionPatchAlg = new AnnotationSetRefListSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.annotationSetSectionPatchAlg = new AnnotationSetSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.classDataSectionPatchAlg = new ClassDataSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.codeSectionPatchAlg = new CodeSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.debugInfoSectionPatchAlg = new DebugInfoItemSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.annotationSectionPatchAlg = new AnnotationSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.encodedArraySectionPatchAlg = new StaticValueSectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + this.annotationsDirectorySectionPatchAlg = new AnnotationsDirectorySectionPatchAlgorithm( + patchFile, oldDex, patchedDex, oldToFullPatchedIndexMap, + patchedToSmallPatchedIndexMap, extraInfoFile + ); + + this.stringDataSectionPatchAlg.execute(); + this.typeIdSectionPatchAlg.execute(); + this.typeListSectionPatchAlg.execute(); + this.protoIdSectionPatchAlg.execute(); + this.fieldIdSectionPatchAlg.execute(); + this.methodIdSectionPatchAlg.execute(); + Runtime.getRuntime().gc(); + this.annotationSectionPatchAlg.execute(); + this.annotationSetSectionPatchAlg.execute(); + this.annotationSetRefListSectionPatchAlg.execute(); + this.annotationsDirectorySectionPatchAlg.execute(); + Runtime.getRuntime().gc(); + this.debugInfoSectionPatchAlg.execute(); + this.codeSectionPatchAlg.execute(); + Runtime.getRuntime().gc(); + this.classDataSectionPatchAlg.execute(); + this.encodedArraySectionPatchAlg.execute(); + this.classDefSectionPatchAlg.execute(); + Runtime.getRuntime().gc(); + + // Thirdly, write header, mapList. Calculate and write patched dex's sign and checksum. + Dex.Section headerOut = this.patchedDex.openSection(patchedToc.header.off); + patchedToc.writeHeader(headerOut); + + Dex.Section mapListOut = this.patchedDex.openSection(patchedToc.mapList.off); + patchedToc.writeMap(mapListOut); + + this.patchedDex.writeHashes(); + + // Finally, write patched dex to file. + this.patchedDex.writeTo(out); + } + + public void executeAndSaveTo(File file) throws IOException { + OutputStream os = null; + try { + os = new BufferedOutputStream(new FileOutputStream(file)); + executeAndSaveTo(os); + } finally { + if (os != null) { + try { + os.close(); + } catch (Exception e) { + // ignored. + } + } + } + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatcherLogger.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatcherLogger.java new file mode 100644 index 00000000..3ee24910 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/DexPatcherLogger.java @@ -0,0 +1,61 @@ +package com.tencent.tinker.commons.dexpatcher; + +/** + * Created by tangyinsheng on 2016/9/18. + */ + +public final class DexPatcherLogger { + private IDexPatcherLogger loggerImpl = null; + + public void setLoggerImpl(IDexPatcherLogger dexPatcherLogger) { + this.loggerImpl = dexPatcherLogger; + } + + public void v(String tag, String fmt, Object... vals) { + if (this.loggerImpl != null) { + fmt = "[V][" + tag + "] " + fmt; + this.loggerImpl.v((vals == null || vals.length == 0) ? fmt : String.format(fmt, vals)); + } + } + + public void d(String tag, String fmt, Object... vals) { + if (this.loggerImpl != null) { + fmt = "[D][" + tag + "] " + fmt; + this.loggerImpl.d((vals == null || vals.length == 0) ? fmt : String.format(fmt, vals)); + } + } + + public void i(String tag, String fmt, Object... vals) { + if (this.loggerImpl != null) { + fmt = "[I][" + tag + "] " + fmt; + this.loggerImpl.i((vals == null || vals.length == 0) ? fmt : String.format(fmt, vals)); + } + } + + public void w(String tag, String fmt, Object... vals) { + if (this.loggerImpl != null) { + fmt = "[W][" + tag + "] " + fmt; + this.loggerImpl.w((vals == null || vals.length == 0) ? fmt : String.format(fmt, vals)); + } + } + + public void e(String tag, String fmt, Object... vals) { + if (this.loggerImpl != null) { + fmt = "[E][" + tag + "] " + fmt; + this.loggerImpl.e((vals == null || vals.length == 0) ? fmt : String.format(fmt, vals)); + } + } + + + public interface IDexPatcherLogger { + void v(String msg); + + void d(String msg); + + void i(String msg); + + void w(String msg); + + void e(String msg); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSectionPatchAlgorithm.java new file mode 100644 index 00000000..f6a32d6e --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Annotation; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class AnnotationSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedAnnotationTocSec = null; + private Dex.Section patchedAnnotationSec = null; + + public AnnotationSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isAnnotationInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public AnnotationSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedAnnotationTocSec = patchedDex.getTableOfContents().annotations; + this.patchedAnnotationSec = patchedDex.openSection(this.patchedAnnotationTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotations; + } + + @Override + protected Annotation nextItem(DexDataBuffer section) { + return section.readAnnotation(); + } + + @Override + protected int getItemSize(Annotation item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedAnnotationSectionOffset(); + } + + @Override + protected Annotation adjustItem(IndexMap indexMap, Annotation item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(Annotation patchedItem) { + ++this.patchedAnnotationTocSec.size; + return this.patchedAnnotationSec.writeAnnotation(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetRefListSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetRefListSectionPatchAlgorithm.java new file mode 100644 index 00000000..8b837f83 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetRefListSectionPatchAlgorithm.java @@ -0,0 +1,127 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.AnnotationSetRefList; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class AnnotationSetRefListSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedAnnotationSetRefListTocSec = null; + private Dex.Section patchedAnnotationSetRefListSec = null; + + public AnnotationSetRefListSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isAnnotationSetRefListInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public AnnotationSetRefListSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedAnnotationSetRefListTocSec + = patchedDex.getTableOfContents().annotationSetRefLists; + this.patchedAnnotationSetRefListSec + = patchedDex.openSection(this.patchedAnnotationSetRefListTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotationSetRefLists; + } + + @Override + protected AnnotationSetRefList nextItem(DexDataBuffer section) { + return section.readAnnotationSetRefList(); + } + + @Override + protected int getItemSize(AnnotationSetRefList item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedAnnotationSetRefListSectionOffset(); + } + + @Override + protected AnnotationSetRefList adjustItem(IndexMap indexMap, AnnotationSetRefList item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(AnnotationSetRefList patchedItem) { + ++this.patchedAnnotationSetRefListTocSec.size; + return this.patchedAnnotationSetRefListSec.writeAnnotationSetRefList(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationSetRefListOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationSetRefListDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetSectionPatchAlgorithm.java new file mode 100644 index 00000000..acbd8086 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationSetSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.AnnotationSet; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class AnnotationSetSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedAnnotationSetTocSec = null; + private Dex.Section patchedAnnotationSetSec = null; + + public AnnotationSetSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isAnnotationSetInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public AnnotationSetSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedAnnotationSetTocSec = patchedDex.getTableOfContents().annotationSets; + this.patchedAnnotationSetSec = patchedDex.openSection(this.patchedAnnotationSetTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotationSets; + } + + @Override + protected AnnotationSet nextItem(DexDataBuffer section) { + return section.readAnnotationSet(); + } + + @Override + protected int getItemSize(AnnotationSet item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedAnnotationSetSectionOffset(); + } + + @Override + protected AnnotationSet adjustItem(IndexMap indexMap, AnnotationSet item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(AnnotationSet patchedItem) { + ++this.patchedAnnotationSetTocSec.size; + return this.patchedAnnotationSetSec.writeAnnotationSet(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationSetOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationSetDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationsDirectorySectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationsDirectorySectionPatchAlgorithm.java new file mode 100644 index 00000000..d703ca7d --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/AnnotationsDirectorySectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.AnnotationsDirectory; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class AnnotationsDirectorySectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedAnnotationsDirectoryTocSec = null; + private Dex.Section patchedAnnotationsDirectorySec = null; + + public AnnotationsDirectorySectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isAnnotationsDirectoryInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public AnnotationsDirectorySectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedAnnotationsDirectoryTocSec = patchedDex.getTableOfContents().annotationsDirectories; + this.patchedAnnotationsDirectorySec = patchedDex.openSection(this.patchedAnnotationsDirectoryTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().annotationsDirectories; + } + + @Override + protected AnnotationsDirectory nextItem(DexDataBuffer section) { + return section.readAnnotationsDirectory(); + } + + @Override + protected int getItemSize(AnnotationsDirectory item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedAnnotationsDirectorySectionOffset(); + } + + @Override + protected AnnotationsDirectory adjustItem(IndexMap indexMap, AnnotationsDirectory item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(AnnotationsDirectory patchedItem) { + ++this.patchedAnnotationsDirectoryTocSec.size; + return this.patchedAnnotationsDirectorySec.writeAnnotationsDirectory(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapAnnotationsDirectoryOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markAnnotationsDirectoryDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDataSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDataSectionPatchAlgorithm.java new file mode 100644 index 00000000..0de65223 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDataSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.ClassData; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class ClassDataSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedClassDataTocSec = null; + private Dex.Section patchedClassDataSec = null; + + public ClassDataSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isClassDataInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public ClassDataSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedClassDataTocSec = patchedDex.getTableOfContents().classDatas; + this.patchedClassDataSec = patchedDex.openSection(this.patchedClassDataTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().classDatas; + } + + @Override + protected ClassData nextItem(DexDataBuffer section) { + return section.readClassData(); + } + + @Override + protected int getItemSize(ClassData item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedClassDataSectionOffset(); + } + + @Override + protected ClassData adjustItem(IndexMap indexMap, ClassData item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(ClassData patchedItem) { + ++this.patchedClassDataTocSec.size; + return this.patchedClassDataSec.writeClassData(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapClassDataOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markClassDataDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDefSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDefSectionPatchAlgorithm.java new file mode 100644 index 00000000..9000d65d --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ClassDefSectionPatchAlgorithm.java @@ -0,0 +1,114 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.ClassDef; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class ClassDefSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedClassDefTocSec = null; + private Dex.Section patchedClassDefSec = null; + + public ClassDefSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isClassDefInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public ClassDefSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedClassDefTocSec = patchedDex.getTableOfContents().classDefs; + this.patchedClassDefSec = patchedDex.openSection(this.patchedClassDefTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().classDefs; + } + + @Override + protected ClassDef nextItem(DexDataBuffer section) { + return section.readClassDef(); + } + + + @Override + protected int getItemSize(ClassDef item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedClassDefSectionOffset(); + } + + @Override + protected ClassDef adjustItem(IndexMap indexMap, ClassDef item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(ClassDef patchedItem) { + ++this.patchedClassDefTocSec.size; + return this.patchedClassDefSec.writeClassDef(patchedItem); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/CodeSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/CodeSectionPatchAlgorithm.java new file mode 100644 index 00000000..edea8a0f --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/CodeSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Code; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class CodeSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedCodeTocSec = null; + private Dex.Section patchedCodeSec = null; + + public CodeSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isCodeInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public CodeSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedCodeTocSec = patchedDex.getTableOfContents().codes; + this.patchedCodeSec = patchedDex.openSection(this.patchedCodeTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().codes; + } + + @Override + protected Code nextItem(DexDataBuffer section) { + return section.readCode(); + } + + @Override + protected int getItemSize(Code item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedCodeSectionOffset(); + } + + @Override + protected Code adjustItem(IndexMap indexMap, Code item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(Code patchedItem) { + ++this.patchedCodeTocSec.size; + return this.patchedCodeSec.writeCode(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapCodeOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markCodeDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DebugInfoItemSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DebugInfoItemSectionPatchAlgorithm.java new file mode 100644 index 00000000..000451ed --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DebugInfoItemSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.DebugInfoItem; +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class DebugInfoItemSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedDebugInfoItemTocSec = null; + private Dex.Section patchedDebugInfoItemSec = null; + + public DebugInfoItemSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isDebugInfoInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public DebugInfoItemSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedDebugInfoItemTocSec = patchedDex.getTableOfContents().debugInfos; + this.patchedDebugInfoItemSec = patchedDex.openSection(this.patchedDebugInfoItemTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().debugInfos; + } + + @Override + protected DebugInfoItem nextItem(DexDataBuffer section) { + return section.readDebugInfoItem(); + } + + @Override + protected int getItemSize(DebugInfoItem item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedDebugInfoSectionOffset(); + } + + @Override + protected DebugInfoItem adjustItem(IndexMap indexMap, DebugInfoItem item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(DebugInfoItem patchedItem) { + ++this.patchedDebugInfoItemTocSec.size; + return this.patchedDebugInfoItemSec.writeDebugInfoItem(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapDebugInfoItemOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markDebugInfoItemDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DexSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DexSectionPatchAlgorithm.java new file mode 100644 index 00000000..62b746f0 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/DexSectionPatchAlgorithm.java @@ -0,0 +1,436 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.Hex; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; + +import java.util.Arrays; + +/** + * Created by tangyinsheng on 2016/6/29. + */ +public abstract class DexSectionPatchAlgorithm> { + protected final DexPatchFile patchFile; + + protected final Dex oldDex; + + /** + * IndexMap for mapping old item to corresponding one in full patch. + */ + private final IndexMap oldToFullPatchedIndexMap; + + /** + * IndexMap for mapping item in full patch to corresponding one in small patch. + */ + private final IndexMap fullPatchedToSmallPatchedIndexMap; + + /** + * Signature string of dex we're processing. For extra info file usage. + */ + private final String oldDexSignStr; + private SmallPatchedDexItemChooser smallPatchedDexItemChooser = null; + + public DexSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap + ) { + this(patchFile, oldDex, oldToFullPatchedIndexMap, fullPatchedToSmallPatchedIndexMap, null); + } + + public DexSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser smallPatchedDexItemChooser + ) { + this.patchFile = patchFile; + this.oldDex = oldDex; + this.oldToFullPatchedIndexMap = oldToFullPatchedIndexMap; + this.fullPatchedToSmallPatchedIndexMap = fullPatchedToSmallPatchedIndexMap; + this.oldDexSignStr = Hex.toHexString(oldDex.computeSignature(false)); + this.smallPatchedDexItemChooser = smallPatchedDexItemChooser; + } + + /** + * Get {@code Section} in {@code TableOfContents}. + */ + protected abstract TableOfContents.Section getTocSection(Dex dex); + + /** + * Get next item in {@code section}. + */ + protected abstract T nextItem(DexDataBuffer section); + + /** + * Get size of {@code item}. + */ + protected abstract int getItemSize(T item); + + /** + * Adjust {@code item} using specific {@code indexMap} + */ + protected T adjustItem(IndexMap indexMap, T item) { + return item; + } + + /** + * Update index or offset mapping in {@code indexMap}. + */ + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + // Should override by subclass if needed. + } + + /** + * Mark deleted index or offset in {@code indexMap}. + */ + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + // Should override by subclass if needed. + } + + /** + * Judge if item on index {@code patchedIndex} should be kept in small dex. + */ + protected final boolean isPatchedItemInSmallPatchedDex(String oldDexSignStr, int patchedIndex) { + if (this.smallPatchedDexItemChooser != null) { + return this.smallPatchedDexItemChooser + .isPatchedItemInSmallPatchedDex(oldDexSignStr, patchedIndex); + } else { + return true; + } + } + + /** + * Return base offset of current section in full patched dex. + */ + protected abstract int getFullPatchSectionBase(); + + /** + * Output patched item. This method should be overrided by subclass + * so that patched item can be written to right place. + *

    + * Returns the offset where {@code patchedItem} is written. (Must be valid.) + */ + protected abstract int writePatchedItem(T patchedItem); + + private int[] readDeltaIndiciesOrOffsets(int count) { + int[] result = new int[count]; + int lastVal = 0; + for (int i = 0; i < count; ++i) { + int delta = patchFile.getBuffer().readSleb128(); + lastVal = lastVal + delta; + result[i] = lastVal; + } + return result; + } + + /** + * Adapter method for item's offset fetching, if an item is not + * inherited from {@code Item} (which means it is a simple item in dex section + * that doesn't need multiple members to describe), this method + * return {@code index} instead. + */ + private int getItemOffsetOrIndex(int index, T item) { + if (item instanceof TableOfContents.Section.Item) { + return ((TableOfContents.Section.Item) item).off; + } else { + return index; + } + } + + public void execute() { + int deletedItemCount; + int[] deletedIndices; + + int addedItemCount; + int[] addedIndices; + + int replacedItemCount; + int[] replacedIndices; + + if (patchFile != null) { + deletedItemCount = patchFile.getBuffer().readUleb128(); + deletedIndices = readDeltaIndiciesOrOffsets(deletedItemCount); + + addedItemCount = patchFile.getBuffer().readUleb128(); + addedIndices = readDeltaIndiciesOrOffsets(addedItemCount); + + replacedItemCount = patchFile.getBuffer().readUleb128(); + replacedIndices = readDeltaIndiciesOrOffsets(replacedItemCount); + } else { + deletedItemCount = 0; + deletedIndices = new int[deletedItemCount]; + + addedItemCount = 0; + addedIndices = new int[addedItemCount]; + + replacedItemCount = 0; + replacedIndices = new int[replacedItemCount]; + } + + TableOfContents.Section tocSec = getTocSection(this.oldDex); + Dex.Section oldSection = null; + + int oldItemCount = 0; + if (tocSec.exists()) { + oldSection = this.oldDex.openSection(tocSec); + oldItemCount = tocSec.size; + } + + // Now rest data are added and replaced items arranged in the order of + // added indices and replaced indices. + boolean genFullPatchDex = (fullPatchedToSmallPatchedIndexMap == null); + + if (genFullPatchDex) { + doFullPatch( + oldSection, oldItemCount, deletedIndices, addedIndices, replacedIndices + ); + } else { + doSmallPatch( + oldSection, oldItemCount, deletedIndices, addedIndices, replacedIndices + ); + } + } + + private void doFullPatch( + Dex.Section oldSection, + int oldItemCount, + int[] deletedIndices, + int[] addedIndices, + int[] replacedIndices + ) { + int deletedItemCount = deletedIndices.length; + int addedItemCount = addedIndices.length; + int replacedItemCount = replacedIndices.length; + int newItemCount = oldItemCount + addedItemCount - deletedItemCount; + + int deletedItemCounter = 0; + int addActionCursor = 0; + int replaceActionCursor = 0; + + int oldIndex = 0; + int patchedIndex = 0; + while (oldIndex < oldItemCount || patchedIndex < newItemCount) { + if (addActionCursor < addedItemCount && addedIndices[addActionCursor] == patchedIndex) { + T addedItem = nextItem(patchFile.getBuffer()); + int patchedOffset = writePatchedItem(addedItem); + ++addActionCursor; + ++patchedIndex; + } else + if (replaceActionCursor < replacedItemCount && replacedIndices[replaceActionCursor] == patchedIndex) { + T replacedItem = nextItem(patchFile.getBuffer()); + int patchedOffset = writePatchedItem(replacedItem); + ++replaceActionCursor; + ++patchedIndex; + } else + if (Arrays.binarySearch(deletedIndices, oldIndex) >= 0) { + T skippedOldItem = nextItem(oldSection); // skip old item. + ++oldIndex; + ++deletedItemCounter; + } else + if (Arrays.binarySearch(replacedIndices, oldIndex) >= 0) { + T skippedOldItem = nextItem(oldSection); // skip old item. + ++oldIndex; + } else + if (oldIndex < oldItemCount) { + T oldItem = adjustItem(this.oldToFullPatchedIndexMap, nextItem(oldSection)); + + int patchedOffset = writePatchedItem(oldItem); + + updateIndexOrOffset( + this.oldToFullPatchedIndexMap, + oldIndex, + getItemOffsetOrIndex(oldIndex, oldItem), + patchedIndex, + patchedOffset + ); + + ++oldIndex; + ++patchedIndex; + } + } + + if (addActionCursor != addedItemCount || deletedItemCounter != deletedItemCount + || replaceActionCursor != replacedItemCount + ) { + throw new IllegalStateException( + String.format( + "bad patch operation sequence. addCounter: %d, addCount: %d, " + + "delCounter: %d, delCount: %d, " + + "replaceCounter: %d, replaceCount:%d", + addActionCursor, + addedItemCount, + deletedItemCounter, + deletedItemCount, + replaceActionCursor, + replacedItemCount + ) + ); + } + } + + private void doSmallPatch( + Dex.Section oldSection, + int oldItemCount, + int[] deletedIndices, + int[] addedIndices, + int[] replacedIndices + ) { + int deletedItemCount = deletedIndices.length; + int addedItemCount = addedIndices.length; + int replacedItemCount = replacedIndices.length; + int newItemCount = oldItemCount + addedItemCount - deletedItemCount; + + int deletedItemCounter = 0; + int addActionCursor = 0; + int replaceActionCursor = 0; + + int oldIndex = 0; + int fullPatchedIndex = 0; + int fullPatchedOffset = getFullPatchSectionBase(); + int smallPatchedIndex = 0; + while (oldIndex < oldItemCount || fullPatchedIndex < newItemCount) { + if (addActionCursor < addedItemCount && addedIndices[addActionCursor] == fullPatchedIndex) { + T addedItem = nextItem(patchFile.getBuffer()); + ++addActionCursor; + + if (getTocSection(oldDex).isElementFourByteAligned) { + fullPatchedOffset = SizeOf.roundToTimesOfFour(fullPatchedOffset); + } + + if (isPatchedItemInSmallPatchedDex(this.oldDexSignStr, fullPatchedIndex)) { + T adjustedItem = adjustItem(fullPatchedToSmallPatchedIndexMap, addedItem); + int smallPatchedOffset = writePatchedItem(adjustedItem); + updateIndexOrOffset( + fullPatchedToSmallPatchedIndexMap, + fullPatchedIndex, + fullPatchedOffset, + smallPatchedIndex, + smallPatchedOffset + ); + ++smallPatchedIndex; + } + + ++fullPatchedIndex; + fullPatchedOffset += getItemSize(addedItem); + } else + if (replaceActionCursor < replacedItemCount && replacedIndices[replaceActionCursor] == fullPatchedIndex) { + T replacedItem = nextItem(patchFile.getBuffer()); + ++replaceActionCursor; + + if (getTocSection(oldDex).isElementFourByteAligned) { + fullPatchedOffset = SizeOf.roundToTimesOfFour(fullPatchedOffset); + } + + if (isPatchedItemInSmallPatchedDex(this.oldDexSignStr, fullPatchedIndex)) { + T adjustedItem = adjustItem(fullPatchedToSmallPatchedIndexMap, replacedItem); + int smallPatchedOffset = writePatchedItem(adjustedItem); + updateIndexOrOffset( + fullPatchedToSmallPatchedIndexMap, + fullPatchedIndex, + fullPatchedOffset, + smallPatchedIndex, + smallPatchedOffset + ); + ++smallPatchedIndex; + } + + ++fullPatchedIndex; + fullPatchedOffset += getItemSize(replacedItem); + } else + if (Arrays.binarySearch(deletedIndices, oldIndex) >= 0) { + T skippedOldItem = nextItem(oldSection); // skip old item. + ++oldIndex; + ++deletedItemCounter; + } else + if (Arrays.binarySearch(replacedIndices, oldIndex) >= 0) { + T skippedOldItem = nextItem(oldSection); // skip old item. + ++oldIndex; + } else + if (oldIndex < oldItemCount) { + T oldItem = nextItem(oldSection); + T oldItemInFullPatch = adjustItem(this.oldToFullPatchedIndexMap, oldItem); + + if (getTocSection(oldDex).isElementFourByteAligned) { + fullPatchedOffset = SizeOf.roundToTimesOfFour(fullPatchedOffset); + } + + if (isPatchedItemInSmallPatchedDex(this.oldDexSignStr, fullPatchedIndex)) { + T patchedItemInSmallPatch = adjustItem( + this.fullPatchedToSmallPatchedIndexMap, oldItemInFullPatch + ); + int smallPatchedOffset = writePatchedItem(patchedItemInSmallPatch); + updateIndexOrOffset( + fullPatchedToSmallPatchedIndexMap, + fullPatchedIndex, + fullPatchedOffset, + smallPatchedIndex, + smallPatchedOffset + ); + ++smallPatchedIndex; + } + + updateIndexOrOffset( + oldToFullPatchedIndexMap, + oldIndex, + getItemOffsetOrIndex(oldIndex, oldItem), + fullPatchedIndex, + fullPatchedOffset + ); + + ++fullPatchedIndex; + fullPatchedOffset += getItemSize(oldItemInFullPatch); + + ++oldIndex; + } + } + + if (addActionCursor != addedItemCount || deletedItemCounter != deletedItemCount + || replaceActionCursor != replacedItemCount + ) { + throw new IllegalStateException( + String.format( + "bad patch operation sequence. addCounter: %d, addCount: %d, " + + "delCounter: %d, delCount: %d, " + + "replaceCounter: %d, replaceCount:%d", + addActionCursor, + addedItemCount, + deletedItemCounter, + deletedItemCount, + replaceActionCursor, + replacedItemCount + ) + ); + } + } + + /** + * Indicates if an item in full patched dex with specific index + * should be kept in small patched dex of current old dex. + */ + public interface SmallPatchedDexItemChooser { + boolean isPatchedItemInSmallPatchedDex(String oldDexSign, int patchedItemIndex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/FieldIdSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/FieldIdSectionPatchAlgorithm.java new file mode 100644 index 00000000..16c9ece3 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/FieldIdSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.FieldId; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class FieldIdSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedFieldIdTocSec = null; + private Dex.Section patchedFieldIdSec = null; + + public FieldIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isFieldIdInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public FieldIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedFieldIdTocSec = patchedDex.getTableOfContents().fieldIds; + this.patchedFieldIdSec = patchedDex.openSection(this.patchedFieldIdTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().fieldIds; + } + + @Override + protected FieldId nextItem(DexDataBuffer section) { + return section.readFieldId(); + } + + @Override + protected int getItemSize(FieldId item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedFieldIdSectionOffset(); + } + + @Override + protected FieldId adjustItem(IndexMap indexMap, FieldId item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(FieldId patchedItem) { + ++this.patchedFieldIdTocSec.size; + return this.patchedFieldIdSec.writeFieldId(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapFieldIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markFieldIdDeleted(deletedIndex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/MethodIdSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/MethodIdSectionPatchAlgorithm.java new file mode 100644 index 00000000..ddff7cc9 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/MethodIdSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.MethodId; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class MethodIdSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedMethodIdTocSec = null; + private Dex.Section patchedMethodIdSec = null; + + public MethodIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isMethodIdInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public MethodIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedMethodIdTocSec = patchedDex.getTableOfContents().methodIds; + this.patchedMethodIdSec = patchedDex.openSection(this.patchedMethodIdTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().methodIds; + } + + @Override + protected MethodId nextItem(DexDataBuffer section) { + return section.readMethodId(); + } + + @Override + protected int getItemSize(MethodId item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedMethodIdSectionOffset(); + } + + @Override + protected MethodId adjustItem(IndexMap indexMap, MethodId item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(MethodId patchedItem) { + ++this.patchedMethodIdTocSec.size; + return this.patchedMethodIdSec.writeMethodId(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapMethodIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markMethodIdDeleted(deletedIndex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ProtoIdSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ProtoIdSectionPatchAlgorithm.java new file mode 100644 index 00000000..2e5e2d28 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/ProtoIdSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.ProtoId; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class ProtoIdSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedProtoIdTocSec = null; + private Dex.Section patchedProtoIdSec = null; + + public ProtoIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isProtoIdInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public ProtoIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedProtoIdTocSec = patchedDex.getTableOfContents().protoIds; + this.patchedProtoIdSec = patchedDex.openSection(this.patchedProtoIdTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().protoIds; + } + + @Override + protected ProtoId nextItem(DexDataBuffer section) { + return section.readProtoId(); + } + + @Override + protected int getItemSize(ProtoId item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedProtoIdSectionOffset(); + } + + @Override + protected ProtoId adjustItem(IndexMap indexMap, ProtoId item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(ProtoId patchedItem) { + ++this.patchedProtoIdTocSec.size; + return this.patchedProtoIdSec.writeProtoId(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapProtoIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markProtoIdDeleted(deletedIndex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StaticValueSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StaticValueSectionPatchAlgorithm.java new file mode 100644 index 00000000..6a25503b --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StaticValueSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.EncodedValue; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class StaticValueSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedEncodedValueTocSec = null; + private Dex.Section patchedEncodedValueSec = null; + + public StaticValueSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isEncodedArrayInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public StaticValueSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedEncodedValueTocSec = patchedDex.getTableOfContents().encodedArrays; + this.patchedEncodedValueSec = patchedDex.openSection(this.patchedEncodedValueTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().encodedArrays; + } + + @Override + protected EncodedValue nextItem(DexDataBuffer section) { + return section.readEncodedArray(); + } + + @Override + protected int getItemSize(EncodedValue item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedEncodedArraySectionOffset(); + } + + @Override + protected EncodedValue adjustItem(IndexMap indexMap, EncodedValue item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(EncodedValue patchedItem) { + ++this.patchedEncodedValueTocSec.size; + return this.patchedEncodedValueSec.writeEncodedArray(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapStaticValuesOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markStaticValuesDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StringDataSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StringDataSectionPatchAlgorithm.java new file mode 100644 index 00000000..44fc7411 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/StringDataSectionPatchAlgorithm.java @@ -0,0 +1,127 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.StringData; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class StringDataSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedStringDataTocSec = null; + private TableOfContents.Section patchedStringIdTocSec = null; + private Dex.Section patchedStringDataSec = null; + private Dex.Section patchedStringIdSec = null; + + public StringDataSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isStringInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public StringDataSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedStringDataTocSec = patchedDex.getTableOfContents().stringDatas; + this.patchedStringIdTocSec = patchedDex.getTableOfContents().stringIds; + this.patchedStringDataSec = patchedDex.openSection(this.patchedStringDataTocSec); + this.patchedStringIdSec = patchedDex.openSection(this.patchedStringIdTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().stringDatas; + } + + @Override + protected StringData nextItem(DexDataBuffer section) { + return section.readStringData(); + } + + @Override + protected int getItemSize(StringData item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedStringDataSectionOffset(); + } + + @Override + protected int writePatchedItem(StringData patchedItem) { + int off = this.patchedStringDataSec.writeStringData(patchedItem); + this.patchedStringIdSec.writeInt(off); + ++this.patchedStringDataTocSec.size; + ++this.patchedStringIdTocSec.size; + return off; + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapStringIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markStringIdDeleted(deletedIndex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeIdSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeIdSectionPatchAlgorithm.java new file mode 100644 index 00000000..5b590c2d --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeIdSectionPatchAlgorithm.java @@ -0,0 +1,127 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class TypeIdSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedTypeIdTocSec = null; + private Dex.Section patchedTypeIdSec = null; + + public TypeIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isTypeIdInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public TypeIdSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedTypeIdTocSec = patchedDex.getTableOfContents().typeIds; + this.patchedTypeIdSec = patchedDex.openSection(this.patchedTypeIdTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().typeIds; + } + + @Override + protected Integer nextItem(DexDataBuffer section) { + return section.readInt(); + } + + @Override + protected int getItemSize(Integer item) { + return SizeOf.UINT; + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedTypeIdSectionOffset(); + } + + @Override + protected Integer adjustItem(IndexMap indexMap, Integer item) { + return indexMap.adjustStringIndex(item); + } + + @Override + protected int writePatchedItem(Integer patchedItem) { + int off = this.patchedTypeIdSec.position(); + this.patchedTypeIdSec.writeInt(patchedItem); + ++this.patchedTypeIdTocSec.size; + return off; + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldIndex != newIndex) { + indexMap.mapTypeIds(oldIndex, newIndex); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markTypeIdDeleted(deletedIndex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeListSectionPatchAlgorithm.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeListSectionPatchAlgorithm.java new file mode 100644 index 00000000..8e3ad559 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/algorithms/patch/TypeListSectionPatchAlgorithm.java @@ -0,0 +1,125 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.algorithms.patch; + +import com.tencent.tinker.android.dex.Dex; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.TypeList; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dx.util.IndexMap; +import com.tencent.tinker.commons.dexpatcher.struct.DexPatchFile; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; + +/** + * Created by tangyinsheng on 2016/7/4. + */ +public class TypeListSectionPatchAlgorithm extends DexSectionPatchAlgorithm { + private TableOfContents.Section patchedTypeListTocSec = null; + private Dex.Section patchedTypeListSec = null; + + public TypeListSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + final SmallPatchedDexItemFile extraInfoFile + ) { + this( + patchFile, + oldDex, + patchedDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + new SmallPatchedDexItemChooser() { + @Override + public boolean isPatchedItemInSmallPatchedDex( + String oldDexSign, int patchedItemIndex + ) { + return extraInfoFile.isTypeListInSmallPatchedDex( + oldDexSign, patchedItemIndex + ); + } + } + ); + } + + public TypeListSectionPatchAlgorithm( + DexPatchFile patchFile, + Dex oldDex, + Dex patchedDex, + IndexMap oldToFullPatchedIndexMap, + IndexMap fullPatchedToSmallPatchedIndexMap, + SmallPatchedDexItemChooser spdItemChooser + ) { + super( + patchFile, + oldDex, + oldToFullPatchedIndexMap, + fullPatchedToSmallPatchedIndexMap, + spdItemChooser + ); + + if (patchedDex != null) { + this.patchedTypeListTocSec = patchedDex.getTableOfContents().typeLists; + this.patchedTypeListSec = patchedDex.openSection(this.patchedTypeListTocSec); + } + } + + @Override + protected TableOfContents.Section getTocSection(Dex dex) { + return dex.getTableOfContents().typeLists; + } + + @Override + protected TypeList nextItem(DexDataBuffer section) { + return section.readTypeList(); + } + + @Override + protected int getItemSize(TypeList item) { + return item.byteCountInDex(); + } + + @Override + protected int getFullPatchSectionBase() { + return this.patchFile.getPatchedTypeListSectionOffset(); + } + + @Override + protected TypeList adjustItem(IndexMap indexMap, TypeList item) { + return indexMap.adjust(item); + } + + @Override + protected int writePatchedItem(TypeList patchedItem) { + ++this.patchedTypeListTocSec.size; + return this.patchedTypeListSec.writeTypeList(patchedItem); + } + + @Override + protected void updateIndexOrOffset(IndexMap indexMap, int oldIndex, int oldOffset, int newIndex, int newOffset) { + if (oldOffset != newOffset) { + indexMap.mapTypeListOffset(oldOffset, newOffset); + } + } + + @Override + protected void markDeletedIndexOrOffset(IndexMap indexMap, int deletedIndex, int deletedOffset) { + indexMap.markTypeListDeleted(deletedOffset); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/DexPatchFile.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/DexPatchFile.java new file mode 100644 index 00000000..1cb356f4 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/DexPatchFile.java @@ -0,0 +1,302 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.struct; + +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.TableOfContents; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dex.util.CompareUtils; +import com.tencent.tinker.android.dex.util.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created by tangyinsheng on 2016/7/1. + */ +public final class DexPatchFile { + public static final byte[] MAGIC = {0x44, 0x58, 0x44, 0x49, 0x46, 0x46}; // DXDIFF + public static final short CURRENT_VERSION = 0x0002; + private final DexDataBuffer buffer; + private short version; + private int patchedDexSize; + private int firstChunkOffset; + private int patchedStringIdSectionOffset; + private int patchedTypeIdSectionOffset; + private int patchedProtoIdSectionOffset; + private int patchedFieldIdSectionOffset; + private int patchedMethodIdSectionOffset; + private int patchedClassDefSectionOffset; + private int patchedMapListSectionOffset; + private int patchedTypeListSectionOffset; + private int patchedAnnotationSetRefListSectionOffset; + private int patchedAnnotationSetSectionOffset; + private int patchedClassDataSectionOffset; + private int patchedCodeSectionOffset; + private int patchedStringDataSectionOffset; + private int patchedDebugInfoSectionOffset; + private int patchedAnnotationSectionOffset; + private int patchedEncodedArraySectionOffset; + private int patchedAnnotationsDirectorySectionOffset; + private byte[] oldDexSignature; + + public DexPatchFile(File file) throws IOException { + this.buffer = new DexDataBuffer(ByteBuffer.wrap(FileUtils.readFile(file))); + init(); + } + + public DexPatchFile(InputStream is) throws IOException { + this.buffer = new DexDataBuffer(ByteBuffer.wrap(FileUtils.readStream(is))); + init(); + } + + private void init() { + byte[] magic = this.buffer.readByteArray(MAGIC.length); + if (CompareUtils.uArrCompare(magic, MAGIC) != 0) { + throw new IllegalStateException("bad dex patch file magic: " + Arrays.toString(magic)); + } + + this.version = this.buffer.readShort(); + if (CompareUtils.uCompare(this.version, CURRENT_VERSION) != 0) { + throw new IllegalStateException("bad dex patch file version: " + this.version + ", expected: " + CURRENT_VERSION); + } + + this.patchedDexSize = this.buffer.readInt(); + this.firstChunkOffset = this.buffer.readInt(); + this.patchedStringIdSectionOffset = this.buffer.readInt(); + this.patchedTypeIdSectionOffset = this.buffer.readInt(); + this.patchedProtoIdSectionOffset = this.buffer.readInt(); + this.patchedFieldIdSectionOffset = this.buffer.readInt(); + this.patchedMethodIdSectionOffset = this.buffer.readInt(); + this.patchedClassDefSectionOffset = this.buffer.readInt(); + this.patchedMapListSectionOffset = this.buffer.readInt(); + this.patchedTypeListSectionOffset = this.buffer.readInt(); + this.patchedAnnotationSetRefListSectionOffset = this.buffer.readInt(); + this.patchedAnnotationSetSectionOffset = this.buffer.readInt(); + this.patchedClassDataSectionOffset = this.buffer.readInt(); + this.patchedCodeSectionOffset = this.buffer.readInt(); + this.patchedStringDataSectionOffset = this.buffer.readInt(); + this.patchedDebugInfoSectionOffset = this.buffer.readInt(); + this.patchedAnnotationSectionOffset = this.buffer.readInt(); + this.patchedEncodedArraySectionOffset = this.buffer.readInt(); + this.patchedAnnotationsDirectorySectionOffset = this.buffer.readInt(); + this.oldDexSignature = this.buffer.readByteArray(SizeOf.SIGNATURE); + + this.buffer.position(firstChunkOffset); + } + + private List readDeltaIndiciesOrOffsets(int count) { + List result = new ArrayList<>(count); + int lastVal = 0; + for (int i = 0; i < count; ++i) { + int delta = this.buffer.readSleb128(); + lastVal = lastVal + delta; + result.add(lastVal); + } + return result; + } + + private > void readChunkData( + int sectionType, Set deletedItemIndices, Map indexToNewItemMap + ) { + int deletedItemCount = this.buffer.readUleb128(); + List deletedIndices = readDeltaIndiciesOrOffsets(deletedItemCount); + deletedItemIndices.addAll(deletedIndices); + + int addedItemCount = this.buffer.readUleb128(); + List addedIndices = readDeltaIndiciesOrOffsets(addedItemCount); + + int replacedItemCount = this.buffer.readUleb128(); + List replacedIndices = readDeltaIndiciesOrOffsets(replacedItemCount); + + int addedIndexCursor = 0; + int replacedIndexCursor = 0; + + while (addedIndexCursor < addedItemCount || replacedIndexCursor < replacedItemCount) { + if (addedIndexCursor >= addedItemCount) { + // rest items are all replaced item. + while (replacedIndexCursor < replacedItemCount) { + T newItem = readItemBySectionType(sectionType); + indexToNewItemMap.put(replacedIndexCursor, newItem); + ++replacedIndexCursor; + } + } else + if (replacedIndexCursor >= replacedItemCount) { + // rest items are all added item. + while (addedIndexCursor < addedItemCount) { + T newItem = readItemBySectionType(sectionType); + indexToNewItemMap.put(addedIndexCursor, newItem); + ++addedIndexCursor; + } + } else { + T newItem = readItemBySectionType(sectionType); + if (addedIndexCursor <= replacedIndexCursor) { + indexToNewItemMap.put(addedIndexCursor, newItem); + ++addedIndexCursor; + } else { + indexToNewItemMap.put(replacedIndexCursor, newItem); + ++replacedIndexCursor; + } + } + } + } + + @SuppressWarnings("unchecked") + private > T readItemBySectionType(int sectionType) { + switch (sectionType) { + case TableOfContents.SECTION_TYPE_TYPEIDS: { + return (T) (Integer) this.buffer.readInt(); + } + case TableOfContents.SECTION_TYPE_PROTOIDS: { + return (T) this.buffer.readProtoId(); + } + case TableOfContents.SECTION_TYPE_FIELDIDS: { + return (T) this.buffer.readFieldId(); + } + case TableOfContents.SECTION_TYPE_METHODIDS: { + return (T) this.buffer.readMethodId(); + } + case TableOfContents.SECTION_TYPE_CLASSDEFS: { + return (T) this.buffer.readClassDef(); + } + case TableOfContents.SECTION_TYPE_STRINGDATAS: { + return (T) this.buffer.readStringData(); + } + case TableOfContents.SECTION_TYPE_TYPELISTS: { + return (T) this.buffer.readTypeList(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONS: { + return (T) this.buffer.readAnnotation(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETS: { + return (T) this.buffer.readAnnotationSet(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSETREFLISTS: { + return (T) this.buffer.readAnnotationSetRefList(); + } + case TableOfContents.SECTION_TYPE_ANNOTATIONSDIRECTORIES: { + return (T) this.buffer.readAnnotationsDirectory(); + } + case TableOfContents.SECTION_TYPE_DEBUGINFOS: { + return (T) this.buffer.readDebugInfoItem(); + } + case TableOfContents.SECTION_TYPE_CODES: { + return (T) this.buffer.readCode(); + } + case TableOfContents.SECTION_TYPE_CLASSDATA: { + return (T) this.buffer.readClassData(); + } + case TableOfContents.SECTION_TYPE_ENCODEDARRAYS: { + return (T) this.buffer.readEncodedArray(); + } + default: { + return null; + } + } + } + + public short getVersion() { + return version; + } + + public byte[] getOldDexSignature() { + return this.oldDexSignature; + } + + public int getPatchedDexSize() { + return patchedDexSize; + } + + public int getPatchedStringIdSectionOffset() { + return patchedStringIdSectionOffset; + } + + public int getPatchedTypeIdSectionOffset() { + return patchedTypeIdSectionOffset; + } + + public int getPatchedProtoIdSectionOffset() { + return patchedProtoIdSectionOffset; + } + + public int getPatchedFieldIdSectionOffset() { + return patchedFieldIdSectionOffset; + } + + public int getPatchedMethodIdSectionOffset() { + return patchedMethodIdSectionOffset; + } + + public int getPatchedClassDefSectionOffset() { + return patchedClassDefSectionOffset; + } + + public int getPatchedMapListSectionOffset() { + return patchedMapListSectionOffset; + } + + public int getPatchedTypeListSectionOffset() { + return patchedTypeListSectionOffset; + } + + public int getPatchedAnnotationSetRefListSectionOffset() { + return patchedAnnotationSetRefListSectionOffset; + } + + public int getPatchedAnnotationSetSectionOffset() { + return patchedAnnotationSetSectionOffset; + } + + public int getPatchedClassDataSectionOffset() { + return patchedClassDataSectionOffset; + } + + public int getPatchedCodeSectionOffset() { + return patchedCodeSectionOffset; + } + + public int getPatchedStringDataSectionOffset() { + return patchedStringDataSectionOffset; + } + + public int getPatchedDebugInfoSectionOffset() { + return patchedDebugInfoSectionOffset; + } + + public int getPatchedAnnotationSectionOffset() { + return patchedAnnotationSectionOffset; + } + + public int getPatchedEncodedArraySectionOffset() { + return patchedEncodedArraySectionOffset; + } + + public int getPatchedAnnotationsDirectorySectionOffset() { + return patchedAnnotationsDirectorySectionOffset; + } + + public DexDataBuffer getBuffer() { + return buffer; + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/PatchOperation.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/PatchOperation.java new file mode 100644 index 00000000..0f129d9f --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/PatchOperation.java @@ -0,0 +1,63 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.struct; + +/** + * Created by tangyinsheng on 2016/6/29. + */ +public final class PatchOperation { + public static final int OP_DEL = 0; + public static final int OP_ADD = 1; + public static final int OP_REPLACE = 2; + + public int op; + public int index; + public T newItem; + + public PatchOperation(int op, int index) { + this(op, index, null); + } + + public PatchOperation(int op, int index, T newItem) { + this.op = op; + this.index = index; + this.newItem = newItem; + } + + public static String translateOpToString(int op) { + switch (op) { + case OP_DEL: + return "OP_DEL"; + case OP_ADD: + return "OP_ADD"; + case OP_REPLACE: + return "OP_REPLACE"; + default: + return "OP_UNKNOWN"; + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + String opDesc = translateOpToString(op); + sb.append('{'); + sb.append("op: ").append(opDesc).append(", index: ").append(index).append(", newItem: ").append(newItem); + sb.append('}'); + return sb.toString(); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/SmallPatchedDexItemFile.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/SmallPatchedDexItemFile.java new file mode 100644 index 00000000..fc517591 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/struct/SmallPatchedDexItemFile.java @@ -0,0 +1,412 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.dexpatcher.struct; + +import com.tencent.tinker.android.dex.SizeOf; +import com.tencent.tinker.android.dex.io.DexDataBuffer; +import com.tencent.tinker.android.dex.util.CompareUtils; +import com.tencent.tinker.android.dex.util.FileUtils; +import com.tencent.tinker.android.dx.util.Hex; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created by tangyinsheng on 2016/8/10. + */ +public final class SmallPatchedDexItemFile { + public static final byte[] MAGIC = {0x44, 0x44, 0x45, 0x58, 0x54, 0x52, 0x41}; // DDEXTRA + public static final short CURRENT_VERSION = 0x0001; + private final List oldDexSigns = new ArrayList<>(); + private final Map + oldDexSignToPatchedStringIdOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedTypeIdOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedProtoIdOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedFieldIdOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedMethodIdOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedClassDefOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedMapListOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedTypeListOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedAnnotationSetRefListOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedAnnotationSetOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedClassDataOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedCodeOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedStringDataOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedDebugInfoOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedAnnotationOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedEncodedArrayOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedAnnotationsDirectoryOffsetMap = new HashMap<>(); + private final Map + oldDexSignToPatchedDexSizeMap = new HashMap<>(); + private final Map> + oldDexSignToStringIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToTypeIdIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToTypeListIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToProtoIdIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToFieldIdIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToMethodIdIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToAnnotationIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToAnnotationSetIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToAnnotationSetRefListIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToAnnotationsDirectoryIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToEncodedArrayIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToDebugInfoIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToCodeIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToClassDataIndicesInSmallPatch = new HashMap<>(); + private final Map> + oldDexSignToClassDefIndicesInSmallPatch = new HashMap<>(); + private int version; + private int firstChunkOffset; + + public SmallPatchedDexItemFile(File input) throws IOException { + DexDataBuffer buffer = new DexDataBuffer(ByteBuffer.wrap(FileUtils.readFile(input))); + init(buffer); + } + + public SmallPatchedDexItemFile(InputStream is) throws IOException { + DexDataBuffer buffer = new DexDataBuffer(ByteBuffer.wrap(FileUtils.readStream(is))); + init(buffer); + } + + private void init(DexDataBuffer buffer) throws IOException { + byte[] magic = buffer.readByteArray(MAGIC.length); + if (CompareUtils.uArrCompare(magic, MAGIC) != 0) { + throw new IllegalStateException( + "bad dexdiff extra file magic: " + Arrays.toString(magic) + ); + } + this.version = buffer.readShort(); + if (this.version != CURRENT_VERSION) { + throw new IllegalStateException( + "bad dexdiff extra file version: " + this.version + ", expected: " + CURRENT_VERSION + ); + } + + this.firstChunkOffset = buffer.readInt(); + buffer.position(this.firstChunkOffset); + + int oldDexSignCount = buffer.readUleb128(); + for (int i = 0; i < oldDexSignCount; ++i) { + byte[] oldDexSign = buffer.readByteArray(SizeOf.SIGNATURE); + oldDexSigns.add(Hex.toHexString(oldDexSign)); + } + + for (int i = 0; i < oldDexSignCount; ++i) { + final String oldDexSign = oldDexSigns.get(i); + oldDexSignToPatchedStringIdOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedTypeIdOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedProtoIdOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedFieldIdOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedMethodIdOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedClassDefOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedStringDataOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedTypeListOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedAnnotationOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedAnnotationSetOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedAnnotationSetRefListOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedAnnotationsDirectoryOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedDebugInfoOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedCodeOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedClassDataOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedEncodedArrayOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedMapListOffsetMap.put(oldDexSign, buffer.readInt()); + oldDexSignToPatchedDexSizeMap.put(oldDexSign, buffer.readInt()); + } + + readDataChunk(buffer, oldDexSignToStringIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToTypeIdIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToTypeListIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToProtoIdIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToFieldIdIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToMethodIdIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToAnnotationIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToAnnotationSetIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToAnnotationSetRefListIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToAnnotationsDirectoryIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToEncodedArrayIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToDebugInfoIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToCodeIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToClassDataIndicesInSmallPatch); + readDataChunk(buffer, oldDexSignToClassDefIndicesInSmallPatch); + } + + private void readDataChunk( + DexDataBuffer buffer, Map> oldDexSignToIndicesInSmallPatchMap + ) { + int oldDexSignCount = oldDexSigns.size(); + for (int i = 0; i < oldDexSignCount; ++i) { + int itemCount = buffer.readUleb128(); + int prevIndex = 0; + for (int j = 0; j < itemCount; ++j) { + int indexDelta = buffer.readSleb128(); + prevIndex += indexDelta; + + final String oldDexSign = oldDexSigns.get(i); + Set indices = oldDexSignToIndicesInSmallPatchMap.get(oldDexSign); + if (indices == null) { + indices = new HashSet<>(); + oldDexSignToIndicesInSmallPatchMap.put(oldDexSign, indices); + } + + indices.add(prevIndex); + } + } + } + + public boolean isAffectedOldDex(String oldDexSign) { + return this.oldDexSigns.contains(oldDexSign); + } + + public boolean isSmallPatchedDexEmpty(String oldDexSign) { + Set indices = this.oldDexSignToClassDefIndicesInSmallPatch.get(oldDexSign); + return (indices == null || indices.isEmpty()); + } + + public int getPatchedStringIdOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedStringIdOffsetMap.get(oldDexSign); + } + + public int getPatchedTypeIdOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedTypeIdOffsetMap.get(oldDexSign); + } + + public int getPatchedProtoIdOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedProtoIdOffsetMap.get(oldDexSign); + } + + public int getPatchedFieldIdOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedFieldIdOffsetMap.get(oldDexSign); + } + + public int getPatchedMethodIdOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedMethodIdOffsetMap.get(oldDexSign); + } + + public int getPatchedClassDefOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedClassDefOffsetMap.get(oldDexSign); + } + + public int getPatchedMapListOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedMapListOffsetMap.get(oldDexSign); + } + + public int getPatchedTypeListOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedTypeListOffsetMap.get(oldDexSign); + } + + public int getPatchedAnnotationSetRefListOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedAnnotationSetRefListOffsetMap.get(oldDexSign); + } + + public int getPatchedAnnotationSetOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedAnnotationSetOffsetMap.get(oldDexSign); + } + + public int getPatchedClassDataOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedClassDataOffsetMap.get(oldDexSign); + } + + public int getPatchedCodeOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedCodeOffsetMap.get(oldDexSign); + } + + public int getPatchedStringDataOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedStringDataOffsetMap.get(oldDexSign); + } + + public int getPatchedDebugInfoOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedDebugInfoOffsetMap.get(oldDexSign); + } + + public int getPatchedAnnotationOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedAnnotationOffsetMap.get(oldDexSign); + } + + public int getPatchedEncodedArrayOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedEncodedArrayOffsetMap.get(oldDexSign); + } + + public int getPatchedAnnotationsDirectoryOffsetByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedAnnotationsDirectoryOffsetMap.get(oldDexSign); + } + + public int getPatchedDexSizeByOldDexSign(String oldDexSign) { + return this.oldDexSignToPatchedDexSizeMap.get(oldDexSign); + } + + public boolean isStringInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToStringIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isTypeIdInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToTypeIdIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isTypeListInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToTypeListIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isProtoIdInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToProtoIdIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isFieldIdInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToFieldIdIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isMethodIdInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToMethodIdIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isAnnotationInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToAnnotationIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isAnnotationSetInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToAnnotationSetIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isAnnotationSetRefListInSmallPatchedDex( + String oldDexSign, int indexInPatchedDex + ) { + Set indices = oldDexSignToAnnotationSetRefListIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isAnnotationsDirectoryInSmallPatchedDex( + String oldDexSign, int indexInPatchedDex + ) { + Set indices = oldDexSignToAnnotationsDirectoryIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isEncodedArrayInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToEncodedArrayIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isDebugInfoInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToDebugInfoIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isCodeInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToCodeIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isClassDataInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToClassDataIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } + + public boolean isClassDefInSmallPatchedDex(String oldDexSign, int indexInPatchedDex) { + Set indices = oldDexSignToClassDefIndicesInSmallPatch.get(oldDexSign); + if (indices == null) { + return false; + } + return indices.contains(indexInPatchedDex); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/resutil/ResUtil.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/resutil/ResUtil.java new file mode 100644 index 00000000..b9780090 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/resutil/ResUtil.java @@ -0,0 +1,75 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.commons.resutil; + +import com.tencent.tinker.commons.ziputil.TinkerZipEntry; +import com.tencent.tinker.commons.ziputil.TinkerZipFile; +import com.tencent.tinker.commons.ziputil.TinkerZipOutputStream; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by zhangshaowen on 16/8/10. + */ +public class ResUtil { + private static final int BUFFER_SIZE = 16384; + + public static void extractTinkerEntry(TinkerZipFile apk, TinkerZipEntry zipEntry, TinkerZipOutputStream outputStream) throws IOException { + InputStream in = null; + try { + in = apk.getInputStream(zipEntry); + outputStream.putNextEntry(new TinkerZipEntry(zipEntry)); + byte[] buffer = new byte[BUFFER_SIZE]; + + for (int length = in.read(buffer); length != -1; length = in.read(buffer)) { + outputStream.write(buffer, 0, length); + } + outputStream.closeEntry(); + } finally { + if (in != null) { + in.close(); + } + } + } + + public static void extractLargeModifyFile(TinkerZipEntry sourceArscEntry, File newFile, long newFileCrc, TinkerZipOutputStream outputStream) throws IOException { + TinkerZipEntry newArscZipEntry = new TinkerZipEntry(sourceArscEntry); + + newArscZipEntry.setMethod(TinkerZipEntry.STORED); + newArscZipEntry.setSize(newFile.length()); + newArscZipEntry.setCompressedSize(newFile.length()); + newArscZipEntry.setCrc(newFileCrc); + FileInputStream in = null; + try { + in = new FileInputStream(newFile); + outputStream.putNextEntry(new TinkerZipEntry(newArscZipEntry)); + byte[] buffer = new byte[BUFFER_SIZE]; + + for (int length = in.read(buffer); length != -1; length = in.read(buffer)) { + outputStream.write(buffer, 0, length); + } + outputStream.closeEntry(); + } finally { + if (in != null) { + in.close(); + } + } + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Arrays.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Arrays.java new file mode 100644 index 00000000..8712e839 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Arrays.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2010 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.commons.ziputil; + +/** + * modify by zhangshaowen on 16/6/7. + */ +public class Arrays { + public static void checkOffsetAndCount(int arrayLength, int offset, int count) { + if ((offset | count) < 0 || offset > arrayLength || arrayLength - offset < count) { +// throw new ArrayIndexOutOfBoundsException(arrayLength, offset, +// count); + throw new ArrayIndexOutOfBoundsException(offset); + } + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/BufferIterator.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/BufferIterator.java new file mode 100644 index 00000000..7c175e54 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/BufferIterator.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2010 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.commons.ziputil; + +/** + * modify by zhangshaowen on 16/6/7. + */ +public abstract class BufferIterator { + /** + * Seeks to the absolute position {@code offset}, measured in bytes from the start. + */ + public abstract void seek(int offset); + /** + * Skips forwards or backwards {@code byteCount} bytes from the current position. + */ + public abstract void skip(int byteCount); + + public abstract int readInt(); + + public abstract short readShort(); +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/HeapBufferIterator.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/HeapBufferIterator.java new file mode 100644 index 00000000..d6591ce8 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/HeapBufferIterator.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2010 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.commons.ziputil; + +import java.nio.ByteOrder; + +/** + * Iterates over big- or little-endian bytes in a Java byte[]. + * + * @hide don't make this public without adding bounds checking. + */ +public final class HeapBufferIterator extends BufferIterator { + private final byte[] buffer; + private final int offset; + private final int byteCount; + private final ByteOrder order; + private int position; + HeapBufferIterator(byte[] buffer, int offset, int byteCount, ByteOrder order) { + this.buffer = buffer; + this.offset = offset; + this.byteCount = byteCount; + this.order = order; + } + + /** + * Returns a new iterator over {@code buffer}, starting at {@code offset} and continuing for + * {@code byteCount} bytes. Items larger than a byte are interpreted using the given byte order. + */ + public static BufferIterator iterator(byte[] buffer, int offset, int byteCount, ByteOrder order) { + return new HeapBufferIterator(buffer, offset, byteCount, order); + } + + public void seek(int offset) { + position = offset; + } + + public void skip(int byteCount) { + position += byteCount; + } + + public void readByteArray(byte[] dst, int dstOffset, int byteCount) { + System.arraycopy(buffer, offset + position, dst, dstOffset, byteCount); + position += byteCount; + } + + public byte readByte() { + byte result = buffer[offset + position]; + ++position; + return result; + } + + public int readInt() { + int result = Memory.peekInt(buffer, offset + position, order); + position += SizeOf.INT; + return result; + } + + public short readShort() { + short result = Memory.peekShort(buffer, offset + position, order); + position += SizeOf.SHORT; + return result; + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Memory.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Memory.java new file mode 100644 index 00000000..cf7b75dc --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Memory.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.commons.ziputil; + +import java.nio.ByteOrder; + +/** + * modify by zhangshaowen on 16/6/7. + */ +public final class Memory { + private Memory() { } + + public static int peekInt(byte[] src, int offset, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + return (((src[offset++] & 0xff) << 24) + | ((src[offset++] & 0xff) << 16) + | ((src[offset++] & 0xff) << 8) + | ((src[offset ] & 0xff) << 0)); + } else { + return (((src[offset++] & 0xff) << 0) + | ((src[offset++] & 0xff) << 8) + | ((src[offset++] & 0xff) << 16) + | ((src[offset ] & 0xff) << 24)); + } + } + public static long peekLong(byte[] src, int offset, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + int h = ((src[offset++] & 0xff) << 24) + | ((src[offset++] & 0xff) << 16) + | ((src[offset++] & 0xff) << 8) + | ((src[offset++] & 0xff) << 0); + int l = ((src[offset++] & 0xff) << 24) + | ((src[offset++] & 0xff) << 16) + | ((src[offset++] & 0xff) << 8) + | ((src[offset ] & 0xff) << 0); + return (((long) h) << 32L) | ((long) l) & 0xffffffffL; + } else { + int l = ((src[offset++] & 0xff) << 0) + | ((src[offset++] & 0xff) << 8) + | ((src[offset++] & 0xff) << 16) + | ((src[offset++] & 0xff) << 24); + int h = ((src[offset++] & 0xff) << 0) + | ((src[offset++] & 0xff) << 8) + | ((src[offset++] & 0xff) << 16) + | ((src[offset ] & 0xff) << 24); + return (((long) h) << 32L) | ((long) l) & 0xffffffffL; + } + } + public static short peekShort(byte[] src, int offset, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + return (short) ((src[offset] << 8) | (src[offset + 1] & 0xff)); + } else { + return (short) ((src[offset + 1] << 8) | (src[offset] & 0xff)); + } + } + public static void pokeInt(byte[] dst, int offset, int value, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + dst[offset++] = (byte) ((value >> 24) & 0xff); + dst[offset++] = (byte) ((value >> 16) & 0xff); + dst[offset++] = (byte) ((value >> 8) & 0xff); + dst[offset ] = (byte) ((value >> 0) & 0xff); + } else { + dst[offset++] = (byte) ((value >> 0) & 0xff); + dst[offset++] = (byte) ((value >> 8) & 0xff); + dst[offset++] = (byte) ((value >> 16) & 0xff); + dst[offset ] = (byte) ((value >> 24) & 0xff); + } + } + public static void pokeLong(byte[] dst, int offset, long value, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + int i = (int) (value >> 32); + dst[offset++] = (byte) ((i >> 24) & 0xff); + dst[offset++] = (byte) ((i >> 16) & 0xff); + dst[offset++] = (byte) ((i >> 8) & 0xff); + dst[offset++] = (byte) ((i >> 0) & 0xff); + i = (int) value; + dst[offset++] = (byte) ((i >> 24) & 0xff); + dst[offset++] = (byte) ((i >> 16) & 0xff); + dst[offset++] = (byte) ((i >> 8) & 0xff); + dst[offset ] = (byte) ((i >> 0) & 0xff); + } else { + int i = (int) value; + dst[offset++] = (byte) ((i >> 0) & 0xff); + dst[offset++] = (byte) ((i >> 8) & 0xff); + dst[offset++] = (byte) ((i >> 16) & 0xff); + dst[offset++] = (byte) ((i >> 24) & 0xff); + i = (int) (value >> 32); + dst[offset++] = (byte) ((i >> 0) & 0xff); + dst[offset++] = (byte) ((i >> 8) & 0xff); + dst[offset++] = (byte) ((i >> 16) & 0xff); + dst[offset ] = (byte) ((i >> 24) & 0xff); + } + } + public static void pokeShort(byte[] dst, int offset, short value, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + dst[offset++] = (byte) ((value >> 8) & 0xff); + dst[offset ] = (byte) ((value >> 0) & 0xff); + } else { + dst[offset++] = (byte) ((value >> 0) & 0xff); + dst[offset ] = (byte) ((value >> 8) & 0xff); + } + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/SizeOf.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/SizeOf.java new file mode 100644 index 00000000..03458938 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/SizeOf.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2010 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.commons.ziputil; + +/** + * modify by zhangshaowen on 16/6/7. + */ +public final class SizeOf { + public static final int CHAR = 2; + public static final int DOUBLE = 8; + public static final int FLOAT = 4; + public static final int INT = 4; + public static final int LONG = 8; + public static final int SHORT = 2; + private SizeOf() { + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/StandardCharsets.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/StandardCharsets.java new file mode 100644 index 00000000..caa1fbf4 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/StandardCharsets.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2010 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.commons.ziputil; + +import java.nio.charset.Charset; + +/** + * modify by zhangshaowen on 16/6/7. + */ +public final class StandardCharsets { + public static final Charset UTF_8 = Charset.forName("UTF-8"); + + private StandardCharsets() { + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Streams.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Streams.java new file mode 100644 index 00000000..4af128a4 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/Streams.java @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2010 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.commons.ziputil; + +import java.io.ByteArrayOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Reader; +import java.io.StringWriter; +import java.util.concurrent.atomic.AtomicReference; + +//import java.util.Arrays; + +/** + * modify by zhangshaowen on 16/6/7. + */ +public final class Streams { + private static AtomicReference skipBuffer = new AtomicReference(); + private Streams() { + } + /** + * Implements InputStream.read(int) in terms of InputStream.read(byte[], int, int). + * InputStream assumes that you implement InputStream.read(int) and provides default + * implementations of the others, but often the opposite is more efficient. + */ + public static int readSingleByte(InputStream in) throws IOException { + byte[] buffer = new byte[1]; + int result = in.read(buffer, 0, 1); + return (result != -1) ? buffer[0] & 0xff : -1; + } + /** + * Implements OutputStream.write(int) in terms of OutputStream.write(byte[], int, int). + * OutputStream assumes that you implement OutputStream.write(int) and provides default + * implementations of the others, but often the opposite is more efficient. + */ + public static void writeSingleByte(OutputStream out, int b) throws IOException { + byte[] buffer = new byte[1]; + buffer[0] = (byte) (b & 0xff); + out.write(buffer); + } + /** + * Fills 'dst' with bytes from 'in', throwing EOFException if insufficient bytes are available. + */ + public static void readFully(InputStream in, byte[] dst) throws IOException { + readFully(in, dst, 0, dst.length); + } + + /** + * Reads exactly 'byteCount' bytes from 'in' (into 'dst' at offset 'offset'), and throws + * EOFException if insufficient bytes are available. + * + * Used to implement {@link java.io.DataInputStream#readFully(byte[], int, int)}. + */ + public static void readFully(InputStream in, byte[] dst, int offset, int byteCount) throws IOException { + if (byteCount == 0) { + return; + } + if (in == null) { + throw new NullPointerException("in == null"); + } + if (dst == null) { + throw new NullPointerException("dst == null"); + } + Arrays.checkOffsetAndCount(dst.length, offset, byteCount); + while (byteCount > 0) { + int bytesRead = in.read(dst, offset, byteCount); + if (bytesRead < 0) { + throw new EOFException(); + } + offset += bytesRead; + byteCount -= bytesRead; + } + } + /** + * Returns a byte[] containing the remainder of 'in', closing it when done. + */ + public static byte[] readFully(InputStream in) throws IOException { + try { + return readFullyNoClose(in); + } finally { + in.close(); + } + } + /** + * Returns a byte[] containing the remainder of 'in'. + */ + public static byte[] readFullyNoClose(InputStream in) throws IOException { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int count; + while ((count = in.read(buffer)) != -1) { + bytes.write(buffer, 0, count); + } + return bytes.toByteArray(); + } + /** + * Returns the remainder of 'reader' as a string, closing it when done. + */ + public static String readFully(Reader reader) throws IOException { + try { + StringWriter writer = new StringWriter(); + char[] buffer = new char[1024]; + int count; + while ((count = reader.read(buffer)) != -1) { + writer.write(buffer, 0, count); + } + return writer.toString(); + } finally { + reader.close(); + } + } + public static void skipAll(InputStream in) throws IOException { + do { + in.skip(Long.MAX_VALUE); + } while (in.read() != -1); + } + /** + * Skip at most {@code byteCount} bytes from {@code in} by calling read + * repeatedly until either the stream is exhausted or we read fewer bytes than + * we ask for. + * + *

    This method reuses the skip buffer but is careful to never use it at + * the same time that another stream is using it. Otherwise streams that use + * the caller's buffer for consistency checks like CRC could be clobbered by + * other threads. A thread-local buffer is also insufficient because some + * streams may call other streams in their skip() method, also clobbering the + * buffer. + */ + public static long skipByReading(InputStream in, long byteCount) throws IOException { + // acquire the shared skip buffer. + byte[] buffer = skipBuffer.getAndSet(null); + if (buffer == null) { + buffer = new byte[4096]; + } + long skipped = 0; + while (skipped < byteCount) { + int toRead = (int) Math.min(byteCount - skipped, buffer.length); + int read = in.read(buffer, 0, toRead); + if (read == -1) { + break; + } + skipped += read; + if (read < toRead) { + break; + } + } + // release the shared skip buffer. + skipBuffer.set(buffer); + return skipped; + } + /** + * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. + * Returns the total number of bytes transferred. + */ + public static int copy(InputStream in, OutputStream out) throws IOException { + int total = 0; + byte[] buffer = new byte[8192]; + int c; + while ((c = in.read(buffer)) != -1) { + total += c; + out.write(buffer, 0, c); + } + return total; + } + /** + * Returns the ASCII characters up to but not including the next "\r\n", or + * "\n". + * + * @throws EOFException if the stream is exhausted before the next newline + * character. + */ + public static String readAsciiLine(InputStream in) throws IOException { + // TODO: support UTF-8 here instead + StringBuilder result = new StringBuilder(80); + while (true) { + int c = in.read(); + if (c == -1) { + throw new EOFException(); + } else if (c == '\n') { + break; + } + result.append((char) c); + } + int length = result.length(); + if (length > 0 && result.charAt(length - 1) == '\r') { + result.setLength(length - 1); + } + return result.toString(); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipEntry.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipEntry.java new file mode 100644 index 00000000..a1f03235 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipEntry.java @@ -0,0 +1,449 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.commons.ziputil; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.zip.ZipException; + +/** + * modify by zhangshaowen on 16/6/7. + * remove zip64 + * + * An entry within a zip file. + * An entry has attributes such as its name (which is actually a path) and the uncompressed size + * of the corresponding data. An entry does not contain the data itself, but can be used as a key + * with {@link TinkerZipFile#getInputStream}. The class documentation for {@code ZipInputStream} and + * {@link TinkerZipOutputStream} shows how {@code ZipEntry} is used in conjunction with those two classes. + */ +public class TinkerZipEntry implements ZipConstants, Cloneable { + /** + * Zip entry state: Deflated. + */ + public static final int DEFLATED = 8; + /** + * Zip entry state: Stored. + */ + public static final int STORED = 0; + String name; + String comment; + long crc = -1; // Needs to be a long to distinguish -1 ("not set") from the 0xffffffff CRC32. + long compressedSize = -1; + long size = -1; + int compressionMethod = -1; + int time = -1; + int modDate = -1; + byte[] extra; + long localHeaderRelOffset = -1; + long dataOffset = -1; + /** @hide - for testing only */ + public TinkerZipEntry(String name, String comment, long crc, long compressedSize, + long size, int compressionMethod, int time, int modDate, byte[] extra, + long localHeaderRelOffset, long dataOffset) { + this.name = name; + this.comment = comment; + this.crc = crc; + this.compressedSize = compressedSize; + this.size = size; + this.compressionMethod = compressionMethod; + this.time = time; + this.modDate = modDate; + this.extra = extra; + this.localHeaderRelOffset = localHeaderRelOffset; + this.dataOffset = dataOffset; + } + /** + * Constructs a new {@code ZipEntry} with the specified name. The name is actually a path, + * and may contain {@code /} characters. + * + * @throws IllegalArgumentException + * if the name length is outside the range (> 0xFFFF). + */ + public TinkerZipEntry(String name) { + if (name == null) { + throw new NullPointerException("name == null"); + } + validateStringLength("Name", name); + this.name = name; + } + /** + * Constructs a new {@code ZipEntry} using the values obtained from {@code + * ze}. + * + * @param ze + * the {@code ZipEntry} from which to obtain values. + */ + public TinkerZipEntry(TinkerZipEntry ze) { + name = ze.name; + comment = ze.comment; + time = ze.time; + size = ze.size; + compressedSize = ze.compressedSize; + crc = ze.crc; + compressionMethod = ze.compressionMethod; + modDate = ze.modDate; + extra = ze.extra; + localHeaderRelOffset = ze.localHeaderRelOffset; + dataOffset = ze.dataOffset; + } + /* + * Internal constructor. Creates a new ZipEntry by reading the + * Central Directory Entry (CDE) from "in", which must be positioned + * at the CDE signature. If the GPBF_UTF8_FLAG is set in the CDE then + * UTF-8 is used to decode the string information, otherwise the + * defaultCharset is used. + * + * On exit, "in" will be positioned at the start of the next entry + * in the Central Directory. + */ + TinkerZipEntry(byte[] cdeHdrBuf, InputStream cdStream, Charset defaultCharset, boolean isZip64) throws IOException { + Streams.readFully(cdStream, cdeHdrBuf, 0, cdeHdrBuf.length); + BufferIterator it = HeapBufferIterator.iterator(cdeHdrBuf, 0, cdeHdrBuf.length, + ByteOrder.LITTLE_ENDIAN); + int sig = it.readInt(); + if (sig != CENSIG) { + TinkerZipFile.throwZipException("unknown", cdStream.available(), "unknown", 0, "Central Directory Entry", sig); + } + it.seek(8); + int gpbf = it.readShort() & 0xffff; + if ((gpbf & TinkerZipFile.GPBF_UNSUPPORTED_MASK) != 0) { + throw new ZipException("Invalid General Purpose Bit Flag: " + gpbf); + } + // If the GPBF_UTF8_FLAG is set then the character encoding is UTF-8 whatever the default + // provided. + Charset charset = defaultCharset; + if ((gpbf & TinkerZipFile.GPBF_UTF8_FLAG) != 0) { + charset = Charset.forName("UTF-8"); + } + compressionMethod = it.readShort() & 0xffff; + time = it.readShort() & 0xffff; + modDate = it.readShort() & 0xffff; + // These are 32-bit values in the file, but 64-bit fields in this object. + crc = ((long) it.readInt()) & 0xffffffffL; + compressedSize = ((long) it.readInt()) & 0xffffffffL; + size = ((long) it.readInt()) & 0xffffffffL; + int nameLength = it.readShort() & 0xffff; + int extraLength = it.readShort() & 0xffff; + int commentByteCount = it.readShort() & 0xffff; + // This is a 32-bit value in the file, but a 64-bit field in this object. + it.seek(42); + localHeaderRelOffset = ((long) it.readInt()) & 0xffffffffL; + byte[] nameBytes = new byte[nameLength]; + Streams.readFully(cdStream, nameBytes, 0, nameBytes.length); + if (containsNulByte(nameBytes)) { + throw new ZipException("Filename contains NUL byte: " + Arrays.toString(nameBytes)); + } + name = new String(nameBytes, 0, nameBytes.length, charset); + if (extraLength > 0) { + extra = new byte[extraLength]; + Streams.readFully(cdStream, extra, 0, extraLength); + } + if (commentByteCount > 0) { + byte[] commentBytes = new byte[commentByteCount]; + Streams.readFully(cdStream, commentBytes, 0, commentByteCount); + comment = new String(commentBytes, 0, commentBytes.length, charset); + } + /*if (isZip64) { + Zip64.parseZip64ExtendedInfo(this, true *//* from central directory *//*); + }*/ + } + + private static boolean containsNulByte(byte[] bytes) { + for (byte b : bytes) { + if (b == 0) { + return true; + } + } + return false; + } + + private static void validateStringLength(String argument, String string) { + // This check is not perfect: the character encoding is determined when the entry is + // written out. UTF-8 is probably a worst-case: most alternatives should be single byte per + // character. + byte[] bytes = string.getBytes(Charset.forName("UTF-8")); + if (bytes.length > 0xffff) { + throw new IllegalArgumentException(argument + " too long: " + bytes.length); + } + } + + /** + * Returns the comment for this {@code ZipEntry}, or {@code null} if there is no comment. + * If we're reading a zip file using {@code ZipInputStream}, the comment is not available. + */ + public String getComment() { + return comment; + } + + /** + * Sets the comment for this {@code ZipEntry}. + * @throws IllegalArgumentException if the comment is >= 64 Ki UTF-8 bytes. + */ + public void setComment(String comment) { + if (comment == null) { + this.comment = null; + return; + } + validateStringLength("Comment", comment); + this.comment = comment; + } + + /** + * Gets the compressed size of this {@code ZipEntry}. + * + * @return the compressed size, or -1 if the compressed size has not been + * set. + */ + public long getCompressedSize() { + return compressedSize; + } + + /** + * Sets the compressed size for this {@code ZipEntry}. + * + * @param value + * the compressed size (in bytes). + */ + public void setCompressedSize(long value) { + compressedSize = value; + } + + /** + * Gets the checksum for this {@code ZipEntry}. + * + * @return the checksum, or -1 if the checksum has not been set. + */ + public long getCrc() { + return crc; + } + + /** + * Sets the checksum for this {@code ZipEntry}. + * + * @param value + * the checksum for this entry. + * @throws IllegalArgumentException + * if {@code value} is < 0 or > 0xFFFFFFFFL. + */ + public void setCrc(long value) { + if (value >= 0 && value <= 0xFFFFFFFFL) { + crc = value; + } else { + throw new IllegalArgumentException("Bad CRC32: " + value); + } + } + + /** + * Gets the extra information for this {@code ZipEntry}. + * + * @return a byte array containing the extra information, or {@code null} if + * there is none. + */ + public byte[] getExtra() { + return extra; + } + + /** + * Sets the extra information for this {@code ZipEntry}. + * + * @throws IllegalArgumentException if the data length >= 64 KiB. + */ + public void setExtra(byte[] data) { + if (data != null && data.length > 0xffff) { + throw new IllegalArgumentException("Extra data too long: " + data.length); + } + extra = data; + } + + /** + * Gets the compression method for this {@code ZipEntry}. + * + * @return the compression method, either {@code DEFLATED}, {@code STORED} + * or -1 if the compression method has not been set. + */ + public int getMethod() { + return compressionMethod; + } + + /** + * Sets the compression method for this entry to either {@code DEFLATED} or {@code STORED}. + * The default is {@code DEFLATED}, which will cause the size, compressed size, and CRC to be + * set automatically, and the entry's data to be compressed. If you switch to {@code STORED} + * note that you'll have to set the size (or compressed size; they must be the same, but it's + * okay to only set one) and CRC yourself because they must appear before the user data + * in the resulting zip file. See {@link #setSize} and {@link #setCrc}. + * @throws IllegalArgumentException + * when value is not {@code DEFLATED} or {@code STORED}. + */ + public void setMethod(int value) { + if (value != STORED && value != DEFLATED) { + throw new IllegalArgumentException("Bad method: " + value); + } + compressionMethod = value; + } + + /** + * Gets the name of this {@code ZipEntry}. + * + *

    Security note: Entry names can represent relative paths. {@code foo/../bar} or + * {@code ../bar/baz}, for example. If the entry name is being used to construct a filename + * or as a path component, it must be validated or sanitized to ensure that files are not + * written outside of the intended destination directory. + * + * @return the entry name. + */ + public String getName() { + return name; + } + + /** + * Gets the uncompressed size of this {@code ZipEntry}. + * + * @return the uncompressed size, or {@code -1} if the size has not been + * set. + */ + public long getSize() { + return size; + } + + /** + * Sets the uncompressed size of this {@code ZipEntry}. + * + * @param value the uncompressed size for this entry. + * @throws IllegalArgumentException if {@code value < 0}. + */ + public void setSize(long value) { + if (value < 0) { + throw new IllegalArgumentException("Bad size: " + value); + } + size = value; + } + + /** + * Gets the last modification time of this {@code ZipEntry}. + * + * @return the last modification time as the number of milliseconds since + * Jan. 1, 1970. + */ + public long getTime() { + if (time != -1) { + GregorianCalendar cal = new GregorianCalendar(); + cal.set(Calendar.MILLISECOND, 0); + cal.set(1980 + ((modDate >> 9) & 0x7f), ((modDate >> 5) & 0xf) - 1, + modDate & 0x1f, (time >> 11) & 0x1f, (time >> 5) & 0x3f, + (time & 0x1f) << 1); + return cal.getTime().getTime(); + } + return -1; + } + + /** + * Sets the modification time of this {@code ZipEntry}. + * + * @param value + * the modification time as the number of milliseconds since Jan. + * 1, 1970. + */ + public void setTime(long value) { + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(new Date(value)); + int year = cal.get(Calendar.YEAR); + if (year < 1980) { + modDate = 0x21; + time = 0; + } else { + modDate = cal.get(Calendar.DATE); + modDate = (cal.get(Calendar.MONTH) + 1 << 5) | modDate; + modDate = ((cal.get(Calendar.YEAR) - 1980) << 9) | modDate; + time = cal.get(Calendar.SECOND) >> 1; + time = (cal.get(Calendar.MINUTE) << 5) | time; + time = (cal.get(Calendar.HOUR_OF_DAY) << 11) | time; + } + } + + /** + * Determine whether or not this {@code ZipEntry} is a directory. + * + * @return {@code true} when this {@code ZipEntry} is a directory, {@code + * false} otherwise. + */ + public boolean isDirectory() { + return name.charAt(name.length() - 1) == '/'; + } + + /** @hide */ + public long getDataOffset() { + return dataOffset; + } + + /** @hide */ + public void setDataOffset(long value) { + dataOffset = value; + } + + /** + * Returns the string representation of this {@code ZipEntry}. + * + * @return the string representation of this {@code ZipEntry}. + */ + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("name:" + name); + sb.append("\ncomment:" + comment); + sb.append("\ntime:" + time); + sb.append("\nsize:" + size); + sb.append("\ncompressedSize:" + compressedSize); + sb.append("\ncrc:" + crc); + sb.append("\ncompressionMethod:" + compressionMethod); + sb.append("\nmodDate:" + modDate); + sb.append("\nextra:" + extra); + sb.append("\nlocalHeaderRelOffset:" + localHeaderRelOffset); + sb.append("\ndataOffset:" + dataOffset); + return sb.toString(); + } + + /** + * Returns a deep copy of this zip entry. + */ + @Override public Object clone() { + try { + TinkerZipEntry result = (TinkerZipEntry) super.clone(); + result.extra = extra != null ? extra.clone() : null; + return result; + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + /** + * Returns the hash code for this {@code ZipEntry}. + * + * @return the hash code of the entry. + */ + @Override + public int hashCode() { + return name.hashCode(); + } +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipFile.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipFile.java new file mode 100644 index 00000000..dbc8f48b --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipFile.java @@ -0,0 +1,605 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.commons.ziputil; + +import java.io.BufferedInputStream; +import java.io.Closeable; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.nio.ByteOrder; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.zip.ZipException; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +// import libcore.io.IoUtils; + +/** + * modify by zhangshaowen on 16/6/7. + * + * This class provides random read access to a zip file. You pay more to read + * the zip file's central directory up front (from the constructor), but if you're using + * {@link #getEntry} to look up multiple files by name, you get the benefit of this index. + * + *

    If you only want to iterate through all the files (using {@link #entries()}, you should + * consider {@link ZipInputStream}, which provides stream-like read access to a zip file and + * has a lower up-front cost because you don't pay to build an in-memory index. + * + *

    If you want to create a zip file, use {@link ZipOutputStream}. There is no API for updating + * an existing zip file. + */ +public class TinkerZipFile implements Closeable, ZipConstants { + /** + * Open zip file for reading. + */ + public static final int OPEN_READ = 1; + /** + * Delete zip file when closed. + */ + public static final int OPEN_DELETE = 4; + /** + * General Purpose Bit Flags, Bit 0. + * If set, indicates that the file is encrypted. + */ + static final int GPBF_ENCRYPTED_FLAG = 1 << 0; + /** + * General Purpose Bit Flags, Bit 3. + * If this bit is set, the fields crc-32, compressed + * size and uncompressed size are set to zero in the + * local header. The correct values are put in the + * data descriptor immediately following the compressed + * data. (Note: PKZIP version 2.04g for DOS only + * recognizes this bit for method 8 compression, newer + * versions of PKZIP recognize this bit for any + * compression method.) + */ + static final int GPBF_DATA_DESCRIPTOR_FLAG = 1 << 3; + /** + * General Purpose Bit Flags, Bit 11. + * Language encoding flag (EFS). If this bit is set, + * the filename and comment fields for this file + * must be encoded using UTF-8. + */ + static final int GPBF_UTF8_FLAG = 1 << 11; + /** + * Supported General Purpose Bit Flags Mask. + * Bit mask of bits not supported. + * Note: The only bit that we will enforce at this time + * is the encrypted bit. Although other bits are not supported, + * we must not enforce them as this could break some legitimate + * use cases (See http://b/8617715). + */ + static final int GPBF_UNSUPPORTED_MASK = GPBF_ENCRYPTED_FLAG; + private final String filename; + private final LinkedHashMap entries = new LinkedHashMap(); + private File fileToDeleteOnClose; + private RandomAccessFile raf; + private String comment; + + /** + * Constructs a new {@code ZipFile} allowing read access to the contents of the given file. + * + *

    UTF-8 is used to decode all comments and entry names in the file. + * + * @throws ZipException if a zip error occurs. + * @throws IOException if an {@code IOException} occurs. + */ + public TinkerZipFile(File file) throws ZipException, IOException { + this(file, OPEN_READ); + } + /** + * Constructs a new {@code ZipFile} allowing read access to the contents of the given file. + * + *

    UTF-8 is used to decode all comments and entry names in the file. + * + * @throws IOException if an IOException occurs. + */ + public TinkerZipFile(String name) throws IOException { + this(new File(name), OPEN_READ); + } + /** + * Constructs a new {@code ZipFile} allowing access to the given file. + * + *

    UTF-8 is used to decode all comments and entry names in the file. + * + *

    The {@code mode} must be either {@code OPEN_READ} or {@code OPEN_READ|OPEN_DELETE}. + * If the {@code OPEN_DELETE} flag is supplied, the file will be deleted at or before the + * time that the {@code ZipFile} is closed (the contents will remain accessible until + * this {@code ZipFile} is closed); it also calls {@code File.deleteOnExit}. + * + * @throws IOException if an {@code IOException} occurs. + */ + public TinkerZipFile(File file, int mode) throws IOException { + filename = file.getPath(); + if (mode != OPEN_READ && mode != (OPEN_READ | OPEN_DELETE)) { + throw new IllegalArgumentException("Bad mode: " + mode); + } + if ((mode & OPEN_DELETE) != 0) { + fileToDeleteOnClose = file; + fileToDeleteOnClose.deleteOnExit(); + } else { + fileToDeleteOnClose = null; + } + raf = new RandomAccessFile(filename, "r"); + + readCentralDir(); + // guard.open("close"); + } + + /** + * Returns true if the string is null or 0-length. + * @param str the string to be examined + * @return true if str is null or zero length + */ + public static boolean isEmpty(CharSequence str) { + if (str == null || str.length() == 0) { + return true; + } + return false; + } + /*@Override protected void finalize() throws IOException { + try { + if (guard != null) { + guard.warnIfOpen(); + } + } finally { + try { + super.finalize(); + } catch (Throwable t) { + throw new AssertionError(t); + } + } + }*/ + + /** + * Returns true if a and b are equal, including if they are both null. + *

    Note: In platform versions 1.1 and earlier, this method only worked well if + * both the arguments were instances of String.

    + * @param a first CharSequence to check + * @param b second CharSequence to check + * @return true if a and b are equal + */ + public static boolean equals(CharSequence a, CharSequence b) { + if (a == b) return true; + int length; + if (a != null && b != null && (length = a.length()) == b.length()) { + if (a instanceof String && b instanceof String) { + return a.equals(b); + } else { + for (int i = 0; i < length; i++) { + if (a.charAt(i) != b.charAt(i)) return false; + } + return true; + } + } + return false; + } + + private static EocdRecord parseEocdRecord(RandomAccessFile raf, long offset, boolean isZip64) throws IOException { + raf.seek(offset); + // Read the End Of Central Directory. ENDHDR includes the signature bytes, + // which we've already read. + byte[] eocd = new byte[ENDHDR - 4]; + raf.readFully(eocd); + BufferIterator it = HeapBufferIterator.iterator(eocd, 0, eocd.length, ByteOrder.LITTLE_ENDIAN); + final long numEntries; + final long centralDirOffset; + if (isZip64) { + numEntries = -1; + centralDirOffset = -1; + // If we have a zip64 end of central directory record, we skip through the regular + // end of central directory record and use the information from the zip64 eocd record. + // We're still forced to read the comment length (below) since it isn't present in the + // zip64 eocd record. + it.skip(16); + } else { + // If we don't have a zip64 eocd record, we read values from the "regular" + // eocd record. + int diskNumber = it.readShort() & 0xffff; + int diskWithCentralDir = it.readShort() & 0xffff; + numEntries = it.readShort() & 0xffff; + int totalNumEntries = it.readShort() & 0xffff; + it.skip(4); // Ignore centralDirSize. + centralDirOffset = ((long) it.readInt()) & 0xffffffffL; + if (numEntries != totalNumEntries || diskNumber != 0 || diskWithCentralDir != 0) { + throw new ZipException("Spanned archives not supported"); + } + } + final int commentLength = it.readShort() & 0xffff; + return new EocdRecord(numEntries, centralDirOffset, commentLength); + } + + static void throwZipException(String filename, long fileSize, String entryName, long localHeaderRelOffset, String msg, int magic) throws ZipException { + final String hexString = Integer.toHexString(magic); + throw new ZipException("file name:" + filename + + ", file size" + fileSize + + ", entry name:" + entryName + + ", entry localHeaderRelOffset:" + localHeaderRelOffset + + ", " + + msg + " signature not found; was " + hexString); + } + + /** + * Closes this zip file. This method is idempotent. This method may cause I/O if the + * zip file needs to be deleted. + * + * @throws IOException + * if an IOException occurs. + */ + public void close() throws IOException { + // guard.close(); + RandomAccessFile localRaf = raf; + if (localRaf != null) { // Only close initialized instances + synchronized (localRaf) { + raf = null; + localRaf.close(); + } + if (fileToDeleteOnClose != null) { + fileToDeleteOnClose.delete(); + fileToDeleteOnClose = null; + } + } + } + + private void checkNotClosed() { + if (raf == null) { + throw new IllegalStateException("Zip file closed"); + } + } + + /** + * Returns an enumeration of the entries. The entries are listed in the + * order in which they appear in the zip file. + * + *

    If you only need to iterate over the entries in a zip file, and don't + * need random-access entry lookup by name, you should probably use {@link ZipInputStream} + * instead, to avoid paying to construct the in-memory index. + * + * @throws IllegalStateException if this zip file has been closed. + */ + public Enumeration entries() { + checkNotClosed(); + final Iterator iterator = entries.values().iterator(); + return new Enumeration() { + public boolean hasMoreElements() { + checkNotClosed(); + return iterator.hasNext(); + } + public TinkerZipEntry nextElement() { + checkNotClosed(); + return iterator.next(); + } + }; + } + + /** + * Returns this file's comment, or null if it doesn't have one. + * See {@link ZipOutputStream#setComment}. + * + * @throws IllegalStateException if this zip file has been closed. + * @since 1.7 + */ + public String getComment() { + checkNotClosed(); + return comment; + } + + /** + * Returns the zip entry with the given name, or null if there is no such entry. + * + * @throws IllegalStateException if this zip file has been closed. + */ + public TinkerZipEntry getEntry(String entryName) { + checkNotClosed(); + if (entryName == null) { + throw new NullPointerException("entryName == null"); + } + TinkerZipEntry ze = entries.get(entryName); + if (ze == null) { + ze = entries.get(entryName + "/"); + } + return ze; + } + + /** + * Returns an input stream on the data of the specified {@code ZipEntry}. + * + * @param entry + * the ZipEntry. + * @return an input stream of the data contained in the {@code ZipEntry}. + * @throws IOException + * if an {@code IOException} occurs. + * @throws IllegalStateException if this zip file has been closed. + */ + public InputStream getInputStream(TinkerZipEntry entry) throws IOException { + // Make sure this ZipEntry is in this Zip file. We run it through the name lookup. + entry = getEntry(entry.getName()); + if (entry == null) { + return null; + } + // Create an InputStream at the right part of the file. + RandomAccessFile localRaf = raf; + synchronized (localRaf) { + // We don't know the entry data's start position. All we have is the + // position of the entry's local header. + // http://www.pkware.com/documents/casestudies/APPNOTE.TXT + RAFStream rafStream = new RAFStream(localRaf, entry.localHeaderRelOffset); + DataInputStream is = new DataInputStream(rafStream); + final int localMagic = Integer.reverseBytes(is.readInt()); + if (localMagic != LOCSIG) { + throwZipException(filename, localRaf.length(), entry.getName(), entry.localHeaderRelOffset, "Local File Header", localMagic); + } + is.skipBytes(2); + // At position 6 we find the General Purpose Bit Flag. + int gpbf = Short.reverseBytes(is.readShort()) & 0xffff; + if ((gpbf & TinkerZipFile.GPBF_UNSUPPORTED_MASK) != 0) { + throw new ZipException("Invalid General Purpose Bit Flag: " + gpbf); + } + // Offset 26 has the file name length, and offset 28 has the extra field length. + // These lengths can differ from the ones in the central header. + is.skipBytes(18); + int fileNameLength = Short.reverseBytes(is.readShort()) & 0xffff; + int extraFieldLength = Short.reverseBytes(is.readShort()) & 0xffff; + is.close(); + // Skip the variable-size file name and extra field data. + rafStream.skip(fileNameLength + extraFieldLength); + /*if (entry.compressionMethod == ZipEntry.STORED) { + rafStream.endOffset = rafStream.offset + entry.size; + return rafStream; + } else { + rafStream.endOffset = rafStream.offset + entry.compressedSize; + int bufSize = Math.max(1024, (int) Math.min(entry.getSize(), 65535L)); + return new ZipInflaterInputStream(rafStream, new Inflater(true), bufSize, entry); + }*/ + if (entry.compressionMethod == TinkerZipEntry.STORED) { + rafStream.endOffset = rafStream.offset + entry.size; + } else { + rafStream.endOffset = rafStream.offset + entry.compressedSize; + } + return rafStream; + } + } + + /** + * Gets the file name of this {@code ZipFile}. + * + * @return the file name of this {@code ZipFile}. + */ + public String getName() { + return filename; + } + + /** + * Returns the number of {@code ZipEntries} in this {@code ZipFile}. + * + * @return the number of entries in this file. + * @throws IllegalStateException if this zip file has been closed. + */ + public int size() { + checkNotClosed(); + return entries.size(); + } + + /** + * Find the central directory and read the contents. + * + *

    The central directory can be followed by a variable-length comment + * field, so we have to scan through it backwards. The comment is at + * most 64K, plus we have 18 bytes for the end-of-central-dir stuff + * itself, plus apparently sometimes people throw random junk on the end + * just for the fun of it. + * + *

    This is all a little wobbly. If the wrong value ends up in the EOCD + * area, we're hosed. This appears to be the way that everybody handles + * it though, so we're in good company if this fails. + */ + private void readCentralDir() throws IOException { + // Scan back, looking for the End Of Central Directory field. If the zip file doesn't + // have an overall comment (unrelated to any per-entry comments), we'll hit the EOCD + // on the first try. + // No need to synchronize raf here -- we only do this when we first open the zip file. + long scanOffset = raf.length() - ENDHDR; + if (scanOffset < 0) { + throw new ZipException("File too short to be a zip file: " + raf.length()); + } + + raf.seek(0); + final int headerMagic = Integer.reverseBytes(raf.readInt()); + if (headerMagic != LOCSIG) { + throw new ZipException("Not a zip archive"); + } + + long stopOffset = scanOffset - 65536; + if (stopOffset < 0) { + stopOffset = 0; + } + + while (true) { + raf.seek(scanOffset); + if (Integer.reverseBytes(raf.readInt()) == ENDSIG) { + break; + } + + scanOffset--; + if (scanOffset < stopOffset) { + throw new ZipException("End Of Central Directory signature not found"); + } + } + + // Read the End Of Central Directory. ENDHDR includes the signature bytes, + // which we've already read. + byte[] eocd = new byte[ENDHDR - 4]; + raf.readFully(eocd); + + // Pull out the information we need. + BufferIterator it = HeapBufferIterator.iterator(eocd, 0, eocd.length, ByteOrder.LITTLE_ENDIAN); + int diskNumber = it.readShort() & 0xffff; + int diskWithCentralDir = it.readShort() & 0xffff; + int numEntries = it.readShort() & 0xffff; + int totalNumEntries = it.readShort() & 0xffff; + it.skip(4); // Ignore centralDirSize. + long centralDirOffset = ((long) it.readInt()) & 0xffffffffL; + int commentLength = it.readShort() & 0xffff; + + if (numEntries != totalNumEntries || diskNumber != 0 || diskWithCentralDir != 0) { + throw new ZipException("Spanned archives not supported"); + } + + if (commentLength > 0) { + byte[] commentBytes = new byte[commentLength]; + raf.readFully(commentBytes); + comment = new String(commentBytes, 0, commentBytes.length, StandardCharsets.UTF_8); + } + + // Seek to the first CDE and read all entries. + // We have to do this now (from the constructor) rather than lazily because the + // public API doesn't allow us to throw IOException except from the constructor + // or from getInputStream. + RAFStream rafStream = new RAFStream(raf, centralDirOffset); + BufferedInputStream bufferedStream = new BufferedInputStream(rafStream, 4096); + byte[] hdrBuf = new byte[CENHDR]; // Reuse the same buffer for each entry. + for (int i = 0; i < numEntries; ++i) { + TinkerZipEntry newEntry = new TinkerZipEntry(hdrBuf, bufferedStream, StandardCharsets.UTF_8, + (false) /* isZip64 */); + if (newEntry.localHeaderRelOffset >= centralDirOffset) { + throw new ZipException("Local file header offset is after central directory"); + } + String entryName = newEntry.getName(); + if (entries.put(entryName, newEntry) != null) { + throw new ZipException("Duplicate entry name: " + entryName); + } + } + + } + + // private final CloseGuard guard = CloseGuard.get(); + static class EocdRecord { + final long numEntries; + final long centralDirOffset; + final int commentLength; + EocdRecord(long numEntries, long centralDirOffset, int commentLength) { + this.numEntries = numEntries; + this.centralDirOffset = centralDirOffset; + this.commentLength = commentLength; + } + } + + /** + * Wrap a stream around a RandomAccessFile. The RandomAccessFile is shared + * among all streams returned by getInputStream(), so we have to synchronize + * access to it. (We can optimize this by adding buffering here to reduce + * collisions.) + * + *

    We could support mark/reset, but we don't currently need them. + * + * @hide + */ + public static class RAFStream extends InputStream { + private final RandomAccessFile sharedRaf; + private long endOffset; + private long offset; + public RAFStream(RandomAccessFile raf, long initialOffset, long endOffset) { + sharedRaf = raf; + offset = initialOffset; + this.endOffset = endOffset; + } + public RAFStream(RandomAccessFile raf, long initialOffset) throws IOException { + this(raf, initialOffset, raf.length()); + } + @Override public int available() throws IOException { + return (offset < endOffset ? 1 : 0); + } + @Override public int read() throws IOException { + return Streams.readSingleByte(this); + } + @Override public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { + synchronized (sharedRaf) { + final long length = endOffset - offset; + if (byteCount > length) { + byteCount = (int) length; + } + sharedRaf.seek(offset); + int count = sharedRaf.read(buffer, byteOffset, byteCount); + if (count > 0) { + offset += count; + return count; + } else { + return -1; + } + } + } + @Override public long skip(long byteCount) throws IOException { + if (byteCount > endOffset - offset) { + byteCount = endOffset - offset; + } + offset += byteCount; + return byteCount; + } + /*public int fill(Inflater inflater, int nativeEndBufSize) throws IOException { + synchronized (sharedRaf) { + int len = Math.min((int) (endOffset - offset), nativeEndBufSize); + int cnt = inflater.setFileInput(sharedRaf.getFD(), offset, nativeEndBufSize); + // setFileInput read from the file, so we need to get the OS and RAFStream back + // in sync... + skip(cnt); + return len; + } + }*/ + } + /** @hide */ + /*public static class ZipInflaterInputStream extends InflaterInputStream { + private final ZipEntry entry; + private long bytesRead = 0; + public ZipInflaterInputStream(InputStream is, Inflater inf, int bsize, ZipEntry entry) { + super(is, inf, bsize); + this.entry = entry; + } + @Override public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { + final int i; + try { + i = super.read(buffer, byteOffset, byteCount); + } catch (IOException e) { + throw new IOException("Error reading data for " + entry.getName() + " near offset " + + bytesRead, e); + } + if (i == -1) { + if (entry.size != bytesRead) { + throw new IOException("Size mismatch on inflated file: " + bytesRead + " vs " + + entry.size); + } + } else { + bytesRead += i; + } + return i; + } + @Override public int available() throws IOException { + if (closed) { + // Our superclass will throw an exception, but there's a jtreg test that + // explicitly checks that the InputStream returned from ZipFile.getInputStream + // returns 0 even when closed. + return 0; + } + return super.available() == 0 ? 0 : (int) (entry.getSize() - bytesRead); + } + }*/ +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipOutputStream.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipOutputStream.java new file mode 100644 index 00000000..62aabf47 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/TinkerZipOutputStream.java @@ -0,0 +1,579 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.commons.ziputil; + +// import libcore.util.CountingOutputStream; +// import libcore.util.EmptyArray; + +import java.io.ByteArrayOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashSet; +import java.util.zip.GZIPOutputStream; +import java.util.zip.ZipException; +import java.util.zip.ZipInputStream; + +// import java.nio.charset.StandardCharsets; +// import java.util.Arrays; + +/** + * modify by zhangshaowen on 16/6/7. + * remove zip64 + * const time, modDate + * remove entry extra + * remove entry comment + * + * Used to write (compress) data into zip files. + * + *

    {@code ZipOutputStream} is used to write {@link TinkerZipEntry}s to the underlying + * stream. Output from {@code ZipOutputStream} can be read using {@link TinkerZipFile} + * or {@link ZipInputStream}. + * + *

    While {@code DeflaterOutputStream} can write compressed zip file + * entries, this extension can write uncompressed entries as well. + * Use {@link TinkerZipEntry#setMethod} or @link #setMethod with the {@link TinkerZipEntry#STORED} flag. + * + *

    Example

    + *

    Using {@code ZipOutputStream} is a little more complicated than {@link GZIPOutputStream} + * because zip files are containers that can contain multiple files. This code creates a zip + * file containing several files, similar to the {@code zip(1)} utility. + *

    + * OutputStream os = ...
    + * ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
    + * try {
    + *     for (int i = 0; i < fileCount; ++i) {
    + *         String filename = ...
    + *         byte[] bytes = ...
    + *         ZipEntry entry = new ZipEntry(filename);
    + *         zos.putNextEntry(entry);
    + *         zos.write(bytes);
    + *         zos.closeEntry();
    + *     }
    + * } finally {
    + *     zos.close();
    + * }
    + * 
    + */ +public class TinkerZipOutputStream extends FilterOutputStream implements ZipConstants { + /** + * Indicates deflated entries. + */ + public static final int DEFLATED = 8; + /** + * Indicates uncompressed entries. + */ + public static final int STORED = 0; + public static final byte[] BYTE = new byte[0]; + //zhangshaowen edit here, we just want the same time and modDate + //remove random fields + final static int TIME_CONST = 40691; + final static int MOD_DATE_CONST = 18698; + private static final int ZIP_VERSION_2_0 = 20; // Zip specification version 2.0. + private static final byte[] ZIP64_PLACEHOLDER_BYTES = + new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; + private final HashSet entries = new HashSet(); + /** + * Whether we force all entries in this archive to have a zip64 extended info record. + * This of course implies that the {@code currentEntryNeedsZip64} and + * {@code archiveNeedsZip64EocdRecord} are always {@code true}. + */ + private final boolean forceZip64; + private byte[] commentBytes = BYTE; + private int defaultCompressionMethod = DEFLATED; + // private int compressionLevel = Deflater.DEFAULT_COMPRESSION; + private ByteArrayOutputStream cDir = new ByteArrayOutputStream(); + private TinkerZipEntry currentEntry; + // private final CRC32 crc = new CRC32(); + private long offset = 0; + /** The charset-encoded name for the current entry. */ + private byte[] nameBytes; + /** The charset-encoded comment for the current entry. */ + private byte[] entryCommentBytes; + /** + * Whether this zip file needs a Zip64 EOCD record / zip64 EOCD record locator. This + * will be true if we wrote an entry whose size or compressed size was too large for + * the standard zip format or if we exceeded the maximum number of entries allowed + * in the standard format. + */ + private boolean archiveNeedsZip64EocdRecord; + /** + * Whether the current entry being processed needs a zip64 extended info record. This + * will be true if the entry is too large for the standard zip format or if the offset + * to the start of the current entry header is greater than 0xFFFFFFFF. + */ + private boolean currentEntryNeedsZip64; + /** + * Constructs a new {@code ZipOutputStream} that writes a zip file to the given + * {@code OutputStream}. + * + *

    UTF-8 will be used to encode the file comment, entry names and comments. + */ + public TinkerZipOutputStream(OutputStream os) { + this(os, false /* forceZip64 */); + } + /** + * @hide for testing only. + */ + public TinkerZipOutputStream(OutputStream os, boolean forceZip64) { + super(os); + this.forceZip64 = forceZip64; + } + + /** + * Sets the default compression method to be used when a {@code ZipEntry} doesn't + * explicitly specify a method. See {@link TinkerZipEntry#setMethod} for more details. + */ + /*public void setMethod(int method) { + if (method != STORED && method != DEFLATED) { + throw new IllegalArgumentException("Bad method: " + method); + } + defaultCompressionMethod = method; + }*/ + static long writeLongAsUint32(OutputStream os, long i) throws IOException { + // Write out the long value as an unsigned int + os.write((int) (i & 0xFF)); + os.write((int) (i >> 8) & 0xFF); + os.write((int) (i >> 16) & 0xFF); + os.write((int) (i >> 24) & 0xFF); + return i; + } + + static long writeLongAsUint64(OutputStream os, long i) throws IOException { + int i1 = (int) i; + os.write(i1 & 0xFF); + os.write((i1 >> 8) & 0xFF); + os.write((i1 >> 16) & 0xFF); + os.write((i1 >> 24) & 0xFF); + int i2 = (int) (i >> 32); + os.write(i2 & 0xFF); + os.write((i2 >> 8) & 0xFF); + os.write((i2 >> 16) & 0xFF); + os.write((i2 >> 24) & 0xFF); + return i; + } + + static int writeIntAsUint16(OutputStream os, int i) throws IOException { + os.write(i & 0xFF); + os.write((i >> 8) & 0xFF); + return i; + } + + /** + * Closes the current {@code ZipEntry}, if any, and the underlying output + * stream. If the stream is already closed this method does nothing. + * + * @throws IOException + * If an error occurs closing the stream. + */ + @Override + public void close() throws IOException { + // don't call super.close() because that calls finish() conditionally + if (out != null) { + finish(); + // def.end(); + out.close(); + out = null; + } + } + /*private void checkAndSetZip64Requirements(ZipEntry entry) { + final long totalBytesWritten = getBytesWritten(); + final long entriesWritten = entries.size(); + currentEntryNeedsZip64 = false; + if (forceZip64) { + currentEntryNeedsZip64 = true; + archiveNeedsZip64EocdRecord = true; + return; + } + // In this particular case, we'll write a zip64 eocd record locator and a zip64 eocd + // record but we won't actually need zip64 extended info records for any of the individual + // entries (unless they trigger the checks below). + if (entriesWritten == 64*1024 - 1) { + archiveNeedsZip64EocdRecord = true; + } + // Check whether we'll need to write out a zip64 extended info record in both the local file header + // and the central directory. In addition, we will need a zip64 eocd record locator + // and record to mark this archive as zip64. + // + // TODO: This is an imprecise check. When method != STORED it's possible that the compressed + // size will be (slightly) larger than the actual size. How can we improve this ? + if (totalBytesWritten > Zip64.MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE || + (entry.getSize() > Zip64.MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE)) { + currentEntryNeedsZip64 = true; + archiveNeedsZip64EocdRecord = true; + } + }*/ + + /** + * Closes the current {@code ZipEntry}. Any entry terminal data is written + * to the underlying stream. + * + * @throws IOException + * If an error occurs closing the entry. + */ + public void closeEntry() throws IOException { + checkOpen(); + if (currentEntry == null) { + return; + } + /*if (currentEntry.getMethod() == DEFLATED) { + super.finish(); + } + // Verify values for STORED types + if (currentEntry.getMethod() == STORED) { + if (crc.getValue() != currentEntry.crc) { + throw new ZipException("CRC mismatch"); + } + if (currentEntry.size != crc.tbytes) { + throw new ZipException("Size mismatch"); + } + }*/ + long curOffset = LOCHDR; + // Write the DataDescriptor + if (currentEntry.getMethod() != STORED) { + curOffset += EXTHDR; + // Data descriptor signature and CRC are 4 bytes each for both zip and zip64. + writeLongAsUint32(out, EXTSIG); + /*writeLongAsUint32(out, currentEntry.crc = crc.getValue()); + currentEntry.compressedSize = def.getBytesWritten(); + currentEntry.size = def.getBytesRead();*/ + writeLongAsUint32(out, currentEntry.crc); + /*if (currentEntryNeedsZip64) { + // We need an additional 8 bytes to store 8 byte compressed / uncompressed + // sizes. + curOffset += 8; + writeLongAsUint64(out, currentEntry.compressedSize); + writeLongAsUint64(out, currentEntry.size); + } else { + writeLongAsUint32(out, currentEntry.compressedSize); + writeLongAsUint32(out, currentEntry.size); + }*/ + writeLongAsUint32(out, currentEntry.compressedSize); + writeLongAsUint32(out, currentEntry.size); + } + // Update the CentralDirectory + // http://www.pkware.com/documents/casestudies/APPNOTE.TXT + int flags = currentEntry.getMethod() == STORED ? 0 : TinkerZipFile.GPBF_DATA_DESCRIPTOR_FLAG; + // Since gingerbread, we always set the UTF-8 flag on individual files if appropriate. + // Some tools insist that the central directory have the UTF-8 flag. + // http://code.google.com/p/android/issues/detail?id=20214 + flags |= TinkerZipFile.GPBF_UTF8_FLAG; + writeLongAsUint32(cDir, CENSIG); + writeIntAsUint16(cDir, ZIP_VERSION_2_0); // Version this file was made by. + writeIntAsUint16(cDir, ZIP_VERSION_2_0); // Minimum version needed to extract. + writeIntAsUint16(cDir, flags); + writeIntAsUint16(cDir, currentEntry.getMethod()); + writeIntAsUint16(cDir, currentEntry.time); + writeIntAsUint16(cDir, currentEntry.modDate); + // writeLongAsUint32(cDir, crc.getValue()); + writeLongAsUint32(cDir, currentEntry.crc); + if (currentEntry.getMethod() == DEFLATED) { + /*currentEntry.setCompressedSize(def.getBytesWritten()); + currentEntry.setSize(def.getBytesRead());*/ + curOffset += currentEntry.getCompressedSize(); + } else { + /*currentEntry.setCompressedSize(crc.tbytes); + currentEntry.setSize(crc.tbytes);*/ + curOffset += currentEntry.getSize(); + } + /*if (currentEntryNeedsZip64) { + // Refresh the extended info with the compressed size / size before + // writing it to the central directory. + Zip64.refreshZip64ExtendedInfo(currentEntry); + // NOTE: We would've written out the zip64 extended info locator to the entry + // extras while constructing the local file header. There's no need to do it again + // here. If we do, there will be a size mismatch since we're calculating offsets + // based on the *current* size of the extra data and not based on the size + // at the point of writing the LFH. + writeLongAsUint32(cDir, Zip64.MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE); + writeLongAsUint32(cDir, Zip64.MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE); + } else { + writeLongAsUint32(cDir, currentEntry.getCompressedSize()); + writeLongAsUint32(cDir, currentEntry.getSize()); + }*/ + writeLongAsUint32(cDir, currentEntry.getCompressedSize()); + writeLongAsUint32(cDir, currentEntry.getSize()); + curOffset += writeIntAsUint16(cDir, nameBytes.length); + if (currentEntry.extra != null) { + curOffset += writeIntAsUint16(cDir, currentEntry.extra.length); + } else { + writeIntAsUint16(cDir, 0); + } + writeIntAsUint16(cDir, entryCommentBytes.length); // Comment length. + writeIntAsUint16(cDir, 0); // Disk Start + writeIntAsUint16(cDir, 0); // Internal File Attributes + writeLongAsUint32(cDir, 0); // External File Attributes + /*if (currentEntryNeedsZip64) { + writeLongAsUint32(cDir, Zip64.MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE); + } else { + writeLongAsUint32(cDir, currentEntry.localHeaderRelOffset); + }*/ + writeLongAsUint32(cDir, currentEntry.localHeaderRelOffset); + cDir.write(nameBytes); + nameBytes = null; + if (currentEntry.extra != null) { + cDir.write(currentEntry.extra); + } + offset += curOffset; + if (entryCommentBytes.length > 0) { + cDir.write(entryCommentBytes); + entryCommentBytes = BYTE; + } + currentEntry = null; + /*crc.reset(); + def.reset(); + done = false;*/ + } + /** + * Sets the compression level to be used + * for writing entry data. + */ + /*public void setLevel(int level) { + if (level < Deflater.DEFAULT_COMPRESSION || level > Deflater.BEST_COMPRESSION) { + throw new IllegalArgumentException("Bad level: " + level); + } + compressionLevel = level; + }*/ + + /** + * Indicates that all entries have been written to the stream. Any terminal + * information is written to the underlying stream. + * + * @throws IOException + * if an error occurs while terminating the stream. + */ + // @Override + public void finish() throws IOException { + // TODO: is there a bug here? why not checkOpen? + if (out == null) { + throw new IOException("Stream is closed"); + } + if (cDir == null) { + return; + } + if (entries.isEmpty()) { + throw new ZipException("No entries"); + } + if (currentEntry != null) { + closeEntry(); + } + int cdirEntriesSize = cDir.size(); + /*if (archiveNeedsZip64EocdRecord) { + Zip64.writeZip64EocdRecordAndLocator(cDir, entries.size(), offset, cdirEntriesSize); + }*/ + // Write Central Dir End + writeLongAsUint32(cDir, ENDSIG); + writeIntAsUint16(cDir, 0); // Disk Number + writeIntAsUint16(cDir, 0); // Start Disk + // Instead of trying to figure out *why* this archive needed a zip64 eocd record, + // just delegate all these values to the zip64 eocd record. + if (archiveNeedsZip64EocdRecord) { + writeIntAsUint16(cDir, 0xFFFF); // Number of entries + writeIntAsUint16(cDir, 0xFFFF); // Number of entries + writeLongAsUint32(cDir, 0xFFFFFFFF); // Size of central dir + writeLongAsUint32(cDir, 0xFFFFFFFF); // Offset of central dir; + } else { + writeIntAsUint16(cDir, entries.size()); // Number of entries + writeIntAsUint16(cDir, entries.size()); // Number of entries + writeLongAsUint32(cDir, cdirEntriesSize); // Size of central dir + writeLongAsUint32(cDir, offset); // Offset of central dir + } + writeIntAsUint16(cDir, commentBytes.length); + if (commentBytes.length > 0) { + cDir.write(commentBytes); + } + // Write the central directory. + cDir.writeTo(out); + cDir = null; + } + + /** + * Writes entry information to the underlying stream. Data associated with + * the entry can then be written using {@code write()}. After data is + * written {@code closeEntry()} must be called to complete the writing of + * the entry to the underlying stream. + * + * @param ze + * the {@code ZipEntry} to store. + * @throws IOException + * If an error occurs storing the entry. + * @see #write + */ + public void putNextEntry(TinkerZipEntry ze) throws IOException { + if (currentEntry != null) { + closeEntry(); + } + // Did this ZipEntry specify a method, or should we use the default? + int method = ze.getMethod(); + if (method == -1) { + method = defaultCompressionMethod; + } + // If the method is STORED, check that the ZipEntry was configured appropriately. + if (method == STORED) { + if (ze.getCompressedSize() == -1) { + ze.setCompressedSize(ze.getSize()); + } else if (ze.getSize() == -1) { + ze.setSize(ze.getCompressedSize()); + } + if (ze.getCrc() == -1) { + throw new ZipException("STORED entry missing CRC"); + } + if (ze.getSize() == -1) { + throw new ZipException("STORED entry missing size"); + } + if (ze.size != ze.compressedSize) { + throw new ZipException("STORED entry size/compressed size mismatch"); + } + } + checkOpen(); + // checkAndSetZip64Requirements(ze); + + //zhangshaowen edit here, we just want the same time and modDate + ze.comment = null; + ze.extra = null; + ze.time = TIME_CONST; + ze.modDate = MOD_DATE_CONST; + + nameBytes = ze.name.getBytes(StandardCharsets.UTF_8); + checkSizeIsWithinShort("Name", nameBytes); + entryCommentBytes = BYTE; + if (ze.comment != null) { + entryCommentBytes = ze.comment.getBytes(StandardCharsets.UTF_8); + // The comment is not written out until the entry is finished, but it is validated here + // to fail-fast. + checkSizeIsWithinShort("Comment", entryCommentBytes); + } + // def.setLevel(compressionLevel); + ze.setMethod(method); + currentEntry = ze; + + currentEntry.localHeaderRelOffset = offset; + entries.add(currentEntry.name); + // Local file header. + // http://www.pkware.com/documents/casestudies/APPNOTE.TXT + int flags = (method == STORED) ? 0 : TinkerZipFile.GPBF_DATA_DESCRIPTOR_FLAG; + // Java always outputs UTF-8 filenames. (Before Java 7, the RI didn't set this flag and used + // modified UTF-8. From Java 7, when using UTF_8 it sets this flag and uses normal UTF-8.) + flags |= TinkerZipFile.GPBF_UTF8_FLAG; + writeLongAsUint32(out, LOCSIG); // Entry header + writeIntAsUint16(out, ZIP_VERSION_2_0); // Minimum version needed to extract. + writeIntAsUint16(out, flags); + writeIntAsUint16(out, method); + + //zhangshaowen edit here, we just want the same time and modDate +// if (currentEntry.getTime() == -1) { +// currentEntry.setTime(System.currentTimeMillis()); +// } + writeIntAsUint16(out, currentEntry.time); + writeIntAsUint16(out, currentEntry.modDate); + if (method == STORED) { + writeLongAsUint32(out, currentEntry.crc); + /*if (currentEntryNeedsZip64) { + // NOTE: According to the spec, we're allowed to use these fields under zip64 + // as long as the sizes are <= 4G (and omit writing the zip64 extended information header). + // + // For simplicity, we write the zip64 extended info here even if we only need it + // in the central directory (i.e, the case where we're turning on zip64 because the + // offset to this entries LFH is > 0xFFFFFFFF). + out.write(ZIP64_PLACEHOLDER_BYTES); // compressed size + out.write(ZIP64_PLACEHOLDER_BYTES); // uncompressed size + } else { + writeLongAsUint32(out, currentEntry.size); + writeLongAsUint32(out, currentEntry.size); + }*/ + writeLongAsUint32(out, currentEntry.size); + writeLongAsUint32(out, currentEntry.size); + } else { + writeLongAsUint32(out, 0); + writeLongAsUint32(out, 0); + writeLongAsUint32(out, 0); + } + writeIntAsUint16(out, nameBytes.length); + /*if (currentEntryNeedsZip64) { + Zip64.insertZip64ExtendedInfoToExtras(currentEntry); + }*/ + if (currentEntry.extra != null) { + writeIntAsUint16(out, currentEntry.extra.length); + } else { + writeIntAsUint16(out, 0); + } + out.write(nameBytes); + if (currentEntry.extra != null) { + out.write(currentEntry.extra); + } + } + + /** + * Sets the comment associated with the file being written. See {@link TinkerZipFile#getComment}. + * @throws IllegalArgumentException if the comment is >= 64 Ki encoded bytes. + */ + public void setComment(String comment) { + if (comment == null) { + this.commentBytes = BYTE; + return; + } + byte[] newCommentBytes = comment.getBytes(StandardCharsets.UTF_8); + checkSizeIsWithinShort("Comment", newCommentBytes); + this.commentBytes = newCommentBytes; + } + + /** + * Writes data for the current entry to the underlying stream. + * + * @throws IOException + * If an error occurs writing to the stream + */ + @Override + public void write(byte[] buffer, int offset, int byteCount) throws IOException { + Arrays.checkOffsetAndCount(buffer.length, offset, byteCount); + if (currentEntry == null) { + throw new ZipException("No active entry"); + } + /*final long totalBytes = crc.tbytes + byteCount; + if ((totalBytes > Zip64.MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE) && !currentEntryNeedsZip64) { + throw new IOException("Zip entry size (" + totalBytes + + " bytes) cannot be represented in the zip format (needs Zip64)." + + " Set the entry length using ZipEntry#setLength to use Zip64 where necessary."); + }*/ + if (currentEntry.getMethod() == STORED) { + out.write(buffer, offset, byteCount); + } else { + out.write(buffer, offset, byteCount); + } + // crc.update(buffer, offset, byteCount); + } + private void checkOpen() throws IOException { + if (cDir == null) { + throw new IOException("Stream is closed"); + } + } + private void checkSizeIsWithinShort(String property, byte[] bytes) { + if (bytes.length > 0xffff) { + throw new IllegalArgumentException(property + + " too long in UTF-8:" + + bytes.length + + " bytes"); + } + } + /*private long getBytesWritten() { + // This cast is somewhat messy but less error prone than keeping an + // CountingOutputStream reference around in addition to the FilterOutputStream's + // out. + return ((CountingOutputStream) out).getCount(); + }*/ +} diff --git a/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/ZipConstants.java b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/ZipConstants.java new file mode 100644 index 00000000..2bb0e394 --- /dev/null +++ b/tinker-commons/src/main/java/com/tencent/tinker/commons/ziputil/ZipConstants.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.commons.ziputil; + +/** + * modify by zhangshaowen on 16/6/7. + * + * Do not add constants to this interface! It's implemented by the classes + * in this package whose names start "Zip", and the constants are thereby + * public API. + */ +interface ZipConstants { + long LOCSIG = 0x4034b50, EXTSIG = 0x8074b50, + CENSIG = 0x2014b50, ENDSIG = 0x6054b50; + int LOCHDR = 30, EXTHDR = 16, CENHDR = 46, ENDHDR = 22, + LOCVER = 4, LOCFLG = 6, LOCHOW = 8, LOCTIM = 10, LOCCRC = 14, + LOCSIZ = 18, LOCLEN = 22, LOCNAM = 26, LOCEXT = 28, EXTCRC = 4, + EXTSIZ = 8, EXTLEN = 12, CENVEM = 4, CENVER = 6, CENFLG = 8, + CENHOW = 10, CENTIM = 12, CENCRC = 16, CENSIZ = 20, CENLEN = 24, + CENNAM = 28, CENEXT = 30, CENCOM = 32, CENDSK = 34, CENATT = 36, + CENATX = 38, CENOFF = 42, ENDSUB = 8, ENDTOT = 10, ENDSIZ = 12, + ENDOFF = 16, ENDCOM = 20; +} diff --git a/tinker-sample-android/.gitignore b/tinker-sample-android/.gitignore new file mode 100644 index 00000000..c6cbe562 --- /dev/null +++ b/tinker-sample-android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/tinker-sample-android/app/.gitignore b/tinker-sample-android/app/.gitignore new file mode 100644 index 00000000..c125ebd4 --- /dev/null +++ b/tinker-sample-android/app/.gitignore @@ -0,0 +1,3 @@ +/build + +/version.properties diff --git a/tinker-sample-android/app/build.gradle b/tinker-sample-android/app/build.gradle new file mode 100644 index 00000000..39c944dd --- /dev/null +++ b/tinker-sample-android/app/build.gradle @@ -0,0 +1,354 @@ +apply plugin: 'com.android.application' + + + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile "com.android.support:appcompat-v7:23.1.1" + compile("com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}") + compile("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}") + compile "com.android.support:multidex:1.0.1" + + //use to test multiDex +// compile group: 'com.google.guava', name: 'guava', version: '19.0' +// compile "org.scala-lang:scala-library:2.11.7" +} + +def gitSha() { + return 'git rev-parse --short HEAD'.execute().text.trim() +} + +def javaVersion = JavaVersion.VERSION_1_7 + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.2" + + compileOptions { + sourceCompatibility javaVersion + targetCompatibility javaVersion + } + //recommend + dexOptions { + jumboMode = true + } + + signingConfigs { + release { + try { + storeFile file("./keystore/release.keystore") + storePassword "testres" + keyAlias "testres" + keyPassword "testres" + } catch (ex) { + throw new InvalidUserDataException(ex.toString()) + } + } + + debug { + storeFile file("./keystore/debug.keystore") + } + } + + defaultConfig { + applicationId "tinker.sample.android" + minSdkVersion 10 + targetSdkVersion 22 + versionCode 1 + versionName "1.0.0" + /** + * you can use multiDex and install it in your ApplicationLifeCycle implement + */ + multiDexEnabled true + /** + * not like proguard, multiDexKeepProguard is not a list, so we can't just + * add for you in our task. you can copy tinker keep rules at + * build/intermediates/tinker_intermediates/tinker_multidexkeep.pro + */ + multiDexKeepProguard file("keep_in_main_dex.txt") + /** + * buildConfig can change during patch! + * we can use the newly value when patch + */ + buildConfigField "String", "MESSAGE", "\"I am the base apk\"" +// buildConfigField "String", "MESSAGE", "\"I am the patch apk\"" + /** + * client version would update with patch + * so we can get the newly git version easily! + */ + buildConfigField "String", "CLIENTVERSION", "\"${gitSha()}\"" + buildConfigField "String", "PLATFORM", "\"all\"" + } +// //use to test flavors support +// productFlavors { +// flavor1 { +// applicationId 'tinker.sample.android.flavor1' +// } +// +// flavor2 { +// applicationId 'tinker.sample.android.flavor2' +// } +// } + + buildTypes { + release { + minifyEnabled true + signingConfig signingConfigs.release + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + debuggable true + minifyEnabled false + signingConfig signingConfigs.debug + } + } + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } +} + +def bakPath = file("${buildDir}/bakApk/") + +/** + * you can use assembleRelease to build you base apk + * use tinkerPatchRelease -POLD_APK= -PAPPLY_MAPPING= -PAPPLY_RESOURCE= to build patch + * add apk from the build/bakApk + */ +ext { + //for some reason, you may want to ignore tinkerBuild, such as instant run debug build? + tinkerEnabled = true + //you should bak the following files + //old apk file to build patch apk + tinkerOldApkPath = "${bakPath}/app-debug-0919-20-32-57.apk" + //proguard mapping file to build patch apk + tinkerApplyMappingPath = "${bakPath}/" + //resource R.txt to build patch apk, must input if there is resource changed + tinkerApplyResourcePath = "${bakPath}/" +} + + +def getOldApkPath() { + return hasProperty("OLD_APK") ? OLD_APK : ext.tinkerOldApkPath +} + +def getApplyMappingPath() { + return hasProperty("APPLY_MAPPING") ? APPLY_MAPPING : ext.tinkerApplyMappingPath +} + +def getApplyResourceMappingPath() { + return hasProperty("APPLY_RESOURCE") ? APPLY_RESOURCE : ext.tinkerApplyResourcePath +} + +def getTinkerIdValue() { + return hasProperty("TINKER_ID") ? TINKER_ID : gitSha() +} + +def buildWithTinker() { + return hasProperty("TINKER_ENABLE") ? TINKER_ENABLE : ext.tinkerEnabled +} + +if (buildWithTinker()) { + apply plugin: 'com.tencent.tinker.patch' + + tinkerPatch { + /** + * necessary,default 'null' + * the old apk path, use to diff with the new apk to build + * add apk from the build/bakApk + */ + oldApk = getOldApkPath() + /** + * optional,default 'false' + * there are some cases we may get some warnings + * if ignoreWarning is true, we would just assert the patch process + * case 1: minSdkVersion is below 14, but you are using dexMode with raw. + * it must be crash when load. + * case 2: newly added Android Component in AndroidManifest.xml, + * it must be crash when load. + * case 3: loader classes in dex.loader{} are not keep in the main dex, + * it must be let tinker not work. + * case 4: loader classes in dex.loader{} changes, + * loader classes is ues to load patch dex. it is useless to change them. + * it won't crash, but these changes can't effect. you may ignore it + * case 5: resources.arsc has changed, but we don't use applyResourceMapping to build + */ + ignoreWarning = false + /** + * optional,default 'true' + * whether sign the patch file + * if not, you must do yourself. otherwise it can't check success during the patch loading + * we will use the sign config with your build type + */ + useSign = true + + /** + * Warning, applyMapping will affect the normal android build! + */ + buildConfig { + /** + * optional,default 'null' + * if we use tinkerPatch to build the patch apk, you'd better to apply the old + * apk mapping file if minifyEnabled is enable! + * Warning: + * you must be careful that it will affect the normal assemble build! + */ + applyMapping = getApplyMappingPath() + /** + * optional,default 'null' + * It is nice to keep the resource id from R.txt file to reduce java changes + */ + applyResourceMapping = getApplyResourceMappingPath() + + /** + * necessary,default 'null' + * because we don't want to check the base apk with md5 in the runtime(it is slow) + * tinkerId is use to identify the unique base apk when the patch is tried to apply. + * we can use git rev, svn rev or simply versionCode. + * we will gen the tinkerId in your manifest automatic + */ + tinkerId = getTinkerIdValue() + } + + dex { + /** + * optional,default 'jar' + * only can be 'raw' or 'jar'. for raw, we would keep its original format + * for jar, we would repack dexes with zip format. + * if you want to support below 14, you must use jar + * or you want to save rom or check quicker, you can use raw mode also + */ + dexMode = "jar" + /** + * necessary,default '[]' + * what dexes in apk are expected to deal with tinkerPatch + * it support * or ? pattern. + */ + pattern = ["classes*.dex", + "assets/secondary-dex-?.jar"] + /** + * necessary,default '[]' + * Warning, it is very very important, loader classes can't change with patch. + * thus, they will be removed from patch dexes. + * you must put the following class into main dex. + * Simply, you should add your own application {@code tinker.sample.android.SampleApplication} + * own tinkerLoader, and the classes you use in them + * + */ + loader = ["com.tencent.tinker.loader.*", + "tinker.sample.android.SampleApplication", + //use sample, let BaseBuildInfo unchangeable with tinker + "tinker.sample.android.app.BaseBuildInfo" + ] + } + + lib { + /** + * optional,default '[]' + * what library in apk are expected to deal with tinkerPatch + * it support * or ? pattern. + * for library in assets, we would just recover them in the patch directory + * you can get them in TinkerLoadResult with Tinker + */ + pattern = ["lib/armeabi/*.so"] + } + + res { + /** + * optional,default '[]' + * what resource in apk are expected to deal with tinkerPatch + * it support * or ? pattern. + * you must include all your resources in apk here, + * otherwise, they won't repack in the new apk resources. + */ + pattern = ["res/*", "assets/*", "resources.arsc", "AndroidManifest.xml"] + + /** + * optional,default '[]' + * the resource file exclude patterns, ignore add, delete or modify resource change + * it support * or ? pattern. + * Warning, we can only use for files no relative with resources.arsc + */ + ignoreChange = ["assets/sample_meta.txt"] + + /** + * default 100kb + * for modify resource, if it is larger than 'largeModSize' + * we would like to use bsdiff algorithm to reduce patch file size + */ + largeModSize = 100 + } + + packageConfig { + /** + * optional,default 'TINKER_ID, TINKER_ID_VALUE' 'NEW_TINKER_ID, NEW_TINKER_ID_VALUE' + * package meta file gen. path is assets/package_meta.txt in patch file + * you can use securityCheck.getPackageProperties() in your ownPackageCheck method + * or TinkerLoadResult.getPackageConfigByName + * we will get the TINKER_ID from the old apk manifest for you automatic, + * other config files (such as patchMessage below)is not necessary + */ + configField("patchMessage", "tinker is sample to use") + /** + * just a sample case, you can use such as sdkVersion, brand, channel... + * you can parse it in the SamplePatchListener. + * Then you can use patch conditional! + */ + configField("platform", "all") + + } + //or you can add config filed outside, or get meta value from old apk + //project.tinkerPatch.packageConfig.configField("test1", project.tinkerPatch.packageConfig.getMetaDataFromOldApk("Test")) + //project.tinkerPatch.packageConfig.configField("test2", "sample") + + /** + * if you don't use zipArtifact or path, we just use 7za to try + */ + sevenZip { + /** + * optional,default '7za' + * the 7zip artifact path, it will use the right 7za with your platform + */ + zipArtifact = "com.tencent.tinker:seven-zip:1.0.0" + /** + * optional,default '7za' + * you can specify the 7za path yourself, it will overwrite the zipArtifact value + */ +// path = "/usr/local/bin/7za" + } + } + +/** + * task type, you want to bak + */ + def taskName = "debug" +/** + * bak apk and mapping + */ + tasks.getByName("assemble${taskName.capitalize()}") { + it.doLast { + copy { + def date = new Date().format("MMdd-HH-mm-ss") + from "${buildDir}/outputs/apk/${project.getName()}-${taskName}.apk" + into bakPath + rename { String fileName -> + fileName.replace("${project.getName()}-${taskName}.apk", "${project.getName()}-${taskName}-${date}.apk") + } + + from "${buildDir}/outputs/mapping/${taskName}/mapping.txt" + into bakPath + rename { String fileName -> + fileName.replace("mapping.txt", "${project.getName()}-${taskName}-${date}-mapping.txt") + } + + from "${buildDir}/intermediates/symbols/${taskName}/R.txt" + into bakPath + rename { String fileName -> + fileName.replace("R.txt", "${project.getName()}-${taskName}-${date}-R.txt") + } + } + } + } +} diff --git a/tinker-sample-android/app/keep_in_main_dex.txt b/tinker-sample-android/app/keep_in_main_dex.txt new file mode 100644 index 00000000..12c1dcf5 --- /dev/null +++ b/tinker-sample-android/app/keep_in_main_dex.txt @@ -0,0 +1,26 @@ +# you can copy the tinker keep rule at +# build/intermediates/tinker_intermediates/tinker_multidexkeep.pro + +-keep class com.tencent.tinker.loader.** { + *; +} + +-keep class tinker.sample.android.app.SampleApplication { + *; +} + +-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle { + *; +} + +-keep public class * extends com.tencent.tinker.loader.TinkerLoader { + *; +} + +-keep public class * extends com.tencent.tinker.loader.app.TinkerApplication { + *; +} + +# here, it is your own keep rules. +# you must be careful that the class name you write won't be proguard +# but the tinker class above is OK, we have already keep for you! diff --git a/tinker-sample-android/app/keystore/debug.keystore b/tinker-sample-android/app/keystore/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..7638521399fe70417333dcb179fea94e8167c6e6 GIT binary patch literal 1268 zcmezO_TO6u1_mY|W&~sY#JrTE{LGY;)TGk%?9@u2xQ~Q(mpD+(Zi6PK?FM{oT-t1m zER0%Af{cu;3@lAdi&G}P$=3Sw{K5a6#gfOOy}71;W=)DZ_x0BKGj&CR&cAxv{(d~j zaJHoU-uD;F*Qh-xXX~imlTv?UZtrwWCyfKrtv4EOB`nsK3M`oB#mZ4UYrnHZu+Gnw ziTwHdVI*kiH%_VYd2-0n9_|pRwGq0F6AG2^Ro;W z+w*TQZE5-PyZ)L#=gXMbm-ifR+BxR8EdL;PV@+A^v^2qoTKlIe$%||}G%q80wU0?+ zpKHK7hagwwzfEthpIvawaN4Z*k9D_~YFJ9ODnEYYyxa7WZq8LM*27}24?Yj+e8hcV zMnT7Op82<)geqk^KCG8)PTe2h?9TV_TiuS0Hp{hrg#xQV%^4Y3_)& z@^Y9xh2yO9zeiIyCZ9@+aDMjarb~a){LNh#s*IZTF2*)6JWbq|u*h5KcK@U!PZxim zvdl}uy8F~Th1pDxn^rJv@@<`cdD4tr3;lYhccRugH_v4!J&{wH9{OFCeNVsd#TEa) znF(H4>$}|6;o9*tJNIi&KIF>1O+R*~J--rD)YdUpo>ic^j1POHrqC@EdKWK?M5}PQ~u8Fb_WIXy~{(qj%e*=y9B1KDu{}x0n`}@ z_qRMuyiClD42;Om0|p^8&|TFvhcC`7UHGOy;HEYItedP`j{mUP}c>G`D-H}tM$D~}V)ys$I8;zj7h>Ff13 zcRlkuR{DUU=*l`}kvgddC+3R2b=!K;)znNsYsc%(=MOse9sJ}RnAZGe&XHoZmHFSy YJ{LYbZ}sQzK7*CsT3181K5q8|0HkUf!~g&Q literal 0 HcmV?d00001 diff --git a/tinker-sample-android/app/keystore/release.keystore b/tinker-sample-android/app/keystore/release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..c32e009e485f63cccf211ae19714682621986820 GIT binary patch literal 4095 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

  • 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 UfV9Oxq;E33481PN0Hxml0vXoDX8-^I literal 0 HcmV?d00001 diff --git a/tinker-sample-android/app/proguard-rules.pro b/tinker-sample-android/app/proguard-rules.pro new file mode 100644 index 00000000..36186f49 --- /dev/null +++ b/tinker-sample-android/app/proguard-rules.pro @@ -0,0 +1,19 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/zhangshaowen/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} +-keepattributes SourceFile,LineNumberTable + diff --git a/tinker-sample-android/app/src/androidTest/java/tinker/sample/android/ApplicationTest.java b/tinker-sample-android/app/src/androidTest/java/tinker/sample/android/ApplicationTest.java new file mode 100644 index 00000000..7ef9c04b --- /dev/null +++ b/tinker-sample-android/app/src/androidTest/java/tinker/sample/android/ApplicationTest.java @@ -0,0 +1,29 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/tinker-sample-android/app/src/main/AndroidManifest.xml b/tinker-sample-android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..9676eb94 --- /dev/null +++ b/tinker-sample-android/app/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/Log/MyLogImp.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/Log/MyLogImp.java new file mode 100644 index 00000000..429accb9 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/Log/MyLogImp.java @@ -0,0 +1,96 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.Log; + +import android.util.Log; + +import com.tencent.tinker.lib.util.TinkerLog; + +/** + * Created by zhangshaowen on 16/6/3. + */ +public class MyLogImp implements TinkerLog.TinkerLogImp { + private static final String TAG = "Tinker.MyLogImp"; + + public static final int LEVEL_VERBOSE = 0; + public static final int LEVEL_DEBUG = 1; + public static final int LEVEL_INFO = 2; + public static final int LEVEL_WARNING = 3; + public static final int LEVEL_ERROR = 4; + public static final int LEVEL_NONE = 5; + private static int level = LEVEL_VERBOSE; + + public static int getLogLevel() { + return level; + } + + public static void setLevel(final int level) { + MyLogImp.level = level; + android.util.Log.w(TAG, "new log level: " + level); + + } + + @Override + public void v(String s, String s1, Object... objects) { + if (level <= LEVEL_VERBOSE) { + final String log = objects == null ? s1 : String.format(s1, objects); + android.util.Log.v(s, log); + } + } + + @Override + public void i(String s, String s1, Object... objects) { + if (level <= LEVEL_INFO) { + final String log = objects == null ? s1 : String.format(s1, objects); + android.util.Log.i(s, log); + } + } + + @Override + public void w(String s, String s1, Object... objects) { + if (level <= LEVEL_WARNING) { + final String log = objects == null ? s1 : String.format(s1, objects); + android.util.Log.w(s, log); + } + } + + @Override + public void d(String s, String s1, Object... objects) { + if (level <= LEVEL_DEBUG) { + final String log = objects == null ? s1 : String.format(s1, objects); + android.util.Log.d(s, log); + } + } + + @Override + public void e(String s, String s1, Object... objects) { + if (level <= LEVEL_ERROR) { + final String log = objects == null ? s1 : String.format(s1, objects); + android.util.Log.e(s, log); + } + } + + @Override + public void printErrStackTrace(String s, Throwable throwable, String s1, Object... objects) { + String log = objects == null ? s1 : String.format(s1, objects); + if (log == null) { + log = ""; + } + log = log + " " + Log.getStackTraceString(throwable); + android.util.Log.e(s, log); + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/app/BaseBuildInfo.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/BaseBuildInfo.java new file mode 100644 index 00000000..4ffa7d4d --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/BaseBuildInfo.java @@ -0,0 +1,25 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.app; + +/** + * Created by zhangshaowen on 16/6/30. + * we add BaseBuildInfo to loader pattern, so it won't change with patch! + */ +public class BaseBuildInfo { + public static String TEST_MESSAGE = "I won't change with tinker patch!"; +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/app/BuildInfo.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/BuildInfo.java new file mode 100644 index 00000000..58ea3527 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/BuildInfo.java @@ -0,0 +1,37 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.app; + +import tinker.sample.android.BuildConfig; + +/** + * Created by zhangshaowen on 16/6/30. + * we use BuildInfo instead of {@link BuildInfo} to make less change + */ +public class BuildInfo { + /** + * they are not final, so they won't change with the BuildConfig values! + */ + public static boolean DEBUG = BuildConfig.DEBUG; + public static String VERSION_NAME = BuildConfig.VERSION_NAME; + public static int VERSION_CODE = BuildConfig.VERSION_CODE; + + public static String MESSAGE = BuildConfig.MESSAGE; + public static String CLIENTVERSION = BuildConfig.CLIENTVERSION; + public static String PLATFORM = BuildConfig.PLATFORM; + +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/app/MainActivity.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/MainActivity.java new file mode 100644 index 00000000..bc55dc62 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/MainActivity.java @@ -0,0 +1,155 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.app; + +import android.app.AlertDialog; +import android.content.Context; +import android.graphics.Typeface; +import android.os.Bundle; +import android.os.Environment; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.tinker.TinkerInstaller; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import tinker.sample.android.R; +import tinker.sample.android.util.Utils; + +public class MainActivity extends AppCompatActivity { + private static final String TAG = "Tinker.MainActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Log.e(TAG, "i am on onCreate classloader:" + MainActivity.class.getClassLoader().toString()); + //test resource change + Log.e(TAG, "i am on onCreate string:" + getResources().getString(R.string.test_resource)); +// Log.e(TAG, "i am on patch onCreate"); + + Button loadPatchButton = (Button) findViewById(R.id.loadPatch); + + loadPatchButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk"); + } + }); + + Button loadLibraryButton = (Button) findViewById(R.id.loadLibrary); + + loadLibraryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //for lib/armeabi, just use TinkerInstaller.loadLibrary + TinkerInstaller.loadArmLibrary(getApplicationContext(), "stlport_shared"); +// TinkerInstaller.loadLibraryFromTinker(getApplicationContext(), "assets/x86", "stlport_shared"); + } + }); + + Button cleanPatchButton = (Button) findViewById(R.id.cleanPatch); + + cleanPatchButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Tinker.with(getApplicationContext()).cleanPatch(); + } + }); + + Button killSelfButton = (Button) findViewById(R.id.killSelf); + + killSelfButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + android.os.Process.killProcess(android.os.Process.myPid()); + } + }); + + Button buildInfoButton = (Button) findViewById(R.id.showInfo); + + buildInfoButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showInfo(MainActivity.this); + } + }); + } + + public boolean showInfo(Context context) { + // add more Build Info + final StringBuilder sb = new StringBuilder(); + Tinker tinker = Tinker.with(getApplicationContext()); + if (tinker.isTinkerLoaded()) { + sb.append(String.format("[patch is loaded] \n")); + sb.append(String.format("[buildConfig CLIENTVERSION] %s \n", BuildInfo.CLIENTVERSION)); + sb.append(String.format("[buildConfig MESSSAGE] %s \n", BuildInfo.MESSAGE)); + sb.append(String.format("[TINKER_ID] %s \n", tinker.getTinkerLoadResultIfPresent().getPackageConfigByName(ShareConstants.TINKER_ID))); + sb.append(String.format("[REAL TINKER_ID] %s \n", tinker.getTinkerLoadResultIfPresent().getTinkerID())); + sb.append(String.format("[packageConfig patchMessage] %s \n", tinker.getTinkerLoadResultIfPresent().getPackageConfigByName("patchMessage"))); + sb.append(String.format("[TINKER_ID Rom Space] %d k \n", tinker.getTinkerRomSpace())); + + } else { + sb.append(String.format("[patch is not loaded] \n")); + sb.append(String.format("[buildConfig CLIENTVERSION] %s \n", BuildInfo.CLIENTVERSION)); + sb.append(String.format("[buildConfig MESSSAGE] %s \n", BuildInfo.MESSAGE)); + sb.append(String.format("[TINKER_ID] %s \n", ShareTinkerInternals.getManifestTinkerID(getApplicationContext()))); + } + sb.append(String.format("[BaseBuildInfo Message] %s \n", BaseBuildInfo.TEST_MESSAGE)); + + final TextView v = new TextView(context); + v.setText(sb); + v.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + v.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10); + v.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + v.setTextColor(0xFF000000); + v.setTypeface(Typeface.MONOSPACE); + final int padding = 16; + v.setPadding(padding, padding, padding, padding); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setCancelable(true); + builder.setView(v); + final AlertDialog alert = builder.create(); + alert.show(); + return true; + } + + @Override + protected void onResume() { + Log.e(TAG, "i am on onResume"); +// Log.e(TAG, "i am on patch onResume"); + + super.onResume(); + Utils.setBackground(false); + + } + + @Override + protected void onPause() { + super.onPause(); + Utils.setBackground(true); + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java new file mode 100644 index 00000000..48ddaf4e --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/app/SampleApplicationLike.java @@ -0,0 +1,105 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.app; + +import android.annotation.TargetApi; +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.content.res.AssetManager; +import android.content.res.Resources; +import android.os.Build; +import android.support.multidex.MultiDex; + +import com.tencent.tinker.anno.DefaultLifeCycle; +import com.tencent.tinker.lib.tinker.TinkerInstaller; +import com.tencent.tinker.loader.app.ApplicationLifeCycle; +import com.tencent.tinker.loader.app.DefaultApplicationLike; +import com.tencent.tinker.loader.shareutil.ShareConstants; + +import tinker.sample.android.Log.MyLogImp; +import tinker.sample.android.util.SampleApplicationContext; +import tinker.sample.android.util.TinkerManager; + +/** + * because you can not use any other class in your application, we need to + * move your implement of Application to {@link ApplicationLifeCycle} + * As Application, all its direct reference class should be in the main dex. + * + * We use tinker-android-anno to make sure all your classes can be patched. + * + * application: if it is start with '.', we will add SampleApplicationLifeCycle's package name + * + * flags: + * TINKER_ENABLE_ALL: support dex, lib and resource + * TINKER_DEX_MASK: just support dex + * TINKER_NATIVE_LIBRARY_MASK: just support lib + * TINKER_RESOURCE_MASK: just support resource + * + * loaderClass: define the tinker loader class, we can just use the default TinkerLoader + * + * loadVerifyFlag: whether check files' md5 on the load time, defualt it is false. + * + * Created by zhangshaowen on 16/3/17. + */ +@SuppressWarnings("unused") +@DefaultLifeCycle(application = "tinker.sample.android.app.SampleApplication", + flags = ShareConstants.TINKER_ENABLE_ALL, + loadVerifyFlag = false) +public class SampleApplicationLike extends DefaultApplicationLike { + private static final String TAG = "Tinker.SampleApplicationLike"; + + public SampleApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, + long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent, + Resources[] resources, ClassLoader[] classLoader, AssetManager[] assetManager) { + super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent, resources, classLoader, assetManager); + } + + /** + * install multiDex before install tinker + * so we don't need to put the tinker lib classes in the main dex + * + * @param base + */ + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + @Override + public void onBaseContextAttached(Context base) { + super.onBaseContextAttached(base); + //you must install multiDex whatever tinker is installed! + MultiDex.install(base); + + SampleApplicationContext.application = getApplication(); + SampleApplicationContext.context = getApplication().getApplicationContext(); + TinkerManager.setTinkerApplicationLike(this); + TinkerManager.initFastCrashProtect(); + //should set before tinker is installed + TinkerManager.setUpgradeRetryEnable(true); + + //optional set logIml, or you can use default debug log + TinkerInstaller.setLogIml(new MyLogImp()); + + //installTinker after load multiDex + //or you can put com.tencent.tinker.** to main dex + TinkerManager.installTinker(this); + } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) { + getApplication().registerActivityLifecycleCallbacks(callback); + } + +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/crash/SampleUncaughtExceptionHandler.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/crash/SampleUncaughtExceptionHandler.java new file mode 100644 index 00000000..b98bbb4d --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/crash/SampleUncaughtExceptionHandler.java @@ -0,0 +1,140 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.crash; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.SystemClock; +import android.widget.Toast; + +import com.tencent.tinker.lib.tinker.TinkerApplicationHelper; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.app.ApplicationLike; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import tinker.sample.android.reporter.SampleTinkerReport; +import tinker.sample.android.util.TinkerManager; +import tinker.sample.android.util.Utils; + +/** + * optional, use dynamic configuration is better way + * for native crash, + *

    + * Created by zhangshaowen on 16/7/3. + * tinker's crash is caught by {@code LoadReporter.onLoadException} + * use {@code TinkerApplicationHelper} api, no need to install tinker! + */ +public class SampleUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { + private static final String TAG = "Tinker.SampleUncaughtExHandler"; + + private final Thread.UncaughtExceptionHandler ueh; + private static final long QUICK_CRASH_ELAPSE = 10 * 1000; + public static final int MAX_CRASH_COUNT = 3; + private static final String DALVIK_XPOSED_CRASH = "Class ref in pre-verified class resolved to unexpected implementation"; + + public SampleUncaughtExceptionHandler() { + ueh = Thread.getDefaultUncaughtExceptionHandler(); + } + + @Override + public void uncaughtException(Thread thread, Throwable ex) { + TinkerLog.e(TAG, "uncaughtException:" + ex.getMessage()); + tinkerFastCrashProtect(); + tinkerPreVerifiedCrashHandler(ex); + ueh.uncaughtException(thread, ex); + } + + /** + * Such as Xposed, if it try to load some class before we load from patch files. + * With dalvik, it will crash with "Class ref in pre-verified class resolved to unexpected implementation". + * With art, it may crash at some times. But we can't know the actual crash type. + * If it use Xposed, we can just clean patch or mention user to uninstall it. + */ + private void tinkerPreVerifiedCrashHandler(Throwable ex) { + if (Utils.isXposedExists(ex)) { + //method 1 + ApplicationLike applicationLike = TinkerManager.getTinkerApplicationLike(); + if (applicationLike == null || applicationLike.getApplication() == null) { + return; + } + + if (!TinkerApplicationHelper.isTinkerLoadSuccess(applicationLike)) { + return; + } + boolean isCausedByXposed = false; + //for art, we can't know the actually crash type + //art's xposed has not much people + if (ShareTinkerInternals.isVmArt()) { + isCausedByXposed = true; + } else if (ex instanceof IllegalAccessError && ex.getMessage().contains(DALVIK_XPOSED_CRASH)) { + //for dalvik, we know the actual crash type + isCausedByXposed = true; + } + + if (isCausedByXposed) { + SampleTinkerReport.onXposedCrash(); + TinkerLog.e(TAG, "have xposed: just clean tinker"); + //kill all other process to ensure that all process's code is the same. + ShareTinkerInternals.killAllOtherProcess(applicationLike.getApplication()); + + TinkerApplicationHelper.cleanPatch(applicationLike); + ShareTinkerInternals.setTinkerDisableWithSharedPreferences(applicationLike.getApplication()); + //method 2 + //or you can mention user to uninstall Xposed! + Toast.makeText(applicationLike.getApplication(), "please uninstall Xposed, illegal modify the app", Toast.LENGTH_LONG).show(); + } + } + } + + /** + * if tinker is load, and it crash more than MAX_CRASH_COUNT, then we just clean patch. + */ + private boolean tinkerFastCrashProtect() { + ApplicationLike applicationLike = TinkerManager.getTinkerApplicationLike(); + + if (applicationLike == null || applicationLike.getApplication() == null) { + return false; + } + if (!TinkerApplicationHelper.isTinkerLoadSuccess(applicationLike)) { + return false; + } + + final long elapsedTime = SystemClock.elapsedRealtime() - applicationLike.getApplicationStartElapsedTime(); + //this process may not install tinker, so we use TinkerApplicationHelper api + if (elapsedTime < QUICK_CRASH_ELAPSE) { + String currentVersion = TinkerApplicationHelper.getCurrentVersion(applicationLike); + if (ShareTinkerInternals.isNullOrNil(currentVersion)) { + return false; + } + + SharedPreferences sp = applicationLike.getApplication().getSharedPreferences(ShareConstants.TINKER_SHARE_PREFERENCE_CONFIG, Context.MODE_MULTI_PROCESS); + int fastCrashCount = sp.getInt(currentVersion, 0); + if (fastCrashCount >= MAX_CRASH_COUNT) { + SampleTinkerReport.onFastCrashProtect(); + TinkerApplicationHelper.cleanPatch(applicationLike); + TinkerLog.e(TAG, "tinker has fast crash more than %d, we just clean patch!", fastCrashCount); + return true; + } else { + sp.edit().putInt(currentVersion, ++fastCrashCount).commit(); + TinkerLog.e(TAG, "tinker has fast crash %d times", fastCrashCount); + } + } + + return false; + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java new file mode 100644 index 00000000..138f7725 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java @@ -0,0 +1,122 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.reporter; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.MessageQueue; +import android.widget.Toast; + +import com.tencent.tinker.lib.reporter.DefaultLoadReporter; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.tinker.TinkerInstaller; +import com.tencent.tinker.loader.shareutil.ShareConstants; + +import java.io.File; + +import tinker.sample.android.util.UpgradePatchRetry; +import tinker.sample.android.util.Utils; + +/** + * optional, you can just use DefaultLoadReporter + * Created by zhangshaowen on 16/4/13. + */ +public class SampleLoadReporter extends DefaultLoadReporter { + private Handler handler = new Handler(); + + public SampleLoadReporter(Context context) { + super(context); + } + + @Override + public void onLoadPatchListenerReceiveFail(final File patchFile, int errorCode, final boolean isUpgrade) { + super.onLoadPatchListenerReceiveFail(patchFile, errorCode, isUpgrade); + switch (errorCode) { + case ShareConstants.ERROR_PATCH_NOTEXIST: + Toast.makeText(context, "patch file is not exist", Toast.LENGTH_LONG).show(); + break; + case ShareConstants.ERROR_PATCH_RUNNING: + // try later + // only retry for upgrade patch + if (isUpgrade) { + handler.postDelayed(new Runnable() { + @Override + public void run() { + TinkerInstaller.onReceiveUpgradePatch(context, patchFile.getAbsolutePath()); + } + }, 60 * 1000); + } + break; + case Utils.ERROR_PATCH_ROM_SPACE: + Toast.makeText(context, "rom space is not enough", Toast.LENGTH_LONG).show(); + break; + } + SampleTinkerReport.onTryApplyFail(errorCode); + } + + @Override + public void onLoadResult(File patchDirectory, int loadCode, long cost) { + super.onLoadResult(patchDirectory, loadCode, cost); + switch (loadCode) { + case ShareConstants.ERROR_LOAD_OK: + SampleTinkerReport.onLoaded(cost); + break; + } + Looper.getMainLooper().myQueue().addIdleHandler(new MessageQueue.IdleHandler() { + @Override public boolean queueIdle() { + UpgradePatchRetry.getInstance(context).onPatchRetryLoad(); + return false; + } + }); + } + @Override + public void onLoadException(Throwable e, int errorCode) { + super.onLoadException(e, errorCode); + SampleTinkerReport.onLoadException(e, errorCode); + } + + @Override + public void onLoadFileMd5Mismatch(File file, int fileType) { + super.onLoadFileMd5Mismatch(file, fileType); + SampleTinkerReport.onLoadFileMisMatch(fileType); + } + + @Override + public void onLoadFileNotFound(File file, int fileType, boolean isDirectory) { + super.onLoadFileNotFound(file, fileType, isDirectory); + SampleTinkerReport.onLoadFileNotFound(fileType); + } + + @Override + public void onLoadPackageCheckFail(File patchFile, int errorCode) { + super.onLoadPackageCheckFail(patchFile, errorCode); + SampleTinkerReport.onLoadPackageCheckFail(errorCode); + } + + @Override + public void onLoadPatchInfoCorrupted(String oldVersion, String newVersion, File patchInfoFile) { + super.onLoadPatchInfoCorrupted(oldVersion, newVersion, patchInfoFile); + SampleTinkerReport.onLoadInfoCorrupted(); + } + + @Override + public void onLoadPatchVersionChanged(String oldVersion, String newVersion, File patchDirectoryFile, String currentPatchName) { + super.onLoadPatchVersionChanged(oldVersion, newVersion, patchDirectoryFile, currentPatchName); + } + +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchListener.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchListener.java new file mode 100644 index 00000000..852ef447 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchListener.java @@ -0,0 +1,122 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.reporter; + +import android.app.ActivityManager; +import android.content.Context; +import android.content.SharedPreferences; + +import com.tencent.tinker.lib.listener.DefaultPatchListener; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.tinker.TinkerLoadResult; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; +import java.util.Properties; + +import tinker.sample.android.app.BuildInfo; +import tinker.sample.android.crash.SampleUncaughtExceptionHandler; +import tinker.sample.android.util.Utils; + +/** + * Created by zhangshaowen on 16/4/30. + * optional, you can just use DefaultPatchListener + * we can check whatever you want whether we actually send a patch request + * such as we can check rom space or apk channel + */ +public class SamplePatchListener extends DefaultPatchListener { + private static final String TAG = "Tinker.SamplePatchListener"; + + protected static final long NEW_PATCH_RESTRICTION_SPACE_SIZE_MIN = 60 * 1024 * 1024; + protected static final long OLD_PATCH_RESTRICTION_SPACE_SIZE_MIN = 30 * 1024 * 1024; + + private final int maxMemory; + + public SamplePatchListener(Context context) { + super(context); + maxMemory = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); + TinkerLog.i(TAG, "application maxMemory:" + maxMemory); + } + + /** + * because we use the defaultCheckPatchReceived method + * the error code define by myself should after {@code ShareConstants.ERROR_RECOVER_INSERVICE + * + * @param path + * @param newPatch + * @return + */ + @Override + public int patchCheck(String path, boolean isUpgrade) { + File patchFile = new File(path); + TinkerLog.i(TAG, "receive a patch file: %s, isUpgrade:%b, file size:%d", path, isUpgrade, SharePatchFileUtil.getFileOrDirectorySize(patchFile)); + int returnCode = super.patchCheck(path, isUpgrade); + + if (returnCode == ShareConstants.ERROR_PATCH_OK) { + if (isUpgrade) { + returnCode = Utils.checkForPatchRecover(NEW_PATCH_RESTRICTION_SPACE_SIZE_MIN, maxMemory); + } else { + returnCode = Utils.checkForPatchRecover(OLD_PATCH_RESTRICTION_SPACE_SIZE_MIN, maxMemory); + } + } + + if (returnCode == ShareConstants.ERROR_PATCH_OK) { + String patchMd5 = SharePatchFileUtil.getMD5(patchFile); + SharedPreferences sp = context.getSharedPreferences(ShareConstants.TINKER_SHARE_PREFERENCE_CONFIG, Context.MODE_MULTI_PROCESS); + //optional, only disable this patch file with md5 + int fastCrashCount = sp.getInt(patchMd5, 0); + if (fastCrashCount >= SampleUncaughtExceptionHandler.MAX_CRASH_COUNT) { + returnCode = Utils.ERROR_PATCH_CRASH_LIMIT; + } else { + //for upgrade patch, version must be not the same + //for repair patch, we won't has the tinker load flag + Tinker tinker = Tinker.with(context); + + if (tinker.isTinkerLoaded()) { + TinkerLoadResult tinkerLoadResult = tinker.getTinkerLoadResultIfPresent(); + if (tinkerLoadResult != null) { + String currentVersion = tinkerLoadResult.currentVersion; + if (patchMd5.equals(currentVersion)) { + returnCode = Utils.ERROR_PATCH_ALREADY_APPLY; + } + } + } + } + } + // Warning, it is just a sample case, you don't need to copy all of these + // Interception some of the request + if (returnCode == ShareConstants.ERROR_PATCH_OK) { + Properties properties = ShareTinkerInternals.fastGetPatchPackageMeta(patchFile); + if (properties == null) { + returnCode = Utils.ERROR_PATCH_CONDITION_NOT_SATISFIED; + } else { + String platform = properties.getProperty(Utils.PLATFORM); + TinkerLog.i(TAG, "get platform:" + platform); + // check patch platform require + if (platform == null || !platform.equals(BuildInfo.PLATFORM)) { + returnCode = Utils.ERROR_PATCH_CONDITION_NOT_SATISFIED; + } + } + } + + SampleTinkerReport.onTryApply(isUpgrade, returnCode == ShareConstants.ERROR_PATCH_OK); + return returnCode; + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchReporter.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchReporter.java new file mode 100644 index 00000000..a3566d68 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SamplePatchReporter.java @@ -0,0 +1,87 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.reporter; + +import android.content.Context; +import android.content.Intent; + +import com.tencent.tinker.lib.reporter.DefaultPatchReporter; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; + +import java.io.File; + +import tinker.sample.android.util.UpgradePatchRetry; + +/** + * optional, you can just use DefaultPatchReporter + * Created by zhangshaowen on 16/4/8. + */ +public class SamplePatchReporter extends DefaultPatchReporter { + public SamplePatchReporter(Context context) { + super(context); + } + + @Override + public void onPatchServiceStart(Intent intent) { + super.onPatchServiceStart(intent); + SampleTinkerReport.onApplyPatchServiceStart(); + UpgradePatchRetry.getInstance(context).onPatchServiceStart(intent); + } + + @Override + public void onPatchDexOptFail(File patchFile, File dexFile, String optDirectory, String dexName, Throwable t, boolean isUpgradePatch) { + super.onPatchDexOptFail(patchFile, dexFile, optDirectory, dexName, t, isUpgradePatch); + SampleTinkerReport.onApplyDexOptFail(t); + } + + @Override + public void onPatchException(File patchFile, Throwable e, boolean isUpgradePatch) { + super.onPatchException(patchFile, e, isUpgradePatch); + SampleTinkerReport.onApplyCrash(e); + } + + @Override + public void onPatchInfoCorrupted(File patchFile, String oldVersion, String newVersion, boolean isUpgradePatch) { + super.onPatchInfoCorrupted(patchFile, oldVersion, newVersion, isUpgradePatch); + SampleTinkerReport.onApplyInfoCorrupted(); + } + + @Override + public void onPatchPackageCheckFail(File patchFile, boolean isUpgradePatch, int errorCode) { + super.onPatchPackageCheckFail(patchFile, isUpgradePatch, errorCode); + SampleTinkerReport.onApplyPackageCheckFail(errorCode); + } + + @Override + public void onPatchResult(File patchFile, boolean success, long cost, boolean isUpgradePatch) { + super.onPatchResult(patchFile, success, cost, isUpgradePatch); + SampleTinkerReport.onApplied(isUpgradePatch, cost, success); + UpgradePatchRetry.getInstance(context).onPatchServiceResult(isUpgradePatch); + } + + @Override + public void onPatchTypeExtractFail(File patchFile, File extractTo, String filename, int fileType, boolean isUpgradePatch) { + super.onPatchTypeExtractFail(patchFile, extractTo, filename, fileType, isUpgradePatch); + SampleTinkerReport.onApplyExtractFail(fileType); + } + + @Override + public void onPatchVersionCheckFail(File patchFile, SharePatchInfo oldPatchInfo, String patchFileVersion, boolean isUpgradePatch) { + super.onPatchVersionCheckFail(patchFile, oldPatchInfo, patchFileVersion, isUpgradePatch); + SampleTinkerReport.onApplyVersionCheckFail(); + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleTinkerReport.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleTinkerReport.java new file mode 100644 index 00000000..269f1066 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleTinkerReport.java @@ -0,0 +1,522 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.reporter; + +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import tinker.sample.android.util.Utils; + +/** + * a simple tinker data reporter + * Created by zhangshaowen on 16/9/17. + */ +public class SampleTinkerReport { + private static final String TAG = "Tinker.SampleTinkerReport"; + + // KEY - PV + public static final int KEY_REQUEST = 0; + public static final int KEY_DOWNLOAD = 1; + public static final int KEY_TRY_APPLY = 2; + public static final int KEY_TRY_APPLY_SUCCESS = 3; + public static final int KEY_APPLIED_START = 4; + public static final int KEY_APPLIED = 5; + public static final int KEY_LOADED = 6; + public static final int KEY_CRASH_FAST_PROTECT = 7; + public static final int KEY_CRASH_CAUSE_XPOSED_DALVIK = 8; + public static final int KEY_CRASH_CAUSE_XPOSED_ART = 9; + public static final int KEY_APPLY_WITH_RETRY = 10; + + //Key -- try apply detail + public static final int KEY_TRY_APPLY_REPAIR = 70; + public static final int KEY_TRY_APPLY_UPGRADE = 71; + public static final int KEY_TRY_APPLY_DISABLE = 72; + public static final int KEY_TRY_APPLY_RUNNING = 73; + public static final int KEY_TRY_APPLY_INSERVICE = 74; + public static final int KEY_TRY_APPLY_NOT_EXIST = 75; + public static final int KEY_TRY_APPLY_GOOGLEPLAY = 76; + public static final int KEY_TRY_APPLY_ROM_SPACE = 77; + public static final int KEY_TRY_APPLY_ALREADY_APPLY = 78; + public static final int KEY_TRY_APPLY_MEMORY_LIMIT = 79; + public static final int KEY_TRY_APPLY_CRASH_LIMIT = 80; + public static final int KEY_TRY_APPLY_CONDITION_NOT_SATISFIED = 81; + + //Key -- apply detail + public static final int KEY_APPLIED_REPAIR = 100; + public static final int KEY_APPLIED_UPGRADE = 101; + public static final int KEY_APPLIED_REPAIR_FAIL = 102; + public static final int KEY_APPLIED_UPGRADE_FAIL = 103; + + public static final int KEY_APPLIED_EXCEPTION = 120; + public static final int KEY_APPLIED_DEXOPT = 121; + public static final int KEY_APPLIED_INFO_CORRUPTED = 122; + //package check + public static final int KEY_APPLIED_PACKAGE_CHECK_SIGNATURE = 150; + public static final int KEY_APPLIED_PACKAGE_CHECK_DEX_META = 151; + public static final int KEY_APPLIED_PACKAGE_CHECK_LIB_META = 152; + public static final int KEY_APPLIED_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND = 153; + public static final int KEY_APPLIED_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND = 154; + public static final int KEY_APPLIED_PACKAGE_CHECK_META_NOT_FOUND = 155; + public static final int KEY_APPLIED_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL = 156; + public static final int KEY_APPLIED_PACKAGE_CHECK_RES_META = 157; + //version check + public static final int KEY_APPLIED_VERSION_CHECK = 180; + //extract error + public static final int KEY_APPLIED_PATCH_FILE_EXTRACT = 181; + public static final int KEY_APPLIED_DEX_EXTRACT = 182; + /** + * for art small dex + */ + public static final int KEY_APPLIED_DEX_ART_EXTRACT = 183; + public static final int KEY_APPLIED_LIB_EXTRACT = 184; + public static final int KEY_APPLIED_RESOURCE_EXTRACT = 185; + //cost time + public static final int KEY_APPLIED_SUCC_COST_5S_LESS = 200; + public static final int KEY_APPLIED_SUCC_COST_10S_LESS = 201; + public static final int KEY_APPLIED_SUCC_COST_30S_LESS = 202; + public static final int KEY_APPLIED_SUCC_COST_60S_LESS = 203; + public static final int KEY_APPLIED_SUCC_COST_OTHER = 204; + + public static final int KEY_APPLIED_FAIL_COST_5S_LESS = 205; + public static final int KEY_APPLIED_FAIL_COST_10S_LESS = 206; + public static final int KEY_APPLIED_FAIL_COST_30S_LESS = 207; + public static final int KEY_APPLIED_FAIL_COST_60S_LESS = 208; + public static final int KEY_APPLIED_FAIL_COST_OTHER = 209; + + + // KEY -- load detail + public static final int KEY_LOADED_UNKNOWN_EXCEPTION = 250; + public static final int KEY_LOADED_UNCAUGHT_EXCEPTION = 251; + public static final int KEY_LOADED_EXCEPTION_DEX = 252; + public static final int KEY_LOADED_EXCEPTION_DEX_CHECK = 253; + public static final int KEY_LOADED_EXCEPTION_RESOURCE = 254; + + public static final int KEY_LOADED_MISMATCH_DEX = 300; + public static final int KEY_LOADED_MISMATCH_LIB = 301; + public static final int KEY_LOADED_MISMATCH_RESOURCE = 302; + public static final int KEY_LOADED_MISSING_DEX = 303; + public static final int KEY_LOADED_MISSING_LIB = 304; + public static final int KEY_LOADED_MISSING_PATCH_FILE = 305; + public static final int KEY_LOADED_MISSING_PATCH_INFO = 306; + public static final int KEY_LOADED_MISSING_DEX_OPT = 307; + public static final int KEY_LOADED_MISSING_RES = 308; + public static final int KEY_LOADED_INFO_CORRUPTED = 309; + + //load package check + public static final int KEY_LOADED_PACKAGE_CHECK_SIGNATURE = 350; + public static final int KEY_LOADED_PACKAGE_CHECK_DEX_META = 351; + public static final int KEY_LOADED_PACKAGE_CHECK_LIB_META = 352; + public static final int KEY_LOADED_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND = 353; + public static final int KEY_LOADED_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND = 354; + public static final int KEY_LOADED_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL = 355; + public static final int KEY_LOADED_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND = 356; + public static final int KEY_LOADED_PACKAGE_CHECK_RES_META = 357; + + public static final int KEY_LOADED_SUCC_COST_500_LESS = 400; + public static final int KEY_LOADED_SUCC_COST_1000_LESS = 401; + public static final int KEY_LOADED_SUCC_COST_3000_LESS = 402; + public static final int KEY_LOADED_SUCC_COST_5000_LESS = 403; + public static final int KEY_LOADED_SUCC_COST_OTHER = 404; + + interface Reporter { + void onReport(int key); + + void onReport(String message); + } + + private static Reporter reporter = null; + + public void setReporter(Reporter reporter) { + this.reporter = reporter; + } + + public static void onTryApply(boolean upgrade, boolean success) { + if (reporter == null) { + return; + } + reporter.onReport(KEY_TRY_APPLY); + if (upgrade) { + reporter.onReport(KEY_TRY_APPLY_UPGRADE); + } else { + reporter.onReport(KEY_TRY_APPLY_REPAIR); + } + if (success) { + reporter.onReport(KEY_TRY_APPLY_SUCCESS); + } + } + + public static void onTryApplyFail(int errorCode) { + if (reporter == null) { + return; + } + switch (errorCode) { + case ShareConstants.ERROR_PATCH_NOTEXIST: + reporter.onReport(KEY_TRY_APPLY_NOT_EXIST); + break; + case ShareConstants.ERROR_PATCH_DISABLE: + reporter.onReport(KEY_TRY_APPLY_DISABLE); + break; + case ShareConstants.ERROR_PATCH_INSERVICE: + reporter.onReport(KEY_TRY_APPLY_INSERVICE); + break; + case ShareConstants.ERROR_PATCH_RUNNING: + reporter.onReport(KEY_TRY_APPLY_RUNNING); + break; + case Utils.ERROR_PATCH_ROM_SPACE: + reporter.onReport(KEY_TRY_APPLY_ROM_SPACE); + break; + case Utils.ERROR_PATCH_GOOGLEPLAY_CHANNEL: + reporter.onReport(KEY_TRY_APPLY_GOOGLEPLAY); + break; + case Utils.ERROR_PATCH_ALREADY_APPLY: + reporter.onReport(KEY_TRY_APPLY_ALREADY_APPLY); + break; + case Utils.ERROR_PATCH_CRASH_LIMIT: + reporter.onReport(KEY_TRY_APPLY_CRASH_LIMIT); + break; + case Utils.ERROR_PATCH_MEMORY_LIMIT: + reporter.onReport(KEY_TRY_APPLY_MEMORY_LIMIT); + break; + case Utils.ERROR_PATCH_CONDITION_NOT_SATISFIED: + reporter.onReport(KEY_TRY_APPLY_CONDITION_NOT_SATISFIED); + break; + } + } + + public static void onLoadPackageCheckFail(int errorCode) { + if (reporter == null) { + return; + } + switch (errorCode) { + case ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_SIGNATURE); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_DEX_META); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_LIB_META); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL); + + break; + case ShareConstants.ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED: + reporter.onReport(KEY_LOADED_PACKAGE_CHECK_RES_META); + break; + } + } + + public static void onLoaded(long cost) { + if (reporter == null) { + return; + } + reporter.onReport(KEY_LOADED); + + if (cost < 0L) { + TinkerLog.e(TAG, "hp_report report load cost failed, invalid cost"); + return; + } + + if (cost <= 500) { + reporter.onReport(KEY_LOADED_SUCC_COST_500_LESS); + } else if (cost <= 1000) { + reporter.onReport(KEY_LOADED_SUCC_COST_1000_LESS); + } else if (cost <= 3000) { + reporter.onReport(KEY_LOADED_SUCC_COST_3000_LESS); + } else if (cost <= 5000) { + reporter.onReport(KEY_LOADED_SUCC_COST_5000_LESS); + } else { + reporter.onReport(KEY_LOADED_SUCC_COST_OTHER); + } + } + + public static void onLoadInfoCorrupted() { + if (reporter == null) { + return; + } + reporter.onReport(KEY_LOADED_INFO_CORRUPTED); + } + + public static void onLoadFileNotFound(int fileType) { + if (reporter == null) { + return; + } + switch (fileType) { + case ShareConstants.TYPE_DEX_OPT: + reporter.onReport(KEY_LOADED_MISSING_DEX_OPT); + break; + case ShareConstants.TYPE_DEX: + reporter.onReport(KEY_LOADED_MISSING_DEX); + break; + case ShareConstants.TYPE_LIBRARY: + reporter.onReport(KEY_LOADED_MISSING_LIB); + break; + case ShareConstants.TYPE_PATCH_FILE: + reporter.onReport(KEY_LOADED_MISSING_PATCH_FILE); + break; + case ShareConstants.TYPE_PATCH_INFO: + reporter.onReport(KEY_LOADED_MISSING_PATCH_INFO); + break; + case ShareConstants.TYPE_RESOURCE: + reporter.onReport(KEY_LOADED_MISSING_RES); + break; + } + } + + public static void onLoadFileMisMatch(int fileType) { + if (reporter == null) { + return; + } + switch (fileType) { + case ShareConstants.TYPE_DEX: + reporter.onReport(KEY_LOADED_MISMATCH_DEX); + break; + case ShareConstants.TYPE_LIBRARY: + reporter.onReport(KEY_LOADED_MISMATCH_LIB); + break; + case ShareConstants.TYPE_RESOURCE: + reporter.onReport(KEY_LOADED_MISMATCH_RESOURCE); + break; + } + } + + public static void onLoadException(Throwable throwable, int errorCode) { + if (reporter == null) { + return; + } + boolean isDexCheckFail = false; + switch (errorCode) { + case ShareConstants.ERROR_LOAD_EXCEPTION_DEX: + if (throwable.getMessage().contains(ShareConstants.CHECK_DEX_INSTALL_FAIL)) { + reporter.onReport(KEY_LOADED_EXCEPTION_DEX_CHECK); + isDexCheckFail = true; + TinkerLog.e(TAG, "tinker dex check fail:" + throwable.getMessage()); + } else { + reporter.onReport(KEY_LOADED_EXCEPTION_DEX); + TinkerLog.e(TAG, "tinker dex reflect fail:" + throwable.getMessage()); + } + break; + case ShareConstants.ERROR_LOAD_EXCEPTION_RESOURCE: + reporter.onReport(KEY_LOADED_EXCEPTION_RESOURCE); + break; + case ShareConstants.ERROR_LOAD_EXCEPTION_UNCAUGHT: + reporter.onReport(KEY_LOADED_UNCAUGHT_EXCEPTION); + break; + case ShareConstants.ERROR_LOAD_EXCEPTION_UNKNOWN: + reporter.onReport(KEY_LOADED_UNKNOWN_EXCEPTION); + break; + } + //reporter exception, for dex check fail, we don't need to report stacktrace + if (!isDexCheckFail) { + reporter.onReport("Tinker Exception:load tinker occur exception " + Utils.getExceptionCauseString(throwable)); + } + } + + public static void onApplyPatchServiceStart() { + if (reporter == null) { + return; + } + reporter.onReport(KEY_APPLIED_START); + } + + public static void onApplyDexOptFail(Throwable throwable) { + if (reporter == null) { + return; + } + reporter.onReport(KEY_APPLIED_DEXOPT); + reporter.onReport("Tinker Exception:apply tinker occur exception " + Utils.getExceptionCauseString(throwable)); + } + + public static void onApplyInfoCorrupted() { + if (reporter == null) { + return; + } + reporter.onReport(KEY_APPLIED_INFO_CORRUPTED); + } + + public static void onApplyVersionCheckFail() { + if (reporter == null) { + return; + } + reporter.onReport(KEY_APPLIED_VERSION_CHECK); + } + + public static void onApplyExtractFail(int fileType) { + if (reporter == null) { + return; + } + switch (fileType) { + case ShareConstants.TYPE_DEX: + reporter.onReport(KEY_APPLIED_DEX_EXTRACT); + break; + case ShareConstants.TYPE_DEX_FOR_ART: + reporter.onReport(KEY_APPLIED_DEX_ART_EXTRACT); + break; + case ShareConstants.TYPE_LIBRARY: + reporter.onReport(KEY_APPLIED_LIB_EXTRACT); + break; + case ShareConstants.TYPE_PATCH_FILE: + reporter.onReport(KEY_APPLIED_PATCH_FILE_EXTRACT); + break; + case ShareConstants.TYPE_RESOURCE: + reporter.onReport(KEY_APPLIED_RESOURCE_EXTRACT); + break; + } + } + + public static void onApplied(boolean isUpgrade, long cost, boolean success) { + if (reporter == null) { + return; + } + if (success) { + reporter.onReport(KEY_APPLIED); + } + + if (isUpgrade) { + if (success) { + reporter.onReport(KEY_APPLIED_UPGRADE); + } else { + reporter.onReport(KEY_APPLIED_UPGRADE_FAIL); + } + + } else { + if (success) { + reporter.onReport(KEY_APPLIED_REPAIR); + } else { + reporter.onReport(KEY_APPLIED_REPAIR_FAIL); + } + } + + TinkerLog.i(TAG, "hp_report report apply cost = %d", cost); + + if (cost < 0L) { + TinkerLog.e(TAG, "hp_report report apply cost failed, invalid cost"); + return; + } + + if (cost <= 5000) { + if (success) { + reporter.onReport(KEY_APPLIED_SUCC_COST_5S_LESS); + } else { + reporter.onReport(KEY_APPLIED_FAIL_COST_5S_LESS); + } + } else if (cost <= 10 * 1000) { + if (success) { + reporter.onReport(KEY_APPLIED_SUCC_COST_10S_LESS); + } else { + reporter.onReport(KEY_APPLIED_FAIL_COST_10S_LESS); + } + } else if (cost <= 30 * 1000) { + if (success) { + reporter.onReport(KEY_APPLIED_SUCC_COST_30S_LESS); + } else { + reporter.onReport(KEY_APPLIED_FAIL_COST_30S_LESS); + } + } else if (cost <= 60 * 1000) { + if (success) { + reporter.onReport(KEY_APPLIED_SUCC_COST_60S_LESS); + } else { + reporter.onReport(KEY_APPLIED_FAIL_COST_60S_LESS); + } + } else { + if (success) { + reporter.onReport(KEY_APPLIED_SUCC_COST_OTHER); + } else { + reporter.onReport(KEY_APPLIED_FAIL_COST_OTHER); + } + } + } + + public static void onApplyPackageCheckFail(int errorCode) { + if (reporter == null) { + return; + } + TinkerLog.i(TAG, "hp_report package check failed, error = %d", errorCode); + + switch (errorCode) { + case ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_SIGNATURE); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_DEX_META); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_LIB_META); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_META_NOT_FOUND); + break; + case ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED: + reporter.onReport(KEY_APPLIED_PACKAGE_CHECK_RES_META); + break; + } + } + + public static void onApplyCrash(Throwable throwable) { + if (reporter == null) { + return; + } + reporter.onReport(KEY_APPLIED_EXCEPTION); + reporter.onReport("Tinker Exception:apply tinker occur exception " + Utils.getExceptionCauseString(throwable)); + } + + public static void onFastCrashProtect() { + if (reporter == null) { + return; + } + reporter.onReport(KEY_CRASH_FAST_PROTECT); + } + + public static void onXposedCrash() { + if (reporter == null) { + return; + } + if (ShareTinkerInternals.isVmArt()) { + reporter.onReport(KEY_CRASH_CAUSE_XPOSED_ART); + } else { + reporter.onReport(KEY_CRASH_CAUSE_XPOSED_DALVIK); + } + } + + public static void onReportRetryPatch() { + if (reporter == null) { + return; + } + reporter.onReport(KEY_APPLY_WITH_RETRY); + } + +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/service/SampleResultService.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/service/SampleResultService.java new file mode 100644 index 00000000..d98c3a50 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/service/SampleResultService.java @@ -0,0 +1,143 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.service; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; + +import com.tencent.tinker.lib.service.DefaultTinkerResultService; +import com.tencent.tinker.lib.service.PatchResult; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.lib.util.TinkerServiceInternals; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; + +import java.io.File; +import java.util.zip.ZipFile; + +import tinker.sample.android.util.Utils; + +/** + * optional, you can just use DefaultTinkerResultService + * we can restart process when we are at background or screen off + * Created by zhangshaowen on 16/4/13. + */ +public class SampleResultService extends DefaultTinkerResultService { + private static final String TAG = "Tinker.SampleResultService"; + + + @Override + public void onPatchResult(final PatchResult result) { + if (result == null) { + TinkerLog.e(TAG, "SampleResultService received null result!!!!"); + return; + } + TinkerLog.i(TAG, "SampleResultService receive result: %s", result.toString()); + + //first, we want to kill the recover process + TinkerServiceInternals.killTinkerPatchServiceProcess(getApplicationContext()); + + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(new Runnable() { + @Override + public void run() { + if (result.isSuccess) { + Toast.makeText(getApplicationContext(), "patch success, please restart process", Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getApplicationContext(), "patch fail, please check reason", Toast.LENGTH_LONG).show(); + } + } + }); + // is success and newPatch, it is nice to delete the raw file, and restart at once + // for old patch, you can't delete the patch file + if (result.isSuccess && result.isUpgradePatch) { + File rawFile = new File(result.rawPatchFilePath); + if (rawFile.exists()) { + TinkerLog.i(TAG, "save delete raw patch file"); + SharePatchFileUtil.safeDeleteFile(rawFile); + } + //not like TinkerResultService, I want to restart just when I am at background! + //if you have not install tinker this moment, you can use TinkerApplicationHelper api + if (checkIfNeedKill(result)) { + if (Utils.isBackground()) { + TinkerLog.i(TAG, "it is in background, just restart process"); + restartProcess(); + } else { + //we can wait process at background, such as onAppBackground + //or we can restart when the screen off + TinkerLog.i(TAG, "tinker wait screen to restart process"); + new ScreenState(getApplicationContext(), new ScreenState.IOnScreenOff() { + @Override + public void onScreenOff() { + restartProcess(); + } + }); + } + } else { + TinkerLog.i(TAG, "I have already install the newly patch version!"); + } + } + + //repair current patch fail, just clean! + if (!result.isSuccess && !result.isUpgradePatch) { + //if you have not install tinker this moment, you can use TinkerApplicationHelper api + Tinker.with(getApplicationContext()).cleanPatch(); + } + } + + /** + * you can restart your process through service or broadcast + */ + private void restartProcess() { + TinkerLog.i(TAG, "app is background now, i can kill quietly"); + //you can send service or broadcast intent to restart your process + android.os.Process.killProcess(android.os.Process.myPid()); + } + + static class ScreenState { + interface IOnScreenOff { + void onScreenOff(); + } + + ScreenState(Context context, final IOnScreenOff onScreenOffInterface) { + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_OFF); + context.registerReceiver(new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent in) { + String action = in == null ? "" : in.getAction(); + TinkerLog.i(TAG, "ScreenReceiver action [%s] ", action); + if (Intent.ACTION_SCREEN_OFF.equals(action)) { + + context.unregisterReceiver(this); + + if (onScreenOffInterface != null) { + onScreenOffInterface.onScreenOff(); + } + } + } + }, filter); + } + } + +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/util/SampleApplicationContext.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/SampleApplicationContext.java new file mode 100644 index 00000000..509924de --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/SampleApplicationContext.java @@ -0,0 +1,28 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.util; + +import android.app.Application; +import android.content.Context; + +/** + * Created by zhangshaowen on 16/8/9. + */ +public class SampleApplicationContext { + public static Application application = null; + public static Context context = null; +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/util/TinkerManager.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/TinkerManager.java new file mode 100644 index 00000000..4106eceb --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/TinkerManager.java @@ -0,0 +1,106 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.util; + +import com.tencent.tinker.lib.listener.PatchListener; +import com.tencent.tinker.lib.patch.AbstractPatch; +import com.tencent.tinker.lib.patch.RepairPatch; +import com.tencent.tinker.lib.patch.UpgradePatch; +import com.tencent.tinker.lib.reporter.LoadReporter; +import com.tencent.tinker.lib.reporter.PatchReporter; +import com.tencent.tinker.lib.tinker.TinkerInstaller; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.app.ApplicationLike; + +import tinker.sample.android.crash.SampleUncaughtExceptionHandler; +import tinker.sample.android.reporter.SampleLoadReporter; +import tinker.sample.android.reporter.SamplePatchListener; +import tinker.sample.android.reporter.SamplePatchReporter; +import tinker.sample.android.service.SampleResultService; + +/** + * Created by zhangshaowen on 16/7/3. + */ +public class TinkerManager { + private static final String TAG = "Tinker.TinkerManager"; + + private static ApplicationLike applicationLike; + private static SampleUncaughtExceptionHandler uncaughtExceptionHandler; + private static boolean isInstalled = false; + + public static void setTinkerApplicationLike(ApplicationLike appLike) { + applicationLike = appLike; + } + + public static ApplicationLike getTinkerApplicationLike() { + return applicationLike; + } + + public static void initFastCrashProtect() { + if (uncaughtExceptionHandler == null) { + uncaughtExceptionHandler = new SampleUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler); + } + } + + public static void setUpgradeRetryEnable(boolean enable) { + UpgradePatchRetry.getInstance(applicationLike.getApplication()).setRetryEnable(enable); + } + + + /** + * all use default class, simply Tinker install method + */ + public static void sampleInstallTinker(ApplicationLike appLike) { + if (isInstalled) { + TinkerLog.w(TAG, "install tinker, but has installed, ignore"); + return; + } + TinkerInstaller.install(appLike); + isInstalled = true; + + } + + /** + * you can specify all class you want. + * sometimes, you can only install tinker in some process you want! + * + * @param appLike + */ + public static void installTinker(ApplicationLike appLike) { + if (isInstalled) { + TinkerLog.w(TAG, "install tinker, but has installed, ignore"); + return; + } + //or you can just use DefaultLoadReporter + LoadReporter loadReporter = new SampleLoadReporter(appLike.getApplication()); + //or you can just use DefaultPatchReporter + PatchReporter patchReporter = new SamplePatchReporter(appLike.getApplication()); + //or you can just use DefaultPatchListener + PatchListener patchListener = new SamplePatchListener(appLike.getApplication()); + //you can set your own upgrade patch if you need + AbstractPatch upgradePatchProcessor = new UpgradePatch(); + //you can set your own repair patch if you need + AbstractPatch repairPatchProcessor = new RepairPatch(); + + TinkerInstaller.install(appLike, + loadReporter, patchReporter, patchListener, + SampleResultService.class, upgradePatchProcessor, repairPatchProcessor); + + isInstalled = true; + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java new file mode 100644 index 00000000..e3f8eefa --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java @@ -0,0 +1,265 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.util; + +import android.content.Context; +import android.content.Intent; + +import com.tencent.tinker.lib.service.TinkerPatchService; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.tinker.TinkerInstaller; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.lib.util.TinkerServiceInternals; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; + +import tinker.sample.android.reporter.SampleTinkerReport; + +/** + * optional + * tinker :patch process may killed by some reason, we can retry it to increase upgrade success rate + * if patch file is at sdcard, copy it to dataDir first. because some software may delete it. + * + * Created by zhangshaowen on 16/7/3. + */ +public class UpgradePatchRetry { + private static final String TAG = "Tinker.UpgradePatchRetry"; + + private static final String RETRY_INFO_NAME = "patch.retry"; + private static final String TEMP_PATCH_NAME = "temp.apk"; + + private static final String RETRY_FILE_MD5_PROPERTY = "md5"; + private static final String RETRY_COUNT_PROPERTY = "times"; + private static final int RETRY_MAX_COUNT = 2; + + private boolean isRetryEnable = false; + private File retryInfoFile = null; + private File tempPatchFile = null; + + private Context context = null; + private static UpgradePatchRetry sInstance; + + /** + * you must set after tinker has installed + * + * @param context + */ + public UpgradePatchRetry(Context context) { + this.context = context; + retryInfoFile = new File(SharePatchFileUtil.getPatchDirectory(context), RETRY_INFO_NAME); + tempPatchFile = new File(SharePatchFileUtil.getPatchDirectory(context), TEMP_PATCH_NAME); + } + + public static UpgradePatchRetry getInstance(Context context) { + if (sInstance == null) { + sInstance = new UpgradePatchRetry(context); + } + return sInstance; + } + + public void onPatchRetryLoad() { + if (!isRetryEnable) { + TinkerLog.w(TAG, "onPatchRetryLoad retry disabled, just return"); + return; + } + Tinker tinker = Tinker.with(context); + //only retry on main process + if (!tinker.isMainProcess()) { + TinkerLog.w(TAG, "onPatchRetryLoad retry is not main process, just return"); + return; + } + + if (!retryInfoFile.exists()) { + TinkerLog.w(TAG, "onPatchRetryLoad retry info not exist, just return"); + return; + } + + if (TinkerServiceInternals.isTinkerPatchServiceRunning(context)) { + TinkerLog.w(TAG, "onPatchRetryLoad tinker service is running, just return"); + return; + } + //must use temp file + String path = tempPatchFile.getAbsolutePath(); + if (path == null || !new File(path).exists()) { + TinkerLog.w(TAG, "onPatchRetryLoad patch file: %s is not exist, just return", path); + return; + } + TinkerLog.w(TAG, "onPatchRetryLoad patch file: %s is exist, retry to patch", path); + TinkerInstaller.onReceiveUpgradePatch(context, path); + SampleTinkerReport.onReportRetryPatch(); + } + + private void copyToTempFile(File patchFile) { + if (patchFile.getAbsolutePath().equals(tempPatchFile.getAbsolutePath())) { + return; + } + TinkerLog.w(TAG, "try copy file: %s to %s", patchFile.getAbsolutePath(), tempPatchFile.getAbsolutePath()); + + try { + SharePatchFileUtil.copyFileUsingStream(patchFile, tempPatchFile); + } catch (IOException e) { + } + } + + public void onPatchServiceStart(Intent intent) { + if (!isRetryEnable) { + TinkerLog.w(TAG, "onPatchServiceStart retry disabled, just return"); + return; + } + + if (intent == null) { + TinkerLog.e(TAG, "onPatchServiceStart intent is null, just return"); + return; + } + + boolean isUpgrade = TinkerPatchService.getPatchUpgradeExtra(intent); + + if (!isUpgrade) { + TinkerLog.w(TAG, "onPatchServiceStart is not upgrade patch, just return"); + return; + } + + String path = TinkerPatchService.getPatchPathExtra(intent); + + if (path == null) { + TinkerLog.w(TAG, "onPatchServiceStart patch path is null, just return"); + return; + } + + RetryInfo retryInfo; + File patchFile = new File(path); + + String patchMd5 = SharePatchFileUtil.getMD5(patchFile); + + if (retryInfoFile.exists()) { + retryInfo = RetryInfo.readRetryProperty(retryInfoFile); + if (retryInfo.md5 == null || retryInfo.times == null || !patchMd5.equals(retryInfo.md5)) { + copyToTempFile(patchFile); + retryInfo.md5 = patchMd5; + retryInfo.times = "1"; + } else { + int nowTimes = Integer.parseInt(retryInfo.times); + if (nowTimes >= RETRY_MAX_COUNT) { + SharePatchFileUtil.safeDeleteFile(retryInfoFile); + SharePatchFileUtil.safeDeleteFile(tempPatchFile); + TinkerLog.w(TAG, "onPatchServiceStart retry more than max count, delete retry info file!"); + return; + } else { + retryInfo.times = String.valueOf(nowTimes + 1); + } + } + + } else { + copyToTempFile(patchFile); + retryInfo = new RetryInfo(patchMd5, "1"); + } + + RetryInfo.writeRetryProperty(retryInfoFile, retryInfo); + + } + + /** + * if we receive any result, we can delete the temp retry info file + * + * @param isUpgradePatch + */ + public void onPatchServiceResult(boolean isUpgradePatch) { + if (!isRetryEnable) { + TinkerLog.w(TAG, "onPatchServiceResult retry disabled, just return"); + return; + } + + if (!isUpgradePatch) { + TinkerLog.w(TAG, "onPatchServiceResult is not upgrade patch, just return"); + return; + } + + //delete info file + if (retryInfoFile.exists()) { + SharePatchFileUtil.safeDeleteFile(retryInfoFile); + } + //delete temp patch file + if (tempPatchFile.exists()) { + SharePatchFileUtil.safeDeleteFile(tempPatchFile); + } + } + + public void setRetryEnable(boolean enable) { + isRetryEnable = enable; + } + + static class RetryInfo { + String md5; + String times; + + RetryInfo(String md5, String times) { + this.md5 = md5; + this.times = times; + } + + static RetryInfo readRetryProperty(File infoFile) { + String md5 = null; + String times = null; + + Properties properties = new Properties(); + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(infoFile); + properties.load(inputStream); + md5 = properties.getProperty(RETRY_FILE_MD5_PROPERTY); + times = properties.getProperty(RETRY_COUNT_PROPERTY); + } catch (IOException e) { + e.printStackTrace(); + } finally { + SharePatchFileUtil.closeQuietly(inputStream); + } + + return new RetryInfo(md5, times); + } + + static void writeRetryProperty(File infoFile, RetryInfo info) { + if (info == null) { + return; + } + + File parentFile = infoFile.getParentFile(); + if (!parentFile.exists()) { + parentFile.mkdirs(); + } + + Properties newProperties = new Properties(); + newProperties.put(RETRY_FILE_MD5_PROPERTY, info.md5); + newProperties.put(RETRY_COUNT_PROPERTY, info.times); + FileOutputStream outputStream = null; + try { + outputStream = new FileOutputStream(infoFile, false); + newProperties.store(outputStream, null); + } catch (Exception e) { +// e.printStackTrace(); + TinkerLog.printErrStackTrace(TAG, e, "retry write property fail"); + } finally { + SharePatchFileUtil.closeQuietly(outputStream); + } + + } + } +} diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/util/Utils.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/Utils.java new file mode 100644 index 00000000..d6f2b993 --- /dev/null +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/Utils.java @@ -0,0 +1,156 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 tinker.sample.android.util; + +import android.os.Environment; +import android.os.StatFs; + +import com.tencent.tinker.loader.shareutil.ShareConstants; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; + +/** + * Created by zhangshaowen on 16/4/7. + */ +public class Utils { + + /** + * the error code define by myself + * should after {@code ShareConstants.ERROR_PATCH_INSERVICE + */ + public static final int ERROR_PATCH_GOOGLEPLAY_CHANNEL = -5; + public static final int ERROR_PATCH_ROM_SPACE = -6; + public static final int ERROR_PATCH_MEMORY_LIMIT = -7; + public static final int ERROR_PATCH_ALREADY_APPLY = -8; + public static final int ERROR_PATCH_CRASH_LIMIT = -9; + public static final int ERROR_PATCH_CONDITION_NOT_SATISFIED = -10; + + public static final String PLATFORM = "platform"; + + public static final int MIN_MEMORY_HEAP_SIZE = 45; + + private static boolean background = false; + + public static boolean isGooglePlay() { + return false; + } + + public static boolean isBackground() { + return background; + } + + public static void setBackground(boolean back) { + background = back; + } + + public static int checkForPatchRecover(long roomSize, int maxMemory) { + if (Utils.isGooglePlay()) { + return Utils.ERROR_PATCH_GOOGLEPLAY_CHANNEL; + } + if (maxMemory < MIN_MEMORY_HEAP_SIZE) { + return Utils.ERROR_PATCH_MEMORY_LIMIT; + } + //or you can mention user to clean their rom space! + if (!checkRomSpaceEnough(roomSize)) { + return Utils.ERROR_PATCH_ROM_SPACE; + } + + return ShareConstants.ERROR_PATCH_OK; + } + + public static boolean isXposedExists(Throwable thr) { + StackTraceElement[] stackTraces = thr.getStackTrace(); + for (StackTraceElement stackTrace : stackTraces) { + final String clazzName = stackTrace.getClassName(); + if (clazzName != null && clazzName.contains("de.robv.android.xposed.XposedBridge")) { + return true; + } + } + return false; + } + + @Deprecated + public static boolean checkRomSpaceEnough(long limitSize) { + long allSize; + long availableSize = 0; + try { + File data = Environment.getDataDirectory(); + StatFs sf = new StatFs(data.getPath()); + availableSize = (long) sf.getAvailableBlocks() * (long) sf.getBlockSize(); + allSize = (long) sf.getBlockCount() * (long) sf.getBlockSize(); + } catch (Exception e) { + allSize = 0; + } + + if (allSize != 0 && availableSize > limitSize) { + return true; + } + return false; + } + + public static String getExceptionCauseString(final Throwable ex) { + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + final PrintStream ps = new PrintStream(bos); + + try { + // print directly + Throwable t = ex; + while (t.getCause() != null) { + t = t.getCause(); + } + t.printStackTrace(ps); + return toVisualString(bos.toString()); + } finally { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static String toVisualString(String src) { + boolean cutFlg = false; + + if (null == src) { + return null; + } + + char[] chr = src.toCharArray(); + if (null == chr) { + return null; + } + + int i = 0; + for (; i < chr.length; i++) { + if (chr[i] > 127) { + chr[i] = 0; + cutFlg = true; + break; + } + } + + if (cutFlg) { + return new String(chr, 0, i); + } else { + return src; + } + } +} diff --git a/tinker-sample-android/app/src/main/res/layout/activity_main.xml b/tinker-sample-android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..e7d4180a --- /dev/null +++ b/tinker-sample-android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,60 @@ + + + + + +

  • FKB+urXOx{4c+(T#i(26Y>s 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 literal 0 HcmV?d00001 diff --git a/third-party/seven-zip/gradle.properties b/third-party/seven-zip/gradle.properties new file mode 100644 index 00000000..6c1444d4 --- /dev/null +++ b/third-party/seven-zip/gradle.properties @@ -0,0 +1,2 @@ +POM_ARTIFACT_ID=seven-zip +POM_NAME=seven-zip diff --git a/tinker-android/tinker-android-anno/.gitignore b/tinker-android/tinker-android-anno/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/tinker-android/tinker-android-anno/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tinker-android/tinker-android-anno/build.gradle b/tinker-android/tinker-android-anno/build.gradle new file mode 100644 index 00000000..d74f33c2 --- /dev/null +++ b/tinker-android/tinker-android-anno/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'java' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} + +sourceSets { + main { + java { + srcDir 'src/main/java' + } + + resources { + srcDir 'src/main/resources' + } + } +} + +task buildSdk(type: Copy, dependsOn: [build]) { + from('build/libs') { + include '*.jar' + exclude '*javadoc.jar' + exclude '*-sources.jar' + } + into(rootProject.file("buildSdk/android")) +} + +apply from: rootProject.file('gradle/java-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') diff --git a/tinker-android/tinker-android-anno/gradle.properties b/tinker-android/tinker-android-anno/gradle.properties new file mode 100644 index 00000000..cd11cbce --- /dev/null +++ b/tinker-android/tinker-android-anno/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=tinker-android-anno +POM_NAME=Tinker Android Anno +POM_PACKAGING=jar \ No newline at end of file diff --git a/tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/AnnotationProcessor.java b/tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/AnnotationProcessor.java new file mode 100644 index 00000000..533a1c3c --- /dev/null +++ b/tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/AnnotationProcessor.java @@ -0,0 +1,115 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.anno; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.Writer; +import java.util.LinkedHashSet; +import java.util.Scanner; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; + + +/** + * Tinker Annotations Processor + * + * Created by zhaoyuan on 16/3/31. + */ +@SupportedSourceVersion(SourceVersion.RELEASE_7) +public class AnnotationProcessor extends AbstractProcessor { + + private static final String SUFFIX = "$$DefaultLifeCycle"; + private static final String APPLICATION_TEMPLATE_PATH = "/TinkerAnnoApplication.tmpl"; + + @Override + public Set getSupportedAnnotationTypes() { + final Set supportedAnnotationTypes = new LinkedHashSet<>(); + + supportedAnnotationTypes.add(DefaultLifeCycle.class.getName()); + + return supportedAnnotationTypes; + } + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + processDefaultLifeCycle(roundEnv.getElementsAnnotatedWith(DefaultLifeCycle.class)); + return true; + } + + + private void processDefaultLifeCycle(Set elements) { + // DefaultLifeCycle + for (Element e : elements) { + DefaultLifeCycle ca = e.getAnnotation(DefaultLifeCycle.class); + + String lifeCycleClassName = ((TypeElement) e).getQualifiedName().toString(); + String lifeCyclePackageName = lifeCycleClassName.substring(0, lifeCycleClassName.lastIndexOf('.')); + lifeCycleClassName = lifeCycleClassName.substring(lifeCycleClassName.lastIndexOf('.') + 1); + + String applicationClassName = ca.application(); + if (applicationClassName.startsWith(".")) { + applicationClassName = lifeCyclePackageName + applicationClassName; + } + String applicationPackageName = applicationClassName.substring(0, applicationClassName.lastIndexOf('.')); + applicationClassName = applicationClassName.substring(applicationClassName.lastIndexOf('.') + 1); + + String loaderClassName = ca.loaderClass(); + if (loaderClassName.startsWith(".")) { + loaderClassName = lifeCyclePackageName + loaderClassName; + } + + System.out.println("*"); + + final InputStream is = AnnotationProcessor.class.getResourceAsStream(APPLICATION_TEMPLATE_PATH); + final Scanner scanner = new Scanner(is); + final String template = scanner.useDelimiter("\\A").next(); + final String fileContent = template + .replaceAll("%PACKAGE%", applicationPackageName) + .replaceAll("%APPLICATION%", applicationClassName) + .replaceAll("%APPLICATION_LIFE_CYCLE%", lifeCyclePackageName + "." + lifeCycleClassName) + .replaceAll("%TINKER_FLAGS%", "" + ca.flags()) + .replaceAll("%TINKER_LOADER_CLASS%", "" + loaderClassName) + .replaceAll("%TINKER_LOAD_VERIFY_FLAG%", "" + ca.loadVerifyFlag()); + + try { + JavaFileObject fileObject = processingEnv.getFiler().createSourceFile(applicationPackageName + "." + applicationClassName); + processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Creating " + fileObject.toUri()); + Writer writer = fileObject.openWriter(); + try { + PrintWriter pw = new PrintWriter(writer); + pw.print(fileContent); + pw.flush(); + + } finally { + writer.close(); + } + } catch (IOException x) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, x.toString()); + } + } + } +} diff --git a/tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/DefaultLifeCycle.java b/tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/DefaultLifeCycle.java new file mode 100644 index 00000000..ddd5db1b --- /dev/null +++ b/tinker-android/tinker-android-anno/src/main/java/com/tencent/tinker/anno/DefaultLifeCycle.java @@ -0,0 +1,44 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.anno; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotations + * + * Created by zhaoyuan on 16/3/31. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +@Inherited +public @interface DefaultLifeCycle { + + String application(); + + String loaderClass() default "com.tencent.tinker.loader.TinkerLoader"; + + int flags(); + + boolean loadVerifyFlag() default false; + + +} diff --git a/tinker-android/tinker-android-anno/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/tinker-android/tinker-android-anno/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000..5f7162da --- /dev/null +++ b/tinker-android/tinker-android-anno/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +com.tencent.tinker.anno.AnnotationProcessor diff --git a/tinker-android/tinker-android-anno/src/main/resources/TinkerAnnoApplication.tmpl b/tinker-android/tinker-android-anno/src/main/resources/TinkerAnnoApplication.tmpl new file mode 100644 index 00000000..a856f512 --- /dev/null +++ b/tinker-android/tinker-android-anno/src/main/resources/TinkerAnnoApplication.tmpl @@ -0,0 +1,16 @@ +package %PACKAGE%; + +import com.tencent.tinker.loader.app.TinkerApplication; + +/** + * + * Generated application for tinker life cycle + * + */ +public class %APPLICATION% extends TinkerApplication { + + public %APPLICATION%() { + super(%TINKER_FLAGS%, "%APPLICATION_LIFE_CYCLE%", "%TINKER_LOADER_CLASS%", %TINKER_LOAD_VERIFY_FLAG%); + } + +} \ No newline at end of file diff --git a/tinker-android/tinker-android-anno/src/test/java/com/tencent/tinker/anno/test/TestLifeCycle.java b/tinker-android/tinker-android-anno/src/test/java/com/tencent/tinker/anno/test/TestLifeCycle.java new file mode 100644 index 00000000..0cea5f12 --- /dev/null +++ b/tinker-android/tinker-android-anno/src/test/java/com/tencent/tinker/anno/test/TestLifeCycle.java @@ -0,0 +1,29 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.anno.test; + +//import com.tencent.tinker.anno.DefaultLifeCycle; +// +///** +// * Test LifeCycle +// * +// * Created by zhaoyuan on 16/4/1. +// */ +//@DefaultLifeCycle(application = ".TestApplication", flags = 0x10, loaderClass="com.tencent.tinker.loader.TinkerLoader") +//public class TestLifeCycle { +// +//} diff --git a/tinker-android/tinker-android-lib/.gitignore b/tinker-android/tinker-android-lib/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/tinker-android/tinker-android-lib/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tinker-android/tinker-android-lib/build.gradle b/tinker-android/tinker-android-lib/build.gradle new file mode 100644 index 00000000..7f9c60b2 --- /dev/null +++ b/tinker-android/tinker-android-lib/build.gradle @@ -0,0 +1,39 @@ +apply plugin: 'com.android.library' + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile project(':tinker-commons') + compile project(':tinker-android:tinker-android-loader') +} + +task buildSdk(type: Copy, dependsOn: [build]) { + from("$buildDir/outputs/aar/") { + include "${project.getName()}-release.aar" + } + + into(rootProject.file("buildSdk/android/")) + rename { String fileName -> + fileName.replace("release", "${version}") + } +} + +apply from: rootProject.file('gradle/android-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') + + + + diff --git a/tinker-android/tinker-android-lib/gradle.properties b/tinker-android/tinker-android-lib/gradle.properties new file mode 100644 index 00000000..a66d58cb --- /dev/null +++ b/tinker-android/tinker-android-lib/gradle.properties @@ -0,0 +1,2 @@ +POM_ARTIFACT_ID=tinker-android-lib +POM_NAME=Tinker Android Lib diff --git a/tinker-android/tinker-android-lib/proguard-rules.pro b/tinker-android/tinker-android-lib/proguard-rules.pro new file mode 100644 index 00000000..ca7ea794 --- /dev/null +++ b/tinker-android/tinker-android-lib/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/zhangshaowen/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/tinker-android/tinker-android-lib/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java b/tinker-android/tinker-android-lib/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java new file mode 100644 index 00000000..58b06d7d --- /dev/null +++ b/tinker-android/tinker-android-lib/src/androidTest/java/com/tencent/tinker/lib/patch/ApplicationTest.java @@ -0,0 +1,29 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/tinker-android/tinker-android-lib/src/main/AndroidManifest.xml b/tinker-android/tinker-android-lib/src/main/AndroidManifest.xml new file mode 100644 index 00000000..da7ffb48 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java new file mode 100644 index 00000000..f0f3055f --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/DefaultPatchListener.java @@ -0,0 +1,85 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.listener; + +import android.content.Context; + +import com.tencent.tinker.lib.service.TinkerPatchService; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerServiceInternals; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/14. + */ +public class DefaultPatchListener implements PatchListener { + protected final Context context; + + public DefaultPatchListener(Context context) { + this.context = context; + } + + /** + * when we receive a patch, what would we do? + * you can overwrite it + * + * @param path + * @param isUpgrade + * @return + */ + @Override + public int onPatchReceived(String path, boolean isUpgrade) { + + int returnCode = patchCheck(path, isUpgrade); + + if (returnCode == ShareConstants.ERROR_PATCH_OK) { + TinkerPatchService.runPatchService(context, path, isUpgrade); + } else { + Tinker.with(context).getLoadReporter().onLoadPatchListenerReceiveFail(new File(path), returnCode, isUpgrade); + } + return returnCode; + + } + + protected int patchCheck(String path, boolean isUpgrade) { + Tinker manager = Tinker.with(context); + //check SharePrefenences also + if (!manager.isTinkerEnabled() || !ShareTinkerInternals.isTinkerEnableWithSharedPreferences(context)) { + return ShareConstants.ERROR_PATCH_DISABLE; + } + File file = new File(path); + + if (!file.isFile() || !file.exists() || file.length() == 0) { + return ShareConstants.ERROR_PATCH_NOTEXIST; + } + + //patch service can not send request + if (manager.isPatchProcess()) { + return ShareConstants.ERROR_PATCH_INSERVICE; + } + + //if the patch service is running, pending + if (TinkerServiceInternals.isTinkerPatchServiceRunning(context)) { + return ShareConstants.ERROR_PATCH_RUNNING; + } + return ShareConstants.ERROR_PATCH_OK; + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java new file mode 100644 index 00000000..7d65c555 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/listener/PatchListener.java @@ -0,0 +1,24 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.listener; + +/** + * Created by zhangshaowen on 16/3/14. + */ +public interface PatchListener { + int onPatchReceived(String path, boolean isUpgrade); +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java new file mode 100644 index 00000000..1cbe4025 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/AbstractPatch.java @@ -0,0 +1,29 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.content.Context; + +import com.tencent.tinker.lib.service.PatchResult; + +/** + * Created by zhangshaowen on 16/3/15. + */ +public abstract class AbstractPatch { + + public abstract boolean tryPatch(Context context, String tempPatchPath, PatchResult patchResult); +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BasePatchInternal.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BasePatchInternal.java new file mode 100644 index 00000000..5ef3d88d --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BasePatchInternal.java @@ -0,0 +1,101 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * Created by zhangshaowen on 16/4/12. + */ +public class BasePatchInternal { + protected static final String TAG = "Tinker.BasePatchInternal"; + + protected static final String DEX_PATH = ShareConstants.DEX_PATH; + protected static final String SO_PATH = ShareConstants.SO_PATH; + protected static final String DEX_OPTIMIZE_PATH = ShareConstants.DEX_OPTIMIZE_PATH; + protected static final int MAX_EXTRACT_ATTEMPTS = ShareConstants.MAX_EXTRACT_ATTEMPTS; + protected static final String DEX_META_FILE = ShareConstants.DEX_META_FILE; + protected static final String SO_META_FILE = ShareConstants.SO_META_FILE; + protected static final String RES_META_FILE = ShareConstants.RES_META_FILE; + + protected static final int TYPE_DEX = ShareConstants.TYPE_DEX; + protected static final int TYPE_DEX_FOR_ART = ShareConstants.TYPE_DEX_FOR_ART; + protected static final int TYPE_Library = ShareConstants.TYPE_LIBRARY; + protected static final int TYPE_RESOURCE = ShareConstants.TYPE_RESOURCE; + + public static boolean extract(ZipFile zipFile, ZipEntry entryFile, File extractTo, String targetMd5, boolean isDex) throws IOException { + int numAttempts = 0; + boolean isExtractionSuccessful = false; + while (numAttempts < MAX_EXTRACT_ATTEMPTS && !isExtractionSuccessful) { + numAttempts++; + BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entryFile)); + FileOutputStream fos = new FileOutputStream(extractTo); + BufferedOutputStream out = new BufferedOutputStream(fos); + + TinkerLog.i(TAG, "try Extracting " + extractTo.getPath()); + + try { + byte[] buffer = new byte[ShareConstants.BUFFER_SIZE]; + int length = bis.read(buffer); + while (length != -1) { + out.write(buffer, 0, length); + length = bis.read(buffer); + } + } finally { + SharePatchFileUtil.closeQuietly(out); + SharePatchFileUtil.closeQuietly(bis); + } + + if (isDex) { + isExtractionSuccessful = SharePatchFileUtil.verifyDexFileMd5(extractTo, targetMd5); + } else { + isExtractionSuccessful = SharePatchFileUtil.verifyFileMd5(extractTo, targetMd5); + } + TinkerLog.i(TAG, "isExtractionSuccessful: %b", isExtractionSuccessful); + + if (!isExtractionSuccessful) { + extractTo.delete(); + if (extractTo.exists()) { + TinkerLog.e(TAG, "Failed to delete corrupted dex " + extractTo.getPath()); + } + } + } + + return isExtractionSuccessful; + } + + public static int getMetaCorruptedCode(int type) { + if (type == TYPE_DEX || type == TYPE_DEX_FOR_ART) { + return ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED; + } else if (type == TYPE_Library) { + return ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED; + } else if (type == TYPE_RESOURCE) { + return ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED; + } + return ShareConstants.ERROR_PACKAGE_CHECK_OK; + } +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BsDiffPatchInternal.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BsDiffPatchInternal.java new file mode 100644 index 00000000..45e241b2 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/BsDiffPatchInternal.java @@ -0,0 +1,211 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.os.SystemClock; + +import com.tencent.tinker.bsdiff.BSPatch; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareBsDiffPatchInfo; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * Created by zhangshaowen on 16/3/21. + */ +public class BsDiffPatchInternal extends BasePatchInternal { + private static final String TAG = "Tinker.BsDiffPatchInternal"; + + protected static boolean tryRecoverLibraryFiles(Tinker manager, ShareSecurityCheck checker, Context context, + String patchVersionDirectory, File patchFile, boolean isUpgradePatch) { + + if (!manager.isEnabledForNativeLib()) { + TinkerLog.w(TAG, "patch recover, library is not enabled"); + return true; + } + String libMeta = checker.getMetaContentMap().get(SO_META_FILE); + + if (libMeta == null) { + TinkerLog.w(TAG, "patch recover, library is not contained"); + return true; + } + long begin = SystemClock.elapsedRealtime(); + boolean result = patchLibraryExtractViaBsDiff(context, patchVersionDirectory, libMeta, patchFile, isUpgradePatch); + long cost = SystemClock.elapsedRealtime() - begin; + TinkerLog.i(TAG, "recover lib result:%b, cost:%d, isUpgradePatch:%b", result, cost, isUpgradePatch); + return result; + } + + + private static boolean patchLibraryExtractViaBsDiff(Context context, String patchVersionDirectory, String meta, File patchFile, boolean isUpgradePatch) { + String dir = patchVersionDirectory + "/" + SO_PATH + "/"; + return extractBsDiffInternals(context, dir, meta, patchFile, TYPE_Library, isUpgradePatch); + } + + private static boolean extractBsDiffInternals(Context context, String dir, String meta, File patchFile, int type, boolean isUpgradePatch) { + //parse + ArrayList patchList = new ArrayList<>(); + + ShareBsDiffPatchInfo.parseDiffPatchInfo(meta, patchList); + + if (patchList.isEmpty()) { + TinkerLog.w(TAG, "extract patch list is empty! type:%s:", ShareTinkerInternals.getTypeString(type)); + return true; + } + + File directory = new File(dir); + if (!directory.exists()) { + directory.mkdirs(); + } + //I think it is better to extract the raw files from apk + Tinker manager = Tinker.with(context); + ApplicationInfo applicationInfo = context.getApplicationInfo(); + if (applicationInfo == null) { + // Looks like running on a test Context, so just return without patching. + TinkerLog.w(TAG, "applicationInfo == null!!!!"); + return false; + } + ZipFile apk = null; + ZipFile patch = null; + try { + String apkPath = applicationInfo.sourceDir; + apk = new ZipFile(apkPath); + patch = new ZipFile(patchFile); + + for (ShareBsDiffPatchInfo info : patchList) { + long start = System.currentTimeMillis(); + + final String infoPath = info.path; + String patchRealPath; + if (infoPath.equals("")) { + patchRealPath = info.name; + } else { + patchRealPath = info.path + "/" + info.name; + } + final String fileMd5 = info.md5; + if (!SharePatchFileUtil.checkIfMd5Valid(fileMd5)) { + TinkerLog.w(TAG, "meta file md5 mismatch, type:%s, name: %s, md5: %s", ShareTinkerInternals.getTypeString(type), info.name, info.md5); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + String middle; + + middle = info.path + "/" + info.name; + + File extractedFile = new File(dir + middle); + + //check file whether already exist + if (extractedFile.exists()) { + if (fileMd5.equals(SharePatchFileUtil.getMD5(extractedFile))) { + //it is ok, just continue + TinkerLog.w(TAG, "bsdiff file %s is already exist, and md5 match, just continue", extractedFile.getPath()); + continue; + } else { + TinkerLog.w(TAG, "have a mismatch corrupted dex " + extractedFile.getPath()); + extractedFile.delete(); + } + } else { + extractedFile.getParentFile().mkdirs(); + } + + + String patchFileMd5 = info.patchMd5; + //it is a new file, just copy + ZipEntry patchFileEntry = patch.getEntry(patchRealPath); + + if (patchFileEntry == null) { + TinkerLog.w(TAG, "patch entry is null. path:" + patchRealPath); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.name, type, isUpgradePatch); + return false; + } + + if (patchFileMd5.equals("0")) { + if (!extract(patch, patchFileEntry, extractedFile, fileMd5, false)) { + TinkerLog.w(TAG, "Failed to extract file " + extractedFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.name, type, isUpgradePatch); + return false; + } + } else { + //we do not check the intermediate files' md5 to save time, use check whether it is 32 length + if (!SharePatchFileUtil.checkIfMd5Valid(patchFileMd5)) { + TinkerLog.w(TAG, "meta file md5 mismatch, type:%s, name: %s, md5: %s", ShareTinkerInternals.getTypeString(type), info.name, patchFileMd5); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + + ZipEntry rawApkFileEntry = apk.getEntry(patchRealPath); + + if (rawApkFileEntry == null) { + TinkerLog.w(TAG, "apk entry is null. path:" + patchRealPath); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.name, type, isUpgradePatch); + return false; + } + + String rawApkCrc = info.rawCrc; + + //check source crc instead of md5 for faster + String rawEntryCrc = String.valueOf(rawApkFileEntry.getCrc()); + if (!rawEntryCrc.equals(rawApkCrc)) { + TinkerLog.e(TAG, "apk entry %s crc is not equal, expect crc: %s, got crc: %s", patchRealPath, rawApkCrc, rawEntryCrc); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.name, type, isUpgradePatch); + return false; + } + InputStream oldStream = null; + InputStream newStream = null; + try { + oldStream = apk.getInputStream(rawApkFileEntry); + newStream = patch.getInputStream(patchFileEntry); + BSPatch.patchFast(oldStream, newStream, extractedFile); + } finally { + SharePatchFileUtil.closeQuietly(oldStream); + SharePatchFileUtil.closeQuietly(newStream); + } + + //go go go bsdiff get the + if (!SharePatchFileUtil.verifyFileMd5(extractedFile, fileMd5)) { + TinkerLog.w(TAG, "Failed to recover diff file " + extractedFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.name, type, isUpgradePatch); + SharePatchFileUtil.safeDeleteFile(extractedFile); + return false; + } + TinkerLog.w(TAG, "success recover bsdiff file: %s, use time: %d", + extractedFile.getPath(), (System.currentTimeMillis() - start)); + } + } + + } catch (Throwable e) { +// e.printStackTrace(); + throw new TinkerRuntimeException("patch " + ShareTinkerInternals.getTypeString(type) + " extract failed (" + e.getMessage() + ").", e); + } finally { + SharePatchFileUtil.closeZip(apk); + SharePatchFileUtil.closeZip(patch); + } + return true; + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java new file mode 100644 index 00000000..936b50a6 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java @@ -0,0 +1,418 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.os.SystemClock; + +import com.tencent.tinker.commons.dexpatcher.DexPatchApplier; +import com.tencent.tinker.commons.dexpatcher.struct.SmallPatchedDexItemFile; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareDexDiffPatchInfo; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import dalvik.system.DexFile; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +/** + * Created by zhangshaowen on 16/4/12. + */ +public class DexDiffPatchInternal extends BasePatchInternal { + protected static final String TAG = "Tinker.DexDiffPatchInternal"; + + protected static boolean tryRecoverDexFiles(Tinker manager, ShareSecurityCheck checker, Context context, + String patchVersionDirectory, File patchFile, boolean isUpgradePatch) { + + if (!manager.isEnabledForDex()) { + TinkerLog.w(TAG, "patch recover, dex is not enabled"); + return true; + } + String dexMeta = checker.getMetaContentMap().get(DEX_META_FILE); + + if (dexMeta == null) { + TinkerLog.w(TAG, "patch recover, dex is not contained"); + return true; + } + + long begin = SystemClock.elapsedRealtime(); + boolean result = patchDexExtractViaDexDiff(context, patchVersionDirectory, dexMeta, patchFile, isUpgradePatch); + long cost = SystemClock.elapsedRealtime() - begin; + TinkerLog.i(TAG, "recover dex result:%b, cost:%d, isUpgradePatch:%b", result, cost, isUpgradePatch); + return result; + } + + private static boolean patchDexExtractViaDexDiff(Context context, String patchVersionDirectory, String meta, File patchFile, boolean isUpgradePatch) { + String dir = patchVersionDirectory + "/" + DEX_PATH + "/"; + + int dexType = ShareTinkerInternals.isVmArt() ? TYPE_DEX_FOR_ART : TYPE_DEX; + if (!extractDexDiffInternals(context, dir, meta, patchFile, dexType, isUpgradePatch)) { + TinkerLog.w(TAG, "patch recover, extractDiffInternals fail"); + return false; + } + + Tinker manager = Tinker.with(context); + + File dexFiles = new File(dir); + File[] files = dexFiles.listFiles(); + + if (files != null) { + String optimizeDexDirectory = patchVersionDirectory + "/" + DEX_OPTIMIZE_PATH + "/"; + File optimizeDexDirectoryFile = new File(optimizeDexDirectory); + + if (!optimizeDexDirectoryFile.exists()) { + optimizeDexDirectoryFile.mkdirs(); + } + + for (File file : files) { + try { + String outputPathName = SharePatchFileUtil.optimizedPathFor(file, optimizeDexDirectoryFile); + long start = System.currentTimeMillis(); + DexFile.loadDex(file.getAbsolutePath(), outputPathName, 0); + TinkerLog.i(TAG, "success dex optimize file, path: %s, use time: %d", file.getPath(), (System.currentTimeMillis() - start)); + } catch (Throwable e) { + TinkerLog.e(TAG, "dex optimize or load failed, path:" + file.getPath()); + //delete file + SharePatchFileUtil.safeDeleteFile(file); + manager.getPatchReporter().onPatchDexOptFail(patchFile, file, optimizeDexDirectory, file.getName(), e, isUpgradePatch); + return false; + } + } + } + + return true; + } + + + private static boolean extractDexDiffInternals(Context context, String dir, String meta, File patchFile, int type, boolean isUpgradePatch) { + //parse + ArrayList patchList = new ArrayList<>(); + + ShareDexDiffPatchInfo.parseDexDiffPatchInfo(meta, patchList); + + if (patchList.isEmpty()) { + TinkerLog.w(TAG, "extract patch list is empty! type:%s:", ShareTinkerInternals.getTypeString(type)); + return true; + } + + File directory = new File(dir); + if (!directory.exists()) { + directory.mkdirs(); + } + //I think it is better to extract the raw files from apk + Tinker manager = Tinker.with(context); + ZipFile apk = null; + ZipFile patch = null; + try { + ApplicationInfo applicationInfo = context.getApplicationInfo(); + if (applicationInfo == null) { + // Looks like running on a test Context, so just return without patching. + TinkerLog.w(TAG, "applicationInfo == null!!!!"); + return false; + } + String apkPath = applicationInfo.sourceDir; + apk = new ZipFile(apkPath); + patch = new ZipFile(patchFile); + + SmallPatchedDexItemFile smallPatchInfoFile = null; + + if (ShareTinkerInternals.isVmArt()) { + File extractedFile = new File(dir + ShareConstants.DEX_SMALLPATCH_INFO_FILE); + ZipEntry smallPatchInfoEntry = patch.getEntry(ShareConstants.DEX_SMALLPATCH_INFO_FILE); + if (smallPatchInfoEntry == null) { + TinkerLog.w(TAG, "small patch info is not exists, bad patch package?"); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, ShareConstants.DEX_SMALLPATCH_INFO_FILE, type, isUpgradePatch); + return false; + } + InputStream smallPatchInfoIs = null; + try { + smallPatchInfoIs = patch.getInputStream(smallPatchInfoEntry); + smallPatchInfoFile = new SmallPatchedDexItemFile(smallPatchInfoIs); + } catch (Throwable e) { + TinkerLog.w(TAG, "failed to read small patched info. reason: " + e.getMessage()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, ShareConstants.DEX_SMALLPATCH_INFO_FILE, type, isUpgradePatch); + return false; + } finally { + SharePatchFileUtil.closeQuietly(smallPatchInfoIs); + } + } + + for (ShareDexDiffPatchInfo info : patchList) { + long start = System.currentTimeMillis(); + + final String infoPath = info.path; + String patchRealPath; + if (infoPath.equals("")) { + patchRealPath = info.rawName; + } else { + patchRealPath = info.path + "/" + info.rawName; + } + + String dexDiffMd5 = info.dexDiffMd5; + String oldDexCrc = info.oldDexCrC; + + String extractedFileMd5 = ShareTinkerInternals.isVmArt() ? info.destMd5InArt : info.destMd5InDvm; + + if (!SharePatchFileUtil.checkIfMd5Valid(extractedFileMd5)) { + TinkerLog.w(TAG, "meta file md5 invalid, type:%s, name: %s, md5: %s", ShareTinkerInternals.getTypeString(type), info.rawName, extractedFileMd5); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + + File extractedFile = new File(dir + info.realName); + + //check file whether already exist + if (extractedFile.exists()) { + if (SharePatchFileUtil.verifyDexFileMd5(extractedFile, extractedFileMd5)) { + //it is ok, just continue + TinkerLog.w(TAG, "dex file %s is already exist, and md5 match, just continue", extractedFile.getPath()); + continue; + } else { + TinkerLog.w(TAG, "have a mismatch corrupted dex " + extractedFile.getPath()); + extractedFile.delete(); + } + } else { + extractedFile.getParentFile().mkdirs(); + } + + ZipEntry patchFileEntry = patch.getEntry(patchRealPath); + ZipEntry rawApkFileEntry = apk.getEntry(patchRealPath); + + if (oldDexCrc.equals("0")) { + if (patchFileEntry == null) { + TinkerLog.w(TAG, "patch entry is null. path:" + patchRealPath); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + + //it is a new file, but maybe we need to repack the dex file + if (!extractDexFile(patch, patchFileEntry, extractedFile, info)) { + TinkerLog.w(TAG, "Failed to extract raw patch file " + extractedFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + } else if (dexDiffMd5.equals("0")) { + // skip process old dex for dalvik vm + if (!ShareTinkerInternals.isVmArt()) { + continue; + } + + if (rawApkFileEntry == null) { + TinkerLog.w(TAG, "apk entry is null. path:" + patchRealPath); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + + //check source crc instead of md5 for faster + String rawEntryCrc = String.valueOf(rawApkFileEntry.getCrc()); + if (!rawEntryCrc.equals(oldDexCrc)) { + TinkerLog.e(TAG, "apk entry %s crc is not equal, expect crc: %s, got crc: %s", patchRealPath, oldDexCrc, rawEntryCrc); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + + InputStream oldDexIs = null; + try { + oldDexIs = apk.getInputStream(rawApkFileEntry); + new DexPatchApplier(oldDexIs, (int) rawApkFileEntry.getSize(), null, smallPatchInfoFile).executeAndSaveTo(extractedFile); + } catch (Throwable e) { + TinkerLog.w(TAG, "Failed to recover dex file " + extractedFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + SharePatchFileUtil.safeDeleteFile(extractedFile); + return false; + } finally { + SharePatchFileUtil.closeQuietly(oldDexIs); + } + + if (!SharePatchFileUtil.verifyDexFileMd5(extractedFile, extractedFileMd5)) { + TinkerLog.w(TAG, "Failed to recover dex file " + extractedFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + SharePatchFileUtil.safeDeleteFile(extractedFile); + return false; + } + } else { + if (patchFileEntry == null) { + TinkerLog.w(TAG, "patch entry is null. path:" + patchRealPath); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + + if (!SharePatchFileUtil.checkIfMd5Valid(dexDiffMd5)) { + TinkerLog.w(TAG, "meta file md5 invalid, type:%s, name: %s, md5: %s", ShareTinkerInternals.getTypeString(type), info.rawName, dexDiffMd5); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + + if (rawApkFileEntry == null) { + TinkerLog.w(TAG, "apk entry is null. path:" + patchRealPath); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + //check source crc instead of md5 for faster + String rawEntryCrc = String.valueOf(rawApkFileEntry.getCrc()); + if (!rawEntryCrc.equals(oldDexCrc)) { + TinkerLog.e(TAG, "apk entry %s crc is not equal, expect crc: %s, got crc: %s", patchRealPath, oldDexCrc, rawEntryCrc); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + return false; + } + + final boolean isRawDexFile = SharePatchFileUtil.isRawDexFile(info.rawName); + InputStream oldInputStream = apk.getInputStream(rawApkFileEntry); + InputStream newInputStream = patch.getInputStream(patchFileEntry); + //if it is not the dex file or we are using jar mode, we should repack the output dex to jar + try { + if (!isRawDexFile || info.isJarMode) { + FileOutputStream fos = new FileOutputStream(extractedFile); + ZipOutputStream zos = new ZipOutputStream(new + BufferedOutputStream(fos)); + + try { + zos.putNextEntry(new ZipEntry(ShareConstants.DEX_IN_JAR)); + //it is not a raw dex file, we do not want to any temp files + int oldDexSize; + if (!isRawDexFile) { + ZipEntry entry; + ZipInputStream zis = new ZipInputStream(oldInputStream); + while ((entry = zis.getNextEntry()) != null) { + if (ShareConstants.DEX_IN_JAR.equals(entry.getName())) break; + } + if (entry == null) { + throw new TinkerRuntimeException("can't recognize zip dex format file:" + extractedFile.getAbsolutePath()); + } + oldInputStream = zis; + oldDexSize = (int) entry.getSize(); + } else { + oldDexSize = (int) rawApkFileEntry.getSize(); + } + new DexPatchApplier(oldInputStream, oldDexSize, newInputStream, smallPatchInfoFile).executeAndSaveTo(zos); + zos.closeEntry(); + } finally { + SharePatchFileUtil.closeQuietly(zos); + } + + } else { + new DexPatchApplier(oldInputStream, (int) rawApkFileEntry.getSize(), newInputStream, smallPatchInfoFile).executeAndSaveTo(extractedFile); + } + } finally { + SharePatchFileUtil.closeQuietly(oldInputStream); + SharePatchFileUtil.closeQuietly(newInputStream); + } + + if (!SharePatchFileUtil.verifyDexFileMd5(extractedFile, extractedFileMd5)) { + TinkerLog.w(TAG, "Failed to recover dex file " + extractedFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, extractedFile, info.rawName, type, isUpgradePatch); + SharePatchFileUtil.safeDeleteFile(extractedFile); + return false; + } + TinkerLog.w(TAG, "success recover dex file: %s, use time: %d", + extractedFile.getPath(), (System.currentTimeMillis() - start)); + } + } + + } catch (Throwable e) { +// e.printStackTrace(); + throw new TinkerRuntimeException("patch " + ShareTinkerInternals.getTypeString(type) + " extract failed (" + e.getMessage() + ").", e); + } finally { + SharePatchFileUtil.closeZip(apk); + SharePatchFileUtil.closeZip(patch); + } + return true; + } + + /** + * repack dex to jar + * + * @param zipFile + * @param entryFile + * @param extractTo + * @param targetMd5 + * @return boolean + * @throws IOException + */ + private static boolean extractDexToJar(ZipFile zipFile, ZipEntry entryFile, File extractTo, String targetMd5) throws IOException { + int numAttempts = 0; + boolean isExtractionSuccessful = false; + while (numAttempts < MAX_EXTRACT_ATTEMPTS && !isExtractionSuccessful) { + numAttempts++; + + FileOutputStream fos = new FileOutputStream(extractTo); + InputStream in = zipFile.getInputStream(entryFile); + + ZipOutputStream zos = null; + BufferedInputStream bis = null; + + TinkerLog.i(TAG, "try Extracting " + extractTo.getPath()); + try { + zos = new ZipOutputStream(new + BufferedOutputStream(fos)); + bis = new BufferedInputStream(in); + + byte[] buffer = new byte[ShareConstants.BUFFER_SIZE]; + ZipEntry entry = new ZipEntry(ShareConstants.DEX_IN_JAR); + zos.putNextEntry(entry); + int length = bis.read(buffer); + while (length != -1) { + zos.write(buffer, 0, length); + length = bis.read(buffer); + } + zos.closeEntry(); + } finally { + SharePatchFileUtil.closeQuietly(bis); + SharePatchFileUtil.closeQuietly(zos); + } + + isExtractionSuccessful = SharePatchFileUtil.verifyDexFileMd5(extractTo, targetMd5); + TinkerLog.i(TAG, "isExtractionSuccessful: %b", isExtractionSuccessful); + + if (!isExtractionSuccessful) { + extractTo.delete(); + if (extractTo.exists()) { + TinkerLog.e(TAG, "Failed to delete corrupted dex " + extractTo.getPath()); + } + } + } + return isExtractionSuccessful; + } + + private static boolean extractDexFile(ZipFile zipFile, ZipEntry entryFile, File extractTo, ShareDexDiffPatchInfo dexInfo) throws IOException { + final String fileMd5 = ShareTinkerInternals.isVmArt() ? dexInfo.destMd5InArt : dexInfo.destMd5InDvm; + final String rawName = dexInfo.rawName; + final boolean isJarMode = dexInfo.isJarMode; + //it is raw dex and we use jar mode, so we need to zip it! + if (SharePatchFileUtil.isRawDexFile(rawName) && isJarMode) { + return extractDexToJar(zipFile, entryFile, extractTo, fileMd5); + } + return extract(zipFile, entryFile, extractTo, fileMd5, true); + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/RepairPatch.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/RepairPatch.java new file mode 100644 index 00000000..f9910f82 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/RepairPatch.java @@ -0,0 +1,121 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.content.Context; + +import com.tencent.tinker.lib.service.PatchResult; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/18. + * + * if some of a patch data(such as so, dex) is deleted, + * we will try to repair them via RepairPatch + * you can implement your own patch processor class + */ +public class RepairPatch extends AbstractPatch { + private static final String TAG = "Tinker.RepairPatch"; + + @Override + public boolean tryPatch(Context context, String tempPatchPath, PatchResult patchResult) { + + Tinker manager = Tinker.with(context); + + final File patchFile = new File(tempPatchPath); + + if (!manager.isTinkerEnabled() || !ShareTinkerInternals.isTinkerEnableWithSharedPreferences(context)) { + TinkerLog.e(TAG, "RepairPatch tryPatch:patch is disabled, just return"); + return false; + } + + if (!patchFile.isFile() || !patchFile.exists()) { + TinkerLog.e(TAG, "RepairPatch tryPatch:patch file is not found, just return"); + return false; + } + //check the signature, we should create a new checker + ShareSecurityCheck signatureCheck = new ShareSecurityCheck(context); + + + int returnCode = ShareTinkerInternals.checkSignatureAndTinkerID(context, patchFile, signatureCheck); + if (returnCode != ShareConstants.ERROR_PACKAGE_CHECK_OK) { + TinkerLog.e(TAG, "RepairPatch tryPatch:onPatchPackageCheckFail"); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, false, returnCode); + return false; + } + + patchResult.patchTinkerID = signatureCheck.getNewTinkerID(); + patchResult.baseTinkerID = signatureCheck.getTinkerID(); + + //it is a old patch, so we should find a exist + SharePatchInfo oldInfo = manager.getTinkerLoadResultIfPresent().patchInfo; + String patchMd5 = SharePatchFileUtil.getMD5(patchFile); + + //use md5 as version + patchResult.patchVersion = patchMd5; + + if (oldInfo == null) { + TinkerLog.e(TAG, "OldPatchProcessor tryPatch:onPatchVersionCheckFail, oldInfo is null"); + manager.getPatchReporter().onPatchVersionCheckFail(patchFile, oldInfo, patchMd5, false); + return false; + } else { + if (oldInfo.oldVersion == null || oldInfo.newVersion == null) { + TinkerLog.e(TAG, "RepairPatch tryPatch:onPatchInfoCorrupted"); + manager.getPatchReporter().onPatchInfoCorrupted(patchFile, oldInfo.oldVersion, oldInfo.newVersion, false); + return false; + } + //already have patch + if (!oldInfo.oldVersion.equals(patchMd5) || !oldInfo.newVersion.equals(patchMd5)) { + TinkerLog.e(TAG, "RepairPatch tryPatch:onPatchVersionCheckFail"); + manager.getPatchReporter().onPatchVersionCheckFail(patchFile, oldInfo, patchMd5, false); + return false; + } + } + + //check ok + final String patchDirectory = manager.getPatchDirectory().getAbsolutePath(); + + final String patchName = SharePatchFileUtil.getPatchVersionDirectory(patchMd5); + + final String patchVersionDirectory = patchDirectory + "/" + patchName; + + if (!DexDiffPatchInternal.tryRecoverDexFiles(manager, signatureCheck, context, patchVersionDirectory, patchFile, false)) { + TinkerLog.e(TAG, "RepairPatch tryPatch:try patch dex failed"); + return false; + } + + if (!BsDiffPatchInternal.tryRecoverLibraryFiles(manager, signatureCheck, context, patchVersionDirectory, patchFile, false)) { + TinkerLog.e(TAG, "RepairPatch tryPatch:try patch library failed"); + return false; + } + + if (!ResDiffPatchInternal.tryRecoverResourceFiles(manager, signatureCheck, context, patchVersionDirectory, patchFile, false)) { + TinkerLog.e(TAG, "RepairPatch tryPatch:try patch resource failed"); + return false; + } + return true; + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ResDiffPatchInternal.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ResDiffPatchInternal.java new file mode 100644 index 00000000..21ac8d85 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/ResDiffPatchInternal.java @@ -0,0 +1,317 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.os.SystemClock; + +import com.tencent.tinker.bsdiff.BSPatch; +import com.tencent.tinker.commons.resutil.ResUtil; +import com.tencent.tinker.commons.ziputil.TinkerZipEntry; +import com.tencent.tinker.commons.ziputil.TinkerZipFile; +import com.tencent.tinker.commons.ziputil.TinkerZipOutputStream; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareResPatchInfo; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * Created by zhangshaowen on 2016/8/8. + */ +public class ResDiffPatchInternal extends BasePatchInternal { + + protected static final String TAG = "Tinker.ResDiffPatchInternal"; + + protected static boolean tryRecoverResourceFiles(Tinker manager, ShareSecurityCheck checker, Context context, + String patchVersionDirectory, File patchFile, boolean isUpgradePatch) { + + if (!manager.isEnabledForResource()) { + TinkerLog.w(TAG, "patch recover, resource is not enabled"); + return true; + } + String resourceMeta = checker.getMetaContentMap().get(RES_META_FILE); + + if (resourceMeta == null || resourceMeta.length() == 0) { + TinkerLog.w(TAG, "patch recover, resource is not contained"); + return true; + } + + long begin = SystemClock.elapsedRealtime(); + boolean result = patchResourceExtractViaResourceDiff(context, patchVersionDirectory, resourceMeta, patchFile, isUpgradePatch); + long cost = SystemClock.elapsedRealtime() - begin; + TinkerLog.i(TAG, "recover resource result:%b, cost:%d, isNewPatch:%b", result, cost, isUpgradePatch); + return result; + } + + private static boolean patchResourceExtractViaResourceDiff(Context context, String patchVersionDirectory, String meta, File patchFile, boolean isUpgradePatch) { + String dir = patchVersionDirectory + "/" + ShareConstants.RES_PATH + "/"; + + if (!extractResourceDiffInternals(context, dir, meta, patchFile, TYPE_RESOURCE, isUpgradePatch)) { + TinkerLog.w(TAG, "patch recover, extractDiffInternals fail"); + return false; + } + return true; + } + + private static boolean extractResourceDiffInternals(Context context, String dir, String meta, File patchFile, int type, boolean isUpgradePatch) { + ShareResPatchInfo resPatchInfo = new ShareResPatchInfo(); + ShareResPatchInfo.parseAllResPatchInfo(meta, resPatchInfo); + TinkerLog.i(TAG, "res dir: %s, meta: %s", dir, resPatchInfo.toString()); + Tinker manager = Tinker.with(context); + + if (!SharePatchFileUtil.checkIfMd5Valid(resPatchInfo.resArscMd5)) { + TinkerLog.w(TAG, "resource meta file md5 mismatch, type:%s, md5: %s", ShareTinkerInternals.getTypeString(type), resPatchInfo.resArscMd5); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + File directory = new File(dir); + + File resOutput = new File(directory, ShareConstants.RES_NAME); + //check result file whether already exist + if (resOutput.exists()) { + if (SharePatchFileUtil.checkResourceArscMd5(resOutput, resPatchInfo.resArscMd5)) { + //it is ok, just continue + TinkerLog.w(TAG, "resource file %s is already exist, and md5 match, just return true", resOutput.getPath()); + return true; + } else { + TinkerLog.w(TAG, "have a mismatch corrupted resource " + resOutput.getPath()); + resOutput.delete(); + } + } else { + resOutput.getParentFile().mkdirs(); + } + + try { + ApplicationInfo applicationInfo = context.getApplicationInfo(); + if (applicationInfo == null) { + //Looks like running on a test Context, so just return without patching. + TinkerLog.w(TAG, "applicationInfo == null!!!!"); + return false; + } + String apkPath = applicationInfo.sourceDir; + + if (!checkAndExtractResourceLargeFile(context, apkPath, directory, patchFile, resPatchInfo, type, isUpgradePatch)) { + return false; + } + + TinkerZipOutputStream out = null; + TinkerZipFile oldApk = null; + TinkerZipFile newApk = null; + int totalEntryCount = 0; + try { + out = new TinkerZipOutputStream(new BufferedOutputStream(new FileOutputStream(resOutput))); + oldApk = new TinkerZipFile(apkPath); + newApk = new TinkerZipFile(patchFile); + final Enumeration entries = oldApk.entries(); + while (entries.hasMoreElements()) { + TinkerZipEntry zipEntry = entries.nextElement(); + if (zipEntry == null) { + throw new TinkerRuntimeException("zipEntry is null when get from oldApk"); + } + String name = zipEntry.getName(); + if (ShareResPatchInfo.checkFileInPattern(resPatchInfo.patterns, name)) { + //won't contain in add set. + if (!resPatchInfo.deleteRes.contains(name) + && !resPatchInfo.modRes.contains(name) + && !resPatchInfo.largeModRes.contains(name) + && !name.equals(ShareConstants.RES_MANIFEST)) { + ResUtil.extractTinkerEntry(oldApk, zipEntry, out); + totalEntryCount++; + } + } + } + + //process manifest + TinkerZipEntry manifestZipEntry = oldApk.getEntry(ShareConstants.RES_MANIFEST); + if (manifestZipEntry == null) { + TinkerLog.w(TAG, "manifest patch entry is null. path:" + ShareConstants.RES_MANIFEST); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, resOutput, ShareConstants.RES_MANIFEST, type, isUpgradePatch); + return false; + } + ResUtil.extractTinkerEntry(oldApk, manifestZipEntry, out); + totalEntryCount++; + + for (String name : resPatchInfo.largeModRes) { + TinkerZipEntry largeZipEntry = oldApk.getEntry(name); + if (largeZipEntry == null) { + TinkerLog.w(TAG, "large patch entry is null. path:" + name); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, resOutput, name, type, isUpgradePatch); + return false; + } + ShareResPatchInfo.LargeModeInfo largeModeInfo = resPatchInfo.largeModMap.get(name); + ResUtil.extractLargeModifyFile(largeZipEntry, largeModeInfo.file, largeModeInfo.crc, out); + totalEntryCount++; + } + + for (String name : resPatchInfo.addRes) { + TinkerZipEntry addZipEntry = newApk.getEntry(name); + if (addZipEntry == null) { + TinkerLog.w(TAG, "add patch entry is null. path:" + name); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, resOutput, name, type, isUpgradePatch); + return false; + } + ResUtil.extractTinkerEntry(newApk, addZipEntry, out); + totalEntryCount++; + } + + for (String name : resPatchInfo.modRes) { + TinkerZipEntry modZipEntry = newApk.getEntry(name); + if (modZipEntry == null) { + TinkerLog.w(TAG, "mod patch entry is null. path:" + name); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, resOutput, name, type, isUpgradePatch); + return false; + } + ResUtil.extractTinkerEntry(newApk, modZipEntry, out); + totalEntryCount++; + } + } finally { + if (out != null) { + out.close(); + } + if (oldApk != null) { + oldApk.close(); + } + if (newApk != null) { + newApk.close(); + } + //delete temp files + for (ShareResPatchInfo.LargeModeInfo largeModeInfo : resPatchInfo.largeModMap.values()) { + SharePatchFileUtil.safeDeleteFile(largeModeInfo.file); + } + } + boolean result = SharePatchFileUtil.checkResourceArscMd5(resOutput, resPatchInfo.resArscMd5); + + if (!result) { + TinkerLog.i(TAG, "check final new resource file fail path:%s, entry count:%d, size:%d", resOutput.getAbsolutePath(), totalEntryCount, resOutput.length()); + SharePatchFileUtil.safeDeleteFile(resOutput); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, resOutput, ShareConstants.RES_NAME, type, isUpgradePatch); + return false; + } + + TinkerLog.i(TAG, "final new resource file:%s, entry count:%d, size:%d", resOutput.getAbsolutePath(), totalEntryCount, resOutput.length()); + } catch (Throwable e) { +// e.printStackTrace(); + throw new TinkerRuntimeException("patch " + ShareTinkerInternals.getTypeString(type) + " extract failed (" + e.getMessage() + ").", e); + } + return true; + } + + private static boolean checkAndExtractResourceLargeFile(Context context, String apkPath, File directory, + File patchFile, ShareResPatchInfo resPatchInfo, int type, boolean isUpgradePatch) { + long start = System.currentTimeMillis(); + Tinker manager = Tinker.with(context); + ZipFile apkFile = null; + ZipFile patchZipFile = null; + try { + //recover resources.arsc first + apkFile = new ZipFile(apkPath); + ZipEntry arscEntry = apkFile.getEntry(ShareConstants.RES_ARSC); + File arscFile = new File(directory, ShareConstants.RES_ARSC); + if (arscEntry == null) { + TinkerLog.w(TAG, "resources apk entry is null. path:" + ShareConstants.RES_ARSC); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, arscFile, ShareConstants.RES_ARSC, type, isUpgradePatch); + return false; + } + //use base resources.arsc crc to identify base.apk + String baseArscCrc = String.valueOf(arscEntry.getCrc()); + if (!baseArscCrc.equals(resPatchInfo.arscBaseCrc)) { + TinkerLog.e(TAG, "resources.arsc's crc is not equal, expect crc: %s, got crc: %s", resPatchInfo.arscBaseCrc, baseArscCrc); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, arscFile, ShareConstants.RES_ARSC, type, isUpgradePatch); + return false; + } + + //resource arsc is not changed, just return true + if (resPatchInfo.largeModRes.isEmpty()) { + TinkerLog.i(TAG, "no large modify resources, just return"); + return true; + } + for (String name : resPatchInfo.largeModRes) { + long largeStart = System.currentTimeMillis(); + ShareResPatchInfo.LargeModeInfo largeModeInfo = resPatchInfo.largeModMap.get(name); + + if (largeModeInfo == null) { + TinkerLog.w(TAG, "resource not found largeModeInfo, type:%s, name: %s", ShareTinkerInternals.getTypeString(type), name); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + + largeModeInfo.file = new File(directory, name); + SharePatchFileUtil.ensureFileDirectory(largeModeInfo.file); + + //we do not check the intermediate files' md5 to save time, use check whether it is 32 length + if (!SharePatchFileUtil.checkIfMd5Valid(largeModeInfo.md5)) { + TinkerLog.w(TAG, "resource meta file md5 mismatch, type:%s, name: %s, md5: %s", ShareTinkerInternals.getTypeString(type), name, largeModeInfo.md5); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, isUpgradePatch, BasePatchInternal.getMetaCorruptedCode(type)); + return false; + } + patchZipFile = new ZipFile(patchFile); + ZipEntry patchEntry = patchZipFile.getEntry(name); + if (patchEntry == null) { + TinkerLog.w(TAG, "large mod patch entry is null. path:" + name); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, largeModeInfo.file, name, type, isUpgradePatch); + return false; + } + + ZipEntry baseEntry = apkFile.getEntry(name); + if (baseEntry == null) { + TinkerLog.w(TAG, "resources apk entry is null. path:" + name); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, largeModeInfo.file, name, type, isUpgradePatch); + return false; + } + InputStream oldStream = null; + InputStream newStream = null; + try { + oldStream = apkFile.getInputStream(baseEntry); + newStream = patchZipFile.getInputStream(patchEntry); + BSPatch.patchFast(oldStream, newStream, largeModeInfo.file); + } finally { + SharePatchFileUtil.closeQuietly(oldStream); + SharePatchFileUtil.closeQuietly(newStream); + } + //go go go bsdiff get the + if (!SharePatchFileUtil.verifyFileMd5(largeModeInfo.file, largeModeInfo.md5)) { + TinkerLog.w(TAG, "Failed to recover large modify file:%s", largeModeInfo.file.getPath()); + SharePatchFileUtil.safeDeleteFile(largeModeInfo.file); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, largeModeInfo.file, name, type, isUpgradePatch); + return false; + } + TinkerLog.w(TAG, "success recover large modify file:%s , file size:%d, use time:%d", largeModeInfo.file.getPath(), largeModeInfo.file.length(), (System.currentTimeMillis() - largeStart)); + } + TinkerLog.w(TAG, "success recover all large modify use time:%d", (System.currentTimeMillis() - start)); + } catch (Throwable e) { +// e.printStackTrace(); + throw new TinkerRuntimeException("patch " + ShareTinkerInternals.getTypeString(type) + " extract failed (" + e.getMessage() + ").", e); + } finally { + SharePatchFileUtil.closeZip(apkFile); + SharePatchFileUtil.closeZip(patchZipFile); + } + return true; + } +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java new file mode 100644 index 00000000..3a91e09f --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/UpgradePatch.java @@ -0,0 +1,158 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.patch; + +import android.content.Context; + +import com.tencent.tinker.lib.service.PatchResult; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; +import java.io.IOException; + + +/** + * generate new patch, you can implement your own patch processor class + * Created by zhangshaowen on 16/3/14. + */ +public class UpgradePatch extends AbstractPatch { + private static final String TAG = "Tinker.UpgradePatch"; + + @Override + public boolean tryPatch(Context context, String tempPatchPath, PatchResult patchResult) { + Tinker manager = Tinker.with(context); + + final File patchFile = new File(tempPatchPath); + + if (!manager.isTinkerEnabled() || !ShareTinkerInternals.isTinkerEnableWithSharedPreferences(context)) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:patch is disabled, just return"); + return false; + } + + if (!patchFile.isFile() || !patchFile.exists()) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:patch file is not found, just return"); + return false; + } + //check the signature, we should create a new checker + ShareSecurityCheck signatureCheck = new ShareSecurityCheck(context); + + int returnCode = ShareTinkerInternals.checkSignatureAndTinkerID(context, patchFile, signatureCheck); + if (returnCode != ShareConstants.ERROR_PACKAGE_CHECK_OK) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:onPatchPackageCheckFail"); + manager.getPatchReporter().onPatchPackageCheckFail(patchFile, true, returnCode); + return false; + } + + patchResult.patchTinkerID = signatureCheck.getNewTinkerID(); + patchResult.baseTinkerID = signatureCheck.getTinkerID(); + + //it is a new patch, so we should not find a exist + SharePatchInfo oldInfo = manager.getTinkerLoadResultIfPresent().patchInfo; + String patchMd5 = SharePatchFileUtil.getMD5(patchFile); + + if (patchMd5 == null) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:patch md5 is null, just return"); + return false; + } + + //use md5 as version + patchResult.patchVersion = patchMd5; + + SharePatchInfo newInfo; + + //already have patch + if (oldInfo != null) { + if (oldInfo.oldVersion == null || oldInfo.newVersion == null) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:onPatchInfoCorrupted"); + manager.getPatchReporter().onPatchInfoCorrupted(patchFile, oldInfo.oldVersion, oldInfo.newVersion, true); + return false; + } + + if (oldInfo.oldVersion.equals(patchMd5) || oldInfo.newVersion.equals(patchMd5)) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:onPatchVersionCheckFail"); + manager.getPatchReporter().onPatchVersionCheckFail(patchFile, oldInfo, patchMd5, true); + return false; + } + newInfo = new SharePatchInfo(oldInfo.oldVersion, patchMd5); + } else { + newInfo = new SharePatchInfo("", patchMd5); + } + + //check ok, we can real recover a new patch + final String patchDirectory = manager.getPatchDirectory().getAbsolutePath(); + + TinkerLog.i(TAG, "UpgradePatch tryPatch:dexDiffMd5:%s", patchMd5); + + final String patchName = SharePatchFileUtil.getPatchVersionDirectory(patchMd5); + + final String patchVersionDirectory = patchDirectory + "/" + patchName; + + TinkerLog.i(TAG, "UpgradePatch tryPatch:patchVersionDirectory:%s", patchVersionDirectory); + + //it is a new patch, we first delete if there is any files + //don't delete dir for faster retry +// SharePatchFileUtil.deleteDir(patchVersionDirectory); + + //copy file + File destPatchFile = new File(patchVersionDirectory + "/" + SharePatchFileUtil.getPatchVersionFile(patchMd5)); + try { + SharePatchFileUtil.copyFileUsingStream(patchFile, destPatchFile); + TinkerLog.w(TAG, "UpgradePatch after %s size:%d, %s size:%d", patchFile.getAbsolutePath(), patchFile.length(), + destPatchFile.getAbsolutePath(), destPatchFile.length()); + } catch (IOException e) { +// e.printStackTrace(); + TinkerLog.e(TAG, "UpgradePatch tryPatch:copy patch file fail from %s to %s", patchFile.getPath(), destPatchFile.getPath()); + manager.getPatchReporter().onPatchTypeExtractFail(patchFile, destPatchFile, patchFile.getName(), ShareConstants.TYPE_PATCH_FILE, true); + return false; + } + + //we use destPatchFile instead of patchFile, because patchFile may be deleted during the patch process + if (!DexDiffPatchInternal.tryRecoverDexFiles(manager, signatureCheck, context, patchVersionDirectory, destPatchFile, true)) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:new patch recover, try patch dex failed"); + return false; + } + + if (!BsDiffPatchInternal.tryRecoverLibraryFiles(manager, signatureCheck, context, patchVersionDirectory, destPatchFile, true)) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:new patch recover, try patch library failed"); + return false; + } + + if (!ResDiffPatchInternal.tryRecoverResourceFiles(manager, signatureCheck, context, patchVersionDirectory, destPatchFile, true)) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:new patch recover, try patch resource failed"); + return false; + } + + final File patchInfoFile = manager.getPatchInfoFile(); + + if (!SharePatchInfo.rewritePatchInfoFileWithLock(patchInfoFile, newInfo, SharePatchFileUtil.getPatchInfoLockFile(patchDirectory))) { + TinkerLog.e(TAG, "UpgradePatch tryPatch:new patch recover, rewrite patch info failed"); + manager.getPatchReporter().onPatchInfoCorrupted(patchFile, newInfo.oldVersion, newInfo.newVersion, true); + return false; + } + + + TinkerLog.w(TAG, "UpgradePatch tryPatch: done, it is ok"); + return true; + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java new file mode 100644 index 00000000..f955477d --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultLoadReporter.java @@ -0,0 +1,255 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.reporter; + + +import android.content.Context; + +import com.tencent.tinker.lib.service.TinkerPatchService; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.tinker.TinkerInstaller; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/10. + * the default implement for LoadReporter + * you can extent it for your own work + * all is running in the process which loading the patch + */ +public class DefaultLoadReporter implements LoadReporter { + private static final String TAG = "Tinker.DefaultLoadReporter"; + protected final Context context; + + public DefaultLoadReporter(Context context) { + this.context = context; + } + + /** + * we receive a patch, but it check fails by PatchListener + * so we would not start a {@link TinkerPatchService} + * + * @param patchFile + * @param errorCode errorCode define as following + * {@code ShareConstants.ERROR_PATCH_OK} it is ok + * {@code ShareConstants.ERROR_PATCH_DISABLE} patch is disable + * {@code ShareConstants.ERROR_PATCH_NOTEXIST} the file of tempPatchPatch file is not exist + * {@code ShareConstants.ERROR_PATCH_RUNNING} the recover service is running now, try later + * {@code ShareConstants.ERROR_PATCH_INSERVICE} the recover service can't send patch request + * + * @param isUpgrade whether is a new patch, or just recover the old patch + */ + @Override + public void onLoadPatchListenerReceiveFail(File patchFile, int errorCode, boolean isUpgrade) { + TinkerLog.i(TAG, "patch load Reporter: patch receive fail:%s, code:%d, isUpgrade:%b", patchFile.getAbsolutePath(), errorCode, isUpgrade); + } + + + /** + * we can only handle patch version change in the main process, + * we will need to kill all other process to ensure that all process's code is the same. + * you can delete the old patch version file as {@link DefaultLoadReporter#onLoadPatchVersionChanged(String, String, File, String)} + * or you can restart your other process here + * + * @param oldVersion + * @param newVersion + * @param patchDirectoryFile + * @param currentPatchName + */ + @Override + public void onLoadPatchVersionChanged(String oldVersion, String newVersion, File patchDirectoryFile, String currentPatchName) { + TinkerLog.i(TAG, "patch version change from " + oldVersion + " to " + newVersion); + + if (oldVersion == null || newVersion == null) { + return; + } + if (oldVersion.equals(newVersion)) { + return; + } + + //check main process + if (!Tinker.with(context).isMainProcess()) { + return; + } + TinkerLog.i(TAG, "try kill all other process"); + //kill all other process to ensure that all process's code is the same. + ShareTinkerInternals.killAllOtherProcess(context); + + //delete old patch files + File[] files = patchDirectoryFile.listFiles(); + if (files != null) { + for (File file : files) { + String name = file.getName(); + if (file.isDirectory() && !name.equals(currentPatchName)) { + SharePatchFileUtil.deleteDir(file); + } + } + } + } + + /** + * some files is not found, + * we'd like to recover the old patch with {@link TinkerPatchService} in OldPatchProcessor mode + * as {@link DefaultLoadReporter#onLoadFileNotFound(File, int, boolean)} + * + * @param file the missing file + * @param fileType file type as following + * {@code ShareConstants.TYPE_PATCH_FILE} patch file or directory not found + * {@code ShareConstants.TYPE_PATCH_INFO} patch info file or directory not found + * {@code ShareConstants.TYPE_DEX} patch dex file or directory not found + * {@code ShareConstants.TYPE_LIBRARY} patch lib file or directory not found + * {@code ShareConstants.TYPE_RESOURCE} patch lib file or directory not found + * + * @param isDirectory whether is directory for the file type + */ + @Override + public void onLoadFileNotFound(File file, int fileType, boolean isDirectory) { + TinkerLog.i(TAG, "patch file not found: %s, fileType:%d, isDirectory:%b", file.getAbsolutePath(), fileType, isDirectory); + if (fileType == ShareConstants.TYPE_DEX || fileType == ShareConstants.TYPE_DEX_OPT + || fileType == ShareConstants.TYPE_LIBRARY || fileType == ShareConstants.TYPE_RESOURCE) { + Tinker tinker = Tinker.with(context); + + //we can recover at any process except recover process + if (!tinker.isPatchProcess()) { + File patchVersionFile = tinker.getTinkerLoadResultIfPresent().patchVersionFile; + if (patchVersionFile != null) { + TinkerInstaller.onReceiveRepairPatch(context, patchVersionFile.getAbsolutePath()); + } + } + } else if (fileType == ShareConstants.TYPE_PATCH_FILE || fileType == ShareConstants.TYPE_PATCH_INFO) { + Tinker.with(context).cleanPatch(); + } + } + + /** + * default, we don't check file's md5 when we load them. but you can set {@code TinkerApplication.tinkerLoadVerifyFlag} + * with tinker-android-anno, you can set {@code DefaultLifeCycle.loadVerifyFlag} + * some files' md5 is mismatch with the meta.txt file + * we won't load these files, clean patch for safety + * + * @param file the mismatch file + * @param fileType file type, just now, only dex or library will go here + * {@code ShareConstants.TYPE_DEX} patch dex file md5 mismatch + * {@code ShareConstants.TYPE_LIBRARY} patch lib file md5 mismatch + * {@code ShareConstants.TYPE_RESOURCE} patch resource file md5 mismatch + */ + @Override + public void onLoadFileMd5Mismatch(File file, int fileType) { + TinkerLog.i(TAG, "patch file md5 mismatch file: %s, fileType:%d", file.getAbsolutePath(), fileType); + //clean patch for safety + Tinker.with(context).cleanPatch(); + } + + /** + * when we load a new patch, we need to rewrite the patch.info file. + * but patch info corrupted, we can't recover from it + * we can clean patch as {@link DefaultLoadReporter#onLoadPatchInfoCorrupted(String, String, File)} + * + * @param oldVersion @nullable + * @param newVersion @nullable + * @param patchInfoFile + */ + @Override + public void onLoadPatchInfoCorrupted(String oldVersion, String newVersion, File patchInfoFile) { + TinkerLog.i(TAG, "patch info file damage: %s", patchInfoFile.getAbsolutePath()); + TinkerLog.i(TAG, "patch info file damage from version: %s to version: %s", oldVersion, newVersion); + + Tinker.with(context).cleanPatch(); + } + + /** + * the load patch process is end, we can see the cost times and the return code + * return codes are define in {@link com.tencent.tinker.loader.shareutil.ShareConstants} + * + * @param patchDirectory the root patch directory {you_apk_data}/tinker + * @param loadCode {@code ShareConstants.ERROR_LOAD_OK}, 0 means success + * @param cost time in ms + */ + @Override + public void onLoadResult(File patchDirectory, int loadCode, long cost) { + TinkerLog.i(TAG, "patch load result, path:%s, code:%d, cost:%d", patchDirectory.getAbsolutePath(), loadCode, cost); + //you can just report the result here + } + + /** + * load patch occur unknown exception that we have wrap try catch for you! + * you may need to report this exception and contact me + * welcome to report a new issues for us! + * you can disable patch as {@link DefaultLoadReporter#onLoadException(Throwable, int)} + * + * @param e + * @param errorCode exception code + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_UNKNOWN} unknown exception + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_DEX} exception when load dex + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_RESOURCE} exception when load resource + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_UNCAUGHT} exception unCaught + */ + @Override + public void onLoadException(Throwable e, int errorCode) { + //for unCaught or dex exception, disable tinker all the time with sp + switch (errorCode) { + case ShareConstants.ERROR_LOAD_EXCEPTION_DEX: + if (e.getMessage().contains(ShareConstants.CHECK_DEX_INSTALL_FAIL)) { + TinkerLog.e(TAG, "tinker dex check fail:" + e.getMessage()); + } else { + TinkerLog.i(TAG, "patch load dex exception: %s", e); + } + ShareTinkerInternals.setTinkerDisableWithSharedPreferences(context); + TinkerLog.i(TAG, "dex exception disable tinker forever with sp"); + break; + case ShareConstants.ERROR_LOAD_EXCEPTION_RESOURCE: + TinkerLog.i(TAG, "patch load resource exception: %s", e); + break; + case ShareConstants.ERROR_LOAD_EXCEPTION_UNCAUGHT: + TinkerLog.i(TAG, "patch load unCatch exception: %s", e); + ShareTinkerInternals.setTinkerDisableWithSharedPreferences(context); + TinkerLog.i(TAG, "unCaught exception disable tinker forever with sp"); + break; + case ShareConstants.ERROR_LOAD_EXCEPTION_UNKNOWN: + TinkerLog.i(TAG, "patch load unknown exception: %s", e); + break; + } + TinkerLog.printErrStackTrace(TAG, e, "tinker load exception"); + + Tinker.with(context).setTinkerDisable(); + Tinker.with(context).cleanPatch(); + } + /** + * check patch signature, TINKER_ID and meta files + * + * @param patchFile the loading path file + * @param errorCode 0 is ok, you should define the errorCode yourself + * {@code ShareConstants.ERROR_PACKAGE_CHECK_OK} it is ok + * {@code ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL} patch file signature is not the same with the base apk + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND} package meta: "assets/package_meta.txt" is not found + * {@code ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED} dex meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED} lib meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in old apk manifest + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in patch meta file + * {@code ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL} apk and patch's TINKER_PATCH value is not equal + * {@code ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED} resource meta file's format check fail + */ + @Override + public void onLoadPackageCheckFail(File patchFile, int errorCode) { + TinkerLog.i(TAG, "load patch package check fail file path:%s, errorCode:%d", patchFile.getAbsolutePath(), errorCode); + Tinker.with(context).cleanPatch(); + } +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java new file mode 100644 index 00000000..c1717c41 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/DefaultPatchReporter.java @@ -0,0 +1,188 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.reporter; + + +import android.content.Context; +import android.content.Intent; + +import com.tencent.tinker.lib.service.DefaultTinkerResultService; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/14. + * the default implement for PatchReporter + * you can extent it for your own work + * all is running in the :patch process + */ +public class DefaultPatchReporter implements PatchReporter { + private static final String TAG = "Tinker.DefaultPatchReporter"; + protected final Context context; + + public DefaultPatchReporter(Context context) { + this.context = context; + } + + /************************************ :patch process below ***************************************/ + /** + * use for report or some work at the beginning of TinkerPatchService + * {@code TinkerPatchService.onHandleIntent} begin + * + * @param intent + */ + @Override + public void onPatchServiceStart(Intent intent) { + TinkerLog.i(TAG, "patchReporter: patch service start"); + } + + /** + * check patch signature, TINKER_ID and meta files + * + * @param patchFile the loading path file + * @param errorCode 0 is ok, you should define the errorCode yourself + * {@code ShareConstants.ERROR_PACKAGE_CHECK_OK} it is ok + * {@code ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL} patch file signature is not the same with the base apk + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND} package meta: "assets/package_meta.txt" is not found + * {@code ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED} dex meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED} lib meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in old apk manifest + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in patch meta file + * {@code ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL} apk and patch's TINKER_PATCH value is not equal + * {@code ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED} resource meta file's format check fail + */ + @Override + public void onPatchPackageCheckFail(File patchFile, boolean isUpgradePatch, int errorCode) { + TinkerLog.i(TAG, "patchReporter: package check failed. path:%s, isUpgrade:%b, code:%d", patchFile.getAbsolutePath(), isUpgradePatch, errorCode); + //only meta corrupted, need to delete temp files. others is just in the check time! + if (errorCode == ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED + || errorCode == ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED + || errorCode == ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED) { + //delete temp files + Tinker.with(context).cleanPatchByVersion(patchFile); + } + } + + /** + * for upgrade patch, patchFileVersion can't equal oldVersion or newVersion in oldPatchInfo + * for repair patch, oldPatchInfo can 't be null, and patchFileVersion must equal with oldVersion and newVersion + * + * @param patchFile the input patch file to recover + * @param oldPatchInfo the current patch info + * @param patchFileVersion it is the md5 of the input patchFile + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + @Override + public void onPatchVersionCheckFail(File patchFile, SharePatchInfo oldPatchInfo, String patchFileVersion, boolean isUpgradePatch) { + TinkerLog.i(TAG, "patchReporter: patch version exist. path:%s, version:%s, isUpgrade:%b", patchFile.getAbsolutePath(), patchFileVersion, isUpgradePatch); + //no need to delete temp files, because it is only in the check time! + } + + /** + * try to recover file fail + * + * @param patchFile the input patch file to recover + * @param extractTo the target file + * @param filename + * @param fileType file type as following + * {@code ShareConstants.TYPE_DEX} extract patch dex file fail + * {@code ShareConstants.TYPE_DEX_FOR_ART} extract patch small art dex file fail + * {@code ShareConstants.TYPE_LIBRARY} extract patch library fail + * {@code ShareConstants.TYPE_PATCH_FILE} copy patch file fail + * {@code ShareConstants.TYPE_RESOURCE} extract patch resource fail + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + @Override + public void onPatchTypeExtractFail(File patchFile, File extractTo, String filename, int fileType, boolean isUpgradePatch) { + TinkerLog.i(TAG, "patchReporter: file extract fail type:%s, path:%s, extractTo:%s, filename:%s, isUpgrade:%b", + ShareTinkerInternals.getTypeString(fileType), patchFile.getPath(), extractTo.getPath(), filename, isUpgradePatch); + //delete temp files + Tinker.with(context).cleanPatchByVersion(patchFile); + } + + /** + * dex opt failed + * + * @param patchFile the input patch file to recover + * @param dexFile the dex file + * @param optDirectory + * @param dexName dexName try to dexOpt + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + @Override + public void onPatchDexOptFail(File patchFile, File dexFile, String optDirectory, String dexName, Throwable t, boolean isUpgradePatch) { + TinkerLog.i(TAG, "patchReporter: dex opt fail path:%s, dexPath:%s, optDir:%s, dexName:%s, isUpgrade:%b", + patchFile.getAbsolutePath(), dexFile.getPath(), optDirectory, dexName, isUpgradePatch); + TinkerLog.printErrStackTrace(TAG, t, "onPatchDexOptFail:"); + //delete temp files + Tinker.with(context).cleanPatchByVersion(patchFile); + } + + /** + * recover result, we will also send a result to {@link DefaultTinkerResultService} + * + * @param patchFile the input patch file to recover + * @param success if it is success + * @param cost cost time in ms + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + @Override + public void onPatchResult(File patchFile, boolean success, long cost, boolean isUpgradePatch) { + TinkerLog.i(TAG, "patchReporter: patch all result path:%s, success:%b, cost:%d, isUpgrade:%b", patchFile.getAbsolutePath(), success, cost, isUpgradePatch); + //you can just report the result here + } + + /** + * when we load a new patch, we need to rewrite the patch.info file. + * but patch info corrupted, we can't recover from it + * + * @param patchFile the input patch file to recover + * @param oldVersion old patch version + * @param newVersion new patch version + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + @Override + public void onPatchInfoCorrupted(File patchFile, String oldVersion, String newVersion, boolean isUpgradePatch) { + TinkerLog.i(TAG, "patchReporter: patch info is corrupted. old:%s, new:%s, isUpgradeP:%b", oldVersion, newVersion, isUpgradePatch); + //patch.info is corrupted, just clean all patch + Tinker.with(context).cleanPatch(); + } + + /** + * recover patch occur unknown exception that we have wrap try catch for you! + * you may need to report this exception and contact me + * welcome to report a new issues for us! + * + * @param patchFile the input file to patch + * @param e + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + @Override + public void onPatchException(File patchFile, Throwable e, boolean isUpgradePatch) { + TinkerLog.i(TAG, "patchReporter: patch exception path:%s, throwable:%s, isUpgrade:%b", patchFile.getAbsolutePath(), e.getMessage(), isUpgradePatch); + TinkerLog.printErrStackTrace(TAG, e, "tinker patch exception"); + //don't accept request any more! + Tinker.with(context).setTinkerDisable(); + ////delete temp files, I think we don't have to clean all patch + Tinker.with(context).cleanPatchByVersion(patchFile); + } +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java new file mode 100644 index 00000000..67f4c7aa --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/LoadReporter.java @@ -0,0 +1,140 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.reporter; + +import com.tencent.tinker.lib.service.TinkerPatchService; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/10. + */ +public interface LoadReporter { + + /** + * we receive a patch, but it check fails by PatchListener + * so we would not start a {@link TinkerPatchService} + * + * @param patchFile + * @param errorCode errorCode define as following + * {@code ShareConstants.ERROR_PATCH_OK} it is ok + * {@code ShareConstants.ERROR_PATCH_DISABLE} patch is disable + * {@code ShareConstants.ERROR_PATCH_NOTEXIST} the file of tempPatchPatch file is not exist + * {@code ShareConstants.ERROR_PATCH_RUNNING} the recover service is running now, try later + * {@code ShareConstants.ERROR_PATCH_INSERVICE} the recover service can't send patch request + * @param isUpgrade whether is a new patch, or just recover the old patch + */ + void onLoadPatchListenerReceiveFail(File patchFile, int errorCode, boolean isUpgrade); + + /** + * we can only handle patch version change in the main process, + * we will need to kill all other process to ensure that all process's code is the same. + * you can delete the old patch version file as {@link DefaultLoadReporter#onLoadPatchVersionChanged(String, String, File, String)} + * or you can restart your other process here + * + * @param oldVersion + * @param newVersion + * @param patchDirectoryFile + * @param currentPatchName + */ + void onLoadPatchVersionChanged(String oldVersion, String newVersion, File patchDirectoryFile, String currentPatchName); + + /** + * the load patch process is end, we can see the cost times and the return code + * return codes are define in {@link com.tencent.tinker.loader.shareutil.ShareConstants} + * + * @param patchDirectory the root patch directory {you_apk_data}/tinker + * @param loadCode {@code ShareConstants.ERROR_LOAD_OK}, 0 means success + * @param cost time in MS + */ + void onLoadResult(File patchDirectory, int loadCode, long cost); + + /** + * load patch occur unknown exception that we have wrap try catch for you! + * you may need to report this exception and contact me + * welcome to report a new issues for us! + * you can disable patch as {@link DefaultLoadReporter#onLoadException(Throwable, int)} + * + * @param e + * @param errorCode exception code + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_UNKNOWN} unknown exception + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_DEX} exception when load dex + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_RESOURCE} exception when load resource + * {@code ShareConstants.ERROR_LOAD_EXCEPTION_UNCAUGHT} exception unCaught + */ + void onLoadException(Throwable e, int errorCode); + + /** + * some files is not found, + * we'd like to recover the old patch with {@link TinkerPatchService} in OldPatchProcessor mode + * as {@link DefaultLoadReporter#onLoadFileNotFound(File, int, boolean)} + * + * @param file the missing file + * @param fileType file type as following + * {@code ShareConstants.TYPE_PATCH_FILE} patch file or directory not found + * {@code ShareConstants.TYPE_PATCH_INFO} patch info file or directory not found + * {@code ShareConstants.TYPE_DEX} patch dex file or directory not found + * {@code ShareConstants.TYPE_LIBRARY} patch lib file or directory not found + * {@code ShareConstants.TYPE_RESOURCE} patch lib file or directory not found + * + * @param isDirectory whether is directory for the file type + */ + void onLoadFileNotFound(File file, int fileType, boolean isDirectory); + + /** + * default, we don't check file's md5 when we load them. but you can set {@code TinkerApplication.tinkerLoadVerifyFlag} + * with tinker-android-anno, you can set {@code DefaultLifeCycle.loadVerifyFlag} + * some files' md5 is mismatch with the meta.txt file + * we won't load these files, clean patch for safety + * + * @param file the mismatch file + * @param fileType file type, just now, only dex or library will go here + * {@code ShareConstants.TYPE_DEX} patch dex file md5 mismatch + * {@code ShareConstants.TYPE_LIBRARY} patch lib file md5 mismatch + * {@code ShareConstants.TYPE_RESOURCE} patch resource file md5 mismatch + */ + void onLoadFileMd5Mismatch(File file, int fileType); + + /** + * when we load a new patch, we need to rewrite the patch.info file. + * but patch info corrupted, we can't recover from it + * we can clean patch as {@link DefaultLoadReporter#onLoadPatchInfoCorrupted(String, String, File)} + * + * @param oldVersion @nullable + * @param newVersion @nullable + * @param patchInfoFile + */ + void onLoadPatchInfoCorrupted(String oldVersion, String newVersion, File patchInfoFile); + + /** + * check patch signature, TINKER_ID and meta files + * + * @param patchFile the loading path file + * @param errorCode 0 is ok, you should define the errorCode yourself + * {@code ShareConstants.ERROR_PACKAGE_CHECK_OK} it is ok + * {@code ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL} patch file signature is not the same with the base apk + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND} package meta: "assets/package_meta.txt" is not found + * {@code ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED} dex meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED} lib meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in old apk manifest + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in patch meta file + * {@code ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL} apk and patch's TINKER_PATCH value is not equal + * {@code ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED} resource meta file's format check fail + */ + void onLoadPackageCheckFail(File patchFile, int errorCode); + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java new file mode 100644 index 00000000..dbc5860c --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/reporter/PatchReporter.java @@ -0,0 +1,139 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.reporter; + + +import android.content.Intent; + +import com.tencent.tinker.lib.patch.RepairPatch; +import com.tencent.tinker.lib.patch.UpgradePatch; +import com.tencent.tinker.lib.service.DefaultTinkerResultService; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/14. + * + * isUpgradePatch: + * true: means that it is a newly patch, we would default use {@link UpgradePatch} + * to do the job + * + * false: means that there are some files missing in current patch, we want to repair them, + * we would default use {@link RepairPatch} to do the recover patch job + */ +public interface PatchReporter { + + /** + * use for report or some work at the beginning of TinkerPatchService + * {@code TinkerPatchService.onHandleIntent} begin + * + * @param intent + */ + void onPatchServiceStart(Intent intent); + + /** + * check patch signature, TINKER_ID and meta files + * + * @param patchFile the loading path file + * @param errorCode 0 is ok, you should define the errorCode yourself + * {@code ShareConstants.ERROR_PACKAGE_CHECK_OK} it is ok + * {@code ShareConstants.ERROR_PACKAGE_CHECK_SIGNATURE_FAIL} patch file signature is not the same with the base apk + * {@code ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED} dex meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED} lib meta file's format check fail + * {@code ShareConstants.ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in old apk manifest + * {@code ShareConstants.ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND} can't find TINKER_PATCH in patch meta file + * {@code ShareConstants.ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL} apk and patch's TINKER_PATCH value is not equal + * {@code ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED} resource meta file's format check fail + */ + void onPatchPackageCheckFail(File patchFile, boolean isUpgradePatch, int errorCode); + + /** + * for upgrade patch, patchFileVersion can't equal oldVersion or newVersion in oldPatchInfo + * for repair patch, oldPatchInfo can 't be null, and patchFileVersion must equal with oldVersion and newVersion + * + * @param patchFile the input patch file to recover + * @param oldPatchInfo the current patch info + * @param patchFileVersion it is the md5 of the input patchFile + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + void onPatchVersionCheckFail(File patchFile, SharePatchInfo oldPatchInfo, String patchFileVersion, boolean isUpgradePatch); + + + /** + * try to recover file fail + * + * @param patchFile the input patch file to recover + * @param extractTo the target file + * @param filename + * @param fileType file type as following + * {@code ShareConstants.TYPE_DEX} extract patch dex file fail + * {@code ShareConstants.TYPE_DEX_FOR_ART} extract patch small art dex file fail + * {@code ShareConstants.TYPE_LIBRARY} extract patch library fail + * {@code ShareConstants.TYPE_PATCH_FILE} copy patch file fail + * {@code ShareConstants.TYPE_RESOURCE} extract patch resource fail + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + void onPatchTypeExtractFail(File patchFile, File extractTo, String filename, int fileType, boolean isUpgradePatch); + + + /** + * dex opt failed + * + * @param patchFile the input patch file to recover + * @param dexFile the dex file + * @param optDirectory + * @param dexName dexName try to dexOpt + * @param t throwable + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + void onPatchDexOptFail(File patchFile, File dexFile, String optDirectory, String dexName, Throwable t, boolean isUpgradePatch); + + + /** + * recover result, we will also send a result to {@link DefaultTinkerResultService} + * + * @param patchFile the input patch file to recover + * @param success if it is success + * @param cost cost time in ms + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + void onPatchResult(File patchFile, boolean success, long cost, boolean isUpgradePatch); + + /** + * recover patch occur unknown exception that we have wrap try catch for you! + * you may need to report this exception and contact me + * welcome to report a new issues for us! + * + * @param patchFile the input file to patch + * @param e + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + void onPatchException(File patchFile, Throwable e, boolean isUpgradePatch); + + /** + * when we load a new patch, we need to rewrite the patch.info file. + * but patch info corrupted, we can't recover from it + * + * @param patchFile the input patch file to recover + * @param oldVersion old patch version + * @param newVersion new patch version + * @param isUpgradePatch whether it is a new patch file, or just recover some of the current patch files + */ + void onPatchInfoCorrupted(File patchFile, String oldVersion, String newVersion, boolean isUpgradePatch); + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java new file mode 100644 index 00000000..0ecb1bca --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/AbstractResultService.java @@ -0,0 +1,78 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.service; + +import android.app.IntentService; +import android.content.Context; +import android.content.Intent; + +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; + +/** + * Created by zhangshaowen on 16/3/14. + */ +public abstract class AbstractResultService extends IntentService { + private static final String TAG = "Tinker.AbstractResultService"; + + private static final String RESULT_EXTRA = "result_extra"; + + private static Class resultServiceClass = null; + + /** + * Creates an IntentService. Invoked by your subclass's constructor. + */ + public AbstractResultService() { + super(AbstractResultService.class.getSimpleName()); + } + + public static void runResultService(Context context, PatchResult result) { + if (resultServiceClass == null) { + throw new TinkerRuntimeException("resultServiceClass is null."); + } + Intent intent = new Intent(context, resultServiceClass); + intent.putExtra(RESULT_EXTRA, result); + + context.startService(intent); + } + + public static void setResultServiceClass(Class serviceClass) { + resultServiceClass = serviceClass; + //try to load + try { + Class.forName(serviceClass.getName()); + } catch (ClassNotFoundException e) { +// e.printStackTrace(); + } + + } + + @Override + protected void onHandleIntent(Intent intent) { + if (intent == null) { + TinkerLog.e(TAG, "AbstractResultService received a null intent, ignoring."); + return; + } + PatchResult result = (PatchResult) ShareIntentUtil.getSerializableExtra(intent, RESULT_EXTRA); + + onPatchResult(result); + } + + public abstract void onPatchResult(PatchResult result); + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java new file mode 100644 index 00000000..078fb5ad --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/DefaultTinkerResultService.java @@ -0,0 +1,86 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.service; + + +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.tinker.TinkerLoadResult; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.lib.util.TinkerServiceInternals; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/19. + */ +public class DefaultTinkerResultService extends AbstractResultService { + private static final String TAG = "Tinker.DefaultTinkerResultService"; + + /** + * we may want to use the new patch just now!! + * + * @param result + */ + @Override + public void onPatchResult(PatchResult result) { + if (result == null) { + TinkerLog.e(TAG, "DefaultTinkerResultService received null result!!!!"); + return; + } + TinkerLog.i(TAG, "DefaultTinkerResultService received a result:%s ", result.toString()); + + //first, we want to kill the recover process + TinkerServiceInternals.killTinkerPatchServiceProcess(getApplicationContext()); + + // if success and newPatch, it is nice to delete the raw file, and restart at once + // only main process can load an upgrade patch! + if (result.isSuccess && result.isUpgradePatch) { + File rawFile = new File(result.rawPatchFilePath); + if (rawFile.exists()) { + TinkerLog.i(TAG, "save delete raw patch file"); + SharePatchFileUtil.safeDeleteFile(rawFile); + } + if (checkIfNeedKill(result)) { + android.os.Process.killProcess(android.os.Process.myPid()); + } else { + TinkerLog.i(TAG, "I have already install the newly patch version!"); + } + } + + //repair current patch fail, just clean! + if (!result.isSuccess && !result.isUpgradePatch) { + Tinker.with(getApplicationContext()).cleanPatch(); + } + } + + public boolean checkIfNeedKill(PatchResult result) { + Tinker tinker = Tinker.with(getApplicationContext()); + if (tinker.isTinkerLoaded()) { + TinkerLoadResult tinkerLoadResult = tinker.getTinkerLoadResultIfPresent(); + if (tinkerLoadResult != null) { + String currentVersion = tinkerLoadResult.currentVersion; + if (result.patchVersion != null && result.patchVersion.equals(currentVersion)) { + return false; + } + } + } + return true; + } + + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/PatchResult.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/PatchResult.java new file mode 100644 index 00000000..7de1e3d9 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/PatchResult.java @@ -0,0 +1,63 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.service; + +import java.io.Serializable; + +/** + * Created by zhangshaowen on 16/3/19. + */ +public class PatchResult implements Serializable { + public boolean isUpgradePatch; + + public boolean isSuccess; + + public String rawPatchFilePath; + + public long costTime; + + public Throwable e; + + //@Nullable + public String patchVersion; + + //@Nullable + public String patchTinkerID; + + //@Nullable + public String baseTinkerID; + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("\nPatchResult: \n"); + sb.append("isUpgradePatch:" + isUpgradePatch + "\n"); + sb.append("isSuccess:" + isSuccess + "\n"); + sb.append("rawPatchFilePath:" + rawPatchFilePath + "\n"); + sb.append("costTime:" + costTime + "\n"); + sb.append("patchVersion:" + patchVersion + "\n"); + sb.append("patchTinkerID:" + patchTinkerID + "\n"); + sb.append("baseTinkerID:" + baseTinkerID + "\n"); + + if (e != null) { + sb.append("Throwable:" + e.getMessage() + "\n"); + } else { + sb.append("Throwable: null" + "\n"); + } + return sb.toString(); + } +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java new file mode 100644 index 00000000..75f254af --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java @@ -0,0 +1,193 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.service; + +import android.app.IntentService; +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.IBinder; +import android.os.SystemClock; + +import com.tencent.tinker.lib.patch.AbstractPatch; +import com.tencent.tinker.lib.tinker.Tinker; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/14. + */ +public class TinkerPatchService extends IntentService { + private static final String TAG = "Tinker.TinkerPatchService"; + + private static final String PATCH_PATH_EXTRA = "patch_path_extra"; + private static final String PATCH_NEW_EXTRA = "patch_new_extra"; + private static AbstractPatch upgradePatchProcessor = null; + private static AbstractPatch repairPatchProcessor = null; + private static int notificationId = ShareConstants.TINKER_PATCH_SERVICE_NOTIFICATION; + + /** + * Creates an IntentService. Invoked by your subclass's constructor. + */ + public TinkerPatchService() { + super(TinkerPatchService.class.getSimpleName()); + } + + public static void runPatchService(Context context, String path, boolean isUpgradePatch) { + Intent intent = new Intent(context, TinkerPatchService.class); + intent.putExtra(PATCH_PATH_EXTRA, path); + intent.putExtra(PATCH_NEW_EXTRA, isUpgradePatch); + + context.startService(intent); + } + + public static void setPatchProcessor(AbstractPatch upgradePatch, AbstractPatch repairPatch) { + upgradePatchProcessor = upgradePatch; + repairPatchProcessor = repairPatch; + } + + public static String getPatchPathExtra(Intent intent) { + if (intent == null) { + throw new TinkerRuntimeException("getPatchPathExtra, but intent is null"); + } + return ShareIntentUtil.getStringExtra(intent, PATCH_PATH_EXTRA); + } + + public static boolean getPatchUpgradeExtra(Intent intent) { + if (intent == null) { + throw new TinkerRuntimeException("getPatchUpgradeExtra, but intent is null"); + } + return ShareIntentUtil.getBooleanExtra(intent, PATCH_NEW_EXTRA, false); + } + + /** + * set the tinker notification id you want + * @param id + */ + public static void setTinkerNotificationId(int id) { + notificationId = id; + } + + @Override + protected void onHandleIntent(Intent intent) { + final Context context = getApplicationContext(); + Tinker tinker = Tinker.with(context); + tinker.getPatchReporter().onPatchServiceStart(intent); + + if (intent == null) { + TinkerLog.e(TAG, "TinkerPatchService received a null intent, ignoring."); + return; + } + String path = getPatchPathExtra(intent); + if (path == null) { + TinkerLog.e(TAG, "TinkerPatchService can't get the path extra, ignoring."); + return; + } + File patchFile = new File(path); + + boolean isUpgradePatch = getPatchUpgradeExtra(intent); + + long begin = SystemClock.elapsedRealtime(); + boolean result; + long cost; + Throwable e = null; + + increasingPriority(); + PatchResult patchResult = new PatchResult(); + try { + if (isUpgradePatch) { + if (upgradePatchProcessor == null) { + throw new TinkerRuntimeException("upgradePatchProcessor is null."); + } + result = upgradePatchProcessor.tryPatch(context, path, patchResult); + + } else { + //just recover from exist patch + if (repairPatchProcessor == null) { + throw new TinkerRuntimeException("upgradePatchProcessor is null."); + } + result = repairPatchProcessor.tryPatch(context, path, patchResult); + } + } catch (Throwable throwable) { + e = throwable; + result = false; + tinker.getPatchReporter().onPatchException(patchFile, e, isUpgradePatch); + } + + cost = SystemClock.elapsedRealtime() - begin; + tinker.getPatchReporter(). + onPatchResult(patchFile, result, cost, isUpgradePatch); + + patchResult.isSuccess = result; + patchResult.isUpgradePatch = isUpgradePatch; + patchResult.rawPatchFilePath = path; + patchResult.costTime = cost; + patchResult.e = e; + + AbstractResultService.runResultService(context, patchResult); + + } + + private void increasingPriority() { + TinkerLog.i(TAG, "try to increase patch process priority"); + Notification notification = new Notification(); + if (Build.VERSION.SDK_INT < 18) { + startForeground(notificationId, notification); + } else { + startForeground(notificationId, notification); + // start InnerService + startService(new Intent(this, InnerService.class)); + } + } + + /** + * I don't want to do this, believe me + */ + //InnerService + public static class InnerService extends Service { + @Override + public void onCreate() { + super.onCreate(); + try { + startForeground(notificationId, new Notification()); + } catch (NullPointerException e) { + TinkerLog.e(TAG, "InnerService set service for push exception:%s.", e); + } + // kill + stopSelf(); + } + + @Override + public void onDestroy() { + stopForeground(true); + super.onDestroy(); + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + } + +} + diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java new file mode 100644 index 00000000..4d5be29c --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/Tinker.java @@ -0,0 +1,409 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.tinker; + +import android.content.Context; +import android.content.Intent; + +import com.tencent.tinker.lib.listener.DefaultPatchListener; +import com.tencent.tinker.lib.listener.PatchListener; +import com.tencent.tinker.lib.patch.AbstractPatch; +import com.tencent.tinker.lib.patch.RepairPatch; +import com.tencent.tinker.lib.patch.UpgradePatch; +import com.tencent.tinker.lib.reporter.DefaultLoadReporter; +import com.tencent.tinker.lib.reporter.DefaultPatchReporter; +import com.tencent.tinker.lib.reporter.LoadReporter; +import com.tencent.tinker.lib.reporter.PatchReporter; +import com.tencent.tinker.lib.service.AbstractResultService; +import com.tencent.tinker.lib.service.DefaultTinkerResultService; +import com.tencent.tinker.lib.service.TinkerPatchService; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.lib.util.TinkerServiceInternals; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/10. + */ +public class Tinker { + private static final String TAG = "Tinker.Tinker"; + + private static Tinker sInstance; + private static boolean installed = false; + final Context context; + /** + * data dir, such as /data/data/tinker.sample.android/tinker + */ + final File patchDirectory; + final PatchListener listener; + final LoadReporter loadReporter; + final PatchReporter patchReporter; + final File patchInfoFile; + final boolean isMainProcess; + final boolean isPatchProcess; + /** + * same with {@code TinkerApplication.tinkerLoadVerifyFlag} + */ + final boolean tinkerLoadVerifyFlag; + /** + * same with {@code TinkerApplication.tinkerFlags} + */ + int tinkerFlags; + TinkerLoadResult tinkerLoadResult; + /** + * whether load patch success + */ + private boolean loaded = false; + + private Tinker(Context context, int tinkerFlags, LoadReporter loadReporter, PatchReporter patchReporter, + PatchListener listener, File patchDirectory, File patchInfoFile, + boolean isInMainProc, boolean isPatchProcess, boolean tinkerLoadVerifyFlag) { + this.context = context; + this.listener = listener; + this.loadReporter = loadReporter; + this.patchReporter = patchReporter; + this.tinkerFlags = tinkerFlags; + this.patchDirectory = patchDirectory; + this.patchInfoFile = patchInfoFile; + this.isMainProcess = isInMainProc; + this.tinkerLoadVerifyFlag = tinkerLoadVerifyFlag; + this.isPatchProcess = isPatchProcess; + } + + /** + * init with default config tinker + * for safer, you must use @{link TinkerInstaller.install} first! + * + * @param context we will use the application context + * @return the Tinker object + */ + public static Tinker with(Context context) { + if (!installed) { + throw new TinkerRuntimeException("you must install tinker before get tinker sInstance"); + } + if (sInstance == null) { + synchronized (Tinker.class) { + if (sInstance == null) { + sInstance = new Builder(context).build(); + } + } + } + return sInstance; + } + + /** + * create custom tinker by {@link Tinker.Builder} + * please do it when very first your app start. + * + * @param tinker + */ + public static void create(Tinker tinker) { + if (sInstance != null) { + throw new TinkerRuntimeException("Tinker instance is already set."); + } + sInstance = tinker; + } + + /** + * you must install tinker first!! + * + * @param intentResult + * @param serviceClass + * @param upgradePatch + * @param repairPatch + */ + public void install(Intent intentResult, Class serviceClass, + AbstractPatch upgradePatch, AbstractPatch repairPatch + ) { + installed = true; + AbstractResultService.setResultServiceClass(serviceClass); + TinkerPatchService.setPatchProcessor(upgradePatch, repairPatch); + + if (!isTinkerEnabled()) { + TinkerLog.e(TAG, "tinker is disabled"); + return; + } + if (intentResult == null) { + throw new TinkerRuntimeException("intentResult must not be null."); + } + tinkerLoadResult = new TinkerLoadResult(); + tinkerLoadResult.parseTinkerResult(getContext(), intentResult); + //after load code set + loadReporter.onLoadResult(patchDirectory, tinkerLoadResult.loadCode, tinkerLoadResult.costTime); + + if (!loaded) { + TinkerLog.w(TAG, "tinker load fail!"); + } + } + + /** + * set tinkerPatchServiceNotificationId + * @param id + */ + public void setPatchServiceNotificationId(int id) { + TinkerPatchService.setTinkerNotificationId(id); + } + + + /** + * Nullable, should check the loaded flag first + */ + public TinkerLoadResult getTinkerLoadResultIfPresent() { + return tinkerLoadResult; + } + + public void install(Intent intentResult) { + install(intentResult, DefaultTinkerResultService.class, new UpgradePatch(), new RepairPatch()); + } + + public Context getContext() { + return context; + } + + public boolean isMainProcess() { + return isMainProcess; + } + + public boolean isPatchProcess() { + return isPatchProcess; + } + + public void setTinkerDisable() { + tinkerFlags = ShareConstants.TINKER_DISABLE; + } + + public LoadReporter getLoadReporter() { + return loadReporter; + } + + public PatchReporter getPatchReporter() { + return patchReporter; + } + + + public boolean isTinkerEnabled() { + return ShareTinkerInternals.isTinkerEnabled(tinkerFlags); + } + + public boolean isTinkerLoaded() { + return loaded; + } + + public void setTinkerLoaded(boolean isLoaded) { + loaded = isLoaded; + } + + public boolean isTinkerInstalled() { + return installed; + } + + public boolean isTinkerLoadVerify() { + return tinkerLoadVerifyFlag; + } + + public boolean isEnabledForDex() { + return ShareTinkerInternals.isTinkerEnabledForDex(tinkerFlags); + } + + public boolean isEnabledForNativeLib() { + return ShareTinkerInternals.isTinkerEnabledForNativeLib(tinkerFlags); + } + + public boolean isEnabledForResource() { + return ShareTinkerInternals.isTinkerEnabledForResource(tinkerFlags); + } + + public File getPatchDirectory() { + return patchDirectory; + } + + public File getPatchInfoFile() { + return patchInfoFile; + } + + public PatchListener getPatchListener() { + return listener; + } + + /** + * clean all patch files + */ + public void cleanPatch() { + if (patchDirectory == null) { + return; + } + if (isTinkerLoaded()) { + TinkerLog.e(TAG, "it is not safety to clean patch when tinker is loaded, you should kill all your process after clean!"); + } + SharePatchFileUtil.deleteDir(patchDirectory); + } + + /** + * clean the patch version files, such as tinker/patch-641e634c + * + * @param versionName + */ + public void cleanPatchByVersion(String versionName) { + if (patchDirectory == null || versionName == null) { + return; + } + String path = patchDirectory.getAbsolutePath() + "/" + versionName; + SharePatchFileUtil.deleteDir(path); + } + + /** + * get the rom size of tinker, use kb + * + * @return + */ + public long getTinkerRomSpace() { + if (patchDirectory == null) { + return 0; + } + + return SharePatchFileUtil.getFileOrDirectorySize(patchDirectory) / 1024; + } + + /** + * try delete the temp version files + * + * @param patchFile + */ + public void cleanPatchByVersion(File patchFile) { + if (patchDirectory == null || patchFile == null || !patchFile.exists()) { + return; + } + String versionName = SharePatchFileUtil.getPatchVersionDirectory(SharePatchFileUtil.getMD5(patchFile)); + cleanPatchByVersion(versionName); + } + + + public static class Builder { + private final Context context; + private final boolean mainProcess; + private final boolean patchProcess; + + private int status = -1; + private LoadReporter loadReporter; + private PatchReporter patchReporter; + private PatchListener listener; + private File patchDirectory; + private File patchInfoFile; + private Boolean tinkerLoadVerifyFlag; + + /** + * Start building a new {@link Tinker} instance. + */ + public Builder(Context context) { + if (context == null) { + throw new TinkerRuntimeException("Context must not be null."); + } + this.context = context; + this.mainProcess = TinkerServiceInternals.isInMainProcess(context); + this.patchProcess = TinkerServiceInternals.isInTinkerPatchServiceProcess(context); + this.patchDirectory = SharePatchFileUtil.getPatchDirectory(context); + if (this.patchDirectory == null) { + TinkerLog.e(TAG, "patchDirectory is null!"); + return; + } + this.patchInfoFile = SharePatchFileUtil.getPatchInfoFile(patchDirectory.getAbsolutePath()); + TinkerLog.w(TAG, "tinker patch directory: %s", patchDirectory); + } + + public Builder tinkerFlags(int tinkerFlags) { + if (this.status != -1) { + throw new TinkerRuntimeException("tinkerFlag is already set."); + } + this.status = tinkerFlags; + return this; + } + + public Builder tinkerLoadVerifyFlag(Boolean verifyMd5WhenLoad) { + if (verifyMd5WhenLoad == null) { + throw new TinkerRuntimeException("tinkerLoadVerifyFlag must not be null."); + } + if (this.tinkerLoadVerifyFlag != null) { + throw new TinkerRuntimeException("tinkerLoadVerifyFlag is already set."); + } + this.tinkerLoadVerifyFlag = verifyMd5WhenLoad; + return this; + } + + public Builder loadReport(LoadReporter loadReporter) { + if (loadReporter == null) { + throw new TinkerRuntimeException("loadReporter must not be null."); + } + if (this.loadReporter != null) { + throw new TinkerRuntimeException("loadReporter is already set."); + } + this.loadReporter = loadReporter; + return this; + } + + public Builder patchReporter(PatchReporter patchReporter) { + if (patchReporter == null) { + throw new TinkerRuntimeException("patchReporter must not be null."); + } + if (this.patchReporter != null) { + throw new TinkerRuntimeException("patchReporter is already set."); + } + this.patchReporter = patchReporter; + return this; + } + + public Builder listener(PatchListener listener) { + if (listener == null) { + throw new TinkerRuntimeException("listener must not be null."); + } + if (this.listener != null) { + throw new TinkerRuntimeException("listener is already set."); + } + this.listener = listener; + return this; + } + + public Tinker build() { + if (status == -1) { + status = ShareConstants.TINKER_ENABLE_ALL; + } + + if (loadReporter == null) { + loadReporter = new DefaultLoadReporter(context); + } + + if (patchReporter == null) { + patchReporter = new DefaultPatchReporter(context); + } + + if (listener == null) { + listener = new DefaultPatchListener(context); + } + + if (tinkerLoadVerifyFlag == null) { + tinkerLoadVerifyFlag = false; + } + + return new Tinker(context, status, loadReporter, patchReporter, listener, patchDirectory, + patchInfoFile, mainProcess, patchProcess, tinkerLoadVerifyFlag); + } + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java new file mode 100644 index 00000000..b3363b47 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerApplicationHelper.java @@ -0,0 +1,342 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.tinker; + +import android.content.Intent; + +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.app.ApplicationLike; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; +import java.util.HashMap; + +/** + * sometimes, you may want to install tinker later, or never install tinker in some process. + * you can use {@code TinkerApplicationHelper} API to get the tinker status! + * Created by zhangshaowen on 16/6/28. + */ +public class TinkerApplicationHelper { + private static final String TAG = "Tinker.TinkerApplicationHelper"; + + /** + * they can use without Tinker is installed! + * same as {@code Tinker.isTinkerEnabled} + * + * @return + */ + public static boolean isTinkerEnableAll(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + int tinkerFlags = applicationLike.getTinkerFlags(); + return ShareTinkerInternals.isTinkerEnabledAll(tinkerFlags); + } + + /** + * same as {@code Tinker.isEnabledForDex} + * + * @param applicationLike + * @return + */ + public static boolean isTinkerEnableForDex(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + int tinkerFlags = applicationLike.getTinkerFlags(); + return ShareTinkerInternals.isTinkerEnabledForDex(tinkerFlags); + } + + /** + * same as {@code Tinker.isEnabledForNativeLib} + * + * @param applicationLike + * @return + */ + public static boolean isTinkerEnableForNativeLib(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + int tinkerFlags = applicationLike.getTinkerFlags(); + return ShareTinkerInternals.isTinkerEnabledForNativeLib(tinkerFlags); + } + + /** + * same as {@code Tinker.isTinkerEnabledForResource} + * + * @param applicationLike + * @return + */ + public static boolean isTinkerEnableForResource(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + int tinkerFlags = applicationLike.getTinkerFlags(); + return ShareTinkerInternals.isTinkerEnabledForResource(tinkerFlags); + } + + /** + * same as {@code Tinker.getPatchDirectory} + * + * @param applicationLike + * @return + */ + public static File getTinkerPatchDirectory(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + + return SharePatchFileUtil.getPatchDirectory(applicationLike.getApplication()); + } + + /** + * whether tinker is success loaded + * same as {@code Tinker.isTinkerLoaded} + * + * @param applicationLike + * @return + */ + public static boolean isTinkerLoadSuccess(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + + Intent tinkerResultIntent = applicationLike.getTinkerResultIntent(); + + if (tinkerResultIntent == null) { + return false; + } + int loadCode = ShareIntentUtil.getIntentReturnCode(tinkerResultIntent); + + return (loadCode == ShareConstants.ERROR_LOAD_OK); + } + + /** + * you can use this api to get load dexes before tinker is installed + * same as {@code Tinker.getTinkerLoadResultIfPresent.dexes} + * + * @return + */ + public static HashMap getLoadDexesAndMd5(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + + Intent tinkerResultIntent = applicationLike.getTinkerResultIntent(); + + if (tinkerResultIntent == null) { + return null; + } + int loadCode = ShareIntentUtil.getIntentReturnCode(tinkerResultIntent); + + if (loadCode == ShareConstants.ERROR_LOAD_OK) { + return ShareIntentUtil.getIntentPatchDexPaths(tinkerResultIntent); + } + return null; + } + + + /** + * you can use this api to get load libs before tinker is installed + * same as {@code Tinker.getTinkerLoadResultIfPresent.libs} + * + * @return + */ + public static HashMap getLoadLibraryAndMd5(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + + Intent tinkerResultIntent = applicationLike.getTinkerResultIntent(); + + if (tinkerResultIntent == null) { + return null; + } + int loadCode = ShareIntentUtil.getIntentReturnCode(tinkerResultIntent); + + if (loadCode == ShareConstants.ERROR_LOAD_OK) { + return ShareIntentUtil.getIntentPatchLibsPaths(tinkerResultIntent); + } + return null; + } + + /** + * you can use this api to get tinker package configs before tinker is installed + * same as {@code Tinker.getTinkerLoadResultIfPresent.packageConfig} + * + * @return + */ + public static HashMap getPackageConfigs(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + + Intent tinkerResultIntent = applicationLike.getTinkerResultIntent(); + + if (tinkerResultIntent == null) { + return null; + } + int loadCode = ShareIntentUtil.getIntentReturnCode(tinkerResultIntent); + + if (loadCode == ShareConstants.ERROR_LOAD_OK) { + return ShareIntentUtil.getIntentPackageConfig(tinkerResultIntent); + } + return null; + } + + /** + * you can use this api to get tinker current version before tinker is installed + * + * @return + */ + public static String getCurrentVersion(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + + Intent tinkerResultIntent = applicationLike.getTinkerResultIntent(); + + if (tinkerResultIntent == null) { + return null; + } + final String oldVersion = ShareIntentUtil.getStringExtra(tinkerResultIntent, ShareIntentUtil.INTENT_PATCH_OLD_VERSION); + final String newVersion = ShareIntentUtil.getStringExtra(tinkerResultIntent, ShareIntentUtil.INTENT_PATCH_NEW_VERSION); + final boolean isMainProcess = ShareTinkerInternals.isInMainProcess(applicationLike.getApplication()); + if (oldVersion != null && newVersion != null) { + if (isMainProcess) { + return newVersion; + } else { + return oldVersion; + } + } + return null; + } + + /** + * clean all patch files without install tinker + * same as {@code Tinker.cleanPatch} + * + * @param applicationLike + */ + public static void cleanPatch(ApplicationLike applicationLike) { + if (applicationLike == null || applicationLike.getApplication() == null) { + throw new TinkerRuntimeException("tinkerApplication is null"); + } + if (TinkerApplicationHelper.isTinkerLoadSuccess(applicationLike)) { + TinkerLog.e(TAG, "it is not safety to clean patch when tinker is loaded, you should kill all your process after clean!"); + } + SharePatchFileUtil.deleteDir(SharePatchFileUtil.getPatchDirectory(applicationLike.getApplication())); + } + + /** + * only support auto load lib/armeabi-v7a library from patch. + * in some process, you may not want to install tinker + * and you can load patch dex and library without install tinker! + * } + */ + public static void loadArmV7aLibrary(ApplicationLike applicationLike, String libName) { + if (libName == null || libName.isEmpty() || applicationLike == null) { + throw new TinkerRuntimeException("libName or context is null!"); + } + + if (TinkerApplicationHelper.isTinkerEnableForNativeLib(applicationLike)) { + if (TinkerApplicationHelper.loadLibraryFromTinker(applicationLike, "lib/armeabi-v7a", libName)) { + return; + } + + } + System.loadLibrary(libName); + } + + + /** + * only support auto load lib/armeabi library from patch. + * in some process, you may not want to install tinker + * and you can load patch dex and library without install tinker! + */ + public static void loadArmLibrary(ApplicationLike applicationLike, String libName) { + if (libName == null || libName.isEmpty() || applicationLike == null) { + throw new TinkerRuntimeException("libName or context is null!"); + } + + if (TinkerApplicationHelper.isTinkerEnableForNativeLib(applicationLike)) { + if (TinkerApplicationHelper.loadLibraryFromTinker(applicationLike, "lib/armeabi", libName)) { + return; + } + + } + System.loadLibrary(libName); + } + + /** + * you can use these api to load tinker library without tinker is installed! + * same as {@code TinkerInstaller#loadLibraryFromTinker} + * + * @param applicationLike + * @param relativePath + * @param libname + * @return + * @throws UnsatisfiedLinkError + */ + public static boolean loadLibraryFromTinker(ApplicationLike applicationLike, String relativePath, String libname) throws UnsatisfiedLinkError { + libname = libname.startsWith("lib") ? libname : "lib" + libname; + libname = libname.endsWith(".so") ? libname : libname + ".so"; + String relativeLibPath = relativePath + "/" + libname; + + //TODO we should add cpu abi, and the real path later + if (TinkerApplicationHelper.isTinkerEnableForNativeLib(applicationLike) + && TinkerApplicationHelper.isTinkerLoadSuccess(applicationLike)) { + HashMap loadLibraries = TinkerApplicationHelper.getLoadLibraryAndMd5(applicationLike); + if (loadLibraries != null) { + String currentVersion = TinkerApplicationHelper.getCurrentVersion(applicationLike); + if (ShareTinkerInternals.isNullOrNil(currentVersion)) { + return false; + } + File patchDirectory = SharePatchFileUtil.getPatchDirectory(applicationLike.getApplication()); + if (patchDirectory == null) { + return false; + } + File patchVersionDirectory = new File(patchDirectory.getAbsolutePath() + "/" + SharePatchFileUtil.getPatchVersionDirectory(currentVersion)); + String libPrePath = patchVersionDirectory.getAbsolutePath() + "/" + ShareConstants.SO_PATH; + + for (String name : loadLibraries.keySet()) { + if (name.equals(relativeLibPath)) { + String patchLibraryPath = libPrePath + "/" + name; + File library = new File(patchLibraryPath); + if (library.exists()) { + //whether we check md5 when load + boolean verifyMd5 = applicationLike.getTinkerLoadVerifyFlag(); + if (verifyMd5 && !SharePatchFileUtil.verifyFileMd5(library, loadLibraries.get(name))) { + //do not report, because tinker is not install + TinkerLog.i(TAG, "loadLibraryFromTinker md5mismatch fail:" + patchLibraryPath); + } else { + System.load(patchLibraryPath); + TinkerLog.i(TAG, "loadLibraryFromTinker success:" + patchLibraryPath); + return true; + } + } + } + } + } + } + return false; + } +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java new file mode 100644 index 00000000..f0b52b0a --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerInstaller.java @@ -0,0 +1,205 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.tinker; + +import android.content.Context; + +import com.tencent.tinker.lib.listener.PatchListener; +import com.tencent.tinker.lib.patch.AbstractPatch; +import com.tencent.tinker.lib.reporter.LoadReporter; +import com.tencent.tinker.lib.reporter.PatchReporter; +import com.tencent.tinker.lib.service.AbstractResultService; +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.app.ApplicationLike; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/19. + */ +public class TinkerInstaller { + private static final String TAG = "Tinker.TinkerInstaller"; + + /** + * install tinker with default config, you must install tinker before you use their api + * or you can just use {@link TinkerApplicationHelper}'s api + * + * @param applicationLike + */ + public static void install(ApplicationLike applicationLike) { + Tinker tinker = new Tinker.Builder(applicationLike.getApplication()).build(); + tinker.install(applicationLike.getTinkerResultIntent()); + } + + /** + * install tinker with custom config, you must install tinker before you use their api + * or you can just use {@link TinkerApplicationHelper}'s api + * + * @param applicationLike + * @param loadReporter + * @param patchReporter + * @param listener + * @param resultServiceClass + * @param upgradePatchProcessor + * @param repairPatchProcessor + */ + public static void install(ApplicationLike applicationLike, LoadReporter loadReporter, PatchReporter patchReporter, + PatchListener listener, Class resultServiceClass, + AbstractPatch upgradePatchProcessor, AbstractPatch repairPatchProcessor) { + + Tinker tinker = new Tinker.Builder(applicationLike.getApplication()) + .tinkerFlags(applicationLike.getTinkerFlags()) + .loadReport(loadReporter) + .listener(listener) + .patchReporter(patchReporter) + .tinkerLoadVerifyFlag(applicationLike.getTinkerLoadVerifyFlag()).build(); + + Tinker.create(tinker); + tinker.install(applicationLike.getTinkerResultIntent(), resultServiceClass, upgradePatchProcessor, repairPatchProcessor); + + + } + + /** + * clean all patch files! + * + * @param context + */ + public static void cleanPatch(Context context) { + Tinker.with(context).cleanPatch(); + } + + /** + * new patch file to install, try install them with :patch process + * + * @param context + * @param patchLocation + */ + public static void onReceiveUpgradePatch(Context context, String patchLocation) { + Tinker.with(context).getPatchListener().onPatchReceived(patchLocation, true); + } + + /** + * some file does not exist, repair them with :patch process + * Generally you will not use it + * + * @param context + * @param patchLocation + */ + public static void onReceiveRepairPatch(Context context, String patchLocation) { + Tinker.with(context).getPatchListener().onPatchReceived(patchLocation, false); + } + + /** + * set logIml for TinkerLog + * + * @param imp + */ + public static void setLogIml(TinkerLog.TinkerLogImp imp) { + TinkerLog.setTinkerLogImp(imp); + } + + /** + * sample usage for native library + * + * @param context + * @param relativePath such as lib/armeabi + * @param libname for the lib libTest.so, you can pass Test or libTest, or libTest.so + * @return boolean + * @throws UnsatisfiedLinkError + */ + public static boolean loadLibraryFromTinker(Context context, String relativePath, String libname) throws UnsatisfiedLinkError { + final Tinker tinker = Tinker.with(context); + + libname = libname.startsWith("lib") ? libname : "lib" + libname; + libname = libname.endsWith(".so") ? libname : libname + ".so"; + String relativeLibPath = relativePath + "/" + libname; + + //TODO we should add cpu abi, and the real path later + if (tinker.isEnabledForNativeLib() && tinker.isTinkerLoaded()) { + TinkerLoadResult loadResult = tinker.getTinkerLoadResultIfPresent(); + if (loadResult.libs != null) { + for (String name : loadResult.libs.keySet()) { + if (name.equals(relativeLibPath)) { + String patchLibraryPath = loadResult.libraryDirectory + "/" + name; + File library = new File(patchLibraryPath); + if (library.exists()) { + //whether we check md5 when load + boolean verifyMd5 = tinker.isTinkerLoadVerify(); + if (verifyMd5 && !SharePatchFileUtil.verifyFileMd5(library, loadResult.libs.get(name))) { + tinker.getLoadReporter().onLoadFileMd5Mismatch(library, ShareConstants.TYPE_LIBRARY); + } else { + System.load(patchLibraryPath); + TinkerLog.i(TAG, "loadLibraryFromTinker success:" + patchLibraryPath); + return true; + } + } + } + } + } + } + + return false; + } + + /** + * you can use TinkerInstaller.loadLibrary replace your System.loadLibrary for auto update library! + * only support auto load lib/armeabi library from patch. + * for other library in lib/* or assets, + * you can load through {@code TinkerInstaller#loadLibraryFromTinker} + */ + public static void loadArmLibrary(Context context, String libName) { + if (libName == null || libName.isEmpty() || context == null) { + throw new TinkerRuntimeException("libName or context is null!"); + } + + Tinker tinker = Tinker.with(context); + if (tinker.isEnabledForNativeLib()) { + if (TinkerInstaller.loadLibraryFromTinker(context, "lib/armeabi", libName)) { + return; + } + + } + System.loadLibrary(libName); + } + + /** + * you can use TinkerInstaller.loadArmV7Library replace your System.loadLibrary for auto update library! + * only support auto load lib/armeabi-v7a library from patch. + * for other library in lib/* or assets, + * you can load through {@code TinkerInstaller#loadLibraryFromTinker} + */ + public static void loadArmV7Library(Context context, String libName) { + if (libName == null || libName.isEmpty() || context == null) { + throw new TinkerRuntimeException("libName or context is null!"); + } + + Tinker tinker = Tinker.with(context); + if (tinker.isEnabledForNativeLib()) { + if (TinkerInstaller.loadLibraryFromTinker(context, "lib/armeabi-v7a", libName)) { + return; + } + + } + System.loadLibrary(libName); + } + + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java new file mode 100644 index 00000000..46316274 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/tinker/TinkerLoadResult.java @@ -0,0 +1,362 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.tinker; + +import android.content.Context; +import android.content.Intent; + +import com.tencent.tinker.lib.util.TinkerLog; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; +import java.util.HashMap; + +/** + * Created by zhangshaowen on 16/3/25. + */ +public class TinkerLoadResult { + private static final String TAG = "Tinker.TinkerLoadResult"; + //@Nullable + public SharePatchInfo patchInfo; + //@Nullable + public String currentVersion; + + public boolean versionChanged; + //@Nullable + public File patchVersionDirectory; + //@Nullable + public File patchVersionFile; + //@Nullable + public File dexDirectory; + //@Nullable + public File libraryDirectory; + //@Nullable + public File resourceDirectory; + //@Nullable + public File resourceFile; + //@Nullable + public HashMap dexes; + //@Nullable + public HashMap libs; + //@Nullable + public HashMap packageConfig; + + public int loadCode; + + public long costTime; + + public boolean parseTinkerResult(Context context, Intent intentResult) { + Tinker tinker = Tinker.with(context); + loadCode = ShareIntentUtil.getIntentReturnCode(intentResult); + TinkerLog.i(TAG, "parseTinkerResult loadCode:%d", loadCode); + + costTime = ShareIntentUtil.getIntentPatchCostTime(intentResult); + //@Nullable + final String oldVersion = ShareIntentUtil.getStringExtra(intentResult, ShareIntentUtil.INTENT_PATCH_OLD_VERSION); + //@Nullable + final String newVersion = ShareIntentUtil.getStringExtra(intentResult, ShareIntentUtil.INTENT_PATCH_NEW_VERSION); + + final File patchDirectory = tinker.getPatchDirectory(); + final File patchInfoFile = tinker.getPatchInfoFile(); + + final boolean isMainProcess = tinker.isMainProcess(); + + + if (oldVersion != null && newVersion != null) { + if (isMainProcess) { + currentVersion = newVersion; + } else { + currentVersion = oldVersion; + } + + TinkerLog.i(TAG, "parseTinkerResult oldVersion:%s, newVersion:%s, current:%s", oldVersion, newVersion, + currentVersion); + //current version may be nil + String patchName = SharePatchFileUtil.getPatchVersionDirectory(currentVersion); + if (!ShareTinkerInternals.isNullOrNil(patchName)) { + patchVersionDirectory = new File(patchDirectory.getAbsolutePath() + "/" + patchName); + patchVersionFile = new File(patchVersionDirectory.getAbsolutePath(), SharePatchFileUtil.getPatchVersionFile(currentVersion)); + dexDirectory = new File(patchVersionDirectory, ShareConstants.DEX_PATH); + libraryDirectory = new File(patchVersionDirectory, ShareConstants.SO_PATH); + resourceDirectory = new File(patchVersionDirectory, ShareConstants.RES_PATH); + resourceFile = new File(resourceDirectory, ShareConstants.RES_NAME); + } + patchInfo = new SharePatchInfo(oldVersion, newVersion); + versionChanged = !(oldVersion.equals(newVersion)); + } + + //found uncaught exception, just return + Throwable exception = ShareIntentUtil.getIntentPatchException(intentResult); + if (exception != null) { + TinkerLog.i(TAG, "Tinker load have exception loadCode:%d", loadCode); + int errorCode = ShareConstants.ERROR_LOAD_EXCEPTION_UNKNOWN; + switch (loadCode) { + case ShareConstants.ERROR_LOAD_PATCH_UNKNOWN_EXCEPTION: + errorCode = ShareConstants.ERROR_LOAD_EXCEPTION_UNKNOWN; + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_LOAD_EXCEPTION: + errorCode = ShareConstants.ERROR_LOAD_EXCEPTION_DEX; + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_LOAD_EXCEPTION: + errorCode = ShareConstants.ERROR_LOAD_EXCEPTION_RESOURCE; + break; + case ShareConstants.ERROR_LOAD_PATCH_UNCAUGHT_EXCEPTION: + errorCode = ShareConstants.ERROR_LOAD_EXCEPTION_UNCAUGHT; + break; + } + tinker.getLoadReporter().onLoadException(exception, errorCode); + return false; + } + + switch (loadCode) { + case ShareConstants.ERROR_LOAD_GET_INTENT_FAIL: + TinkerLog.e(TAG, "can't get the right intent return code"); + throw new TinkerRuntimeException("can't get the right intent return code"); +// break; + case ShareConstants.ERROR_LOAD_DISABLE: + TinkerLog.w(TAG, "tinker is disable, just return"); + break; +// case ShareConstants.ERROR_LOAD_PATCH_NOT_SUPPORTED: +// TinkerLog.w(TAG, "tinker is not supported, just return"); +// break; + case ShareConstants.ERROR_LOAD_PATCH_DIRECTORY_NOT_EXIST: + case ShareConstants.ERROR_LOAD_PATCH_INFO_NOT_EXIST: + TinkerLog.w(TAG, "can't find patch file, is ok, just return"); + break; + + case ShareConstants.ERROR_LOAD_PATCH_INFO_CORRUPTED: + TinkerLog.e(TAG, "path info corrupted"); + tinker.getLoadReporter().onLoadPatchInfoCorrupted(oldVersion, newVersion, patchInfoFile); + break; + + case ShareConstants.ERROR_LOAD_PATCH_INFO_BLANK: + TinkerLog.e(TAG, "path info blank, wait main process to restart"); + break; + + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DIRECTORY_NOT_EXIST: + TinkerLog.e(TAG, "patch version directory not found, current version:%s", currentVersion); + tinker.getLoadReporter().onLoadFileNotFound(patchVersionDirectory, + ShareConstants.TYPE_PATCH_FILE, true); + break; + + case ShareConstants.ERROR_LOAD_PATCH_VERSION_FILE_NOT_EXIST: + TinkerLog.e(TAG, "patch version file not found, current version:%s", currentVersion); + if (patchVersionFile == null) { + throw new TinkerRuntimeException("error load patch version file not exist, but file is null"); + } + tinker.getLoadReporter().onLoadFileNotFound(patchVersionFile, + ShareConstants.TYPE_PATCH_FILE, false); + break; + case ShareConstants.ERROR_LOAD_PATCH_PACKAGE_CHECK_FAIL: + TinkerLog.i(TAG, "patch package check fail"); + if (patchVersionFile == null) { + throw new TinkerRuntimeException("error patch package check fail , but file is null"); + } + int errorCode = intentResult.getIntExtra(ShareIntentUtil.INTENT_PATCH_PACKAGE_PATCH_CHECK, ShareConstants.ERROR_LOAD_GET_INTENT_FAIL); + tinker.getLoadReporter().onLoadPackageCheckFail(patchVersionFile, errorCode); + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_DIRECTORY_NOT_EXIST: + if (dexDirectory != null) { + TinkerLog.e(TAG, "patch dex file directory not found:%s", dexDirectory.getAbsolutePath()); + tinker.getLoadReporter().onLoadFileNotFound(dexDirectory, + ShareConstants.TYPE_DEX, true); + } else { + //should be not here + TinkerLog.e(TAG, "patch dex file directory not found, warning why the path is null!!!!"); + throw new TinkerRuntimeException("patch dex file directory not found, warning why the path is null!!!!"); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_FILE_NOT_EXIST: + String dexPath = ShareIntentUtil.getStringExtra(intentResult, + ShareIntentUtil.INTENT_PATCH_MISSING_DEX_PATH); + if (dexPath != null) { + //we only pass one missing file + TinkerLog.e(TAG, "patch dex file not found:%s", dexPath); + tinker.getLoadReporter().onLoadFileNotFound(new File(dexPath), + ShareConstants.TYPE_DEX, false); + + } else { + TinkerLog.e(TAG, "patch dex file not found, but path is null!!!!"); + throw new TinkerRuntimeException("patch dex file not found, but path is null!!!!"); +// tinker.getLoadReporter().onLoadFileNotFound(null, +// ShareConstants.TYPE_DEX, false); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_OPT_FILE_NOT_EXIST: + String dexOptPath = ShareIntentUtil.getStringExtra(intentResult, + ShareIntentUtil.INTENT_PATCH_MISSING_DEX_PATH); + if (dexOptPath != null) { + //we only pass one missing file + TinkerLog.e(TAG, "patch dex opt file not found:%s", dexOptPath); + tinker.getLoadReporter().onLoadFileNotFound(new File(dexOptPath), + ShareConstants.TYPE_DEX_OPT, false); + + } else { + TinkerLog.e(TAG, "patch dex opt file not found, but path is null!!!!"); + throw new TinkerRuntimeException("patch dex opt file not found, but path is null!!!!"); +// tinker.getLoadReporter().onLoadFileNotFound(null, +// ShareConstants.TYPE_DEX, false); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_LIB_DIRECTORY_NOT_EXIST: + if (patchVersionDirectory != null) { + TinkerLog.e(TAG, "patch lib file directory not found:%s", libraryDirectory.getAbsolutePath()); + tinker.getLoadReporter().onLoadFileNotFound(libraryDirectory, + ShareConstants.TYPE_LIBRARY, true); + } else { + //should be not here + TinkerLog.e(TAG, "patch lib file directory not found, warning why the path is null!!!!"); + throw new TinkerRuntimeException("patch lib file directory not found, warning why the path is null!!!!"); + +// tinker.getLoadReporter().onLoadFileNotFound(null, +// ShareConstants.TYPE_LIBRARY, true); + } + + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_LIB_FILE_NOT_EXIST: + String libPath = ShareIntentUtil.getStringExtra(intentResult, + ShareIntentUtil.INTENT_PATCH_MISSING_LIB_PATH); + if (libPath != null) { + //we only pass one missing file and then we break + TinkerLog.e(TAG, "patch lib file not found:%s", libPath); + tinker.getLoadReporter().onLoadFileNotFound(new File(libPath), + ShareConstants.TYPE_LIBRARY, false); + } else { + TinkerLog.e(TAG, "patch lib file not found, but path is null!!!!"); + throw new TinkerRuntimeException("patch lib file not found, but path is null!!!!"); +// tinker.getLoadReporter().onLoadFileNotFound(null, +// ShareConstants.TYPE_LIBRARY, false); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_CLASSLOADER_NULL: + TinkerLog.e(TAG, "patch dex load fail, classloader is null"); + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_MD5_MISMATCH: + String mismatchPath = ShareIntentUtil.getStringExtra(intentResult, + ShareIntentUtil.INTENT_PATCH_MISMATCH_DEX_PATH); + if (mismatchPath == null) { + TinkerLog.e(TAG, "patch dex file md5 is mismatch, but path is null!!!!"); + throw new TinkerRuntimeException("patch dex file md5 is mismatch, but path is null!!!!"); + } else { + TinkerLog.e(TAG, "patch dex file md5 is mismatch: %s", mismatchPath); + tinker.getLoadReporter().onLoadFileMd5Mismatch(new File(mismatchPath), + ShareConstants.TYPE_DEX); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_REWRITE_PATCH_INFO_FAIL: + TinkerLog.i(TAG, "rewrite patch info file corrupted"); + tinker.getLoadReporter().onLoadPatchInfoCorrupted(oldVersion, newVersion, patchInfoFile); + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_DIRECTORY_NOT_EXIST: + if (patchVersionDirectory != null) { + TinkerLog.e(TAG, "patch resource file directory not found:%s", resourceDirectory.getAbsolutePath()); + tinker.getLoadReporter().onLoadFileNotFound(resourceDirectory, + ShareConstants.TYPE_RESOURCE, true); + } else { + //should be not here + TinkerLog.e(TAG, "patch resource file directory not found, warning why the path is null!!!!"); + throw new TinkerRuntimeException("patch resource file directory not found, warning why the path is null!!!!"); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_FILE_NOT_EXIST: + if (patchVersionDirectory != null) { + TinkerLog.e(TAG, "patch resource file not found:%s", resourceFile.getAbsolutePath()); + tinker.getLoadReporter().onLoadFileNotFound(resourceFile, + ShareConstants.TYPE_RESOURCE, false); + } else { + //should be not here + TinkerLog.e(TAG, "patch resource file not found, warning why the path is null!!!!"); + throw new TinkerRuntimeException("patch resource file not found, warning why the path is null!!!!"); + } + break; + case ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_MD5_MISMATCH: + if (resourceFile == null) { + TinkerLog.e(TAG, "resource file md5 mismatch, but patch resource file not found!"); + throw new TinkerRuntimeException("resource file md5 mismatch, but patch resource file not found!"); + } + TinkerLog.e(TAG, "patch resource file md5 is mismatch: %s", resourceFile.getAbsolutePath()); + + tinker.getLoadReporter().onLoadFileMd5Mismatch(resourceFile, + ShareConstants.TYPE_RESOURCE); + break; + case ShareConstants.ERROR_LOAD_OK: + TinkerLog.i(TAG, "oh yeah, tinker load all success"); + tinker.setTinkerLoaded(true); + //get load dex + dexes = ShareIntentUtil.getIntentPatchDexPaths(intentResult); + libs = ShareIntentUtil.getIntentPatchLibsPaths(intentResult); + + packageConfig = ShareIntentUtil.getIntentPackageConfig(intentResult); + + if (isMainProcess && versionChanged) { + //change the old version to new + patchInfo.oldVersion = currentVersion; + tinker.getLoadReporter().onLoadPatchVersionChanged(oldVersion, newVersion, patchDirectory, patchVersionDirectory.getName()); + + } + return true; + } + return false; + + } + + /** + * get the base tinkerId + * + * @return + */ + public String getTinkerID() { + if (packageConfig != null) { + String tinkerId = packageConfig.get(ShareConstants.TINKER_ID); + return tinkerId; + } + return null; + } + + /** + * get the new tinkerId + * + * @return + */ + public String getNewTinkerID() { + if (packageConfig != null) { + String tinkerId = packageConfig.get(ShareConstants.NEW_TINKER_ID); + + return tinkerId; + } + return null; + } + + /** + * get package configs + * + * @param name + * @return + */ + public String getPackageConfigByName(String name) { + if (packageConfig != null) { + return packageConfig.get(name); + } + return null; + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java new file mode 100644 index 00000000..cb677c5d --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerLog.java @@ -0,0 +1,131 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.util; + +/** + * Created by zhangshaowen on 16/3/17. + */ + + +public class TinkerLog { + private static final String TAG = "Tinker.TinkerLog"; + private static TinkerLogImp debugLog = new TinkerLogImp() { + + @Override + public void v(final String tag, final String msg, final Object... obj) { + String log = obj == null ? msg : String.format(msg, obj); + android.util.Log.v(tag, log); + } + + @Override + public void i(final String tag, final String msg, final Object... obj) { + String log = obj == null ? msg : String.format(msg, obj); + android.util.Log.i(tag, log); + + } + + @Override + public void d(final String tag, final String msg, final Object... obj) { + String log = obj == null ? msg : String.format(msg, obj); + android.util.Log.d(tag, log); + } + + @Override + public void w(final String tag, final String msg, final Object... obj) { + String log = obj == null ? msg : String.format(msg, obj); + android.util.Log.w(tag, log); + } + + @Override + public void e(final String tag, final String msg, final Object... obj) { + String log = obj == null ? msg : String.format(msg, obj); + android.util.Log.e(tag, log); + } + + @Override + public void printErrStackTrace(String tag, Throwable tr, String format, Object... obj) { + String log = obj == null ? format : String.format(format, obj); + if (log == null) { + log = ""; + } + log += " " + android.util.Log.getStackTraceString(tr); + android.util.Log.e(tag, log); + } + }; + private static TinkerLogImp tinkerLogImp = debugLog; + + public static void setTinkerLogImp(TinkerLogImp imp) { + tinkerLogImp = imp; + } + + public static TinkerLogImp getImpl() { + return tinkerLogImp; + } + + public static void v(final String tag, final String msg, final Object... obj) { + if (tinkerLogImp != null) { + tinkerLogImp.v(tag, msg, obj); + } + } + + public static void e(final String tag, final String msg, final Object... obj) { + if (tinkerLogImp != null) { + tinkerLogImp.e(tag, msg, obj); + } + } + + public static void w(final String tag, final String msg, final Object... obj) { + if (tinkerLogImp != null) { + tinkerLogImp.w(tag, msg, obj); + } + } + + public static void i(final String tag, final String msg, final Object... obj) { + if (tinkerLogImp != null) { + tinkerLogImp.i(tag, msg, obj); + } + } + + public static void d(final String tag, final String msg, final Object... obj) { + if (tinkerLogImp != null) { + tinkerLogImp.d(tag, msg, obj); + } + } + + public static void printErrStackTrace(String tag, Throwable tr, final String format, final Object... obj) { + if (tinkerLogImp != null) { + tinkerLogImp.printErrStackTrace(tag, tr, format, obj); + } + } + + public interface TinkerLogImp { + + void v(final String tag, final String msg, final Object... obj); + + void i(final String tag, final String msg, final Object... obj); + + void w(final String tag, final String msg, final Object... obj); + + void d(final String tag, final String msg, final Object... obj); + + void e(final String tag, final String msg, final Object... obj); + + void printErrStackTrace(String tag, Throwable tr, final String format, final Object... obj); + + } + +} diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java new file mode 100644 index 00000000..2118e23b --- /dev/null +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/util/TinkerServiceInternals.java @@ -0,0 +1,133 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.lib.util; + +import android.app.ActivityManager; +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.util.Log; + +import com.tencent.tinker.lib.service.TinkerPatchService; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.util.List; + +/** + * Created by zhangshaowen on 16/3/10. + */ +public class TinkerServiceInternals extends ShareTinkerInternals { + private static final String TAG = "Tinker.ServiceInternals"; + + /** + * or you may just hardcode them in your app + */ + private static String patchServiceProcessName = null; + + public static void killTinkerPatchServiceProcess(Context context) { + String serverProcessName = getTinkerPatchServiceName(context); + if (serverProcessName == null) { + return; + } + + final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + + for (ActivityManager.RunningAppProcessInfo appProcess : am.getRunningAppProcesses()) { + String processName = appProcess.processName; + if (processName.equals(serverProcessName)) { + android.os.Process.killProcess(appProcess.pid); + } + } + + } + + public static boolean isTinkerPatchServiceRunning(Context context) { + final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + String serverName = getTinkerPatchServiceName(context); + if (serverName == null) { + return false; + } + try { + // ActivityManagergetRunningAppProcesses() + List appProcessList = am + .getRunningAppProcesses(); + + for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) { + String processName = appProcess.processName; + if (processName.equals(serverName)) { + return true; + } + } + } catch (Exception e) { + Log.e(TAG, "isTinkerPatchServiceRunning Exception: " + e.toString()); + return false; + } catch (Error e) { + Log.e(TAG, "isTinkerPatchServiceRunning Error: " + e.toString()); + return false; + } + + return false; + } + + + public static String getTinkerPatchServiceName(final Context context) { + if (patchServiceProcessName != null) { + return patchServiceProcessName; + } + //may be null, and you may like to hardcode instead + String serviceName = TinkerServiceInternals.getServiceProcessName(context, TinkerPatchService.class); + if (serviceName == null) { + return null; + } + patchServiceProcessName = serviceName; + return patchServiceProcessName; + } + + /** + * add service cache + * + * @param context + * @return boolean + */ + public static boolean isInTinkerPatchServiceProcess(Context context) { + String process = getProcessName(context); + + String service = TinkerServiceInternals.getTinkerPatchServiceName(context); + if (service == null || service.length() == 0) { + return false; + } + return process.equals(service); + } + + private static String getServiceProcessName(Context context, Class serviceClass) { + PackageManager packageManager = context.getPackageManager(); + + ComponentName component = new ComponentName(context, serviceClass); + ServiceInfo serviceInfo; + try { + serviceInfo = packageManager.getServiceInfo(component, 0); + } catch (PackageManager.NameNotFoundException ignored) { + // Service is disabled. + return null; + } + + return serviceInfo.processName; + } + +} diff --git a/tinker-android/tinker-android-lib/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java b/tinker-android/tinker-android-lib/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java new file mode 100644 index 00000000..f82a6496 --- /dev/null +++ b/tinker-android/tinker-android-lib/src/test/java/com/tencent/tinker/recover/ExampleUnitTest.java @@ -0,0 +1,31 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.recover; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * To work on unit tests, switch the Test Artifact in the Build Variants view. + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/.gitignore b/tinker-android/tinker-android-loader/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/tinker-android/tinker-android-loader/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tinker-android/tinker-android-loader/build.gradle b/tinker-android/tinker-android-loader/build.gradle new file mode 100644 index 00000000..cb3264ad --- /dev/null +++ b/tinker-android/tinker-android-loader/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.library' + + +version rootProject.ext.VERSION_NAME +group rootProject.ext.GROUP + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' +} + +task buildSdk(type: Copy, dependsOn: [build]) { + from("$buildDir/outputs/aar/") { + include "${project.getName()}-release.aar" + } + + into(rootProject.file("buildSdk/android/")) + rename { String fileName -> + fileName.replace("release", "${version}") + } +} + +apply from: rootProject.file('gradle/android-artifacts.gradle') +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/gradle.properties b/tinker-android/tinker-android-loader/gradle.properties new file mode 100644 index 00000000..827e1579 --- /dev/null +++ b/tinker-android/tinker-android-loader/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=tinker-android-loader +POM_NAME=Tinker Android Loader +POM_PACKAGING=jar \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/proguard-rules.pro b/tinker-android/tinker-android-loader/proguard-rules.pro new file mode 100644 index 00000000..ca7ea794 --- /dev/null +++ b/tinker-android/tinker-android-loader/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/zhangshaowen/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/tinker-android/tinker-android-loader/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java b/tinker-android/tinker-android-loader/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java new file mode 100644 index 00000000..1c8f5628 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/androidTest/java/com/tencent/tinker/loader/ApplicationTest.java @@ -0,0 +1,29 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/src/main/AndroidManifest.xml b/tinker-android/tinker-android-loader/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8b6db826 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AbstractTinkerLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AbstractTinkerLoader.java new file mode 100644 index 00000000..111e38c2 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AbstractTinkerLoader.java @@ -0,0 +1,29 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.content.Intent; + +import com.tencent.tinker.loader.app.TinkerApplication; + + +/** + * Created by zhangshaowen on 16/4/30. + */ +public abstract class AbstractTinkerLoader { + abstract public Intent tryLoad(TinkerApplication app, int tinkerFlag, boolean tinkerLoadVerifyFlag); +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AndroidNClassLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AndroidNClassLoader.java new file mode 100644 index 00000000..683ba2c0 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/AndroidNClassLoader.java @@ -0,0 +1,103 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.annotation.TargetApi; +import android.app.Application; +import android.content.Context; +import android.os.Build; + +import java.lang.reflect.Field; + +import dalvik.system.PathClassLoader; + +/** + * Created by zhangshaowen on 16/7/24. + */ +@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) +class AndroidNClassLoader extends PathClassLoader { + PathClassLoader originClassLoader; + + private AndroidNClassLoader(String dexPath, PathClassLoader parent) { + super(dexPath, parent.getParent()); + originClassLoader = parent; + } + + private static AndroidNClassLoader createAndroidNClassLoader(PathClassLoader original) throws Exception { + //let all element "" + AndroidNClassLoader androidNClassLoader = new AndroidNClassLoader("", original); + Object originPathList = findField(original, "pathList").get(original); + Field pathListField = findField(androidNClassLoader, "pathList"); + //just use PathClassloader's pathlist + pathListField.set(androidNClassLoader, originPathList); + return androidNClassLoader; + } + + private static Field findField(Object instance, String name) throws NoSuchFieldException { + for (Class clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) { + try { + Field field = clazz.getDeclaredField(name); + + if (!field.isAccessible()) { + field.setAccessible(true); + } + + return field; + } catch (NoSuchFieldException e) { + // ignore and search next + } + } + throw new NoSuchFieldException("Field " + name + " not found in " + instance.getClass()); + } + + private static void reflectPackageInfoClassloader(Application application, ClassLoader reflectClassLoader) throws Exception { + String defBase = "mBase"; + String defPackageInfo = "mPackageInfo"; + String defClassLoader = "mClassLoader"; + + Context baseContext = (Context) findField(application, defBase).get(application); + Object basePackageInfo = findField(baseContext, defPackageInfo).get(baseContext); + Field classLoaderField = findField(basePackageInfo, defClassLoader); + Thread.currentThread().setContextClassLoader(reflectClassLoader); + classLoaderField.set(basePackageInfo, reflectClassLoader); + } + + public static AndroidNClassLoader inject(PathClassLoader originClassLoader, Application application) throws Exception { + AndroidNClassLoader classLoader = createAndroidNClassLoader(originClassLoader); + reflectPackageInfoClassloader(application, classLoader); + return classLoader; + } + +// public static String getLdLibraryPath(ClassLoader loader) throws Exception { +// String nativeLibraryPath; +// +// nativeLibraryPath = (String) loader.getClass() +// .getMethod("getLdLibraryPath", new Class[0]) +// .invoke(loader, new Object[0]); +// +// return nativeLibraryPath; +// } + + public Class findClass(String name) throws ClassNotFoundException { + return super.findClass(name); + } + + @Override + public String findLibrary(String name) { + return super.findLibrary(name); + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/SystemClassLoaderAdder.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/SystemClassLoaderAdder.java new file mode 100644 index 00000000..88b67135 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/SystemClassLoaderAdder.java @@ -0,0 +1,287 @@ +/* + * Copyright (C) 2016 THL A29 Limited, a Tencent company. + * Copyright (C) 2013 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.loader; + +import android.annotation.SuppressLint; +import android.app.Application; +import android.os.Build; +import android.util.Log; + +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareReflectUtil; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; +import java.util.zip.ZipFile; + +import dalvik.system.DexFile; +import dalvik.system.PathClassLoader; + +/** + * Created by zhangshaowen on 16/3/18. + */ +public class SystemClassLoaderAdder { + private static final String TAG = "Tinker.ClassLoaderAdder"; + + private static final String CHECK_DEX_CLASS = "com.tencent.tinker.loader.TinkerTestDexLoad"; + private static final String CHECK_DEX_FIELD = "isPatch"; + + + @SuppressLint("NewApi") + public static void installDexes(Application application, PathClassLoader loader, File dexOptDir, List files) + throws Throwable { + + if (!files.isEmpty()) { + ClassLoader classLoader = loader; + if (Build.VERSION.SDK_INT >= 24) { + classLoader = AndroidNClassLoader.inject(loader, application); + } + //because in dalvik, if inner class is not the same classloader with it wrapper class. + //it won't fail at dex2opt + if (Build.VERSION.SDK_INT >= 23) { + V23.install(classLoader, files, dexOptDir); + } else if (Build.VERSION.SDK_INT >= 19) { + V19.install(classLoader, files, dexOptDir); + } else if (Build.VERSION.SDK_INT >= 14) { + V14.install(classLoader, files, dexOptDir); + } else { + V4.install(classLoader, files, dexOptDir); + } + + if (!checkDexInstall()) { + throw new TinkerRuntimeException(ShareConstants.CHECK_DEX_INSTALL_FAIL); + } + } + } + + private static boolean checkDexInstall() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Class clazz = Class.forName(CHECK_DEX_CLASS); + Field filed = ShareReflectUtil.findField(clazz, CHECK_DEX_FIELD); + boolean isPatch = (boolean) filed.get(null); + Log.w(TAG, "checkDexInstall result:" + isPatch); + return isPatch; + } + + /** + * Installer for platform versions 19. + */ + private static final class V23 { + + private static void install(ClassLoader loader, List additionalClassPathEntries, + File optimizedDirectory) + throws IllegalArgumentException, IllegalAccessException, + NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IOException { + /* The patched class loader is expected to be a descendant of + * dalvik.system.BaseDexClassLoader. We modify its + * dalvik.system.DexPathList pathList field to append additional DEX + * file entries. + */ + Field pathListField = ShareReflectUtil.findField(loader, "pathList"); + Object dexPathList = pathListField.get(loader); + ArrayList suppressedExceptions = new ArrayList(); + ShareReflectUtil.expandFieldArray(dexPathList, "dexElements", makePathElements(dexPathList, + new ArrayList(additionalClassPathEntries), optimizedDirectory, + suppressedExceptions)); + if (suppressedExceptions.size() > 0) { + for (IOException e : suppressedExceptions) { + Log.w(TAG, "Exception in makePathElement", e); + throw e; + } + + } + } + + /** + * A wrapper around + * {@code private static final dalvik.system.DexPathList#makePathElements}. + */ + private static Object[] makePathElements( + Object dexPathList, ArrayList files, File optimizedDirectory, + ArrayList suppressedExceptions) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + Method makePathElements; + try { + makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements", List.class, File.class, + List.class); + } catch (NoSuchMethodException e) { + Log.e(TAG, "NoSuchMethodException: makePathElements(List,File,List) failure"); + try { + makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements", ArrayList.class, File.class, ArrayList.class); + } catch (NoSuchMethodException e1) { + Log.e(TAG, "NoSuchMethodException: makeDexElements(ArrayList,File,ArrayList) failure"); + try { + Log.e(TAG, "NoSuchMethodException: try use v19 instead"); + return V19.makeDexElements(dexPathList, files, optimizedDirectory, suppressedExceptions); + } catch (NoSuchMethodException e2) { + Log.e(TAG, "NoSuchMethodException: makeDexElements(List,File,List) failure"); + throw e2; + } + } + } + + return (Object[]) makePathElements.invoke(dexPathList, files, optimizedDirectory, suppressedExceptions); + } + } + + /** + * Installer for platform versions 19. + */ + private static final class V19 { + + private static void install(ClassLoader loader, List additionalClassPathEntries, + File optimizedDirectory) + throws IllegalArgumentException, IllegalAccessException, + NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IOException { + /* The patched class loader is expected to be a descendant of + * dalvik.system.BaseDexClassLoader. We modify its + * dalvik.system.DexPathList pathList field to append additional DEX + * file entries. + */ + Field pathListField = ShareReflectUtil.findField(loader, "pathList"); + Object dexPathList = pathListField.get(loader); + ArrayList suppressedExceptions = new ArrayList(); + ShareReflectUtil.expandFieldArray(dexPathList, "dexElements", makeDexElements(dexPathList, + new ArrayList(additionalClassPathEntries), optimizedDirectory, + suppressedExceptions)); + if (suppressedExceptions.size() > 0) { + for (IOException e : suppressedExceptions) { + Log.w(TAG, "Exception in makeDexElement", e); + throw e; + } + } + } + + /** + * A wrapper around + * {@code private static final dalvik.system.DexPathList#makeDexElements}. + */ + private static Object[] makeDexElements( + Object dexPathList, ArrayList files, File optimizedDirectory, + ArrayList suppressedExceptions) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + Method makeDexElements = null; + try { + makeDexElements = ShareReflectUtil.findMethod(dexPathList, "makeDexElements", ArrayList.class, File.class, + ArrayList.class); + } catch (NoSuchMethodException e) { + Log.e(TAG, "NoSuchMethodException: makeDexElements(ArrayList,File,ArrayList) failure"); + try { + makeDexElements = ShareReflectUtil.findMethod(dexPathList, "makeDexElements", List.class, File.class, List.class); + } catch (NoSuchMethodException e1) { + Log.e(TAG, "NoSuchMethodException: makeDexElements(List,File,List) failure"); + throw e1; + } + } + + return (Object[]) makeDexElements.invoke(dexPathList, files, optimizedDirectory, suppressedExceptions); + } + } + + /** + * Installer for platform versions 14, 15, 16, 17 and 18. + */ + private static final class V14 { + + private static void install(ClassLoader loader, List additionalClassPathEntries, + File optimizedDirectory) + throws IllegalArgumentException, IllegalAccessException, + NoSuchFieldException, InvocationTargetException, NoSuchMethodException { + /* The patched class loader is expected to be a descendant of + * dalvik.system.BaseDexClassLoader. We modify its + * dalvik.system.DexPathList pathList field to append additional DEX + * file entries. + */ + Field pathListField = ShareReflectUtil.findField(loader, "pathList"); + Object dexPathList = pathListField.get(loader); + ShareReflectUtil.expandFieldArray(dexPathList, "dexElements", makeDexElements(dexPathList, + new ArrayList(additionalClassPathEntries), optimizedDirectory)); + } + + /** + * A wrapper around + * {@code private static final dalvik.system.DexPathList#makeDexElements}. + */ + private static Object[] makeDexElements( + Object dexPathList, ArrayList files, File optimizedDirectory) + throws IllegalAccessException, InvocationTargetException, + NoSuchMethodException { + Method makeDexElements = + ShareReflectUtil.findMethod(dexPathList, "makeDexElements", ArrayList.class, File.class); + + return (Object[]) makeDexElements.invoke(dexPathList, files, optimizedDirectory); + } + } + + /** + * Installer for platform versions 4 to 13. + */ + private static final class V4 { + private static void install(ClassLoader loader, List additionalClassPathEntries, File optimizedDirectory) + throws IllegalArgumentException, IllegalAccessException, + NoSuchFieldException, IOException { + /* The patched class loader is expected to be a descendant of + * dalvik.system.DexClassLoader. We modify its + * fields mPaths, mFiles, mZips and mDexs to append additional DEX + * file entries. + */ + int extraSize = additionalClassPathEntries.size(); + + Field pathField = ShareReflectUtil.findField(loader, "path"); + + StringBuilder path = new StringBuilder((String) pathField.get(loader)); + String[] extraPaths = new String[extraSize]; + File[] extraFiles = new File[extraSize]; + ZipFile[] extraZips = new ZipFile[extraSize]; + DexFile[] extraDexs = new DexFile[extraSize]; + for (ListIterator iterator = additionalClassPathEntries.listIterator(); + iterator.hasNext();) { + File additionalEntry = iterator.next(); + String entryPath = additionalEntry.getAbsolutePath(); + path.append(':').append(entryPath); + int index = iterator.previousIndex(); + extraPaths[index] = entryPath; + extraFiles[index] = additionalEntry; + extraZips[index] = new ZipFile(additionalEntry); + //edit by zhangshaowen + String outputPathName = SharePatchFileUtil.optimizedPathFor(additionalEntry, optimizedDirectory); + //for below 4.0, we must input jar or zip + extraDexs[index] = DexFile.loadDex(entryPath, outputPathName, 0); + } + + pathField.set(loader, path.toString()); + ShareReflectUtil.expandFieldArray(loader, "mPaths", extraPaths); + ShareReflectUtil.expandFieldArray(loader, "mFiles", extraFiles); + ShareReflectUtil.expandFieldArray(loader, "mZips", extraZips); + try { + ShareReflectUtil.expandFieldArray(loader, "mDexs", extraDexs); + } catch (Exception e) { + + } + } + } + +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java new file mode 100644 index 00000000..b700a1b8 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java @@ -0,0 +1,202 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.annotation.TargetApi; +import android.app.Application; +import android.content.Intent; +import android.os.Build; +import android.util.Log; + +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareDexDiffPatchInfo; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import dalvik.system.PathClassLoader; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by zhangshaowen on 16/3/8. + * check the complete of the dex files + * pre-load patch dex files + */ +public class TinkerDexLoader { + + private static final String TAG = "Tinker.TinkerDexLoader"; + + private static final String DEX_MEAT_FILE = ShareConstants.DEX_META_FILE; + private static final String DEX_PATH = ShareConstants.DEX_PATH; + private static final String DEX_OPTIMIZE_PATH = ShareConstants.DEX_OPTIMIZE_PATH; + private static final ArrayList dexList = new ArrayList<>(); + + private TinkerDexLoader() { + } + + /** + * Load tinker JARs and add them to + * the Application ClassLoader. + * + * @param application The application. + */ + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + public static boolean loadTinkerJars(Application application, boolean tinkerLoadVerifyFlag, String directory, Intent intentResult) { + if (dexList.isEmpty()) { + Log.w(TAG, "there is no dex to load"); + return true; + } + + PathClassLoader classLoader = (PathClassLoader) TinkerDexLoader.class.getClassLoader(); + if (classLoader != null) { + Log.i(TAG, "classloader: " + classLoader.toString()); + } else { + Log.e(TAG, "classloader is null"); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_CLASSLOADER_NULL); + return false; + } + String dexPath = directory + "/" + DEX_PATH + "/"; + File optimizeDir = new File(directory + "/" + DEX_OPTIMIZE_PATH); +// Log.i(TAG, "loadTinkerJars: dex path: " + dexPath); +// Log.i(TAG, "loadTinkerJars: opt path: " + optimizeDir.getAbsolutePath()); + + ArrayList legalFiles = new ArrayList<>(); + + final boolean isArtPlatForm = ShareTinkerInternals.isVmArt(); + for (ShareDexDiffPatchInfo info : dexList) { + //for dalvik, ignore art support dex + if (isJustArtSupportDex(info)) { + continue; + } + String path = dexPath + info.realName; + File file = new File(path); + + if (tinkerLoadVerifyFlag) { + long start = System.currentTimeMillis(); + String checkMd5 = isArtPlatForm ? info.destMd5InArt : info.destMd5InDvm; + if (!SharePatchFileUtil.verifyDexFileMd5(file, checkMd5)) { + //it is good to delete the mismatch file + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_MD5_MISMATCH); + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_MISMATCH_DEX_PATH, + file.getAbsolutePath()); + return false; + } + Log.i(TAG, "verify dex file:" + file.getPath() + ", md5 use time: " + (System.currentTimeMillis() - start)); + } + legalFiles.add(file); + } + try { + SystemClassLoaderAdder.installDexes(application, classLoader, optimizeDir, legalFiles); + } catch (Throwable e) { + Log.e(TAG, "install dexes failed"); +// e.printStackTrace(); + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_EXCEPTION, e); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_LOAD_EXCEPTION); + return false; + } + Log.i(TAG, "after loaded classloader: " + application.getClassLoader().toString()); + + return true; + } + + /** + * all the dex files in meta file exist? + * fast check, only check whether exist + * + * @param directory + * @return boolean + */ + public static boolean checkComplete(String directory, ShareSecurityCheck securityCheck, Intent intentResult) { + String meta = securityCheck.getMetaContentMap().get(DEX_MEAT_FILE); + //not found dex + if (meta == null) { + return true; + } + dexList.clear(); + ShareDexDiffPatchInfo.parseDexDiffPatchInfo(meta, dexList); + + if (dexList.isEmpty()) { + return true; + } + + HashMap dexes = new HashMap<>(); + + for (ShareDexDiffPatchInfo info : dexList) { + //for dalvik, ignore art support dex + if (isJustArtSupportDex(info)) { + continue; + } + if (!ShareDexDiffPatchInfo.checkDexDiffPatchInfo(info)) { + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_PACKAGE_PATCH_CHECK, ShareConstants.ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_PACKAGE_CHECK_FAIL); + return false; + } + dexes.put(info.realName, info.destMd5InDvm); + } + //tinker/patch.info/patch-641e634c/dex + String dexDirectory = directory + "/" + DEX_PATH + "/"; + + File dexDir = new File(dexDirectory); + + if (!dexDir.exists() || !dexDir.isDirectory()) { + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_DIRECTORY_NOT_EXIST); + return false; + } + + String optimizeDexDirectory = directory + "/" + DEX_OPTIMIZE_PATH + "/"; + File optimizeDexDirectoryFile = new File(optimizeDexDirectory); + + //fast check whether there is any dex files missing + for (String name : dexes.keySet()) { + File dexFile = new File(dexDirectory + name); + if (!dexFile.exists()) { + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_MISSING_DEX_PATH, dexFile.getAbsolutePath()); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_FILE_NOT_EXIST); + return false; + } + //check dex opt whether complete also + File dexOptFile = new File(SharePatchFileUtil.optimizedPathFor(dexFile, optimizeDexDirectoryFile)); + if (!dexOptFile.exists()) { + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_MISSING_DEX_PATH, dexOptFile.getAbsolutePath()); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_DEX_OPT_FILE_NOT_EXIST); + return false; + } + } + + //if is ok, add to result intent + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_DEXES_PATH, dexes); + return true; + } + + private static boolean isJustArtSupportDex(ShareDexDiffPatchInfo dexDiffPatchInfo) { + if (ShareTinkerInternals.isVmArt()) { + return false; + } + + String destMd5InDvm = dexDiffPatchInfo.destMd5InDvm; + + if (destMd5InDvm.equals("0")) { + return true; + } + + return false; + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerLoader.java new file mode 100644 index 00000000..7b1853f3 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerLoader.java @@ -0,0 +1,258 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.SystemClock; +import android.util.Log; + +import com.tencent.tinker.loader.app.TinkerApplication; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.SharePatchInfo; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.io.File; + +/** + * Created by zhangshaowen on 16/3/10. + * Warning, it is special for loader classes, they can't change through tinker patch. + * thus, it's reference class must put in the tinkerPatch.dex.loader{} and the android main dex pattern through gradle + */ +public class TinkerLoader extends AbstractTinkerLoader { + private static final String TAG = "Tinker.TinkerLoader"; + + /** + * the patch info file + */ + private SharePatchInfo patchInfo; + + /** + * only main process can handle patch version change or incomplete + */ + @Override + public Intent tryLoad(TinkerApplication app, int tinkerFlag, boolean tinkerLoadVerifyFlag) { + Intent resultIntent = new Intent(); + + long begin = SystemClock.elapsedRealtime(); + tryLoadPatchFilesInternal(app, tinkerFlag, tinkerLoadVerifyFlag, resultIntent); + long cost = SystemClock.elapsedRealtime() - begin; + ShareIntentUtil.setIntentPatchCostTime(resultIntent, cost); + return resultIntent; + } + + private void tryLoadPatchFilesInternal(TinkerApplication app, int tinkerFlag, boolean tinkerLoadVerifyFlag, Intent resultIntent) { + if (!ShareTinkerInternals.isTinkerEnabled(tinkerFlag)) { + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_DISABLE); + return; + } + //tinker + File patchDirectoryFile = SharePatchFileUtil.getPatchDirectory(app); + if (patchDirectoryFile == null) { + Log.w(TAG, "tryLoadPatchFiles:getPatchDirectory == null"); + //treat as not exist + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_DIRECTORY_NOT_EXIST); + return; + } + String patchDirectoryPath = patchDirectoryFile.getAbsolutePath(); + + //check patch directory whether exist + if (!patchDirectoryFile.exists()) { + Log.w(TAG, "tryLoadPatchFiles:patch dir not exist:" + patchDirectoryPath); + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_DIRECTORY_NOT_EXIST); + return; + } + + //tinker/patch.info + File patchInfoFile = SharePatchFileUtil.getPatchInfoFile(patchDirectoryPath); + + //check patch info file whether exist + if (!patchInfoFile.exists()) { + Log.w(TAG, "tryLoadPatchFiles:patch info not exist:" + patchInfoFile.getAbsolutePath()); + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_INFO_NOT_EXIST); + return; + } + //old = 641e634c5b8f1649c75caf73794acbdf + //new = 2c150d8560334966952678930ba67fa8 + File patchInfoLockFile = SharePatchFileUtil.getPatchInfoLockFile(patchDirectoryPath); + + patchInfo = SharePatchInfo.readAndCheckPropertyWithLock(patchInfoFile, patchInfoLockFile); + if (patchInfo == null) { + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_INFO_CORRUPTED); + return; + } + + String oldVersion = patchInfo.oldVersion; + String newVersion = patchInfo.newVersion; + + if (oldVersion == null || newVersion == null) { + //it is nice to clean patch + Log.w(TAG, "tryLoadPatchFiles:onPatchInfoCorrupted"); + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_INFO_CORRUPTED); + return; + } + + resultIntent.putExtra(ShareIntentUtil.INTENT_PATCH_OLD_VERSION, oldVersion); + resultIntent.putExtra(ShareIntentUtil.INTENT_PATCH_NEW_VERSION, newVersion); + + boolean mainProcess = ShareTinkerInternals.isInMainProcess(app); + boolean versionChanged = !(oldVersion.equals(newVersion)); + + String version = oldVersion; + if (versionChanged && mainProcess) { + version = newVersion; + } + if (ShareTinkerInternals.isNullOrNil(version)) { + Log.w(TAG, "tryLoadPatchFiles:version is blank, wait main process to restart"); + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_INFO_BLANK); + return; + } + + //patch-641e634c + String patchName = SharePatchFileUtil.getPatchVersionDirectory(version); + + //tinker/patch.info/patch-641e634c + String patchVersionDirectory = patchDirectoryPath + "/" + patchName; + File patchVersionDirectoryFile = new File(patchVersionDirectory); + + if (!patchVersionDirectoryFile.exists()) { + Log.w(TAG, "tryLoadPatchFiles:onPatchVersionDirectoryNotFound"); + //we may delete patch info file + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_VERSION_DIRECTORY_NOT_EXIST); + return; + } + + //tinker/patch.info/patch-641e634c/patch-641e634c.apk + File patchVersionFile = new File(patchVersionDirectoryFile.getAbsolutePath(), SharePatchFileUtil.getPatchVersionFile(version)); + + if (!patchVersionFile.exists()) { + Log.w(TAG, "tryLoadPatchFiles:onPatchVersionFileNotFound"); + //we may delete patch info file + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_VERSION_FILE_NOT_EXIST); + return; + } + + ShareSecurityCheck securityCheck = new ShareSecurityCheck(app); + + int returnCode = ShareTinkerInternals.checkSignatureAndTinkerID(app, patchVersionFile, securityCheck); + if (returnCode != 0) { + Log.w(TAG, "tryLoadPatchFiles:checkSignatureAndTinkerID"); + resultIntent.putExtra(ShareIntentUtil.INTENT_PATCH_PACKAGE_PATCH_CHECK, returnCode); + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_PACKAGE_CHECK_FAIL); + return; + } + + resultIntent.putExtra(ShareIntentUtil.INTENT_PATCH_PACKAGE_CONFIG, securityCheck.getPackagePropertiesIfPresent()); + + final boolean isEnabledForDex = ShareTinkerInternals.isTinkerEnabledForDex(tinkerFlag); + + if (isEnabledForDex) { + //tinker/patch.info/patch-641e634c/dex + boolean dexCheck = TinkerDexLoader.checkComplete(patchVersionDirectory, securityCheck, resultIntent); + if (!dexCheck) { + //file not found, do not load patch + Log.w(TAG, "tryLoadPatchFiles:dex check fail"); + return; + } + } + + final boolean isEnabledForNativeLib = ShareTinkerInternals.isTinkerEnabledForNativeLib(tinkerFlag); + + if (isEnabledForNativeLib) { + //tinker/patch.info/patch-641e634c/lib + boolean libCheck = TinkerSoLoader.checkComplete(patchVersionDirectory, securityCheck, resultIntent); + if (!libCheck) { + //file not found, do not load patch + Log.w(TAG, "tryLoadPatchFiles:native lib check fail"); + return; + } + } + + //check resource + final boolean isEnabledForResource = ShareTinkerInternals.isTinkerEnabledForResource(tinkerFlag); + Log.w(TAG, "tryLoadPatchFiles:isEnabledForResource:" + isEnabledForResource); + if (isEnabledForResource) { + boolean resourceCheck = TinkerResourceLoader.checkComplete(app, patchVersionDirectory, securityCheck, resultIntent); + if (!resourceCheck) { + //file not found, do not load patch + Log.w(TAG, "tryLoadPatchFiles:resource check fail"); + return; + } + } + //we should first try rewrite patch info file, if there is a error, we can't load jar + if (mainProcess && versionChanged) { + patchInfo.oldVersion = version; + //update old version to new + if (!SharePatchInfo.rewritePatchInfoFileWithLock(patchInfoFile, patchInfo, patchInfoLockFile)) { + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_REWRITE_PATCH_INFO_FAIL); + Log.w(TAG, "tryLoadPatchFiles:onReWritePatchInfoCorrupted"); + return; + } + } + if (!checkSafeModeCount(app)) { + resultIntent.putExtra(ShareIntentUtil.INTENT_PATCH_EXCEPTION, new TinkerRuntimeException("checkSafeModeCount fail")); + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_PATCH_UNCAUGHT_EXCEPTION); + Log.w(TAG, "tryLoadPatchFiles:checkSafeModeCount fail"); + return; + } + //now we can load patch jar + if (isEnabledForDex) { + boolean loadTinkerJars = TinkerDexLoader.loadTinkerJars(app, tinkerLoadVerifyFlag, patchVersionDirectory, resultIntent); + if (!loadTinkerJars) { + Log.w(TAG, "tryLoadPatchFiles:onPatchLoadDexesFail"); + return; + } + } + + //now we can load patch resource + if (isEnabledForResource) { + boolean loadTinkerResources = TinkerResourceLoader.loadTinkerResources(tinkerLoadVerifyFlag, patchVersionDirectory, resultIntent); + if (!loadTinkerResources) { + Log.w(TAG, "tryLoadPatchFiles:onPatchLoadResourcesFail"); + return; + } + } + //all is ok! + ShareIntentUtil.setIntentReturnCode(resultIntent, ShareConstants.ERROR_LOAD_OK); + Log.i(TAG, "tryLoadPatchFiles: load end, ok!"); + return; + } + + private boolean checkSafeModeCount(TinkerApplication application) { + String processName = ShareTinkerInternals.getProcessName(application); + String preferName = ShareConstants.TINKER_OWN_PREFERENCE_CONFIG + processName; + //each process have its own SharedPreferences file + SharedPreferences sp = application.getSharedPreferences(preferName, Context.MODE_PRIVATE); + int count = sp.getInt(ShareConstants.TINKER_SAFE_MODE_COUNT, 0); + Log.w(TAG, "tinker safe mode preferName:" + preferName + " count:" + count); + if (count >= ShareConstants.TINKER_SAFE_MODE_MAX_COUNT) { + sp.edit().putInt(ShareConstants.TINKER_SAFE_MODE_COUNT, 0).commit(); + return false; + } + application.setUseSafeMode(true); + count++; + sp.edit().putInt(ShareConstants.TINKER_SAFE_MODE_COUNT, count).commit(); + Log.w(TAG, "after tinker safe mode count:" + count); + return true; + } + + +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourceLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourceLoader.java new file mode 100644 index 00000000..3976ffe5 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourceLoader.java @@ -0,0 +1,124 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareResPatchInfo; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; + +import java.io.File; + +/** + * Created by liangwenxiang on 2016/4/14. + */ +public class TinkerResourceLoader { + + protected static final String RESOURCE_META_FILE = ShareConstants.RES_META_FILE; + protected static final String RESOURCE_FILE = ShareConstants.RES_NAME; + protected static final String RESOURCE_PATH = ShareConstants.RES_PATH; + private static final String TAG = "Tinker.ResourceLoader"; + private static ShareResPatchInfo resPatchInfo = new ShareResPatchInfo(); + + + private TinkerResourceLoader() { + } + + /** + * Load tinker resources + */ + public static boolean loadTinkerResources(boolean tinkerLoadVerifyFlag, String directory, Intent intentResult) { + if (resPatchInfo == null || resPatchInfo.resArscMd5 == null) { + return true; + } + String resourceString = directory + "/" + RESOURCE_PATH + "/" + RESOURCE_FILE; + File resourceFile = new File(resourceString); + + if (tinkerLoadVerifyFlag) { + long start = System.currentTimeMillis(); + if (!SharePatchFileUtil.checkResourceArscMd5(resourceFile, resPatchInfo.resArscMd5)) { + Log.e(TAG, "Failed to load resource file, path: " + resourceFile.getPath() + ", expect md5: " + resPatchInfo.resArscMd5); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_MD5_MISMATCH); + return false; + } + Log.i(TAG, "verify resource file:" + resourceFile.getPath() + ", md5 use time: " + (System.currentTimeMillis() - start)); + } + try { + TinkerResourcePatcher.monkeyPatchExistingResources(resourceString); + } catch (Throwable e) { + Log.e(TAG, "install resources failed", e); + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_EXCEPTION, e); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_LOAD_EXCEPTION); + return false; + } + return true; + } + + /** + * resource file exist? + * fast check, only check whether exist + * + * @param directory + * @return boolean + */ + public static boolean checkComplete(Context context, String directory, ShareSecurityCheck securityCheck, Intent intentResult) { + String meta = securityCheck.getMetaContentMap().get(RESOURCE_META_FILE); + //not found resource + if (meta == null) { + return true; + } + //only parse first line for faster + ShareResPatchInfo.parseResPatchInfoFirstLine(meta, resPatchInfo); + + if (resPatchInfo.resArscMd5 == null) { + return true; + } + if (!ShareResPatchInfo.checkResPatchInfo(resPatchInfo)) { + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_PACKAGE_PATCH_CHECK, ShareConstants.ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_PACKAGE_CHECK_FAIL); + return false; + } + String resourcePath = directory + "/" + RESOURCE_PATH + "/"; + + File resourceDir = new File(resourcePath); + + if (!resourceDir.exists() || !resourceDir.isDirectory()) { + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_DIRECTORY_NOT_EXIST); + return false; + } + + File resourceFile = new File(resourcePath + RESOURCE_FILE); + if (!resourceFile.exists()) { + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_FILE_NOT_EXIST); + return false; + } + try { + TinkerResourcePatcher.isResourceCanPatch(context); + } catch (Throwable e) { + Log.e(TAG, "resource hook check failed.", e); + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_EXCEPTION, e); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_RESOURCE_LOAD_EXCEPTION); + return false; + } + return true; + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcePatcher.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcePatcher.java new file mode 100644 index 00000000..81aaa4e0 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerResourcePatcher.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2015 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.loader; + +import android.content.Context; +import android.content.res.AssetManager; +import android.content.res.Resources; +import android.util.ArrayMap; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.HashMap; + +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.KITKAT; + +class TinkerResourcePatcher { + // original value + private static Collection> references; + + private static AssetManager newAssetManager = null; + private static Method addAssetPathMethod = null; + private static Method ensureStringBlocksMethod = null; + private static Field assetsFiled = null; + private static Field resourcesImplFiled = null; + + public static void isResourceCanPatch(Context context) throws Throwable { + /* + (Note: the resource directory is *also* inserted into the loadedApk in + monkeyPatchApplication) + The code seems to perform this: + File externalResourceFile = + + AssetManager newAssetManager = new AssetManager(); + newAssetManager.addAssetPath(externalResourceFile) + + // Kitkat needs this method call, Lollipop doesn't. However, it doesn't seem to cause any harm + // in L, so we do it unconditionally. + newAssetManager.ensureStringBlocks(); + + // Find the singleton instance of ResourcesManager + ResourcesManager resourcesManager = ResourcesManager.getInstance(); + + // Iterate over all known Resources objects + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + for (WeakReference wr : resourcesManager.mActiveResources.values()) { + Resources resources = wr.get(); + // Set the AssetManager of the Resources instance to our brand new one + resources.mAssets = newAssetManager; + resources.updateConfiguration(resources.getConfiguration(), resources.getDisplayMetrics()); + } + } + + // Also, for each context, call getTheme() to get the current theme; null out its + // mTheme field, then invoke initializeTheme() to force it to be recreated (with the + // new asset manager!) + + */ + // Create a new AssetManager instance and point it to the resources installed under + // /sdcard + newAssetManager = AssetManager.class.getConstructor().newInstance(); + addAssetPathMethod = AssetManager.class.getDeclaredMethod("addAssetPath", String.class); + addAssetPathMethod.setAccessible(true); + + // Kitkat needs this method call, Lollipop doesn't. However, it doesn't seem to cause any harm + // in L, so we do it unconditionally. + ensureStringBlocksMethod = AssetManager.class.getDeclaredMethod("ensureStringBlocks"); + ensureStringBlocksMethod.setAccessible(true); + + // Iterate over all known Resources objects + if (SDK_INT >= KITKAT) { + //pre-N + // Find the singleton instance of ResourcesManager + Class resourcesManagerClass = Class.forName("android.app.ResourcesManager"); + Method mGetInstance = resourcesManagerClass.getDeclaredMethod("getInstance"); + mGetInstance.setAccessible(true); + Object resourcesManager = mGetInstance.invoke(null); + try { + Field fMActiveResources = resourcesManagerClass.getDeclaredField("mActiveResources"); + fMActiveResources.setAccessible(true); + ArrayMap> arrayMap = + (ArrayMap>) fMActiveResources.get(resourcesManager); + references = arrayMap.values(); + } catch (NoSuchFieldException ignore) { + // N moved the resources to mResourceReferences + Field mResourceReferences = resourcesManagerClass.getDeclaredField("mResourceReferences"); + mResourceReferences.setAccessible(true); + //noinspection unchecked + references = (Collection>) mResourceReferences.get(resourcesManager); + } + } else { + Class activityThread = Class.forName("android.app.ActivityThread"); + Field fMActiveResources = activityThread.getDeclaredField("mActiveResources"); + fMActiveResources.setAccessible(true); + Object thread = getActivityThread(context, activityThread); + @SuppressWarnings("unchecked") + HashMap> map = + (HashMap>) fMActiveResources.get(thread); + references = map.values(); + } + // check resource + if (references == null || references.isEmpty()) { + throw new IllegalStateException("resource references is null or empty"); + } + try { + assetsFiled = Resources.class.getDeclaredField("mAssets"); + assetsFiled.setAccessible(true); + } catch (Throwable ignore) { + // N moved the mAssets inside an mResourcesImpl field + resourcesImplFiled = Resources.class.getDeclaredField("mResourcesImpl"); + resourcesImplFiled.setAccessible(true); + } + } + + public static void monkeyPatchExistingResources(String externalResourceFile) throws Throwable { + if (externalResourceFile == null) { + return; + } + + // Create a new AssetManager instance and point it to the resources installed under + // /sdcard + + if (((Integer) addAssetPathMethod.invoke(newAssetManager, externalResourceFile)) == 0) { + throw new IllegalStateException("Could not create new AssetManager"); + } + + // Kitkat needs this method call, Lollipop doesn't. However, it doesn't seem to cause any harm + // in L, so we do it unconditionally. + ensureStringBlocksMethod.invoke(newAssetManager); + + for (WeakReference wr : references) { + Resources resources = wr.get(); + //pre-N + if (resources != null) { + // Set the AssetManager of the Resources instance to our brand new one + try { + assetsFiled.set(resources, newAssetManager); + } catch (Throwable ignore) { + //N + Object resourceImpl = resourcesImplFiled.get(resources); + Field implAssets = resourceImpl.getClass().getDeclaredField("mAssets"); + implAssets.setAccessible(true); + implAssets.set(resourceImpl, newAssetManager); + } + + resources.updateConfiguration(resources.getConfiguration(), resources.getDisplayMetrics()); + } + } + } + + private static Object getActivityThread(Context context, + Class activityThread) { + try { + if (activityThread == null) { + activityThread = Class.forName("android.app.ActivityThread"); + } + Method m = activityThread.getMethod("currentActivityThread"); + m.setAccessible(true); + Object currentActivityThread = m.invoke(null); + if (currentActivityThread == null && context != null) { + // In older versions of Android (prior to frameworks/base 66a017b63461a22842) + // the currentActivityThread was built on thread locals, so we'll need to try + // even harder + Field mLoadedApk = context.getClass().getField("mLoadedApk"); + mLoadedApk.setAccessible(true); + Object apk = mLoadedApk.get(context); + Field mActivityThreadField = apk.getClass().getDeclaredField("mActivityThread"); + mActivityThreadField.setAccessible(true); + currentActivityThread = mActivityThreadField.get(apk); + } + return currentActivityThread; + } catch (Throwable ignore) { + return null; + } + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java new file mode 100644 index 00000000..018bbc66 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerRuntimeException.java @@ -0,0 +1,34 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +/** + * Created by zhangshaowen on 16/7/8. + */ +public class TinkerRuntimeException extends RuntimeException { + private static final String TINKER_RUNTIME_EXCEPTION_PREFIX = "Tinker Exception:"; + private static final long serialVersionUID = 1L; + + public TinkerRuntimeException(String detailMessage) { + super(TINKER_RUNTIME_EXCEPTION_PREFIX + detailMessage); + } + + public TinkerRuntimeException(String detailMessage, Throwable throwable) { + super(TINKER_RUNTIME_EXCEPTION_PREFIX + detailMessage, throwable); + } + +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerSoLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerSoLoader.java new file mode 100644 index 00000000..c495465b --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerSoLoader.java @@ -0,0 +1,105 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +import android.content.Intent; + +import com.tencent.tinker.loader.shareutil.ShareBsDiffPatchInfo; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.ShareSecurityCheck; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + + +/** + * Created by zhangshaowen on 16/3/8. + */ + +/** + * check the complete of the dex files + * pre-load patch dex files + * we won't load patch library directly! + */ +public class TinkerSoLoader { + protected static final String SO_MEAT_FILE = ShareConstants.SO_META_FILE; + protected static final String SO_PATH = ShareConstants.SO_PATH; + private static final String TAG = "Tinker.TinkerSoLoader"; + + /** + * all the library files in meta file exist? + * fast check, only check whether exist + * + * @param directory + * @return boolean + */ + public static boolean checkComplete(String directory, ShareSecurityCheck securityCheck, Intent intentResult) { + String meta = securityCheck.getMetaContentMap().get(SO_MEAT_FILE); + //not found lib + if (meta == null) { + return true; + } + ArrayList libraryList = new ArrayList<>(); + ShareBsDiffPatchInfo.parseDiffPatchInfo(meta, libraryList); + + if (libraryList.isEmpty()) { + return true; + } + + //tinker//patch-641e634c/lib + String libraryPath = directory + "/" + SO_PATH + "/"; + + HashMap libs = new HashMap<>(); + + for (ShareBsDiffPatchInfo info : libraryList) { + if (!ShareBsDiffPatchInfo.checkDiffPatchInfo(info)) { + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_PACKAGE_PATCH_CHECK, ShareConstants.ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED); + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_PACKAGE_CHECK_FAIL); + return false; + } + String middle = info.path + "/" + info.name; + + //unlike dex, keep the original structure + libs.put(middle, info.md5); + } + + File libraryDir = new File(libraryPath); + + if (!libraryDir.exists() || !libraryDir.isDirectory()) { + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_LIB_DIRECTORY_NOT_EXIST); + return false; + } + + //fast check whether there is any dex files missing + for (String relative : libs.keySet()) { + File libFile = new File(libraryPath + relative); + if (!libFile.exists()) { + ShareIntentUtil.setIntentReturnCode(intentResult, ShareConstants.ERROR_LOAD_PATCH_VERSION_LIB_FILE_NOT_EXIST); + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_MISSING_LIB_PATH, libFile.getAbsolutePath()); + return false; + } + } + + //if is ok, add to result intent + intentResult.putExtra(ShareIntentUtil.INTENT_PATCH_LIBS_PATH, libs); + return true; + } + + +} \ No newline at end of file diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerTestDexLoad.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerTestDexLoad.java new file mode 100644 index 00000000..82b8f1c8 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerTestDexLoad.java @@ -0,0 +1,24 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader; + +/** + * Created by zhangshaowen on 16/9/18. + */ +public class TinkerTestDexLoad { + public static boolean isPatch = false; +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLifeCycle.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLifeCycle.java new file mode 100644 index 00000000..3b67094d --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLifeCycle.java @@ -0,0 +1,66 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.app; + +/** + * Created by zhangshaowen on 16/3/8. + */ + + +import android.app.Application; +import android.content.Context; +import android.content.res.Configuration; + +/** + * This interface is used to delegate calls from main Application object. + * + * Implementations of this interface must have a one-argument constructor that takes + * an argument of type {@link Application}. + */ +public interface ApplicationLifeCycle { + + /** + * Same as {@link Application#onCreate()}. + */ + void onCreate(); + + /** + * Same as {@link Application#onLowMemory()}. + */ + void onLowMemory(); + + /** + * Same as {@link Application#onTrimMemory(int level)}. + * @param level + */ + void onTrimMemory(int level); + + /** + * Same as {@link Application#onTerminate()}. + */ + void onTerminate(); + + /** + * Same as {@link Application#onConfigurationChanged(Configuration newconfig)}. + */ + void onConfigurationChanged(Configuration newConfig); + + /** + * Same as {@link Application#attachBaseContext(Context context)}. + */ + void onBaseContextAttached(Context base); +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLike.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLike.java new file mode 100644 index 00000000..df3d558f --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/ApplicationLike.java @@ -0,0 +1,119 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.app; + +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; + +/** + * Created by zhangshaowen on 16/7/28. + */ +public abstract class ApplicationLike implements ApplicationLifeCycle { + private final Application application; + private final Intent tinkerResultIntent; + private final long applicationStartElapsedTime; + private final long applicationStartMillisTime; + private final int tinkerFlags; + private final boolean tinkerLoadVerifyFlag; + private Resources[] resources; + private ClassLoader[] classLoader; + private AssetManager[] assetManager; + + public ApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, + long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent, + Resources[] resources, ClassLoader[] classLoader, AssetManager[] assetManager) { + this.application = application; + this.tinkerFlags = tinkerFlags; + this.tinkerLoadVerifyFlag = tinkerLoadVerifyFlag; + this.applicationStartElapsedTime = applicationStartElapsedTime; + this.applicationStartMillisTime = applicationStartMillisTime; + this.tinkerResultIntent = tinkerResultIntent; + this.resources = resources; + this.classLoader = classLoader; + this.assetManager = assetManager; + } + + public void setResources(Resources resources) { + this.resources[0] = resources; + } + + public void setAssetManager(AssetManager assetManager) { + this.assetManager[0] = assetManager; + } + + public void setClassLoader(ClassLoader classLoader) { + this.classLoader[0] = classLoader; + } + + public Application getApplication() { + return application; + } + + public final Intent getTinkerResultIntent() { + return tinkerResultIntent; + } + + public final int getTinkerFlags() { + return tinkerFlags; + } + + public final boolean getTinkerLoadVerifyFlag() { + return tinkerLoadVerifyFlag; + } + + public long getApplicationStartElapsedTime() { + return applicationStartElapsedTime; + } + + public long getApplicationStartMillisTime() { + return applicationStartMillisTime; + } + + @Override + public void onCreate() { + + } + + @Override + public void onLowMemory() { + + } + + @Override + public void onTrimMemory(int level) { + + } + + @Override + public void onTerminate() { + + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + + } + + @Override + public void onBaseContextAttached(Context base) { + + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/DefaultApplicationLike.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/DefaultApplicationLike.java new file mode 100644 index 00000000..f0367db2 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/DefaultApplicationLike.java @@ -0,0 +1,72 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.app; + +/** + * Created by zhangshaowen on 16/3/8. + */ + +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.util.Log; + +/** + * Empty implementation of {@link ApplicationLike}. + */ +public class DefaultApplicationLike extends ApplicationLike { + private static final String TAG = "Tinker.DefaultAppLike"; + + public DefaultApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, + long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent, + Resources[] resources, ClassLoader[] classLoader, AssetManager[] assetManager) { + super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent, resources, classLoader, assetManager); + } + + @Override + public void onCreate() { + Log.d(TAG, "onCreate"); + } + + @Override + public void onLowMemory() { + Log.d(TAG, "onLowMemory"); + } + + @Override + public void onTrimMemory(int level) { + Log.d(TAG, "onTrimMemory level:" + level); + } + + @Override + public void onTerminate() { + Log.d(TAG, "onTerminate"); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + Log.d(TAG, "onConfigurationChanged:" + newConfig.toString()); + } + + @Override + public void onBaseContextAttached(Context base) { + Log.d(TAG, "onBaseContextAttached:"); + } +} diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java new file mode 100644 index 00000000..eb908b86 --- /dev/null +++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/app/TinkerApplication.java @@ -0,0 +1,269 @@ +/* + * 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. + * + * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.loader.app; + +import android.annotation.TargetApi; +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.SystemClock; + +import com.tencent.tinker.loader.TinkerLoader; +import com.tencent.tinker.loader.TinkerRuntimeException; +import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.ShareIntentUtil; +import com.tencent.tinker.loader.shareutil.ShareReflectUtil; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * Created by zhangshaowen on 16/3/8. + *