新人第一次接触热更,能成功热更下服务器的资源,并且能在MAC和iOS平台上运行刚更新下的图片资源及lua代码。
但是在android平台上的表现是:图片资源能获取到,但新的lua文件不能运行。请教下各位看有没有什么好的方法可以排查到原因。
程序运行的顺序是:UpdateScene.lua 跳转到 LoginScene.lua(被热更的文件)
我贴几个关键代码吧,需要我提供什么说,只求解决思路~~~
UpdateScene.lua中的更新代码是:
function UpdatePanel:startUpdate()
local writablePath = cc.FileUtils:getInstance():getWritablePath()
local storagePath = writablePath .. "newVersion"
-- 创建AssetsManagerEx对象
local assetsManagerEx = cc.AssetsManagerEx:create("src/version/project.manifest", storagePath)
assetsManagerEx:retain()
-- 设置下载消息listener
local function handleAssetsManagerEx(event)
if (cc.EventAssetsManagerEx.EventCode.ALREADY_UP_TO_DATE == event:getEventCode()) then
self:updateStateText("当前是最新版本,即将进入游戏")
self:goLogin()
end
if (cc.EventAssetsManagerEx.EventCode.NEW_VERSION_FOUND == event:getEventCode()) then
self:updateStateText("发现新版本,开始升级")
end
if (cc.EventAssetsManagerEx.EventCode.UPDATE_PROGRESSION == event:getEventCode()) then
self:updateProcessBar(event:getPercent())
end
if (cc.EventAssetsManagerEx.EventCode.UPDATE_FINISHED == event:getEventCode()) then
self:updateStateText("更新完毕,即将进入游戏")
unloadAllFile()--清除package.loaded中的lua文件
self:goLogin()--跳转到LoginScene.lua场景
end
if (cc.EventAssetsManagerEx.EventCode.ERROR_NO_LOCAL_MANIFEST == event:getEventCode()) then
self:updateStateText("发生错误:本地找不到manifest文件,建议重新最新游戏客户端或重试更新")
self:showRetryBtn()
end
if (cc.EventAssetsManagerEx.EventCode.ERROR_DOWNLOAD_MANIFEST == event:getEventCode()) then
self:updateStateText("发生错误:下载manifest文件失败,请联系搓搓游戏或重试更新")
self:showRetryBtn()
end
if (cc.EventAssetsManagerEx.EventCode.ERROR_PARSE_MANIFEST == event:getEventCode()) then
self:updateStateText("发生错误:解析manifest文件失败,请联系搓搓游戏或重试更新")
self:showRetryBtn()
end
if (cc.EventAssetsManagerEx.EventCode.ERROR_UPDATING == event:getEventCode()) then
self:updateStateText("发生错误:更新失败,请联系搓搓游戏或重试更新")
self:showRetryBtn()
end
end
local dispatcher = cc.Director:getInstance():getEventDispatcher()
local eventListenerAssetsManagerEx = cc.EventListenerAssetsManagerEx:create(assetsManagerEx, handleAssetsManagerEx)
dispatcher:addEventListenerWithFixedPriority(eventListenerAssetsManagerEx, 1)
-- 检查版本并升级
assetsManagerEx:update()
self:showProcessPanel()
self:updateStateText("正在检查更新")
end
--添加搜索路径(这个函数在main.lua中执行)
function refreshSearchPath()
local writablePath = cc.FileUtils:getInstance():getWritablePath()
local storagePath = writablePath .. "newVersion"
if not (cc.FileUtils:getInstance():isDirectoryExist(storagePath)) then
cc.FileUtils:getInstance():createDirectory(storagePath)
end
local targetPlatform = cc.Application:getInstance():getTargetPlatform()
--将下载目录的src和res作为优先级最高的搜索目录,这样才能保证下载的能覆盖原来的代码
--MAC和IOS平台用此方法增加searchPath
if cc.PLATFORM_OS_MAC == targetPlatform or cc.PLATFORM_OS_IOS == targetPlatform then
local searchPaths = cc.FileUtils:getInstance():getSearchPaths()
table.insert(searchPaths, 1, storagePath.."/assets")
table.insert(searchPaths, 2, storagePath.."/assets/src")
table.insert(searchPaths, 3, storagePath.."/assets/res")
cc.FileUtils:getInstance():setSearchPaths(searchPaths)
else
--Android用setSearchPaths会黑屏,所以用这部分代码增加searchPath
local assDir = storagePath.."/assets"
cc.FileUtils:getInstance():addSearchPath(assDir,true)
local srcDir = storagePath.."/assets/src/"
cc.FileUtils:getInstance():addSearchPath(srcDir,true)
local resDir = storagePath.."/assets/res/"
cc.FileUtils:getInstance():addSearchPath(resDir,true)
end
end
------------------------- 自定义require,方便热更的时候全部卸载 -------------------------
--(这个类在main.lua第一行require)
local _require = require
local loaded_files = {}
require = function(name)
--print("自定义require:"..name)
if not loaded_files[name] then
loaded_files[name] = _require(name)
end
return loaded_files[name]
end
unloadAllFile = function()
for name, _ in pairs(loaded_files) do
if string.sub(name,1,string.len("app."))=="app." or
string.sub(name,1,string.len("sandglass."))=="sandglass." or
name == "version" or
name == "version_list" or
name == "version_server" or
name == "version_list_server" then
package.loaded[name] = nil
end
end
for name, _ in pairs(loaded_files) do
logUtil:write(name)
end
loaded_files = {}
end
-------------------------------------------------------------------------------------