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

SystemClassLoaderAdder.checkDexInstall返回false导致加载patch失败并删除掉合成后的补丁 #1695

Open tianzhilanat2010 opened 1 year ago

tianzhilanat2010 commented 1 year ago

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

手机型号:如:RedMi

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

tinker版本:如:1.9.14.25.1

gradle版本:如:4.10.3

是否使用热更新SDK: TinkerPatch SDK

系统:Mac

Log:2022-11-23 15:04:10.368 11299-11299/com.xxxxx.activity D/Tinker.TinkerInternals: same fingerprint:Redmi/chopin/chopin:11/RP1A.200720.011/V12.5.5.0.RKPCNXM:user/release-keys 2022-11-23 15:04:10.368 11299-11299/com.x x x x x.activity W/Tinker.TinkerInternals: getSafeModeCount: recFileName:safemode_count_rec_com.xxxxx.activity failed, return 0 instead. 2022-11-23 15:04:10.369 11299-11299/com.xxxxx.activity I/Tinker.TinkerInternals: setSafeModeCount: count: 1 2022-11-23 15:04:10.369 11299-11299/com.xxxxx.activity I/Tinker.TinkerDexLoader: classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/base.apk"],nativeLibraryDirectories=[/data/app/ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/lib/arm64, /data/app/~~ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]] 2022-11-23 15:04:10.369 11299-11299/com.xxxxx.activity I/Tinker.TinkerDexLoader: verify dex file:/data/user/0/com.xxxxx.activity/tinker/patch-3cadb0ab/dex/tinker_classN.apk md5, use time: 0 2022-11-23 15:04:10.369 11299-11299/com.xxxxx.activity I/Tinker.ClassLoaderAdder: installDexes dexOptDir: /data/user/0/com.xxxxx.activity/tinker/patch-3cadb0ab/odex, dex size:1 2022-11-23 15:04:10.376 11299-11299/com.xxxxx.activity I/Tinker.ClassLoaderAdder: after loaded classloader: dalvik.system.DelegateLastClassLoader[DexPathList[[zip file "/data/user/0/com.xxxxx.activity/tinker/patch-3cadb0ab/dex/tinker_classN.apk"],nativeLibraryDirectories=[/data/app/ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/lib/arm64, /data/app/ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]], dex size:1 2022-11-23 15:04:10.376 11299-11299/com.xxxxx.activity I/Tinker.ClassLoaderAdder: checkDexInstall result: false, checker_classloader: dalvik.system.DelegateLastClassLoader[DexPathList[[zip file "/data/user/0/com.xxxxx.activity/tinker/patch-3cadb0ab/dex/tinker_classN.apk"],nativeLibraryDirectories=[/data/app/ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/lib/arm64, /data/app/ENs-pZzQPqaICMN1pUyFUQ==/com.xxxxx.activity-AK7qGpzt7v98SVwd-dtldQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]] 2022-11-23 15:04:10.376 11299-11299/com.xxxxx.activity E/Tinker.TinkerDexLoader: install dexes failed 2022-11-23 15:04:10.376 11299-11299/com.xxxxx.activity W/Tinker.TinkerLoader: tryLoadPatchFiles:onPatchLoadDexesFail 2022-11-23 15:04:10.426 11299-11299/com.xxxxx.activity I/Tinker.TinkerInternals: setSafeModeCount: count: 0 2022-11-23 15:04:10.556 11299-11299/com.xxxxx.activity E/Reflection: reflect bootstrap failed:

tianzhilanat2010 commented 1 year ago

我看代码 isPatch变量是通过差分包中添加text.dex (包含TinkerTestDexLoad类并且isPatch为true),然后在加载合成好的包后判断是test.dex插入到tinker_classN.apk中,这样以覆盖基础包中的 TinkerTestDexLoad。但是目前看下来是有问题的,无法确保test.dex中的TinkerTestDexLoad class在base包中的TinkerTestDexLoad前面

wangyufengdy commented 1 year ago

我使用的插件版本是:com.android.tools.build:gradle:4.0.2;

有两个办法解决: 第一个:可以通过修改minSdkVersion 小于21; 第二个:自定义一个tinker-android-loader库,修改SystemClassLoaderAdder 中的checkDexInstall永远返回true;
implementation("com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}"){ exclude group: 'com.tencent.tinker', module: 'tinker-android-loader' //移除tinker自带的库 } 引入自定义的tinker-android-loader implementation("xxxxx:xxxxx:1.0.0")

wangyufengdy commented 1 year ago

如果是minSdkVersion >=21的话可以添加 allowLoaderInAnyDex=true removeLoaderForAllDex=true

tianzhilanat2010 commented 1 year ago

我前面是通过自定义一个tinker-android-loader库修复的。 我再试试 allowLoaderInAnyDex=true removeLoaderForAllDex=true

tianzhilanat2010 commented 1 year ago

如果是minSdkVersion >=21的话可以添加 allowLoaderInAnyDex=true removeLoaderForAllDex=true

这个貌似不行