從手寫 .bat 遷移到 Lua 腳本構建 APK,獲得**跨平台、可擴展、結構化**的構建流水線。本文提供適用於 **Cocos2d-x + Lua** 項目的完整構建腳本,涵蓋 SVN 更新、LuaJIT 編譯、ASMaker 加密、NDK 編譯、Ant 打包全流程。
-- 路徑配置區 (需按實際環境修改)
local JAVA_HOME = 'C:/Program Files/Java/jdk1.8.0_05'
local ANT_HOME = 'D:/ProgramSoftware/apache-ant-1.9.4'
local ANDROID_HOME = 'D:/ProgramSoftware/android-sdk'
local NDK_HOME = 'D:/ProgramSoftware/android-ndk-r9d'
local SVN_HOME = 'C:/Program Files/TortoiseSVN/bin'
local ENGINE_DIR = 'D:/engine'
local WORK_DIR = 'D:/engine/projects/XXXX/proj.android'
local RESOURCES_DIR = WORK_DIR .. '/../Resources'
local ASSETS_DIR = WORK_DIR .. '/assets'
dir_exist()、check_mk_path()。assets/、舊 .apk。Resources/,.lua → luajit -b 字節碼,其他文件複製到 Resources_jit/。ASmaker.exe -i Resources_jit -o assets -f .lua -e .exe 加密 Lua 字節碼。ndk-build -C proj.android NDK_MODULE_PATH=... 編譯 C++ 原生庫。android update project、update lib-project。ant release 生成簽名 APK。
-- 遍歷 Resources 目錄進行 LuaJIT
local cmd = string.format('pushd %q & dir /b /s & popd', RESOURCES_DIR)
local file_list = io.popen(cmd)
for line in file_list:lines() do
local line_to = string.gsub(line, 'Resources', 'Resources_jit')
if dir_exist(line) then
check_mk_path(line_to)
else
if string.find(line, '%.lua$') then
jit_file(WORK_DIR, line, line_to) -- luajit -b
else
copy_file(line, line_to) -- 直接複製
end
end
end
file_list:close()
-- ASMaker 加密
local enc_cmd = WORK_DIR .. 'ASmaker.exe -i ' .. WORK_DIR .. '..Resources_jit -o ' .. ASSETS_DIR .. ' -f .lua -e .exe'
local enc_re = run_one_cmd(enc_cmd)
if enc_re:find("失敗") then os.exit(1) end
-- NDK Build
local ndk_cmd = 'call ' .. NDK_HOME .. 'ndk-build -C ' .. WORK_DIR .. ' NDK_MODULE_PATH=' .. ENGINE_DIR .. ';' .. ENGINE_DIR .. 'cocos2dx/platform/third_party/android/prebuilt'
if run_one_cmd(ndk_cmd):find("error") then os.exit(1) end
-- Ant Release
local ant_cmd = 'pushd ' .. WORK_DIR .. ' & call ' .. ANT_HOME .. 'bin/ant release'
if run_one_cmd(ant_cmd):find("failed") then os.exit(1) end
jit_file(work_dir, src, dst):調用 luajit -b src dst。copy_file(src, dst):二進制複製。run_one_cmd(cmd):io.popen(cmd):read('*a') 執行命令捕獲輸出。rmdir(path)、delfile(path):遞歸刪除目錄/文件。/,Windows/Linux/macOS 少量調整即可運行。用 Lua 重寫構建腳本是**工程化思維**的體現:將脆弱、難維護的 bat 替換為結構化、可測試、可擴展的真正程序。Cocos2d-x + Lua 項目天然適合 Lua 構建腳本,**開發語言即構建語言**,降低認知負荷,提升構建可靠性。