1. 程式人生 > >cocos2dx版本熱更新梳理

cocos2dx版本熱更新梳理

cocos熱更新實現了專案資源和指令碼檔案的動態更新。當工程有新的改動時,使用者無需重新下載完整的安裝包,而是通過對比本地與最新的版本資訊,僅下載有改動的檔案到本地,完成版本的更新。

工程的資源和指令碼檔案存放分2個地方,一個是安裝目錄,一個是資料目錄,當app安裝完後,安裝目錄則不再可寫,此後所有的更新檔案統一存放到資料目錄當中,APP呼叫檔案時,也優先搜尋資料目錄的檔案,當資料目錄中找不到檔案時,再到安裝目錄中搜索。

配置檔案分2種,project.manifest和version.manifest。伺服器和客戶端都存有備份,伺服器存放著最新的版本配置檔案,版本號最高,客戶端每次啟動前都會將伺服器版本檔案下載下來,並和本地配置檔案對行對比,如果不是最新版本,則下載並安裝補丁包。配置檔案內容都是Json物件,且結構一樣,只是version.manifest只儲存了版本資訊,project.manifest儲存了版本資訊和補丁資訊。

project.manifest檔案結構如下:

{

     "packageUrl" :"http://test.ztgame.com/",

     "remoteManifestUrl" :"http://test.ztgame.com/project.manifest",

     "remoteVersionUrl" :"http://test.ztgame.com/version.manifest",

     "minVersion":"1.0.0.0",

     "version" : "1.0.0.2",

     "groupVersions" : { "1": "1.0.0.2" },

     "assets" : {

            "p1.zip" : {"md5" : "13eda4aa119b71eaf4c3087a5df3954c","compressed" : true }

     },

     "searchPaths" :["res","src"]

}

json結構是固定的,packageUrl表示伺服器下載目錄的根目錄,remoteManifestUrl欄位表示project.manifest檔案的下載url,remoteVersionUrl欄位表示version.manifest的下載url,minVersion 表示支援更新的最低版本,低於該版本則提示重新下載安裝包。version欄位表示工程的當前版本(如果配置檔案是伺服器上的,表示伺服器的當前版本,如果是客戶端的,則表示客戶端的當前版本),groupVersions欄位用意不明。Assets欄位表示要更新的資源列表,p1.zip為補丁包名(包全路徑為

http://test.ztgame.com/p1.zip),md5欄位為該補丁包的唯一標識,compressed表示下載完後是否需解壓。searchPaths表示要新增的搜尋路徑(程式呼叫指令碼或資原始檔時,搜尋的起始路徑)。

Version.manifest檔案結構與上同,但是沒有assets欄位。

更新流程如下(注:自己對框架原始碼作了小改動,添加了一個最小更新版本):

1.構造AssetsManagerEx物件

1.1繫結下載成功、失敗、進度的回撥函式

1.2設定下載檔案的存放路徑

1.3載入本地project.manifest檔案,若失敗,則丟擲訊息ERROR_NO_LOCAL_MANIFEST,結束。

2.啟動更新

2.1下載version.manifest檔案,若成功goto 2.2,否則下載project.manifest,若成功goto2.2,否則丟擲ERROR_DOWNLOAD_MANIFEST,結束。

2.2載入下載的配置檔案並與本地project.manifest版本號進行對比,若版本相同,則丟擲訊息ALREADY_UP_TO_DATE,結束。若版本低於可更新版本號,則丟擲NONUPDATABLE_VERSION,提示下載完整安裝包,結束。否則goto 3.

3.下載補丁包

3.1清空下載記錄,下載失敗記錄,解壓記錄

3.2檢視是否有未完成的下載記錄,有則繼續逐個下載(通過檢視.temp檔案),否則goto 3.3

3.3獲取本地assets和伺服器asset差異列表,根據補丁包名:

   a.如果本地有,伺服器沒有,則刪除,

b.如果本地有,伺服器也有,但md5不同,剛更新,

c.如果伺服器有,本地沒有,則新增

3.4根據差異列表,將要刪除的資源刪除,要更新和新增的資源包新增到下載列表

3.5批量下載補丁包,全部下載完後,按解壓記錄列表次序依次解壓替換資源

3.6檢視下載記錄,下載失敗記錄,如果有失敗和未完成記錄則丟擲UPDATE_FAILED,結束。否則goto 3.7

3.7依次解壓列表中的檔案。刪除補丁包。結束。

流程圖如下所示: