#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" APP_DIR="$REPO_ROOT/apps/chanora_flutter" PUBSPEC="$APP_DIR/pubspec.yaml" OBOE_DIR="$(cd "$REPO_ROOT/.." && pwd)/oboe-rs" DIST_DIR="$REPO_ROOT/dist/android" TMP_DIR="" cleanup() { if [[ -n "$TMP_DIR" && -d "$TMP_DIR" ]]; then rm -rf "$TMP_DIR" fi } trap cleanup EXIT require_cmd() { local cmd=$1 if ! command -v "$cmd" >/dev/null 2>&1; then echo "ERROR: required command '$cmd' is not on PATH." >&2 exit 1 fi } require_file() { local path=$1 local label=$2 if [[ ! -f "$path" ]]; then echo "ERROR: missing $label at $path" >&2 exit 1 fi } ensure_release_signing() { if [[ -n "${CHANORA_RELEASE_STORE_FILE:-}" ]]; then local missing=() [[ -n "${CHANORA_RELEASE_STORE_PASSWORD:-}" ]] || missing+=("CHANORA_RELEASE_STORE_PASSWORD") [[ -n "${CHANORA_RELEASE_KEY_ALIAS:-}" ]] || missing+=("CHANORA_RELEASE_KEY_ALIAS") [[ -n "${CHANORA_RELEASE_KEY_PASSWORD:-}" ]] || missing+=("CHANORA_RELEASE_KEY_PASSWORD") if (( ${#missing[@]} > 0 )); then printf 'ERROR: release signing is partially configured; missing %s\n' "${missing[*]}" >&2 exit 1 fi require_file "$CHANORA_RELEASE_STORE_FILE" "release keystore" return fi require_cmd keytool TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/chanora-android-aab.XXXXXX")" export CHANORA_RELEASE_STORE_FILE="$TMP_DIR/chanora-release.keystore" export CHANORA_RELEASE_STORE_PASSWORD="${CHANORA_RELEASE_STORE_PASSWORD:-chanora-ci}" export CHANORA_RELEASE_KEY_ALIAS="${CHANORA_RELEASE_KEY_ALIAS:-chanora-ci}" export CHANORA_RELEASE_KEY_PASSWORD="${CHANORA_RELEASE_KEY_PASSWORD:-$CHANORA_RELEASE_STORE_PASSWORD}" keytool -genkeypair \ -storetype PKCS12 \ -keystore "$CHANORA_RELEASE_STORE_FILE" \ -storepass "$CHANORA_RELEASE_STORE_PASSWORD" \ -keypass "$CHANORA_RELEASE_KEY_PASSWORD" \ -alias "$CHANORA_RELEASE_KEY_ALIAS" \ -keyalg RSA \ -keysize 2048 \ -validity 3650 \ -dname "CN=Chanora CI,O=Chanora,OU=Engineering,L=Seoul,S=Seoul,C=KR" \ -noprompt >/dev/null 2>&1 printf 'Generated ephemeral Android release keystore: %s\n' "$CHANORA_RELEASE_STORE_FILE" } main() { require_cmd flutter require_file "$PUBSPEC" "Flutter pubspec" if [[ ! -f "$OBOE_DIR/Cargo.toml" ]]; then cat >&2 <&2 exit 1 fi ( cd "$APP_DIR" flutter pub get flutter build appbundle --release ) local source_aab="$APP_DIR/build/app/outputs/bundle/release/app-release.aab" require_file "$source_aab" "Android release app bundle" mkdir -p "$DIST_DIR" local output="$DIST_DIR/chanora-${app_version}-release.aab" cp "$source_aab" "$output" printf 'Built Android release bundle: %s\n' "$output" } main "$@"