#!/usr/bin/env bash # GoldenChart Android APK — 로컬(CI) 빌드 → data/mobile-releases/ set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" APK_REMOTE_NAME="${APK_REMOTE_NAME:-goldenchart-android.apk}" LOCAL_APK="${LOCAL_APK:-$ROOT/data/mobile-releases/$APK_REMOTE_NAME}" log() { echo "[build-mobile-apk $(date '+%H:%M:%S')] $*"; } sign_release_apk() { local unsigned="$ROOT/app/android/app/build/outputs/apk/release/app-release-unsigned.apk" local signed="$ROOT/app/android/app/build/outputs/apk/release/app-release.apk" local keystore="$ROOT/app/android/goldenchart-release.keystore" if [[ ! -f "$unsigned" ]]; then echo "unsigned APK 없음: $unsigned" >&2 exit 1 fi if [[ ! -f "$keystore" ]]; then log "keystore 생성..." "${JAVA_HOME}/bin/keytool" -genkeypair -v -keystore "$keystore" -alias goldenchart \ -keyalg RSA -keysize 2048 -validity 10000 \ -storepass goldenchart -keypass goldenchart \ -dname "CN=GoldenChart, OU=Mobile, O=GoldenChart, L=Seoul, ST=Seoul, C=KR" fi local apksigner apksigner="${ANDROID_HOME:-$HOME/Library/Android/sdk}/build-tools/35.0.0/apksigner" if [[ ! -x "$apksigner" ]]; then apksigner=$(ls -d "${ANDROID_HOME:-$HOME/Library/Android/sdk}"/build-tools/*/apksigner 2>/dev/null | sort -V | tail -1 || true) fi if [[ -z "$apksigner" || ! -x "$apksigner" ]]; then echo "apksigner 없음. Android SDK build-tools 설치 필요." >&2 exit 1 fi cp "$unsigned" "$signed" "$apksigner" sign --ks "$keystore" --ks-key-alias goldenchart \ --ks-pass pass:goldenchart --key-pass pass:goldenchart "$signed" mkdir -p "$(dirname "$LOCAL_APK")" cp "$signed" "$LOCAL_APK" VERSION_NAME="$(grep -E 'versionName[[:space:]]+"' "$ROOT/app/android/app/build.gradle" | head -1 | sed -E 's/.*versionName[[:space:]]+"([^"]+)".*/\1/' || true)" if [[ -n "$VERSION_NAME" ]]; then printf '%s\n' "$VERSION_NAME" > "${LOCAL_APK%.apk}.version" log "버전 sidecar: ${LOCAL_APK%.apk}.version → $VERSION_NAME" fi log "서명 완료: $LOCAL_APK" } if [[ -z "${JAVA_HOME:-}" ]] && [[ -x "$HOME/.local/jdk-21.0.11+10/Contents/Home/bin/java" ]]; then export JAVA_HOME="$HOME/.local/jdk-21.0.11+10/Contents/Home" fi if [[ -z "${JAVA_HOME:-}" ]] && [[ -x "/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home/bin/java" ]]; then export JAVA_HOME="/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home" fi if [[ -z "${JAVA_HOME:-}" ]] && command -v /usr/libexec/java_home >/dev/null 2>&1; then JAVA_HOME="$(/usr/libexec/java_home 2>/dev/null || true)" [[ -n "$JAVA_HOME" ]] && export JAVA_HOME fi if [[ -z "${JAVA_HOME:-}" ]]; then echo "JAVA_HOME 미설정" >&2 exit 1 fi log "google-services.json 확인" "$ROOT/scripts/ensure-android-google-services.sh" if [[ ! -d "$ROOT/node_modules/vite" ]] || [[ ! -d "$ROOT/app/node_modules/@capacitor/core" ]]; then log "npm ci (root dependencies)" (cd "$ROOT" && npm ci) fi log "cap:sync" (cd "$ROOT/app" && npm run build && bash ../scripts/ensure-android-google-services.sh && npx cap sync) log "assembleRelease" (cd "$ROOT/app/android" && ./gradlew assembleRelease --no-daemon) sign_release_apk log "완료 $(du -h "$LOCAL_APK" | cut -f1)"