#!/usr/bin/env bash # Installs the Android toolchain needed to build a Capacitor APK on Pop!_OS 24.04. # Headless: JDK 21 + cmdline-tools + platform-tools (adb). No Android Studio. # Idempotent - safe to re-run. set -euo pipefail # Versions below are verified against Capacitor 8.5.2's capacitor/build.gradle # (compileSdk 36, targetSdk 36, minSdk 24, Java 21) - do not bump blind. SDK_ROOT="${ANDROID_HOME:-$HOME/Android/Sdk}" CMDLINE_BUILD="15859902" # newest per developer.android.com/studio BUILD_TOOLS="36.1.0" # pairs with compileSdk 36 SHELL_RC="$HOME/.zshrc" MARKER="# >>> android sdk (sp404-layers) >>>" [ "$(id -u)" -ne 0 ] || { echo "Run as your normal user, not root. It will sudo when needed."; exit 1; } echo "==> 1/6 apt packages (needs sudo)" sudo apt-get update -qq # android-sdk-platform-tools-common ships the udev rules that let adb see the phone. sudo apt-get install -y openjdk-21-jdk android-sdk-platform-tools-common unzip curl echo "==> 2/6 command-line tools -> $SDK_ROOT" if [ ! -x "$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then tmp="$(mktemp -d)"; trap 'rm -rf "$tmp"' EXIT url="https://dl.google.com/android/repository/commandlinetools-linux-${CMDLINE_BUILD}_latest.zip" echo " downloading $url" curl -fL --progress-bar -o "$tmp/cmdline.zip" "$url" unzip -q "$tmp/cmdline.zip" -d "$tmp" mkdir -p "$SDK_ROOT/cmdline-tools" rm -rf "$SDK_ROOT/cmdline-tools/latest" # the zip unpacks to cmdline-tools/, sdkmanager insists on being at cmdline-tools/latest/ mv "$tmp/cmdline-tools" "$SDK_ROOT/cmdline-tools/latest" else echo " already present, skipping" fi # Derive JAVA_HOME from the javac we just installed rather than hardcoding a path. JAVA_HOME="$(dirname "$(dirname "$(readlink -f "$(command -v javac)")")")" [ -x "$JAVA_HOME/bin/javac" ] || { echo "Could not locate JAVA_HOME (got '$JAVA_HOME')"; exit 1; } case "$("$JAVA_HOME/bin/javac" -version 2>&1)" in *"javac 21."*) : ;; *) echo "WARNING: Capacitor 8 wants Java 21, found: $("$JAVA_HOME/bin/javac" -version 2>&1)" ;; esac export JAVA_HOME export ANDROID_HOME="$SDK_ROOT" export ANDROID_SDK_ROOT="$SDK_ROOT" export PATH="$SDK_ROOT/cmdline-tools/latest/bin:$SDK_ROOT/platform-tools:$JAVA_HOME/bin:$PATH" echo "==> 3/6 accepting SDK licenses" yes 2>/dev/null | sdkmanager --licenses >/dev/null || true echo "==> 4/6 SDK packages (this is the slow part, ~1-2 GB)" sdkmanager --install \ "platform-tools" \ "platforms;android-35" \ "platforms;android-36" \ "build-tools;${BUILD_TOOLS}" echo "==> 5/6 persisting env to $SHELL_RC" if ! grep -qF "$MARKER" "$SHELL_RC" 2>/dev/null; then cat >> "$SHELL_RC" < 6/6 usb device access" if ! id -nG "$USER" | grep -qw plugdev; then sudo usermod -aG plugdev "$USER" echo " added $USER to plugdev - LOG OUT AND BACK IN for this to take effect" else echo " already in plugdev" fi sudo udevadm control --reload-rules && sudo udevadm trigger || true cat <<'EOF' ------------------------------------------------------------ Done. Open a NEW terminal, then verify: java -version # expect 21.x sdkmanager --list_installed adb devices # plug the phone in, tap "Allow USB debugging" If adb shows "no permissions" or nothing, log out and back in (the plugdev group change needs a fresh session). ------------------------------------------------------------ EOF