An on-device test build compiled all four ABIs (arm64/arm/x86/x86_64), so three of the four Rust compiles were thrown away. That dominated the build time when iterating against a connected phone. --device resolves the attached device's ABI via adb and targets just that triple; --abi <target> selects one explicitly; ABI= works as an env var. Default behaviour is unchanged (all four), since a distributable universal APK genuinely needs them. bun run android:build:device bun run android:build:release:device
95 lines
3.0 KiB
Bash
Executable File
95 lines
3.0 KiB
Bash
Executable File
#!/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 <t> 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/"
|