diff --git a/android/build.sh b/android/build.sh new file mode 100755 index 0000000..468db28 --- /dev/null +++ b/android/build.sh @@ -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 diff --git a/android/gobridge/build-aar.sh b/android/gobridge/build-aar.sh index 638f065..baa4af0 100755 --- a/android/gobridge/build-aar.sh +++ b/android/gobridge/build-aar.sh @@ -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 @@ -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 @@ -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