一、資源加密
版本號:Quick-Cocos2d-x 3.3 Final
調試工具:xCode
工程創建的時候選擇的拷貝源碼。
項目結構如圖:
這個功能七月大神在很早之前就已經實現了,但是在3.3版本中有幾個小BUG,可能很多人不知道一直卡住了。我就在這兒從頭到尾的流程都講一次。
道理很簡單 主要就只用到quick-src/extra/approols/下面的HelperFunc這個類。
我只做了圖片的加密,plist未做。道理一樣。我就只說圖片的吧。
第一步
1. 由於cocos現在統一了資源讀取,所以,找到CCImage.ccp這個類,導入HelperFunc頭文件
1
|
#include "extra/apptools/HelperFunc.h" |
這個時候重要的來了,xcode報錯。提示HelperFunc.h找不到。我查了半天最後才發現問題所在,原來是searchpath的路徑官方填錯了。按照圖片步驟,添加quick-src的搜索路徑
$(SRCROOT)/../../runtime-src/Classes/quick-src
這個時候,錯誤應該就消失了。
2.找到 initWithImageFile 這個函數
修改
1
|
Data data = FileUtils::getInstance()->getDataFromFile(_filePath); |
爲:
1
|
Data data = HelperFunc::getData(_filePath); |
這一步就是讀取資源的時候通過七月大神封裝好的類來解密。
第二步
這個時候android是編譯不過去的。跟上面一樣提示 找不到HelperFunc。
可以通過改mk文件來處理。按照路徑:
你的項目/frameworks/cocos2d-x/cocos/Android.mk
打開mk,在如圖的位置添加quick-src的搜索路徑
$(LOCAL_PATH)/../../runtime-src/Classes/quick-src/
一定要注意格式哦。上面一行末尾如果沒有 需要添加一個“\”
第三步
接下來就是加密圖片了。
在引擎目錄下/quick/bin/下面 有個pack_files.sh 我們就是用到這個東西來加密了。這個跟lua加密差不多。我簡單說一下流程。
1.寫一個配置文件.php的。很簡單。
切記 記好你的key和簽名!!!後面還會用到。
我比較懶,沒有新寫一個demo。用的項目的,所以關鍵部位*****。不過不重要。忘諒解。
2.終端執行 pack_files.sh -c 你的php路徑.php 如果沒有報啥錯,這一步就算完成了。我的輸出路徑填的就是項目res下。如果不是,把加密好的圖片拷貝覆蓋進去就OK。
第四步
最後在AppDelegate.ccp 添加:
stack->setXXTEAKeyAndSign("你的key", strlen("你的key"), "你的簽名", strlen("你的簽名"));
到了這一步,基本大功告成了。跑起來試試吧。真機哦。如果想要在模擬器上也支持加密,需要打開player項目 重複第一步 第四部照做一次,再編譯一個player。
二、腳本加密
如果只是實現加密,這個更簡單了。
在引擎目錄下/quick/bin/下面 compile_scripts.sh 這個東西就是我們需要的。他接受好幾種加密方式,我一般只用到xxtea_zip 和 xxtea_chunk 這兩種。前一種是把lua腳本壓縮成一個zip,爲這個zip加密。後一種是爲每個腳本加密,然後再壓縮一次。都差不多。
終端進入 /quick/bin/這個目錄,執行 ./compile_scripts.sh -i 你的腳本的目錄(比如我的/Users/bkbl/Documents/game/src) -o 加密後文件的輸出目錄(比如我的/Users/bkbl/Documents/game/res/game.zip) -e (加密方式 xxtea_chunk 或者 xxtea_zip ) -es 簽名(比如 XXTEA) -ek 密鑰(也就是KEY 比如 adadada)
只要代碼沒錯誤,這兒也不會報錯。我的輸出路徑是我項目res下。如果不是 拷貝進去。
最後在AppDelegate.ccp 添加
stack->setXXTEAKeyAndSign("你的key", strlen("你的key"), "你的簽名", strlen("你的簽名"));
比如:
1
|
stack->setXXTEAKeyAndSign( "adadada" , strlen ( "adadada" ), "XXTEA" , strlen ( "XXTEA" )); |
讀取這個zip
1
|
stack->loadChunksFromZIP( "res/game.zip" ); |
修改下面
1
|
engine->executeScriptFile(ConfigParser::getInstance()->getEntryFile().c_str()); |
的函數爲
1
|
stack->executeString( "require 'main'" ); |
搞定!!!非常傻瓜式的。再次感謝Quick團隊!
如果你同時做了腳本和資源加密 一定要用一套key和簽名的。切記!!!
論壇原帖地址:
http://www.cocoachina.com/bbs/read.php?tid-282754-page-1.html