Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.1k stars 3.33k forks source link

通过反射调用新增的class,Tinker patch 提示成功,但实际代码并没有生效~ #1584

Closed sunxiaobiu closed 3 years ago

sunxiaobiu commented 3 years ago

Issue/提问须知

在提交issue之前,我们应该先查询是否已经有相关的issue以及常见问题。提交issue时,我们需要写明issue的原因,以及编译或运行过程的日志(加载进程以及Patch进程)。issue需要以下面的格式:


异常类型:app patch 提示安装成功,但是实际没有生效

手机型号:如三星 galaxy6

手机系统版本:如:Android 5.0 

tinker版本:TINKER_VERSION=1.9.14.17

gradle版本:gradle:3.5.3

是否使用热更新SDK: 否

系统:Mac

1.我的需求:在newAPK中新增了一个路径(androidtest), 和test文件(路径tinker.sample.android.androidtest.test),
期望通过反射的方式在mainActivity里面invoke tinker.sample.android.androidtest路径下的所有class文件的methods。
我对比了生成的7zip.apk 和 base.apk的差异,testclass文件被成功识别了。
然后在device上也提示patch is loaded。但是实际这段代码在反射调用的时候并没有调用到。请问可能是什么原因?

P.s. 我是在官方提供的tinker-sample-android项目里面修改的,就改了上述内容,以及build.gradle里面的oldAPk的路径,其他都没有改动过。

可否提供一些排查思路,网上找了各种资料,实在是不知道怎么去排查这个问题了,感谢~!

