#!/usr/bin/env bash # Builds a release-signed Android App Bundle (.aab) for the Google Play Console. # Requires env: YRXTALS_KEYSTORE, YRXTALS_STORE_PASSWORD, YRXTALS_KEY_PASSWORD # Optional: YRXTALS_KEY_ALIAS (defaults to "yrxtals") set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/_env.sh" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" if [[ -z "${YRXTALS_KEYSTORE:-}" ]]; then cat <&2 YRXTALS_KEYSTORE not set. create a release keystore once with: keytool -genkey -v -keystore ~/.android/yrxtals-release.jks \\ -keyalg RSA -keysize 4096 -validity 25000 -alias yrxtals then export: export YRXTALS_KEYSTORE=\$HOME/.android/yrxtals-release.jks export YRXTALS_KEY_ALIAS=yrxtals export YRXTALS_STORE_PASSWORD= export YRXTALS_KEY_PASSWORD= EOF exit 2 fi if [[ -z "${YRXTALS_STORE_PASSWORD:-}" || -z "${YRXTALS_KEY_PASSWORD:-}" ]]; then echo "YRXTALS_STORE_PASSWORD and YRXTALS_KEY_PASSWORD must be set" >&2 exit 2 fi if [[ ! -f "$YRXTALS_KEYSTORE" ]]; then echo "keystore not found at $YRXTALS_KEYSTORE" >&2 exit 2 fi export YRXTALS_KEY_ALIAS="${YRXTALS_KEY_ALIAS:-yrxtals}" bash "$SCRIPT_DIR/generate-icons.sh" GRADLE_KTS="$REPO_ROOT/android/app/build.gradle.kts" CURRENT_CODE="$(grep -E '^[[:space:]]*versionCode = [0-9]+' "$GRADLE_KTS" | head -1 | sed -E 's/.*versionCode = ([0-9]+).*/\1/')" CURRENT_NAME="$(grep -E '^[[:space:]]*versionName = "[^"]+"' "$GRADLE_KTS" | head -1 | sed -E 's/.*versionName = "([^"]+)".*/\1/')" if [[ -z "$CURRENT_CODE" || -z "$CURRENT_NAME" ]]; then echo "could not parse versionCode / versionName from $GRADLE_KTS" >&2 exit 1 fi echo "building versionName=$CURRENT_NAME versionCode=$CURRENT_CODE" JNILIBS="$REPO_ROOT/android/app/src/main/jniLibs" mkdir -p "$JNILIBS/arm64-v8a" echo "→ cargo ndk -t arm64-v8a -P 28 -o $JNILIBS build --profile release" ( cd "$REPO_ROOT" && cargo ndk -t arm64-v8a -P 28 -o "$JNILIBS" build --profile release ) echo "→ gradlew :app:bundleRelease" ( cd "$REPO_ROOT/android" && ./gradlew :app:bundleRelease ) AAB="$REPO_ROOT/android/app/build/outputs/bundle/release/app-release.aab" if [[ ! -f "$AAB" ]]; then echo "expected aab missing at $AAB" >&2 exit 1 fi # patch-bumps versionName and increments versionCode by one after a successful build, so the next invocation tags a fresh version. NEXT_CODE=$((CURRENT_CODE + 1)) IFS='.' read -r MAJOR MINOR PATCH <<<"$CURRENT_NAME" if [[ -z "${MAJOR:-}" || -z "${MINOR:-}" || -z "${PATCH:-}" ]]; then echo "warning: versionName '$CURRENT_NAME' is not semver X.Y.Z; only versionCode will be bumped" >&2 NEXT_NAME="$CURRENT_NAME" else NEXT_PATCH=$((PATCH + 1)) NEXT_NAME="${MAJOR}.${MINOR}.${NEXT_PATCH}" fi sed -i.bak -E "s/^([[:space:]]*)versionCode = [0-9]+/\\1versionCode = $NEXT_CODE/" "$GRADLE_KTS" sed -i.bak -E "s/^([[:space:]]*)versionName = \"[^\"]+\"/\\1versionName = \"$NEXT_NAME\"/" "$GRADLE_KTS" rm -f "$GRADLE_KTS.bak" echo echo "signed aab: $AAB" echo "applicationId: org.elseif.yrxtals" echo "shipped versionName=$CURRENT_NAME versionCode=$CURRENT_CODE" echo "bumped build.gradle.kts to versionName=$NEXT_NAME versionCode=$NEXT_CODE" echo "upload at https://play.google.com/console"