build-pad-apk.cjs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. const { copyFileSync, existsSync, mkdirSync, readFileSync } = require('node:fs')
  2. const { resolve } = require('node:path')
  3. const { spawnSync } = require('node:child_process')
  4. const repoRoot = resolve(__dirname, '..')
  5. const mobileRoot = resolve(repoRoot, 'mobile-app')
  6. const androidRoot = resolve(mobileRoot, 'android-capacitor')
  7. const isOEM = process.argv.includes('--oem')
  8. const variant = isOEM ? 'oem' : 'standard'
  9. const packageJson = JSON.parse(readFileSync(resolve(mobileRoot, 'package.json'), 'utf8'))
  10. const displayVersion = packageJson.version.replace(/^(\d+\.\d+\.\d+)-(\d+)$/, '$1.$2')
  11. const buildEnv = {
  12. ...process.env,
  13. VITE_OEM_VERSION: isOEM ? 'true' : 'false'
  14. }
  15. if (process.platform === 'win32') {
  16. const androidStudioJava = 'C:\\Program Files\\Android\\Android Studio\\jbr'
  17. const defaultAndroidSdk = process.env.LOCALAPPDATA
  18. ? resolve(process.env.LOCALAPPDATA, 'Android', 'Sdk')
  19. : ''
  20. // Capacitor 8 requires Java 17+. Prefer Android Studio's bundled JBR even
  21. // when the machine-wide JAVA_HOME still points to an older JDK.
  22. if (existsSync(androidStudioJava)) {
  23. buildEnv.JAVA_HOME = androidStudioJava
  24. }
  25. if (!buildEnv.ANDROID_HOME && defaultAndroidSdk && existsSync(defaultAndroidSdk)) {
  26. buildEnv.ANDROID_HOME = defaultAndroidSdk
  27. }
  28. }
  29. function run(command, args, cwd) {
  30. const result = spawnSync(command, args, {
  31. cwd,
  32. env: buildEnv,
  33. stdio: 'inherit'
  34. })
  35. if (result.error) {
  36. console.error(`[Pad Build] Failed to start ${command}: ${result.error.message}`)
  37. process.exit(1)
  38. }
  39. if (result.status !== 0) {
  40. process.exit(result.status ?? 1)
  41. }
  42. }
  43. console.log(`[Pad Build] Building ${variant} APK...`)
  44. run(
  45. process.execPath,
  46. [resolve(__dirname, 'build-pad-web.cjs'), ...(isOEM ? ['--oem'] : [])],
  47. mobileRoot
  48. )
  49. run(
  50. process.execPath,
  51. [resolve(mobileRoot, 'node_modules', '@capacitor', 'cli', 'bin', 'capacitor'), 'copy', 'android'],
  52. mobileRoot
  53. )
  54. if (process.platform === 'win32') {
  55. run(process.env.ComSpec || 'cmd.exe', ['/d', '/s', '/c', 'gradlew.bat assembleDebug'], androidRoot)
  56. } else {
  57. run('./gradlew', ['assembleDebug'], androidRoot)
  58. }
  59. const sourceApk = resolve(androidRoot, 'app', 'build', 'outputs', 'apk', 'debug', 'app-debug.apk')
  60. if (!existsSync(sourceApk)) {
  61. console.error(`[Pad Build] APK was not generated: ${sourceApk}`)
  62. process.exit(1)
  63. }
  64. const outputDir = resolve(mobileRoot, 'dist')
  65. const outputApk = resolve(
  66. outputDir,
  67. `Mini7-One-Pad-${displayVersion}-${variant}-debug.apk`
  68. )
  69. mkdirSync(outputDir, { recursive: true })
  70. copyFileSync(sourceApk, outputApk)
  71. console.log(`[Pad Build] APK ready: ${outputApk}`)