tinker icon indicating copy to clipboard operation
tinker copied to clipboard

Odex file: does not exist

Open igottime opened this issue 3 years ago • 0 comments

Issue/提问须知

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

异常类型:app运行时异常

手机型号:航盛车机

手机系统版本:Android9.0

tinker版本:如:1.9.14.25

gradle版本:如:4.2.0

是否使用热更新SDK:否

系统:Windows

报错堆栈
E/Tinker.DefaultPatchReporter: onPatchDexOptFail:  java.io.FileNotFoundException: Odex file: /data/user/0/com.***.***/tinker/patch-b7dc98f7/dex/oat/arm64/tinker_classN.odex does not exist.
       at com.tencent.tinker.loader.TinkerDexOptimizer$OptimizeWorker.run(TinkerDexOptimizer.java:192)
       at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:108)
       at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:83)
       at com.tencent.tinker.lib.patch.DexDiffPatchInternal.dexOptimizeDexFiles(DexDiffPatchInternal.java:380)
       at com.tencent.tinker.lib.patch.DexDiffPatchInternal.patchDexExtractViaDexDiff(DexDiffPatchInternal.java:196)
       at com.tencent.tinker.lib.patch.DexDiffPatchInternal.tryRecoverDexFiles(DexDiffPatchInternal.java:87)
       at com.tencent.tinker.lib.patch.UpgradePatch.tryPatch(UpgradePatch.java:157)
       at com.tencent.tinker.lib.service.TinkerPatchService.doApplyPatch(TinkerPatchService.java:223)
       at com.tencent.tinker.lib.service.TinkerPatchService.onHandleIntent(TinkerPatchService.java:101)
       at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:76)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:193)
       at android.os.HandlerThread.run(HandlerThread.java:65)

是Android9的车机系统,看了一下代码最终是走了TinkerDexOptimizer.java中的
patchClassLoaderStrongRef = NewClassLoaderInjector.triggerDex2Oat(context, optimizedDir,
                                    useDLC, dexFile.getAbsolutePath());
执行完odexFile文件没有生成
 final File odexFile = new File(optimizedPath);
                if (SharePatchFileUtil.isLegalFile(odexFile) || SharePatchFileUtil.shouldAcceptEvenIfIllegal(odexFile)) {
                    if (callback != null) {
                        callback.onSuccess(dexFile, optimizedDir, odexFile);
                    }
                    return true;
                } else {
                    final FileNotFoundException e = new FileNotFoundException("Odex file: "
                            + odexFile.getAbsolutePath() + " does not exist.");
                    if (callback != null) {
                        callback.onFailed(dexFile, optimizedDir, e);
                    }
                    return false;
                }
我尝试在这里直接让其回调onSuccess,实际是修复成功。这样搞会有问题吗?我看了一下历史代码,之前看起来是会走triggerPMDexOptOnDemand(context, dexFile.getAbsolutePath(), optimizedPath);这段逻辑。

我想的解决方案,一个是直接SharePatchFileUtil.shouldAcceptEvenIfIllegal(odexFile)在这里针对该车机放行,另一个是使其触发triggerPMDexOptOnDemand(context, dexFile.getAbsolutePath(), optimizedPath)。请问哪种方式是稳健的?

igottime avatar Dec 07 '22 00:12 igottime