安卓平台上app热更新之后无法再进行覆盖安装

安卓手机上已有一个旧版本的app,不进行卸载操作,这时候直接安装新版可以覆盖掉旧版,运行起来就是最新版本的,此时,也可以再覆盖掉新版安装回旧版本
遇到的问题:如果旧版进行过热更新之后,就无法进行应用覆盖安装操作了,无论是用高版本还是低版本都无法覆盖热更之后的版本,(包名签名都是一致的),请问有人遇到过吗,如何解决

3赞

应该是把可写目录的已下载的旧的更新文件删掉

我是这样删除的jsb.fileUtils.removeDirectory(jsb.fileUtils.getWritablePath());

程序中是这样删除的

每次做整包更新的时候删除一下缓存目录

jsb.fileUtils.getWritablePath()是可写目录,别的游戏也会用到,你这是在给别的游戏挖坑啊,666

我也遇到了这个问题。你删除掉之后,可以了正确使用最新的更新文件嘛?

新版本需要强制清除热更新缓存目录。 这是很多人容易忽略的点。

getWritablePath 是基于自己游戏APP目录下的。 比如 android上就是 mnt/data/com.ooxx.ooxx/目录, IOS上就是 app/ewer-5432f-2rfedcv3…/ducuments/.
大概是这个意思。 就是说,是基于自己目录下的, 不会影响到其它应用

就是要自己删一次?坑爹

对 可以了

判断有整包更新的时候删除一下就可以了

对 是酱紫

main.js 会去根据 local storage 获取之前热更新下来的目录,这样的话可能会造成安装好的新版本资源被覆盖的情况。

也不是一定要删除原来的,你也可以每个发布 app 包的主版本用不同的 local storage key 来保存本地路径,这样就不会冲突了

panda大大这个方法好,比较不容易出错,而且方便操作。:+1:

1赞

每一个IPA,APK,都有一个对应的版本号。。 写入到缓存目录中。 启动时,先检查这个版本号与缓存中的是否一致。 如果不一致。则删除缓存目录,再cc.game.restart 收工!

2赞

AssetManagerEx里其实是做了的,把包里的project.manifest传进去,跟缓存的比较,比缓存大会删掉全部缓存,HotUpdate里有一句this._am.loadLocalManifest(this.manifestUrl); 自行提前调用


bool localNewer = _localManifest->versionGreater(cachedManifest, _versionCompareHandle);
if (localNewer)
{
// Recreate storage, to empty the content
_fileUtils->removeDirectory(_storagePath);
_fileUtils->createDirectory(_storagePath);
CC_SAFE_RELEASE(cachedManifest);
}

如果是两个相同的app 覆盖安装 该怎么办?

挖坟见谅。
分享一下结论。
用2.1.3验证,确实如层主所说,新版本App覆盖安装旧版本,只要版本号比他大,会自动清空缓存目录。
而如果版本号比他小,也不会再去下载更新文件,而是直接用本地的。
这个利用好,应该可以解决很多问题了。

旧包热更新后 main,js 就报错了 main.js 内要加什么代码判断为大版本更新