下面是加载patch包的一些日志信息:
堆栈/日志:
`
06-26 13:55:36.905 16652 16652 E Tinker.MainActivity: i am on onResume
06-26 13:55:36.939 16652 16652 D Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:55:36.534] tryLoad test test
06-26 13:55:36.941 16652 16652 W Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:55:36.542] tryLoadPatchFiles:patch dir not exist:/data/user/0/tinker.sample.android/tinker
06-26 13:55:36.942 16652 16652 D Tinker.DefaultAppLike: [PendingLog @ 2021-06-26 13:55:36.544] onBaseContextAttached:
06-26 13:55:37.248 16652 16652 W Tinker.UpgradePatchRetry: onPatchRetryLoad retry info not exist, just return
06-26 13:55:41.814 16652 16652 E Tinker.MainActivity: i am on onResume
06-26 13:56:23.877 16652 16652 E Tinker.MainActivity: i am on onResume
06-26 13:56:49.949 16652 16652 V Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/app-debug-patch_signed_7zip.apk, file size:4194
06-26 13:56:49.961 16652 16652 W Tinker.PatchInfo: read property failed, e:java.io.FileNotFoundException: /data/user/0/tinker.sample.android/tinker/patch.info (No such file or directory)
06-26 13:56:49.962 16652 16652 W Tinker.PatchInfo: read property failed, e:java.io.FileNotFoundException: /data/user/0/tinker.sample.android/tinker/patch.info (No such file or directory)
06-26 13:56:49.963 16652 16652 W Tinker.UpgradePatchRetry: onPatchListenerCheck retry file is not exist, just return
06-26 13:56:49.972 16652 16652 V Tinker.SamplePatchListener: get platform:all
06-26 13:56:49.995  2996  4634 I ActivityManager: Start proc 17118:tinker.sample.android:patch/u0a241 for service tinker.sample.android/com.tencent.tinker.lib.service.TinkerPatchForeService
06-26 13:56:49.996 16652 16652 I Tinker.TinkerPatchService: run patch service...
06-26 13:56:50.296 17118 17118 D Tinker.TinkerLoader: tryLoad test test
06-26 13:56:50.305 17118 17118 W Tinker.TinkerLoader: tryLoadPatchFiles: we don't load patch with :patch process itself, just return
06-26 13:56:50.307 17118 17118 D Tinker.DefaultAppLike: onBaseContextAttached:
06-26 13:56:50.311 17118 17118 V Tinker.SamplePatchListener: application maxMemory:128
06-26 13:56:50.316 17118 17118 W Tinker.Tinker: tinker patch directory: /data/user/0/tinker.sample.android/tinker
06-26 13:56:50.318 17118 17118 I Tinker.Tinker: try to install tinker, isEnable: true, version: 1.9.14.17
06-26 13:56:50.320 17118 17118 I Tinker.TinkerLoadResult: parseTinkerResult loadCode:-1, process name:tinker.sample.android:patch, main process:false, systemOTA:false, fingerPrint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys, oatDir:null, useInterpretMode:false
06-26 13:56:50.321 17118 17118 W Tinker.TinkerLoadResult: tinker is disable, just return
06-26 13:56:50.322 17118 17118 I Tinker.DefaultLoadReporter: patch loadReporter onLoadResult: patch load result, path:/data/user/0/tinker.sample.android/tinker, code: -1, cost: 9ms
06-26 13:56:50.323 17118 17118 W Tinker.Tinker: tinker load fail!
06-26 13:56:50.324 17118 17118 D Tinker.DefaultAppLike: onCreate
06-26 13:56:50.334 17118 17144 I Tinker.TinkerPatchService: for system version >= Android O, we just ignore increasingPriority job to avoid crash or toasts.
06-26 13:56:50.335 17118 17144 I Tinker.DefaultPatchReporter: patchReporter onPatchServiceStart: patch service start
06-26 13:56:50.347 17118 17144 W Tinker.UpgradePatchRetry: try copy file: /storage/emulated/0/app-debug-patch_signed_7zip.apk to /data/user/0/tinker.sample.android/tinker_temp/temp.apk
06-26 13:56:50.350 17118 17118 D Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:56:50.296] tryLoad test test
06-26 13:56:50.351 17118 17118 W Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:56:50.305] tryLoadPatchFiles: we don't load patch with :patch process itself, just return
06-26 13:56:50.352 17118 17118 D Tinker.DefaultAppLike: [PendingLog @ 2021-06-26 13:56:50.307] onBaseContextAttached:
06-26 13:56:50.353 17118 17118 W Tinker.UpgradePatchRetry: onPatchRetryLoad retry is not main process, just return
06-26 13:56:50.486 17118 17144 I Tinker.UpgradePatch: UpgradePatch tryPatch:patchMd5:729084b63d70ffafc3992a0e170d2fb4
06-26 13:56:50.488 17118 17144 W Tinker.PatchInfo: read property failed, e:java.io.FileNotFoundException: /data/user/0/tinker.sample.android/tinker/patch.info (No such file or directory)
06-26 13:56:50.489 17118 17144 W Tinker.PatchInfo: read property failed, e:java.io.FileNotFoundException: /data/user/0/tinker.sample.android/tinker/patch.info (No such file or directory)
06-26 13:56:50.490 17118 17144 I Tinker.UpgradePatch: UpgradePatch tryPatch:patchVersionDirectory:/data/user/0/tinker.sample.android/tinker/patch-729084b6
06-26 13:56:50.494 17118 17144 W Tinker.UpgradePatch: UpgradePatch copy patch file, src file: /storage/emulated/0/app-debug-patch_signed_7zip.apk size: 4194, dest file: /data/user/0/tinker.sample.android/tinker/patch-729084b6/patch-729084b6.apk size:4194
06-26 13:56:54.834 17118 17144 W Tinker.DexDiffPatchInternal: success recover dex file: /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/classes2.dex.jar, size: 2009181, use time: 4334
06-26 13:56:55.950 17118 17144 W Tinker.DexDiffPatchInternal: success recover dex file: /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/classes.dex.jar, size: 626672, use time: 1115
06-26 13:56:55.952 17118 17144 I Tinker.DexDiffPatchInternal: try Extracting /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/test.dex.jar
06-26 13:56:55.958 17118 17144 I Tinker.DexDiffPatchInternal: isExtractionSuccessful: true
06-26 13:56:56.263 17118 17144 I Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/classes.dex.jar
06-26 13:56:56.264 17118 17144 I Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/classes2.dex.jar
06-26 13:56:56.266 17118 17144 I Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/test.dex.jar
06-26 13:56:56.268 17118 17144 I Tinker.DexDiffPatchInternal: merge classN dex file /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk, result: true, size: 6869339, use: 309ms
06-26 13:56:56.270 17118 17144 I Tinker.DexDiffPatchInternal: legal files to do dexopt: [/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk]
06-26 13:56:56.271 17118 17144 D Tinker.TinkerInternals: getCurrentInstructionSet:arm64
06-26 13:56:56.272 17118 17144 I Tinker.DexDiffPatchInternal: patch recover, try to optimize dex file count:1, optimizeDexDirectory:/data/user/0/tinker.sample.android/tinker/patch-729084b6/odex/
06-26 13:56:56.275 17118 17144 I Tinker.DexDiffPatchInternal: start to parallel optimize dex /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk, size: 6869339
06-26 13:56:56.276 17118 17144 I Tinker.TinkerInternals: class not found exception
06-26 13:56:57.971 17118 17144 W Tinker.ParallelDex: [+] Not API 29 or newer device, skip fixing.
06-26 13:56:57.972 17118 17144 I Tinker.DexDiffPatchInternal: success to parallel optimize dex /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk, opt file:/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/oat/arm64/tinker_classN.odex, opt file size: 94848, use time 1697
06-26 13:56:57.974 17118 17144 I Tinker.DexDiffPatchInternal: recover dex result:true, cost:7478
06-26 13:56:57.975 17118 17144 W Tinker.BsDiffPatchInternal: patch recover, library is not contained
06-26 13:56:57.975 17118 17144 W Tinker.ResDiffPatchInternal: patch recover, resource is not contained
06-26 13:56:57.977 17118 17144 I Tinker.DexDiffPatchInternal: raw dex count: 3, dex opt dex count: 1, final wait times: 90
06-26 13:56:57.992 17118 17144 I Tinker.DexDiffPatchInternal: check dex optimizer file exist: /data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/oat/arm64/tinker_classN.odex, size 94848
06-26 13:56:57.993 17118 17144 I Tinker.DexDiffPatchInternal: check dex optimizer file format: tinker_classN.odex, size 94848
06-26 13:56:58.001 17118 17144 I Tinker.PatchInfo: rewritePatchInfoFile file path:/data/user/0/tinker.sample.android/tinker/patch.info , oldVer:, newVer:729084b63d70ffafc3992a0e170d2fb4, isProtectedApp:0, isRemoveNewVersion:0, fingerprint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys, oatDir:odex, isRemoveInterpretOATDir:0
06-26 13:56:58.015 17118 17144 I Tinker.UpgradePatchRetry: onPatchResetMaxCheck, reset max check to 1
06-26 13:56:58.018 17118 17144 W Tinker.UpgradePatch: UpgradePatch tryPatch: done, it is ok
06-26 13:56:58.020 17118 17144 I Tinker.DefaultPatchReporter: patchReporter onPatchResult: patch all result path: /storage/emulated/0/app-debug-patch_signed_7zip.apk, success: true, cost: 7665
06-26 13:56:58.021 17118 17144 I Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/user/0/tinker.sample.android/tinker_temp/temp.apk
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: SampleResultService receive result:
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: PatchResult:
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: isSuccess:true
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: rawPatchFilePath:/storage/emulated/0/app-debug-patch_signed_7zip.apk
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: costTime:7665
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: dexoptTriggerTime:1624690616273
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: isOatGenerated:true
06-26 13:56:58.050 16652 17157 V Tinker.SampleResultService: patchVersion:729084b63d70ffafc3992a0e170d2fb4
06-26 13:56:58.053 16652 17157 W Tinker.DefaultTinkerResultService: deleteRawPatchFile rawFile path: /storage/emulated/0/app-debug-patch_signed_7zip.apk
06-26 13:56:58.063 16652 17157 I Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /storage/emulated/0/app-debug-patch_signed_7zip.apk
06-26 13:56:58.064 16652 17157 V Tinker.SampleResultService: tinker wait screen to restart process
06-26 13:56:58.064  2996  4634 W ActivityManager: Scheduling restart of crashed service tinker.sample.android/com.tencent.tinker.lib.service.TinkerPatchForeService in 1000ms
06-26 13:56:59.419 17162 17162 D Tinker.TinkerLoader: tryLoad test test
06-26 13:56:59.534 17162 17162 I Tinker.TinkerInternals: class not found exception
06-26 13:56:59.538 17162 17162 D Tinker.TinkerInternals: getCurrentInstructionSet:arm64
06-26 13:56:59.539 17162 17162 W Tinker.TinkerLoader: tryLoadPatchFiles:isEnabledForResource:true
06-26 13:56:59.539 17162 17162 D Tinker.TinkerInternals: same fingerprint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys
06-26 13:56:59.541 17162 17162 W Tinker.TinkerInternals: getSafeModeCount: recFileName:safemode_count_rec_tinker.sample.android failed, return 0 instead.
06-26 13:56:59.544 17162 17162 I Tinker.TinkerInternals: setSafeModeCount: count: 1
06-26 13:56:59.544 17162 17162 I Tinker.TinkerDexLoader: classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/lib/arm64, /system/lib64, /system/vendor/lib64]]]
06-26 13:56:59.545 17162 17162 I Tinker.TinkerDexLoader: verify dex file:/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk md5, use time: 0
06-26 13:56:59.545 17162 17162 I Tinker.ClassLoaderAdder: installDexes dexOptDir: /data/user/0/tinker.sample.android/tinker/patch-729084b6/odex, dex size:1
06-26 13:56:59.563 17162 17162 I Tinker.ClassLoaderAdder: after loaded classloader: com.tencent.tinker.loader.TinkerClassLoader[DexPathList[[zip file "/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/lib/arm64, /system/lib64, /system/vendor/lib64]]], dex size:1
06-26 13:56:59.564 17162 17162 W Tinker.ClassLoaderAdder: checkDexInstall result:true
06-26 13:56:59.565 17162 17162 I Tinker.IncrementCompMgr: package has no incremental component meta, skip init.
06-26 13:56:59.565 17162 17162 I Tinker.AppInfoChangedBlocker: tryStart called.
06-26 13:56:59.565 17162 17162 I Tinker.AppInfoChangedBlocker: tryStart done.
06-26 13:56:59.566 17162 17162 I Tinker.PatchInfo: rewritePatchInfoFile file path:/data/user/0/tinker.sample.android/tinker/patch.info , oldVer:729084b63d70ffafc3992a0e170d2fb4, newVer:729084b63d70ffafc3992a0e170d2fb4, isProtectedApp:0, isRemoveNewVersion:0, fingerprint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys, oatDir:odex, isRemoveInterpretOATDir:0
06-26 13:56:59.575 17162 17162 I Tinker.TinkerLoader: tryLoadPatchFiles: load end, ok!
06-26 13:56:59.586 17162 17162 D Tinker.DefaultAppLike: onBaseContextAttached:
06-26 13:56:59.601 17162 17162 V Tinker.SamplePatchListener: application maxMemory:128
06-26 13:56:59.615 17162 17162 W Tinker.Tinker: tinker patch directory: /data/user/0/tinker.sample.android/tinker
06-26 13:56:59.629 17162 17162 I Tinker.Tinker: try to install tinker, isEnable: true, version: 1.9.14.17
06-26 13:56:59.632 17162 17162 I Tinker.TinkerLoadResult: parseTinkerResult loadCode:0, process name:tinker.sample.android, main process:true, systemOTA:false, fingerPrint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys, oatDir:odex, useInterpretMode:false
06-26 13:56:59.633 17162 17162 I Tinker.TinkerLoadResult: parseTinkerResult oldVersion:, newVersion:729084b63d70ffafc3992a0e170d2fb4, current:729084b63d70ffafc3992a0e170d2fb4
06-26 13:56:59.634 17162 17162 I Tinker.TinkerLoadResult: oh yeah, tinker load all success
06-26 13:56:59.634 17162 17162 I Tinker.DefaultLoadReporter: patch loadReporter onLoadPatchVersionChanged: patch version change from  to 729084b63d70ffafc3992a0e170d2fb4
06-26 13:56:59.639 17162 17162 I Tinker.UpgradePatchRetry: onPatchResetMaxCheck, reset max check to 1
06-26 13:56:59.642 17162 17162 I Tinker.DefaultLoadReporter: patch loadReporter onLoadResult: patch load result, path:/data/user/0/tinker.sample.android/tinker, code: 0, cost: 157ms
06-26 13:56:59.645 17162 17162 I Tinker.TinkerInternals: setSafeModeCount: count: 0
06-26 13:56:59.647 17162 17162 D Tinker.DefaultAppLike: onCreate
06-26 13:57:00.036 17162 17162 E Tinker.MainActivity: ARK HOT Running status = false
06-26 13:57:00.036 17162 17162 E Tinker.MainActivity: i am on onCreate classloader:com.tencent.tinker.loader.TinkerClassLoader[DexPathList[[zip file "/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/lib/arm64, /system/lib64, /system/vendor/lib64]]]
06-26 13:57:00.037 17162 17162 E Tinker.MainActivity: i am on onCreate string:I am in the base apk
06-26 13:57:00.043 17162 17162 I System.out: =============================[tinker.isTinkerLoaded():]true
06-26 13:57:00.123 17162 17162 I Tinker.PatchInfo: rewritePatchInfoFile file path:/data/user/0/tinker.sample.android/tinker/patch.info , oldVer:729084b63d70ffafc3992a0e170d2fb4, newVer:729084b63d70ffafc3992a0e170d2fb4, isProtectedApp:0, isRemoveNewVersion:1, fingerprint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys, oatDir:odex, isRemoveInterpretOATDir:0
06-26 13:57:00.139 17162 17162 E Tinker.MainActivity: i am on onResume
06-26 13:57:00.172 17162 17162 D Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:56:59.419] tryLoad test test
06-26 13:57:00.173 17162 17162 I Tinker.TinkerInternals: [PendingLog @ 2021-06-26 13:56:59.534] class not found exception
06-26 13:57:00.174 17162 17162 D Tinker.TinkerInternals: [PendingLog @ 2021-06-26 13:56:59.538] getCurrentInstructionSet:arm64
06-26 13:57:00.174 17162 17162 W Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:56:59.538] tryLoadPatchFiles:isEnabledForResource:true
06-26 13:57:00.175 17162 17162 D Tinker.TinkerInternals: [PendingLog @ 2021-06-26 13:56:59.539] same fingerprint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys
06-26 13:57:00.176 17162 17162 W Tinker.TinkerInternals: [PendingLog @ 2021-06-26 13:56:59.541] getSafeModeCount: recFileName:safemode_count_rec_tinker.sample.android failed, return 0 instead.
06-26 13:57:00.177 17162 17162 I Tinker.TinkerInternals: [PendingLog @ 2021-06-26 13:56:59.543] setSafeModeCount: count: 1
06-26 13:57:00.178 17162 17162 I Tinker.TinkerDexLoader: [PendingLog @ 2021-06-26 13:56:59.544] classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/lib/arm64, /system/lib64, /system/vendor/lib64]]]
06-26 13:57:00.179 17162 17162 I Tinker.TinkerDexLoader: [PendingLog @ 2021-06-26 13:56:59.545] verify dex file:/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk md5, use time: 0
06-26 13:57:00.180 17162 17162 I Tinker.ClassLoaderAdder: [PendingLog @ 2021-06-26 13:56:59.545] installDexes dexOptDir: /data/user/0/tinker.sample.android/tinker/patch-729084b6/odex, dex size:1
06-26 13:57:00.181 17162 17162 I Tinker.ClassLoaderAdder: [PendingLog @ 2021-06-26 13:56:59.563] after loaded classloader: com.tencent.tinker.loader.TinkerClassLoader[DexPathList[[zip file "/data/user/0/tinker.sample.android/tinker/patch-729084b6/dex/tinker_classN.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-_ImgcmcUct4TftlD-SDbuA==/lib/arm64, /system/lib64, /system/vendor/lib64]]], dex size:1
06-26 13:57:00.182 17162 17162 W Tinker.ClassLoaderAdder: [PendingLog @ 2021-06-26 13:56:59.564] checkDexInstall result:true
06-26 13:57:00.183 17162 17162 I Tinker.IncrementCompMgr: [PendingLog @ 2021-06-26 13:56:59.565] package has no incremental component meta, skip init.
06-26 13:57:00.184 17162 17162 I Tinker.AppInfoChangedBlocker: [PendingLog @ 2021-06-26 13:56:59.565] tryStart called.
06-26 13:57:00.185 17162 17162 I Tinker.AppInfoChangedBlocker: [PendingLog @ 2021-06-26 13:56:59.565] tryStart done.
06-26 13:57:00.186 17162 17162 I Tinker.PatchInfo: [PendingLog @ 2021-06-26 13:56:59.566] rewritePatchInfoFile file path:/data/user/0/tinker.sample.android/tinker/patch.info , oldVer:729084b63d70ffafc3992a0e170d2fb4, newVer:729084b63d70ffafc3992a0e170d2fb4, isProtectedApp:0, isRemoveNewVersion:0, fingerprint:samsung/a5y17ltexx/a5y17lte:8.0.0/R16NW/A520FXXS7CRJB:user/release-keys, oatDir:odex, isRemoveInterpretOATDir:0
06-26 13:57:00.188 17162 17162 I Tinker.TinkerLoader: [PendingLog @ 2021-06-26 13:56:59.575] tryLoadPatchFiles: load end, ok!
06-26 13:57:00.189 17162 17162 D Tinker.DefaultAppLike: [PendingLog @ 2021-06-26 13:56:59.586] onBaseContextAttached:
06-26 13:57:00.363 17162 17162 W Tinker.UpgradePatchRetry: onPatchRetryLoad patch file: /data/user/0/tinker.sample.android/tinker_temp/temp.apk is not exist, just return
`

