Files
homepage/scripts/android-build-deploy.sh
Alexander Bocken c997e74806 feat: add debug mode to Android build script
Adds a `debug` command that temporarily enables cleartext traffic and
points frontendDist at the local dev server, then restores release
config on exit via trap.
2026-03-26 10:05:59 +01:00

116 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Android SDK environment
export ANDROID_HOME=/opt/android-sdk
export NDK_HOME=/opt/android-sdk/ndk/27.0.12077973
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
APK_DIR="src-tauri/gen/android/app/build/outputs/apk/universal/release"
APK_UNSIGNED="$APK_DIR/app-universal-release-unsigned.apk"
APK_SIGNED="$APK_DIR/app-universal-release-signed.apk"
KEYSTORE="src-tauri/debug.keystore"
PACKAGE="org.bocken.app"
MANIFEST="src-tauri/gen/android/app/src/main/AndroidManifest.xml"
TAURI_CONF="src-tauri/tauri.conf.json"
DEV_SERVER="http://192.168.1.4:5173"
PROD_DIST="https://bocken.org"
usage() {
echo "Usage: $0 [build|deploy|run|debug]"
echo " build - Build and sign the APK"
echo " deploy - Build + install on connected device"
echo " run - Build + install + launch on device"
echo " debug - Deploy pointing at local dev server (cleartext enabled)"
exit 1
}
ensure_keystore() {
if [ ! -f "$KEYSTORE" ]; then
echo ":: Generating debug keystore..."
keytool -genkey -v -keystore "$KEYSTORE" \
-alias debug -keyalg RSA -keysize 2048 -validity 10000 \
-storepass android -keypass android \
-dname "CN=Debug,O=Bocken,C=DE"
fi
}
ensure_android_project() {
local id_path
id_path="src-tauri/gen/android/app/src/main/java/$(echo "$PACKAGE" | tr '.' '/')"
if [ ! -d "$id_path" ]; then
echo ":: Android project missing or identifier changed, regenerating..."
rm -rf src-tauri/gen/android
pnpm tauri android init
fi
}
build() {
ensure_android_project
echo ":: Building Android APK..."
pnpm tauri android build --apk
ensure_keystore
echo ":: Signing APK..."
# zipalign
"$ANDROID_HOME/build-tools/35.0.0/zipalign" -f -v 4 \
"$APK_UNSIGNED" "$APK_SIGNED" > /dev/null
# sign with apksigner
"$ANDROID_HOME/build-tools/35.0.0/apksigner" sign \
--ks "$KEYSTORE" --ks-pass pass:android --key-pass pass:android \
"$APK_SIGNED"
echo ":: Signed APK at: $APK_SIGNED"
}
deploy() {
if ! adb devices | grep -q "device$"; then
echo "!! No device connected. Connect your phone and enable USB debugging."
exit 1
fi
build
echo ":: Installing APK on device..."
adb install -r "$APK_SIGNED"
echo ":: Installed successfully."
}
run() {
deploy
echo ":: Launching app..."
adb shell am start -n "$PACKAGE/.MainActivity"
echo ":: App launched."
}
enable_debug() {
echo ":: Enabling debug config (cleartext + local dev server)..."
sed -i 's|\${usesCleartextTraffic}|true|' "$MANIFEST"
sed -i "s|\"frontendDist\": \"$PROD_DIST\"|\"frontendDist\": \"$DEV_SERVER\"|" "$TAURI_CONF"
}
restore_release() {
echo ":: Restoring release config..."
sed -i 's|android:usesCleartextTraffic="true"|android:usesCleartextTraffic="${usesCleartextTraffic}"|' "$MANIFEST"
sed -i "s|\"frontendDist\": \"$DEV_SERVER\"|\"frontendDist\": \"$PROD_DIST\"|" "$TAURI_CONF"
}
debug() {
enable_debug
trap restore_release EXIT
deploy
}
case "${1:-}" in
build) build ;;
deploy) deploy ;;
run) run ;;
debug) debug ;;
*) usage ;;
esac