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.
116 lines
3.2 KiB
Bash
Executable File
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
|