quick-cocos2d-x基於源碼加密打包功能的更新策略(1)

Quick-cocos2d-x增長了編譯及加密源代碼的功能(具體可參考這篇文章)。以此功能爲基礎,我實現了一個版本更新模塊,解決了本身項目中的版本更新需求。現拋磚引玉,與你們分享。
git

從基本原理和方案講起比較枯燥,直接從介紹具體用法開始吧。 web

要可以在線更新文件,一個服務器是必須的。我目前實現的是用HTTP協議取文件,只須要有一個基本的web服務器,能經過相似http://<server>/<filename>的連接取到文件便可。固然,若是須要根據平臺和版本進行文件的分發,服務器端還須要進行相應配置。 小程序

要調試下面的例子,本身在內網甚至就在本機上搭建一個最簡單的web服務器就能夠了。 服務器

1、基本更新功能

1.建立一個能夠自動更新的程序

首先準備好咱們的quick-x工程。做爲例子,咱們直接使用create_project來建立一個新工程helloworld來使用。這一步不用我多說。

接下來,請到這裏下載我寫的更新模塊。只須要根目錄下的update.lua文件便可,其餘的目錄下只是個人一些例子和工具。 app

(2014.5.30加註:quick-x的2.2.3版本里的sample/2048使用了這一更新模塊,可使用例子中的update.lua文件)

將update.lua文件加到helloworld工程的scripts目錄下。修改文件中「local server = "http://192.168.1.98:8088/"」這一句,改爲本身的服務器地址。
在scripts目錄下建立一個新文件appentry.lua,而後打開工程原來的main.lua文件,把裏面調用程序入口的代碼複製過來。若是你使用的是最新版的quick-x,那麼就只有「require("app.MyApp").new():run()」這一句。保存appentry.lua文件。
如今修改main.lua文件,去掉原來的程序入口代碼,改爲「require "update"」。
這樣,更新模塊就添加好了。程序在啓動時,將先運行更新模塊,完成後,自動調用appentry進入原來程序的真正入口。
如今能夠先運行看看了,相信你們都會選擇最方便的player來調試的。實際上真機也是沒問題的。
運行後,界面上首先會顯示「Loading...」,而後再進入熟悉的「Hello,world」界面。

接下來咱們調試與服務器的鏈接是否正常。在服務器上建立一個flist文件,內容爲:
工具

local list = { 
  ver = "1.0.1", 
  stage = { 
  }, 
  remove = { 
  }, 
} 
return list

須要保證用http://<server>/flist這樣的網址能取到flist。若是是最基本的web服務器,把flist文件放在web服務目錄的根下面就能夠。若是但願用http://<server>/getfile?filename=flist這樣的形式取文件,請本身修改update.lua裏的相關代碼。 ui

如今從新運行程序,運行結果看起來沒有什麼不一樣。不過,若是是在player上調試,應該能在helloworld工程目錄下找到flist文件,和服務器上的文件內容是同樣的,說明咱們從服務器取到了文件,鏈接是正常的。若是是真機,請在device.writablePath指向的目錄下找flist文件。

如今,咱們已經有一個能夠自動更新版本的程序了。爲了模擬真實的應用環境,咱們將把源碼加密打包再進行後面的調試。若是還不知道應該怎麼打包,請再認真參考前面的文章。另外,推薦使用QuickXDev插件進行打包(可參考這一篇)。
爲了後面更好的演示圖片資源的更新,打包前能夠修改一下MainScene.lua,在界面上添加一張圖片,以下:
加密

display.addSpriteFramesWithFile(GAME_TEXTURE_DATA_FILENAME, GAME_TEXTURE_IMAGE_FILENAME) 
self.bg = display.newSprite("#logo.png", display.cx-200, display.cy-200) 
self:addChild(self.bg)

將資源放到res目錄下,在config.lua裏配置好GAME_TEXTURE_DATA_FILENAME和GAME_TEXTURE_IMAGE_FILENAME的值。運行能正常顯示圖片後,就能夠真正打包源碼了。 lua

假如你是徹底按照參考文章去打包的,那你應該會將打包後的文件game.zip放在res目錄下,並將scripts目錄下全部原來的源碼所有移走,啓動程序,運行結果和沒打包以前一致。

2.簡單的功能更新

如今,咱們但願將顯示的文字改爲中文。代碼的修改是很簡單的,將MainScene.lua中顯示的字串「Hello, World」改爲「你好,世界」就能夠了。
但咱們怎麼讓程序自動進行更新呢?固然是打包新代碼而後放到服務器上讓程序來取了。

由於咱們只修改了MainScene.lua,因此咱們只須要打包這個文件就能夠了。打包時須要注意的是,MainScene.lua是放在app\scenes目錄下的,因此它在打包目錄下也應該放在相同的兩級目錄之下才行。
咱們將新打包的文件隨便改個文件名(其實在這一情境中,仍然叫game.zip也是沒問題的),好比update.bin。將它放到服務器上,固然仍然要保證http://<server>/update.bin這樣的網址能取到。

接下來咱們修改服務器上的flist文件,以下:
spa

local list = { 
  ver = "1.0.2", 
  stage = { 
    {name="update.bin", code="8c528975dec8b6da5811e92f10a41be0", act="load"}, 
  }, 
  remove = { 
  }, 
} 
return list

能夠看出,list文件的版本號變成了1.0.2,這樣客戶端程序就知道有了更新,準備取新的文件。

stage裏指出這個版本里有多少須要下載到客戶端的文件。
name是文件名。code是文件的MD5碼,用於驗證文件。若是不想驗證文件,code能夠等於nil或者乾脆不寫這一鍵值。但不進行文件驗證顯然是不利的,除了不能保證下載文件的正確性而引發程序崩潰,還有就是不能進行同名文件的更新,若是原來已經下載過update.bin,不進行驗證的話默認原來的文件是正確的,客戶端程序將不會從新下載update.bin。
文件的md5碼取得是很容易的,有不少方法。我實現更新模塊時順便寫了個取md5的小程序,放在更新模塊工程的tools目錄下,使用方法很簡單,將要取md5的文件放在getMd5/files目錄下,用player打開getMd5工程運行,工程目錄下生成的flist.txt裏就是須要的內容了。
act="load"代表這一文件是代碼文件,須要載入運行,若是是普通的圖片資源,能夠等於nil或者直接不寫這一鍵值。

如今,能夠運行客戶端程序了。「Loading...」界面事後,顯示的是「你好,世界」,自動更新成功了!

接下來咱們將討論一下更新的基本原理,以確認咱們的更新方式是真正可行的,同時進一步演示如何進行更深層次的功能更新(如資源路徑變化的處理framework包修改update模塊自身更新等)。固然,更新機制的健壯性(不能由於更新失敗,或者更新文件被破壞形成程序沒法工做),還有如何根據平臺和機型進行版本文件的分發等,也是咱們要討論的。

後一篇: quick-cocos2d-x基於源碼加密打包功能的更新策略(2)

相關文章
相關標籤/搜索