tinker
tinker copied to clipboard
Odex file: does not exist
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)。请问哪种方式是稳健的?