Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions android/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/bin/bash
# Build the Handoff Android app — checks prereqs and builds everything.
set -euo pipefail

cd "$(dirname "$0")"

echo "==> Handoff Android Build"
echo " ────────────────────────"
echo ""

# ─── Detect Android SDK ──────────────────────────────────────────
if [ -z "${ANDROID_HOME:-}" ]; then
for dir in "$HOME/Library/Android/sdk" "$HOME/Android/Sdk" /opt/android-sdk; do
if [ -d "$dir" ]; then
export ANDROID_HOME="$dir"
break
fi
done
fi
if [ -z "${ANDROID_HOME:-}" ]; then
echo "ERROR: Android SDK not found."
echo " Install Android Studio: brew install --cask android-studio"
echo " Then open it once to complete the SDK setup wizard."
exit 1
fi

# ─── Generate local.properties if missing ─────────────────────────
if [ ! -f local.properties ]; then
echo " Generating local.properties..."
echo "sdk.dir=$ANDROID_HOME" > local.properties
fi

# ─── Select JDK 17 if available ───────────────────────────────────
if command -v /usr/libexec/java_home &>/dev/null; then
if /usr/libexec/java_home -v 17 &>/dev/null; then
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
fi
fi

# ─── Build Go bridge if needed ────────────────────────────────────
if [ ! -f app/libs/gobridge.aar ]; then
echo " gobridge.aar not found — building Go bridge..."
(cd gobridge && ./build-aar.sh)
echo ""
fi

# ─── Build APK ────────────────────────────────────────────────────
echo "==> Building debug APK..."
./gradlew assembleDebug

APK="app/build/outputs/apk/debug/app-debug.apk"
echo ""
echo "==> Build complete: $APK"
ls -lh "$APK"

# ─── Install if device connected ─────────────────────────────────
ADB="$ANDROID_HOME/platform-tools/adb"
if [ -x "$ADB" ]; then
DEVICES=$("$ADB" devices 2>/dev/null | grep -w device | head -1 || true)
if [ -n "$DEVICES" ]; then
echo ""
echo "==> Installing on connected device..."
"$ADB" install -r "$APK"
else
echo ""
echo " No device connected. To install later:"
echo " $ADB install $APK"
fi
else
echo ""
echo " adb not found. To install on a device:"
echo " sdkmanager --install 'platform-tools'"
echo " \$ANDROID_HOME/platform-tools/adb install $APK"
fi
53 changes: 49 additions & 4 deletions android/gobridge/build-aar.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,33 @@ cd "$(dirname "$0")"

echo "==> Checking prerequisites..."

# 1. Go
if ! command -v go &>/dev/null; then
echo "ERROR: Go is not installed. Install from https://go.dev/dl/"
echo "ERROR: Go is not installed. Install from https://go.dev/dl/ or: brew install go"
exit 1
fi

# 2. Java — required for gomobile bind (jar/javac)
if ! command -v java &>/dev/null; then
echo "ERROR: Java is not installed."
echo " Install JDK 17: brew install --cask temurin@17"
exit 1
fi

JAVA_VER=$(java -version 2>&1 | head -1 | sed 's/.*"\([0-9]*\).*/\1/')
if [[ "$JAVA_VER" -gt 21 ]]; then
# Try to find JDK 17 automatically
if /usr/libexec/java_home -v 17 &>/dev/null; then
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
echo " JAVA_HOME=$JAVA_HOME (auto-selected JDK 17; JDK $JAVA_VER is too new)"
else
echo "ERROR: JDK $JAVA_VER is too new for Android tooling (max 21)."
echo " Install JDK 17: brew install --cask temurin@17"
exit 1
fi
fi

# 3. Android SDK
if [ -z "${ANDROID_HOME:-}" ]; then
# Try common locations
for dir in "$HOME/Library/Android/sdk" "$HOME/Android/Sdk" /opt/android-sdk; do
Expand All @@ -19,13 +41,15 @@ if [ -z "${ANDROID_HOME:-}" ]; then
fi
done
if [ -z "${ANDROID_HOME:-}" ]; then
echo "ERROR: ANDROID_HOME not set and Android SDK not found"
echo "ERROR: ANDROID_HOME not set and Android SDK not found."
echo " Install Android Studio: brew install --cask android-studio"
echo " Then open it once to complete the SDK setup wizard."
exit 1
fi
fi
echo " ANDROID_HOME=$ANDROID_HOME"

# Find NDK
# 4. Android NDK
if [ -z "${ANDROID_NDK_HOME:-}" ]; then
NDK_DIR="$ANDROID_HOME/ndk"
if [ -d "$NDK_DIR" ]; then
Expand All @@ -35,15 +59,36 @@ if [ -z "${ANDROID_NDK_HOME:-}" ]; then
fi
fi
if [ -z "${ANDROID_NDK_HOME:-}" ]; then
echo "ERROR: Android NDK not found. Install via: sdkmanager --install 'ndk;27.0.12077973'"
echo "ERROR: Android NDK not found."
echo " Install via: sdkmanager --sdk_root=\"\$ANDROID_HOME\" --install 'ndk;27.0.12077973'"
exit 1
fi
echo " ANDROID_NDK_HOME=$ANDROID_NDK_HOME"

# 5. Android SDK platform (API 26 required by gomobile)
if [ ! -d "$ANDROID_HOME/platforms/android-26" ]; then
echo " Android SDK platform 26 not found — installing..."
if command -v sdkmanager &>/dev/null; then
sdkmanager --sdk_root="$ANDROID_HOME" --install 'platforms;android-26' || {
echo "ERROR: Failed to install SDK platform 26."
echo " Install manually: sdkmanager --sdk_root=\"\$ANDROID_HOME\" --install 'platforms;android-26'"
exit 1
}
else
echo "ERROR: Android SDK platform 26 not found and sdkmanager not available."
echo " Install command-line tools: brew install --cask android-commandlinetools"
echo " Then: sdkmanager --sdk_root=\"\$ANDROID_HOME\" --install 'platforms;android-26'"
exit 1
fi
fi

echo "==> Installing gomobile..."
go install golang.org/x/mobile/cmd/gomobile@latest
go install golang.org/x/mobile/cmd/gobind@latest

# Ensure GOPATH/bin is in PATH
export PATH="$(go env GOPATH)/bin:$PATH"

echo "==> Initializing gomobile..."
gomobile init

Expand Down