#!/bin/bash # Build Android APK set -e # Source Rust environment source "$HOME/.cargo/env.fish" 2>/dev/null || source "$HOME/.cargo/env" 2>/dev/null || true # Set Android environment variables export ANDROID_HOME="$HOME/Android/Sdk" export NDK_HOME="$ANDROID_HOME/ndk/$(ls "$ANDROID_HOME/ndk" | head -1)" echo "๐Ÿค– Building Android APK..." echo "Android SDK: $ANDROID_HOME" echo "NDK: $NDK_HOME" echo "" # Parse args: build type (debug/release) and optional --clean flag. # By default the build is INCREMENTAL โ€” Cargo and Vite reuse their caches. # Pass --clean (or CLEAN=1) to wipe all caches for a from-scratch build. # # ABI selection: by default Tauri builds all four ABIs (arm64/arm/x86/x86_64), # which is what a distributable universal APK needs โ€” but for an on-device test # it means three wasted Rust compiles. Pass --device (or ABI=aarch64) to build # only the connected device's architecture; --abi targets one explicitly. BUILD_TYPE="debug" CLEAN="${CLEAN:-0}" ABI="${ABI:-}" next_is_abi=0 for arg in "$@"; do if [ "$next_is_abi" = "1" ]; then ABI="$arg" next_is_abi=0 continue fi case "$arg" in --clean) CLEAN=1 ;; --abi) next_is_abi=1 ;; --device) ABI="device" ;; debug|release) BUILD_TYPE="$arg" ;; esac done # Resolve --device to the attached device's Rust target triple. if [ "$ABI" = "device" ]; then device_abi="$(adb shell getprop ro.product.cpu.abi 2>/dev/null | tr -d '\r\n')" case "$device_abi" in arm64-v8a) ABI="aarch64" ;; armeabi-v7a) ABI="armv7" ;; x86_64) ABI="x86_64" ;; x86) ABI="i686" ;; *) echo "โš ๏ธ Could not detect device ABI (got '${device_abi:-none}') โ€” building all targets." ABI="" ;; esac [ -n "$ABI" ] && echo "๐ŸŽฏ Device ABI $device_abi โ†’ building only '$ABI'" fi TARGET_ARGS=() if [ -n "$ABI" ]; then TARGET_ARGS=(--target "$ABI") fi # Step 0: Optionally clear build caches for a fully fresh build. if [ "$CLEAN" = "1" ]; then echo "๐Ÿงน Clearing build caches (clean build)..." rm -rf node_modules/.vite dist .svelte-kit .next build target src-tauri/target 2>/dev/null || true npm install > /dev/null 2>&1 fi # Step 1: Sync Android source files echo "๐Ÿ”„ Syncing Android sources..." ./scripts/sync-android-sources.sh # Step 2: Build the frontend first to avoid dev server issues echo "๐ŸŽจ Building frontend..." bun run build # Step 2: Build Android APK if [ "$BUILD_TYPE" = "release" ]; then # Configure release signing from .env (single source of truth). Must run # after sync-android-sources.sh, since gen/android is (re)generated there. ./scripts/write-keystore-properties.sh echo "๐Ÿ“ฆ Building release APK..." bun run tauri android build --apk true "${TARGET_ARGS[@]}" else echo "๐Ÿ“ฆ Building debug APK..." bun run tauri android build --apk true --debug "${TARGET_ARGS[@]}" fi echo "" echo "โœ… APK build complete!" echo "๐Ÿ“ฑ APK location: src-tauri/gen/android/app/build/outputs/apk/"