#!/usr/bin/env node import { spawn } from "node:child_process"; import path from "node:path"; import { fileURLToPath } from "node:url"; const scriptDir = path.dirname(fileURLToPath(import.meta.url)); const repoRoot = path.resolve(scriptDir, ".."); const androidDir = path.join(repoRoot, "apps", "android"); const isMain = process.argv[1] ? path.resolve(process.argv[1]) === fileURLToPath(import.meta.url) : false; export function splitAndroidGradleArgs(argv) { const separator = argv.indexOf("--"); if (separator === -1) { return { gradleArgs: argv, postArgs: [] }; } return { gradleArgs: argv.slice(0, separator), postArgs: argv.slice(separator + 1), }; } export function shouldSkipLinuxArmAndroidGradle(options = {}) { const platform = options.platform ?? process.platform; const arch = options.arch ?? process.arch; const env = options.env ?? process.env; if (env.OPENCLAW_ANDROID_GRADLE_ALLOW_LINUX_ARM === "1") { return false; } return platform === "linux" && (arch === "arm64" || arch === "arm"); } export function linuxArmAndroidGradleSkipMessage(platform = process.platform, arch = process.arch) { return ( `[android-gradle] skipped on ${platform}/${arch}: ` + "Android Gradle resource tasks require the Linux x86_64 AAPT2 artifact. " + "Run this task on x64 Linux/macOS or set OPENCLAW_ANDROID_GRADLE_ALLOW_LINUX_ARM=1 to try anyway." ); } export function run(command, args, cwd) { return new Promise((resolve) => { const child = spawn(command, args, { cwd, env: process.env, stdio: "inherit", }); child.on("close", (status, signal) => { if (typeof status === "number") { resolve(status); } else if (signal) { resolve(128); } else { resolve(1); } }); child.on("error", (error) => { console.error(error instanceof Error ? error.message : String(error)); resolve(1); }); }); } export async function main(argv = process.argv.slice(2)) { const { gradleArgs, postArgs } = splitAndroidGradleArgs(argv); if (gradleArgs.length === 0) { console.error( "Usage: node scripts/run-android-gradle.mjs [-- ]", ); return 1; } if (shouldSkipLinuxArmAndroidGradle()) { // Google's Linux AAPT2 artifact is x86_64-only, so resource tasks fail on // Linux arm64 before app code or tests run. CI Android lanes use x64 runners. console.log(linuxArmAndroidGradleSkipMessage()); return 0; } const gradleStatus = await run("./gradlew", gradleArgs, androidDir); if (gradleStatus !== 0 || postArgs.length === 0) { return gradleStatus; } return await run(postArgs[0], postArgs.slice(1), repoRoot); } if (isMain) { process.exit(await main()); }