Android env: require JDK 21/17 by version, since Studio now bundles JBR 25

Check each JDK candidate's major version instead of assuming Android Studio's
JBR is 21, look for Adoptium temurin-{21,17}-jdk (Fedora 44 dropped
java-21-openjdk), and propagate android-env.sh failures to scripts that
source it so fdroid-publish.sh stops before building.
This commit is contained in:
2026-10-16 22:08:47 -05:00
parent 8301371679
commit 89378a41fb
3 changed files with 39 additions and 24 deletions

View File

@@ -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 > Android's system libsqlite3 either — the card schema needs FTS5 with the
> `trigram` tokenizer, which platform SQLite often lacks. > `trigram` tokenizer, which platform SQLite often lacks.
> **Why `JAVA_HOME`?** Gradle/AGP reject very new JDKs. The script prefers > **Why `JAVA_HOME`?** Gradle/AGP reject very new JDKs. The script uses
> Android Studio's bundled JetBrains Runtime (JDK 21), which needs no extra > Android Studio's bundled JetBrains Runtime when it's JDK 21 or 17, but recent
> install. > 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 ### Build and run

View File

@@ -36,19 +36,24 @@ _mtgc_android_env() {
return 1 return 1
fi 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 \ for d in \
"$HOME/.local/share/JetBrains/Toolbox/apps/android-studio/jbr" \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio/jbr" \
"$HOME/.local/share/JetBrains/Toolbox/apps/android-studio"/*/jbr \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio"/*/jbr \
"$HOME/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/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/java-17-openjdk /usr/lib/jvm/java-17-openjdk-* /usr/lib/jvm/temurin-17-jdk*
do 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 done
if [ -z "$jdk" ]; then 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 return 1
fi fi
@@ -67,4 +72,7 @@ _mtgc_android_env() {
} }
_mtgc_android_env _mtgc_android_env
_mtgc_rc=$?
unset -f _mtgc_android_env 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"

View File

@@ -69,30 +69,37 @@ fi
# Fedora's default JDK is newer than AGP/Gradle supports (a JDK 25 default fails # 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. # 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 # Android Studio's bundled JetBrains Runtime is preferred when it's 21 or 17,
# Studio itself runs Gradle with, so it's guaranteed AGP-compatible, and it # but newer Studio releases bundle JBR 25, so every candidate's major version is
# needs no system package install. Note we test for bin/javac specifically — # checked (from its `release` file) rather than assumed. Note we test for
# a JRE-only or leftover-empty /usr/lib/jvm directory must not count. # 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() { find_jdk() {
# Explicit override wins. # Explicit override wins.
if [ -n "${ANDROID_JAVA_HOME:-}" ] && [ -x "${ANDROID_JAVA_HOME}/bin/javac" ]; then if [ -n "${ANDROID_JAVA_HOME:-}" ] && [ -x "${ANDROID_JAVA_HOME}/bin/javac" ]; then
echo "$ANDROID_JAVA_HOME"; return 0 echo "$ANDROID_JAVA_HOME"; return 0
fi 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 \ for d in \
"$HOME/.local/share/JetBrains/Toolbox/apps/android-studio/jbr" \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio/jbr" \
"$HOME/.local/share/JetBrains/Toolbox/apps/android-studio"/*/jbr \ "$HOME/.local/share/JetBrains/Toolbox/apps/android-studio"/*/jbr \
"$HOME/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 do
[ -x "$d/bin/javac" ] && { echo "$d"; return 0; } jdk_ok "$d" && { 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
done done
return 1 return 1
} }
@@ -101,9 +108,8 @@ if JDK_PATH="$(find_jdk)"; then
export JAVA_HOME="$JDK_PATH" export JAVA_HOME="$JDK_PATH"
info "Android JDK: $JAVA_HOME ($("$JAVA_HOME/bin/java" -version 2>&1 | head -1))" info "Android JDK: $JAVA_HOME ($("$JAVA_HOME/bin/java" -version 2>&1 | head -1))"
else else
err "No JDK 21 or 17 found (Gradle rejects the newer system default)." err "No JDK 21 or 17 found (Gradle rejects newer ones, including recent Android Studio's JBR 25)."
err "Easiest fix: install Android Studio (its bundled JBR is used automatically)," err "Fix: sudo dnf install temurin-21-jdk (Adoptium repo; Fedora 44 dropped java-21-openjdk)"
err "or: sudo dnf install java-21-openjdk-devel"
err "or: ANDROID_JAVA_HOME=/path/to/jdk ./scripts/android-setup.sh" err "or: ANDROID_JAVA_HOME=/path/to/jdk ./scripts/android-setup.sh"
exit 1 exit 1
fi fi