diff --git a/README.md b/README.md index 392673c..7e63d07 100644 --- a/README.md +++ b/README.md @@ -474,9 +474,10 @@ prints the three environment variables to export (`ANDROID_HOME`, `NDK_HOME`, > Android's system libsqlite3 either — the card schema needs FTS5 with the > `trigram` tokenizer, which platform SQLite often lacks. -> **Why `JAVA_HOME`?** Gradle/AGP reject very new JDKs. The script prefers -> Android Studio's bundled JetBrains Runtime (JDK 21), which needs no extra -> install. +> **Why `JAVA_HOME`?** Gradle/AGP reject very new JDKs. The script uses +> Android Studio's bundled JetBrains Runtime when it's JDK 21 or 17, but recent +> Studio releases bundle JDK 25 and Fedora 44 no longer packages 21, so you may +> need `sudo dnf install temurin-21-jdk` (from the Adoptium repo). ### Build and run diff --git a/scripts/android-env.sh b/scripts/android-env.sh index 6ff078d..9f67a12 100755 --- a/scripts/android-env.sh +++ b/scripts/android-env.sh @@ -36,19 +36,24 @@ _mtgc_android_env() { return 1 fi - # --- JDK: Gradle/AGP reject very new JDKs; prefer Studio's bundled JBR 21 --- + # --- JDK: Gradle/AGP reject very new JDKs. Studio's bundled JBR is preferred, + # but newer Studio releases bundle JBR 25, so check each candidate's version. for d in \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio/jbr" \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio"/*/jbr \ "$HOME/android-studio/jbr" \ /opt/android-studio/jbr \ - /usr/lib/jvm/java-21-openjdk /usr/lib/jvm/java-21-openjdk-* \ - /usr/lib/jvm/java-17-openjdk /usr/lib/jvm/java-17-openjdk-* + /usr/lib/jvm/java-21-openjdk /usr/lib/jvm/java-21-openjdk-* /usr/lib/jvm/temurin-21-jdk* \ + /usr/lib/jvm/java-17-openjdk /usr/lib/jvm/java-17-openjdk-* /usr/lib/jvm/temurin-17-jdk* do - if [ -x "$d/bin/javac" ]; then jdk="$d"; break; fi + [ -x "$d/bin/javac" ] || continue + case "$(sed -n 's/^JAVA_VERSION="\([0-9]*\).*/\1/p' "$d/release" 2>/dev/null)" in + 21 | 17) jdk="$d"; break ;; + esac done if [ -z "$jdk" ]; then - echo "android-env: no JDK 21/17 found (Gradle rejects the system default)" >&2 + echo "android-env: no JDK 21/17 found (Gradle rejects newer ones, incl. Studio's JBR 25)" >&2 + echo "android-env: sudo dnf install temurin-21-jdk" >&2 return 1 fi @@ -67,4 +72,7 @@ _mtgc_android_env() { } _mtgc_android_env +_mtgc_rc=$? unset -f _mtgc_android_env +# Pass the failure on so `set -e` scripts that source this stop here. +return "$_mtgc_rc" 2>/dev/null || exit "$_mtgc_rc" diff --git a/scripts/android-setup.sh b/scripts/android-setup.sh index 4440fb3..6ee279d 100755 --- a/scripts/android-setup.sh +++ b/scripts/android-setup.sh @@ -69,30 +69,37 @@ fi # Fedora's default JDK is newer than AGP/Gradle supports (a JDK 25 default fails # the Gradle build outright), so pin JAVA_HOME to 21 (or 17) for Android work. # -# Android Studio's bundled JetBrains Runtime is preferred: it's the same JDK -# Studio itself runs Gradle with, so it's guaranteed AGP-compatible, and it -# needs no system package install. Note we test for bin/javac specifically — -# a JRE-only or leftover-empty /usr/lib/jvm directory must not count. +# Android Studio's bundled JetBrains Runtime is preferred when it's 21 or 17, +# but newer Studio releases bundle JBR 25, so every candidate's major version is +# checked (from its `release` file) rather than assumed. Note we test for +# bin/javac specifically — a JRE-only or leftover-empty /usr/lib/jvm directory +# must not count. + +# Major version of the JDK at $1 if it's one Gradle accepts (21 or 17), else fail. +jdk_ok() { + [ -x "$1/bin/javac" ] || return 1 + case "$(sed -n 's/^JAVA_VERSION="\([0-9]*\).*/\1/p' "$1/release" 2>/dev/null)" in + 21 | 17) return 0 ;; + *) return 1 ;; + esac +} find_jdk() { # Explicit override wins. if [ -n "${ANDROID_JAVA_HOME:-}" ] && [ -x "${ANDROID_JAVA_HOME}/bin/javac" ]; then echo "$ANDROID_JAVA_HOME"; return 0 fi - # Android Studio's bundled JBR (Toolbox or standalone install locations). + # Android Studio's bundled JBR (Toolbox or standalone install locations), + # then a system JDK (Fedora or Adoptium packages) of an accepted version. for d in \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio/jbr" \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio"/*/jbr \ "$HOME/android-studio/jbr" \ - /opt/android-studio/jbr + /opt/android-studio/jbr \ + /usr/lib/jvm/java-21-openjdk /usr/lib/jvm/java-21-openjdk-* /usr/lib/jvm/temurin-21-jdk* \ + /usr/lib/jvm/java-17-openjdk /usr/lib/jvm/java-17-openjdk-* /usr/lib/jvm/temurin-17-jdk* do - [ -x "$d/bin/javac" ] && { echo "$d"; return 0; } - done - # Fall back to a system JDK of an accepted major version. - for v in 21 17; do - for d in "/usr/lib/jvm/java-${v}-openjdk" /usr/lib/jvm/java-${v}-openjdk-*; do - [ -x "$d/bin/javac" ] && { echo "$d"; return 0; } - done + jdk_ok "$d" && { echo "$d"; return 0; } done return 1 } @@ -101,9 +108,8 @@ if JDK_PATH="$(find_jdk)"; then export JAVA_HOME="$JDK_PATH" info "Android JDK: $JAVA_HOME ($("$JAVA_HOME/bin/java" -version 2>&1 | head -1))" else - err "No JDK 21 or 17 found (Gradle rejects the newer system default)." - err "Easiest fix: install Android Studio (its bundled JBR is used automatically)," - err "or: sudo dnf install java-21-openjdk-devel" + err "No JDK 21 or 17 found (Gradle rejects newer ones, including recent Android Studio's JBR 25)." + err "Fix: sudo dnf install temurin-21-jdk (Adoptium repo; Fedora 44 dropped java-21-openjdk)" err "or: ANDROID_JAVA_HOME=/path/to/jdk ./scripts/android-setup.sh" exit 1 fi