Quick-cocos2d-x的热更新机制实现(终极版2)(更新3.3版本)

洒泪感谢版主大大!!!

还有点问题 关于问题1的 你的意思是把“searchPaths.push_back(tempPaths);” 这个修改到19行吗?问题是这个和原来的有区别吗?

哈哈 多谢!

这是我看到的实现思路最清晰的一个版本。有个问题是,我的android版本,如何读取asset/res下地lib目录?能否分享一下那个java写的用来获取目录的getAppBaseResourcePath的实现?std::string strBasePath = getAppBaseResourcePath();
searchPaths.push_back(strBasePath);
searchPaths.push_back(strBasePath + “res/”);

我尝试了上面的,也尝试了直接加searchPaths.push_back(“assets/res/”);都无法读取我放在asset/res/lib下地打包的脚本,我看了好几个自动更新的实现,都没有提到,难道是很easy的问题?还是quick-x的版本的问题?

android 用io 读取 asset目录下的文件是读取不到的,我写getAppBaseResourcePath 目的是我的BaseResourcePath 不是asset目录下的, 是在java层修改了的,第一次启动的时候在java把asset目录下的资源全部拷贝到可写目录(可写目录我是放在sd卡上面的),另外如果你不需要修改AppBaseResourcePath 也就是资源任然在asset目录下,你可以不用getAppBaseResourcePath 方法。也就是
std::string strBasePath = getAppBaseResourcePath();
searchPaths.push_back(strBasePath);
searchPaths.push_back(strBasePath + “res/”);

替换为
searchPaths.push_back(“res/”);

你可以先尝试下,如果还有问题,我再给你解答。

那个路径我加了,没有用。问题是,要是我不做自动更新,那图片资源是怎么读得?我就是把代码打包,放在assets/res/lib下面,我也看了安装的那个apk包,目录和文件都在。

在launcher/init.lua 中这样修改
function Launcher.readFile(path)
return cc.FileUtils:getInstance():getFileData(path)
end

问题解决了,谢谢,不是读写的问题,纠结了好久。方向搞错了

是需要什么问题,怎么解决的可以和大家分享下。

if Launcher.platform == “android” then
Launcher.javaClassName = “com/jiuwanle/zhanhuang/luajavabridge/Luajavabridge”
Launcher.luaj = {}
function Launcher.luaj.callStaticMethod(className, methodName, args, sig)
return CCLuaJavaBridge.callStaticMethod(className, methodName, args, sig)

这块Luajavabridge该怎么写,能否提供个源码,这个java类编译成class后放在哪个目录下

这个写法很简单的,我就是参考luaj的java写的,你先搞明白luaj是怎么实现的吧。

Luajavabridge 能提供份源码,我看下就明白了

public static void initPlatform(final int luaCallbackFunction) {
    sActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //TODO::初始化平台SDK
            Luajavabridge.sNeedInitPlatform = false;
            sActivity.runOnGLThread(new Runnable() {
                @Override
                public void run() {
                    Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaCallbackFunction, "successed");
                    Cocos2dxLuaJavaBridge.releaseLuaFunction(luaCallbackFunction);
                }
            });
        }
    });
}

这个方案思路很清晰,先赞一个!我有几个疑问想请教一下,你这个方案应该是直接更新zip包,就是相当于打包后的下载后对比MD5值再进行本地替换,那这样是不是意味着,它不是纯粹的增量型更新??假如我的游戏角本部分全部打包或者按模块打包成game.zip这种形式,那么更新检测的也是game.zip这个包是否需要更新,但实际情况,一般可能只是整个项目的某一个角本有bug做了修改(比如说项目game.zip包里只有logic.lua这个文件需要更新),其它的都没变动,但是有更新的话是不是可以理解为需要更新整个game.zip???还有图片资源方面,如果采用本更新方案,资源打包应该采取哪种方式会比较合理点,不用TP打包成一整张纹理(散的)?或者用TP打包,但是也采取模块化划分?因为更新的也有可能只是一堆图片里的一个背景或者说一个按钮的图片,其它的不需要更新。

你可以更具自己的功能模块打成多个.zip文件,某些文件修改了 只需要做这个文件相对应的.zip 更新下,对于一个功能模块打包后的.zip 应该是比较小,更新是很快的。
图片这块如果更新频繁建议直接用散图就可以了,我的更新中没有硬性要求更新一定要是打包成大图处理。

升级到3.3 需要注意一项事情 在main.lua 的开始部分加上
cc.FileUtils:getInstance():purgeCachedEntries() 目的是 清除fileCached,避免无法加载新的资源bug。

if self._fileList ~= nil then
local appVersionCode = Launcher.getAppVersionCode()
if appVersionCode ~= self._fileList.appVersion then
–新的app已经更新需要删除upd/目录下的所有文件
Launcher.removePath(self._path)
require(“main”)
return
end
else
self._fileList = Launcher.doFile(Launcher.fListName)
end

请问楼主,这里做大版本比较是否需要整个apk重新下载。那么想问下,
1、apk下载是在removePath之前做吗?
2、lua里http请求下载apk后,如何解压缩?

这里做大版本比较是表明已经安装的新的apk版本,这里比较的是心apk版本里的资源一般是最新的,那么第一次启动新安装的版本时就得删除原upd目录下的资源文件。
1:下载apk是在removePath之前做,一般会在上成java层做,我的launcher中有calljava方法initPlatform, 这块逻辑就是给上层去初始化一些事情(包括整包更新),一般android 都是集成第3放SDK,第三方SDK带有整包更新。
如果不是集成三方SDK 自己写一个java版本的下载并安装apk的流程应该非常简单,网上应该能搜到很多这样的代码。
2:lua 里请求http下载apk后 是通过调用java方法来进行安装的。

十分感谢,理清逻辑了