網上關於 LuaJIT 的討論,已經顯得有些陳舊。若是你對 LuaJIT 編譯 Lua 源文件爲具體的 32位或64位字節碼,極其具體使用感興趣的話,不妨快速讀一下這篇文章。此文章針對嘗試在 iOS 或 Android 上使用 LuaJIT 的小夥伴。限於篇幅,此處假定,你能夠成功在 iOS/Android App 中集成了 LuaJIT,而且已經能夠執行源碼形式的 Lua 文件。html
我忍不住在開頭插一句: LuaJIT 編譯後,只有約 600k,可能也就是一張圖片的空間,但卻可讓你的你App能夠擁有一門完整的腳本語言的能力 -- 真的很酷!爲許多問題,提供了許多新的思路,特別是 App 地動態性和可配置型方面。ios
爲了便於下文指令的說明,此處簡單約定下目錄結構。實際使用時,按需設置和整理便可。swift
Lua 的加密工具,本質上就是 Lua 的解釋器。此處使用的解釋器源碼是 LuaJIT。LuaJIT 執行效率最高,且編譯出來的字節碼沒法逆向爲 Lua 源碼,更能保證源碼安全性。LuaJIT 支持交叉編譯,便可以在電腦上編譯出 iOS 或 Android 手機上系統須要的字節碼。如此,咱們只須要編譯一次 32 和 64 位的 LuaJIT 解釋器各一個,備份存檔,後續可直接使用。xcode
編譯 LuaJIT 解釋器,直接用官方的推薦指令便可。比較特殊的一點時,若是是想編譯出 64 位 LuaJIT,須要加上參數 CFLAGS=-DLUAJIT_ENABLE_GC6
。緩存
# cd 到 LuaJIT 源碼目錄 cd tools/LuaJIT-2.1.0-beta3 # 編譯 32 位 LuaJIT 解釋器 make clean && make && cp src/luajit ../luajit-32 && make clean # 編譯 64 位 LuaJIT 解釋器 make clean && make CFLAGS=-DLUAJIT_ENABLE_GC64 && cp src/luajit ../luajit-64 && make clean
注意:從新解壓源碼後,可能須要從新啓動命令行/終端,來清除可能的系統緩存,才能正確 build 出想要的東西。安全
所謂的加密 Lua 源文件,其實就是把 Lua 源文件,編譯爲 LuaJIT 字節碼。相對於 Luac ,LuaJIT 字節碼執行效率更高,並且沒法被直接逆向爲對應的 Lua 源碼。工具
編譯字節碼,用的是 -b 命令,須要注意的是,必定要使用對應字節的 LuaJIT 解釋器來編譯,不然 iOS/Android App 中,可能沒法加載。ui
編譯後的字節碼文件的後綴,能夠根據本身須要自定義。此處我使用的是 「.yan」 和 「.yan64」。加密
# 編譯32位字節碼 ,適用於Android所有手機,部分 iOS 手機。 ./tools/luajit-32 -b ./source/main.lua ./output/main.yan # 編譯64位字節碼,僅用於部分 iOS 手機。 ./tools/luajit-64 -b ./source/main.lua ./output/main.yan64
注意: 敏感信息,不要直接以常量字符串的形式使用。lua
在 Android 手機上,通常只須要使用 32 位的 LuaJIT 字節碼文件便可。iOS 上,狀況比較複雜,從 iOS11 以後,iOS 要求相對的庫必須有64位版本。也就意味着,若是 App 想兼容 iPhone5s 之前的 32位CPU的設備的話,就必須在項目中同時放置32位和64位的LuaJIT靜態庫。關於適用於手機端的 LuaJIT 靜態庫的編譯問題,暫不進一步展開。此處只討論,如何在 iOS 中,動態根據須要準確加載對應的 32 或 64 位的 LuaJIT 字節碼文件。
基於上文的討論,此處給出一個簡單的策略:
分享一個 swift 版的實現:
private func luaFileSuffix() -> String{ #if (arch(i386) || arch(arm)) return ".yan" #else return ".yan64" #endif }