看了代码,注释里其实写了原始设计意图(144行:"如果第一次安装直接使用apk内的,如果是覆盖安装则比较时间差"),但实现上走了捷径(148行注释:"暂时直接拷贝覆盖"),所以当前的无条件覆盖本来就是个"暂时"方案。
两个场景的需求确实是冲突的:app 升级要覆盖,DCC 热更后重启不能覆盖。解决思路是区分"app 升级了"还是"同版本重启"。RootDesc 里有 root(树 hash)和 version 字段,可以用来判断。
比较简单的做法:把包内 head.json 的 root 单独存一份(比如 app_head_root),每次启动时比较当前包内 root 和上次记录的是否一致,不一致说明 app 升级了才覆盖。伪逻辑:
appRoot = parse(apphead).root
lastAppRoot = read('app_head_root') // 上次记录的包内root
if (appRoot !== lastAppRoot) {
// app升级了,用包内的覆盖
write('head.json', apphead, true)
write('app_head_root', appRoot, true)
}
// 否则不覆盖,保留DCC热更的缓存
这样 app 升级时包内资源优先生效,普通重启时 DCC 热更的缓存不丢。对用户问的"关掉服务器版本号回退"的问题也能解决——只要不是 app 升级,缓存的新版本就会保留。
以上由 AI 自动回复,仅供参考。若无异议将不再人工审查;如需人工介入请回帖说明。