Android: build on JDK 25 with Gradle 9.6.1, AGP 9.4.1, Kotlin 2.2.10
Android Studio now bundles JBR 25, which Gradle 8.14's embedded Kotlin can't parse. Follow Tauri's current template: Gradle 9.6.1, Kotlin 2.2.10, the builtInKotlin/newDsl/failOnMissingFiles compatibility flags, the compilerOptions DSL, and ExecOperations in BuildTask (project.exec is gone in Gradle 9). AGP goes to 9.4.1 rather than the template's 9.3.1. Release lint vital is turned off: AGP 9.3/9.4's lint crashes analysing the .gradle.kts scripts (findFirCompiledSymbol), failing every release build. The env scripts now accept JDK 17 through 25, preferring Studio's JBR.
This commit is contained in:
@@ -36,24 +36,22 @@ _mtgc_android_env() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
# --- 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.
|
||||
# --- JDK: Gradle 9.6 / AGP 9 run on 17 through 25 (25 is the newest tested).
|
||||
# Prefer Studio's bundled JBR, then the newest system JDK in that range.
|
||||
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/temurin-21-jdk* \
|
||||
/usr/lib/jvm/java-17-openjdk /usr/lib/jvm/java-17-openjdk-* /usr/lib/jvm/temurin-17-jdk*
|
||||
$(ls -d /usr/lib/jvm/* 2>/dev/null | sort -rV)
|
||||
do
|
||||
[ -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
|
||||
local v
|
||||
v="$(sed -n 's/^JAVA_VERSION="\([0-9]*\).*/\1/p' "$d/release" 2>/dev/null)"
|
||||
if [ -n "$v" ] && [ "$v" -ge 17 ] && [ "$v" -le 25 ]; then jdk="$d"; break; fi
|
||||
done
|
||||
if [ -z "$jdk" ]; then
|
||||
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
|
||||
echo "android-env: no JDK 17–25 found (sudo dnf install java-25-openjdk-devel)" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
@@ -66,22 +66,20 @@ fi
|
||||
|
||||
# --- 2. A JDK the Android Gradle Plugin actually accepts -------------------
|
||||
#
|
||||
# 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.
|
||||
# Gradle 9.6 / AGP 9 run on JDK 17 through 25 (25 is the newest tested; an
|
||||
# older Gradle choked on 25, so an untested newer JDK is skipped, not trusted).
|
||||
#
|
||||
# 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.
|
||||
# Android Studio's bundled JetBrains Runtime is preferred, then the newest
|
||||
# system JDK in range. 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.
|
||||
# Succeeds if $1 is a JDK of a version Gradle accepts (17 through 25).
|
||||
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
|
||||
local v
|
||||
v="$(sed -n 's/^JAVA_VERSION="\([0-9]*\).*/\1/p' "$1/release" 2>/dev/null)"
|
||||
[ -n "$v" ] && [ "$v" -ge 17 ] && [ "$v" -le 25 ]
|
||||
}
|
||||
|
||||
find_jdk() {
|
||||
@@ -90,14 +88,13 @@ find_jdk() {
|
||||
echo "$ANDROID_JAVA_HOME"; return 0
|
||||
fi
|
||||
# Android Studio's bundled JBR (Toolbox or standalone install locations),
|
||||
# then a system JDK (Fedora or Adoptium packages) of an accepted version.
|
||||
# then the newest system JDK (Fedora or Adoptium packages) in range.
|
||||
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/temurin-21-jdk* \
|
||||
/usr/lib/jvm/java-17-openjdk /usr/lib/jvm/java-17-openjdk-* /usr/lib/jvm/temurin-17-jdk*
|
||||
$(ls -d /usr/lib/jvm/* 2>/dev/null | sort -rV)
|
||||
do
|
||||
jdk_ok "$d" && { echo "$d"; return 0; }
|
||||
done
|
||||
@@ -108,8 +105,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 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 "No JDK 17 through 25 found."
|
||||
err "Fix: sudo dnf install java-25-openjdk-devel"
|
||||
err "or: ANDROID_JAVA_HOME=/path/to/jdk ./scripts/android-setup.sh"
|
||||
exit 1
|
||||
fi
|
||||
@@ -262,7 +259,7 @@ Add these to your shell profile (or export them before building):
|
||||
|
||||
export ANDROID_HOME="$ANDROID_HOME"
|
||||
export NDK_HOME="$NDK_DIR"
|
||||
export JAVA_HOME="$JAVA_HOME" # Gradle rejects the newer system default
|
||||
export JAVA_HOME="$JAVA_HOME" # a JDK 17–25 that Gradle accepts
|
||||
|
||||
Then, from the project root:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user