cocos2d使用的是luajit,lua原生編譯出來的bytecode和luajit是不兼容的,因此直接用luac法編譯出來的bytecode腳本沒法在cocos2d中使用。html
目前所指的解決方案有2個:算法
A.luajit加密:json
一、官網下載luajit(http://luajit.org/luajit.html),解壓,目錄以下app
二、在命令行中使用cd 進入luajit下src的目錄,而後執行輸入msvcbuild.bat,執行此批處理文件,編譯出luajit.exe工具
三、接下來就可使用luajit.exe編譯lua腳本的bytecode了:luajit -b [腳本名] [編譯後的腳本名],執行完後會在src目錄下生成一個已經編譯成bytecode的lua文件ui
此時即便把此路徑加入環境變量是沒用的,進行luajit加密命令的時候必須使用cd進入此目錄(C:\Users\hengjingjing\Desktop\LuaJIT-2.0.4\src),由於luajit加密,必須是luajit.exe和src下的jit文件夾配合使用才管用!this
若是unity項目用的是基於ulua擴展的其餘lua版本(cstolua、slua),或者自己用的就是ulua,那麼要用luajit加密方式,由於ulua底層就是用的luajit.能夠看出:Luajit跨平臺,知足於32位和64位(64位並非全部平臺),而且加密後的bytecode比luac生成的bytecode至少小40%,速度也是它的10倍多,總之luajit就是比lua原生的好.加密
此處提供了一個批處理工具實現快速的編譯,來源於 https://blog.csdn.net/st_darkmoon/article/details/53168652 實現可以靈活指定輸出目錄,而且輸出後按照源目錄結構保存。這樣除了拖動指定兩次目錄基本無需任何操做了。
@echo off if exist out rd /s /q out mkdir out setlocal enabledelayedexpansion cls :input set input=: set /p input= 拖入要編譯的lua文件夾: if "%input%"==":" goto input if not exist "%input%" goto input set "input=%input:"=%" :output set output=: set /p output= 拖入要編譯後輸出的目標文件夾: if "%output%"==":" goto output if not exist "%output%" goto output for %%i in ("%input%") do if /i "%%~di"==%%i goto input pushd %cd% cd /d "%input%">nul 2>nul || echo cmd was runing error set cur_dir=%cd% popd set /a num = 0 echo 正在目標文件夾中建立對應目錄結構: for /r %input% %%a in (*) do xcopy %%a %output% /t /s echo 建立完成,開始編譯lua代碼: for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do (set /a num += 1 set pt=%%~fi & set "pt=!pt:%input%=%output%!" luajit -b %%~fi !pt! echo 編譯後: !pt!) echo 編譯腳本數量:%num% ATTRIB %output%/*.* +R echo 編譯完成,開始刪除空白文件夾: for /f "delims=" %%i in ('dir /b /ad /s "%output%"') do (echo 刪除空白目錄信息: %%i & rd %%i /q) pause
B.XXTEA代碼加密:lua
這種只是代碼加密,因爲luajit編譯的字節碼僅支持32位,因此此方案在IOS上是個不錯的選擇。cocos已經自帶此加密功能了。spa
命令格式:
usage: cocos luacompile [-h] [-v] [-s SRC_DIR_ARR] [-d DST_DIR] [-e] [-k ENCRYPTKEY] [-b ENCRYPTSIGN] [--disable-compile] 對 lua 文件進行加密和編譯爲字節碼的處理。 optional arguments: -h, --help show this help message and exit -v, --verbose 更多輸出信息。 -s SRC_DIR_ARR, --src SRC_DIR_ARR 指定須要編譯的 lua 文件路徑,支持指定多個路徑。 -d DST_DIR, --dst DST_DIR 指定輸出文件的路徑。 -e, --encrypt 開啓 XXTEA 加密功能。 -k ENCRYPTKEY, --encryptkey ENCRYPTKEY 指定 XXTEA 加密功能的 key 字段。 -b ENCRYPTSIGN, --encryptsign ENCRYPTSIGN 指定 XXTEA 加密功能的 sign 字段。 --disable-compile 關閉編譯爲字節碼的功能。
咱們主要用到-s,-d,-e,-k,-b以及--disable-compile這幾個參數:
-s就是你須要加密的lua腳本所在的目錄。
-d就是逆須要將加密後的lua腳本放置的目錄。
-e是開啓XXTEA加密功能,若是不用這個參數,後面的也就不用了,這樣子作是編譯爲字節碼。
-k是在-e開啓的狀況下使用,XXTEA加密算法的key字段,這個本身定,不要太長,但越複雜越好。
-b是在-e開啓的狀況下使用,XXTEA加密算法的sign字段,這個本身定,不要太長,但越複雜越好。
--disable-compile是關閉字節碼編譯。爲何要加這個?由於現有的cocos引擎使用的是luajit來編譯字節碼,它僅支持32位,不支持64位的機子(截止至2017.01數據),而蘋果官方要求上傳的app必須兼容arm64的機子,所以只能選擇XXTEA加密,這種加密方式也是很不錯的,算法小巧,在沒有key和sign的狀況下不易被破解,兼容32和64位,是目前用cocos開發惟一可取的加密方式。
這個命令舉個例子:
cocos luacompile -s /Users/xxx/src -d /Users/xxx/src0 -e -k testkey -b testSignment --disable-compile
這條demo就是對src的全部lua腳本作key=testtt,sign=signnn的XXTEA加密,並關閉字節碼編譯。請注意,若是項目中除了lua腳本外,還有其餘一些文件,好比plist,json,xml這些,是不會被編譯的,實際跑的時候記得拷貝過去,保持源文件和目標文件具備一致性,不然會有問題的。