截图:
![tinker](https://user-images.githubusercontent.com/12237826/123505074-58ed7300-d6a0-11eb-87d8-b05b8fc3270a.jpeg)
sunxiaobiu commented 3 years ago

@tom-ystang 可以给一些排查思路吗?谢谢orz

sunxiaobiu commented 3 years ago

我找到原因了,tinker确实已经执行成功,且加载了我新增的class。我的问题是出在我试图用反射从dex里面获取指定包下的所有classes,这个过程失败了,没有获取成功。应该是需要从TinkerClassLoder获取dexElements,然后拿到里面的dexFile List,然后解析指定包下面的class,但是貌似TinkerClassLoder没有把这些信息放到field里面,所以反射调用不到。。。这个目前我还不知道要怎么弄。。

sunxiaobiu commented 3 years ago

我解决了。用一下代码即可:

public static ArrayList<String> findClassesStartWith(String prefix) {
        try {
            ArrayList<String> result = new ArrayList<>();
            ArrayList<DexFile> dexFiles = findAllDexFiles(Thread.currentThread().getContextClassLoader());
            for (DexFile dexFile : dexFiles) {
                Enumeration<String> classNames = dexFile.entries();
                while (classNames.hasMoreElements()) {
                    String className = classNames.nextElement();
                    if (className.startsWith(prefix)) {
                        result.add(className);
                    }
                }
            }
            return result;
        } catch (Exception ignored) {
        }
        return null;
    }

    public static ArrayList<DexFile> findAllDexFiles(ClassLoader classLoader) {
        ArrayList<DexFile> dexFiles = new ArrayList<>();
        try {
            Field pathListField = findField(classLoader, "pathList");
            Object pathList = pathListField.get(classLoader);
            Field dexElementsField = findField(pathList, "dexElements");
            Object[] dexElements = (Object[]) dexElementsField.get(pathList);
            Field dexFileField = findField(dexElements[0], "dexFile");

            for (Object dexElement : dexElements) {
                Object dexFile = dexFileField.get(dexElement);
                dexFiles.add((DexFile) dexFile);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dexFiles;
    }

    private static Field findField(Object instance, String name) throws NoSuchFieldException {
        Class clazz = instance.getClass();

        while (clazz != null) {
            try {
                Field field = clazz.getDeclaredField(name);
                if (!field.isAccessible()) {
                    field.setAccessible(true);
                }

                return field;
            } catch (NoSuchFieldException var4) {
                clazz = clazz.getSuperclass();
            }
        }

        throw new NoSuchFieldException("Field " + name + " not found in " + instance.getClass());
    }