diff options
| author | ruki <[email protected]> | 2025-12-16 23:37:27 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-12-16 23:37:27 +0800 |
| commit | 5537af295c452f1bbc1875c27b285a35a167f44e (patch) | |
| tree | 86e9148f37081cd27d463c0b854e23856c1ca596 | |
| parent | fb8a3f6b216638783cd25600a02f7527dabd91cf (diff) | |
add incbuild support
| -rw-r--r-- | xmake/rules/ndk/package.lua | 93 |
1 files changed, 53 insertions, 40 deletions
diff --git a/xmake/rules/ndk/package.lua b/xmake/rules/ndk/package.lua index 797efa22e..076c78217 100644 --- a/xmake/rules/ndk/package.lua +++ b/xmake/rules/ndk/package.lua @@ -19,6 +19,7 @@ -- -- imports +import("core.project.depend") import("utils.progress") -- main entry @@ -36,56 +37,68 @@ function main(target, opt) assert(android_manifest, "android manifest not set") local final_apk = path.join(target:targetdir(), target:basename() .. ".apk") - progress.show(opt.progress, "${color.build.target}packing.apk %s", final_apk) - local tmp_path = path.join(target:targetdir(), "temp") - os.mkdir(tmp_path) - os.mkdir(path.join(tmp_path, "lib")) - os.mkdir(path.join(tmp_path, "lib", target:arch())) + -- add dependencies + local depfiles = {target:targetfile(), android_manifest, keystore} + if android_res and os.isdir(android_res) then + table.join2(depfiles, os.files(path.join(android_res, "**"))) + end + if android_assets and os.isdir(android_assets) then + table.join2(depfiles, os.files(path.join(android_assets, "**"))) + end - -- copy the target library to temp folder with name libmain.so - local libfile = path.join(tmp_path, "lib", target:arch(), "libmain.so") - os.cp(target:targetfile(), libfile) + depend.on_changed(function () + progress.show(opt.progress, "${color.build.target}packing.apk %s", final_apk) - -- get android tool path - local android_sdkdir = target:toolchain("ndk"):config("android_sdk") - local android_build_toolver = target:toolchain("ndk"):config("build_toolver") - local sdk_tool_path = path.join(android_sdkdir, "build-tools", android_build_toolver) + local tmp_path = path.join(target:targetdir(), "temp") + os.mkdir(tmp_path) + os.mkdir(path.join(tmp_path, "lib")) + os.mkdir(path.join(tmp_path, "lib", target:arch())) - local aapt = path.join(sdk_tool_path, "aapt" .. (is_host("windows") and ".exe" or "")) - local zipalign = path.join(sdk_tool_path, "zipalign" .. (is_host("windows") and ".exe" or "")) - local apksigner = path.join(sdk_tool_path, "apksigner" .. (is_host("windows") and ".bat" or "")) + -- copy the target library to temp folder with name libmain.so + local libfile = path.join(tmp_path, "lib", target:arch(), "libmain.so") + os.cp(target:targetfile(), libfile) - -- pack resources - local resonly_apk = path.join(tmp_path, "res_only.apk") - local androidjar = path.join(android_sdkdir, "platforms", string.format("android-%s", android_sdk_version), - "android.jar") - assert(os.exists(androidjar), "%s not found", androidjar) - local aapt_argv = {"package", "-f", "-M", android_manifest, "-I", androidjar, "-F", resonly_apk} + -- get android tool path + local android_sdkdir = target:toolchain("ndk"):config("android_sdk") + local android_build_toolver = target:toolchain("ndk"):config("build_toolver") + local sdk_tool_path = path.join(android_sdkdir, "build-tools", android_build_toolver) - if android_res and not os.emptydir(android_res) then - table.insert(aapt_argv, "-S") - table.insert(aapt_argv, android_res) - end + local aapt = path.join(sdk_tool_path, "aapt" .. (is_host("windows") and ".exe" or "")) + local zipalign = path.join(sdk_tool_path, "zipalign" .. (is_host("windows") and ".exe" or "")) + local apksigner = path.join(sdk_tool_path, "apksigner" .. (is_host("windows") and ".bat" or "")) - if android_assets and not os.emptydir(android_assets) then - table.insert(aapt_argv, "-A") - table.insert(aapt_argv, android_assets) - end + -- pack resources + local resonly_apk = path.join(tmp_path, "res_only.apk") + local androidjar = path.join(android_sdkdir, "platforms", string.format("android-%s", android_sdk_version), + "android.jar") + assert(os.exists(androidjar), "%s not found", androidjar) + local aapt_argv = {"package", "-f", "-M", android_manifest, "-I", androidjar, "-F", resonly_apk} + + if android_res and not os.emptydir(android_res) then + table.insert(aapt_argv, "-S") + table.insert(aapt_argv, android_res) + end + + if android_assets and not os.emptydir(android_assets) then + table.insert(aapt_argv, "-A") + table.insert(aapt_argv, android_assets) + end - os.vrunv(aapt, aapt_argv) + os.vrunv(aapt, aapt_argv) - -- pack libs - os.vrunv(aapt, {"add", "res_only.apk", "lib/" .. target:arch() .."/libmain.so"}, {curdir = tmp_path}) + -- pack libs + os.vrunv(aapt, {"add", "res_only.apk", "lib/" .. target:arch() .."/libmain.so"}, {curdir = tmp_path}) - -- align apk - local aligned_apk = path.join(tmp_path, "unsigned.apk") - local zipalign_argv = {"-f", "4", "res_only.apk", "unsigned.apk"} + -- align apk + local aligned_apk = path.join(tmp_path, "unsigned.apk") + local zipalign_argv = {"-f", "4", "res_only.apk", "unsigned.apk"} - os.vrunv(zipalign, zipalign_argv, {curdir = tmp_path}) + os.vrunv(zipalign, zipalign_argv, {curdir = tmp_path}) - -- sign apk - local apksigner_argv = {"sign", "--ks", keystore, "--ks-pass", string.format("pass:%s", keystore_pass), "--out", - final_apk, "--in", aligned_apk} - os.vrunv(apksigner, apksigner_argv) + -- sign apk + local apksigner_argv = {"sign", "--ks", keystore, "--ks-pass", string.format("pass:%s", keystore_pass), "--out", + final_apk, "--in", aligned_apk} + os.vrunv(apksigner, apksigner_argv) + end, {dependfile = target:dependfile(final_apk), files = depfiles, values = {android_sdk_version, keystore_pass}}) end |
