const { copyFileSync, existsSync, mkdirSync, readFileSync } = require('node:fs') const { resolve } = require('node:path') const { spawnSync } = require('node:child_process') const repoRoot = resolve(__dirname, '..') const mobileRoot = resolve(repoRoot, 'mobile-app') const androidRoot = resolve(mobileRoot, 'android-capacitor') const isOEM = process.argv.includes('--oem') const variant = isOEM ? 'oem' : 'standard' const packageJson = JSON.parse(readFileSync(resolve(mobileRoot, 'package.json'), 'utf8')) const displayVersion = packageJson.version.replace(/^(\d+\.\d+\.\d+)-(\d+)$/, '$1.$2') const buildEnv = { ...process.env, VITE_OEM_VERSION: isOEM ? 'true' : 'false' } if (process.platform === 'win32') { const androidStudioJava = 'C:\\Program Files\\Android\\Android Studio\\jbr' const defaultAndroidSdk = process.env.LOCALAPPDATA ? resolve(process.env.LOCALAPPDATA, 'Android', 'Sdk') : '' // Capacitor 8 requires Java 17+. Prefer Android Studio's bundled JBR even // when the machine-wide JAVA_HOME still points to an older JDK. if (existsSync(androidStudioJava)) { buildEnv.JAVA_HOME = androidStudioJava } if (!buildEnv.ANDROID_HOME && defaultAndroidSdk && existsSync(defaultAndroidSdk)) { buildEnv.ANDROID_HOME = defaultAndroidSdk } } function run(command, args, cwd) { const result = spawnSync(command, args, { cwd, env: buildEnv, stdio: 'inherit' }) if (result.error) { console.error(`[Pad Build] Failed to start ${command}: ${result.error.message}`) process.exit(1) } if (result.status !== 0) { process.exit(result.status ?? 1) } } console.log(`[Pad Build] Building ${variant} APK...`) run( process.execPath, [resolve(__dirname, 'build-pad-web.cjs'), ...(isOEM ? ['--oem'] : [])], mobileRoot ) run( process.execPath, [resolve(mobileRoot, 'node_modules', '@capacitor', 'cli', 'bin', 'capacitor'), 'copy', 'android'], mobileRoot ) if (process.platform === 'win32') { run(process.env.ComSpec || 'cmd.exe', ['/d', '/s', '/c', 'gradlew.bat assembleDebug'], androidRoot) } else { run('./gradlew', ['assembleDebug'], androidRoot) } const sourceApk = resolve(androidRoot, 'app', 'build', 'outputs', 'apk', 'debug', 'app-debug.apk') if (!existsSync(sourceApk)) { console.error(`[Pad Build] APK was not generated: ${sourceApk}`) process.exit(1) } const outputDir = resolve(mobileRoot, 'dist') const outputApk = resolve( outputDir, `Mini7-One-Pad-${displayVersion}-${variant}-debug.apk` ) mkdirSync(outputDir, { recursive: true }) copyFileSync(sourceApk, outputApk) console.log(`[Pad Build] APK ready: ${outputApk}`)