Files
西风逍遥游 5150d17b91 ci: align Android NDK to runner-preinstalled 27.3 and cache Emscripten SDK
Windows/macOS runner images already ship the Android SDK; the only real
download was NDK 26.1.10909125. Align ANDROID_NDK_VERSION to the
preinstalled 27.3.13750724 so setup-android downloads nothing (zero cache
quota). Update setup-android-sdk.sh, Makefile and Readmes to match.

Emscripten is not preinstalled on ubuntu runners, so cache \C:\Users\xiaofans/emsdk
but only save on the default branch to avoid churning/evicting hot
per-PR caches.
2026-08-26 14:49:01 +08:00

121 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Locate Android SDK roots / sdkmanager / NDK after android-actions/setup-android.
# Writes ANDROID_HOME, ANDROID_SDK, ANDROID_NDK (forward-slash paths) to GITHUB_ENV.
set -euo pipefail
ANDROID_API="${ANDROID_API:-34}"
ANDROID_NDK_VERSION="${ANDROID_NDK_VERSION:-27.3.13750724}"
to_unix() {
local p="${1//\\//}"
if command -v cygpath >/dev/null 2>&1; then
cygpath -u "$p" 2>/dev/null || echo "$p"
else
echo "$p"
fi
}
candidates=()
[ -n "${ANDROID_HOME:-}" ] && candidates+=("$ANDROID_HOME")
[ -n "${ANDROID_SDK_ROOT:-}" ] && candidates+=("$ANDROID_SDK_ROOT")
[ -n "${ANDROID_SDK:-}" ] && candidates+=("$ANDROID_SDK")
[ -n "${LOCALAPPDATA:-}" ] && candidates+=("${LOCALAPPDATA}/Android/Sdk")
candidates+=("$HOME/Android/Sdk" "$HOME/Library/Android/sdk" "/usr/local/lib/android/sdk")
SDK_ROOT=""
for c in "${candidates[@]}"; do
[ -n "$c" ] || continue
u=$(to_unix "$c")
if [ -d "$u" ]; then
SDK_ROOT="$u"
break
fi
done
if [ -z "$SDK_ROOT" ]; then
echo "ANDROID_HOME / Android SDK root not found"
echo "ANDROID_HOME=${ANDROID_HOME:-}"
echo "ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT:-}"
echo "PATH=$PATH"
exit 1
fi
find_sdkmanager() {
local root="$1"
local c
for c in \
"$root/cmdline-tools/latest/bin/sdkmanager" \
"$root/cmdline-tools/latest/bin/sdkmanager.bat" \
"$root"/cmdline-tools/*/bin/sdkmanager \
"$root"/cmdline-tools/*/bin/sdkmanager.bat \
"$root/tools/bin/sdkmanager" \
"$root/tools/bin/sdkmanager.bat"; do
if [ -f "$c" ]; then
echo "$c"
return 0
fi
done
# Also accept whatever is already on PATH.
if command -v sdkmanager >/dev/null 2>&1; then
command -v sdkmanager
return 0
fi
if command -v sdkmanager.bat >/dev/null 2>&1; then
command -v sdkmanager.bat
return 0
fi
return 1
}
SDKMANAGER="$(find_sdkmanager "$SDK_ROOT" || true)"
if [ -z "$SDKMANAGER" ]; then
echo "sdkmanager not found under $SDK_ROOT"
ls -la "$SDK_ROOT" || true
ls -la "$SDK_ROOT/cmdline-tools" 2>/dev/null || true
exit 1
fi
echo "Using Android SDK: $SDK_ROOT"
echo "Using sdkmanager: $SDKMANAGER"
# Install requested packages if missing.
need_install=0
[ -d "$SDK_ROOT/platforms/android-${ANDROID_API}" ] || need_install=1
[ -d "$SDK_ROOT/build-tools/${ANDROID_API}.0.0" ] || need_install=1
[ -d "$SDK_ROOT/ndk/${ANDROID_NDK_VERSION}" ] || need_install=1
if [ "$need_install" -eq 1 ]; then
echo "Installing Android packages via sdkmanager..."
yes | "$SDKMANAGER" --sdk_root="$SDK_ROOT" --install \
"platform-tools" \
"platforms;android-${ANDROID_API}" \
"build-tools;${ANDROID_API}.0.0" \
"ndk;${ANDROID_NDK_VERSION}" || true
yes | "$SDKMANAGER" --sdk_root="$SDK_ROOT" --licenses >/dev/null || true
fi
NDK_DIR="$SDK_ROOT/ndk/${ANDROID_NDK_VERSION}"
if [ ! -f "$NDK_DIR/build/cmake/android.toolchain.cmake" ]; then
# Fall back to any installed NDK.
NDK_DIR="$(ls -d "$SDK_ROOT"/ndk/* 2>/dev/null | sort -V | tail -1 || true)"
fi
if [ -z "${NDK_DIR:-}" ] || [ ! -f "$NDK_DIR/build/cmake/android.toolchain.cmake" ]; then
echo "Android NDK toolchain not found under $SDK_ROOT/ndk"
ls -la "$SDK_ROOT/ndk" 2>/dev/null || true
exit 1
fi
{
echo "ANDROID_HOME=$SDK_ROOT"
echo "ANDROID_SDK_ROOT=$SDK_ROOT"
echo "ANDROID_SDK=$SDK_ROOT"
echo "ANDROID_NDK=$NDK_DIR"
} >> "${GITHUB_ENV:?}"
# Ensure cmdline-tools bin is on PATH for later steps.
BIN_DIR="$(dirname "$SDKMANAGER")"
echo "$BIN_DIR" >> "${GITHUB_PATH:?}"
echo "$SDK_ROOT/platform-tools" >> "${GITHUB_PATH:?}"
echo "ANDROID_NDK=$NDK_DIR"