Harden Android build setup

This commit is contained in:
Alexander Sellite 2026-08-08 00:34:06 -04:00
parent 352350157b
commit c85f709851

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
ANDROID_HOME="${ANDROID_HOME:-/home/sol6_vi/Android/Sdk}" ANDROID_HOME="${ANDROID_HOME:-${HOME}/Android/Sdk}"
JAVA_HOME="${JAVA_HOME:-}" JAVA_HOME="${JAVA_HOME:-}"
INSTALL=0 INSTALL=0
AUTO=0 AUTO=0
@ -55,6 +55,9 @@ done
PROJECT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" PROJECT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
GODOT="${GODOT_BIN:-godot}" GODOT="${GODOT_BIN:-godot}"
PROJECT_VERSION="$(
sed -n 's/^config\/version="\([^"]*\)"/\1/p' "${PROJECT_ROOT}/project.godot"
)"
MISSING=0 MISSING=0
print_status() { printf '%s %s\n' "[$1]" "$2"; } print_status() { printf '%s %s\n' "[$1]" "$2"; }
@ -71,7 +74,7 @@ check_dir() {
check_file() { check_file() {
local path="$1" label="$2" local path="$1" label="$2"
if [[ -x "$path" || -f "$path" ]]; then if [[ -x "$path" ]]; then
print_status OK "${label}: ${path}" print_status OK "${label}: ${path}"
else else
print_status ERR "Missing ${label}: ${path}" print_status ERR "Missing ${label}: ${path}"
@ -113,6 +116,8 @@ resolve_java_home() {
check_java() { check_java() {
if resolve_java_home && [[ -x "$JAVA_HOME/bin/java" ]]; then if resolve_java_home && [[ -x "$JAVA_HOME/bin/java" ]]; then
print_status OK "Java binary: $JAVA_HOME/bin/java" print_status OK "Java binary: $JAVA_HOME/bin/java"
check_file "$JAVA_HOME/bin/javac" "javac binary"
check_file "$JAVA_HOME/bin/keytool" "keytool binary"
"$JAVA_HOME/bin/java" -version 2>&1 | sed -n '1,2p' "$JAVA_HOME/bin/java" -version 2>&1 | sed -n '1,2p'
local java_ver local java_ver
java_ver=$("$JAVA_HOME/bin/java" -version 2>&1 | sed -n '1p') java_ver=$("$JAVA_HOME/bin/java" -version 2>&1 | sed -n '1p')
@ -161,18 +166,13 @@ check_sdk_paths() {
check_dir "$ANDROID_HOME/platform-tools" "platform-tools" check_dir "$ANDROID_HOME/platform-tools" "platform-tools"
check_file "$ANDROID_HOME/platform-tools/adb" "adb binary" check_file "$ANDROID_HOME/platform-tools/adb" "adb binary"
if [[ -d "$ANDROID_HOME/build-tools" ]]; then if [[ -d "$ANDROID_HOME/build-tools/$BUILDTOOLS_VERSION" ]]; then
local bt print_status OK "build-tools ${BUILDTOOLS_VERSION}: present"
bt="$(ls -1v "$ANDROID_HOME/build-tools" 2>/dev/null | tail -n 1 || true)" check_file \
if [[ -n "$bt" ]]; then "$ANDROID_HOME/build-tools/$BUILDTOOLS_VERSION/apksigner" \
print_status OK "build-tools versions: $(ls -1 "$ANDROID_HOME/build-tools" | tr '\n' ' ')" "apksigner"
check_file "$ANDROID_HOME/build-tools/$bt/apksigner" "apksigner"
else
print_status ERR "build-tools directory exists but is empty"
MISSING=$((MISSING+1))
fi
else else
print_status ERR "Missing build-tools root: $ANDROID_HOME/build-tools" print_status ERR "Missing build-tools version: ${BUILDTOOLS_VERSION}"
MISSING=$((MISSING+1)) MISSING=$((MISSING+1))
fi fi
@ -198,6 +198,7 @@ check_sdk_paths() {
install_jdk_hint() { install_jdk_hint() {
local pm=0 local pm=0
local -a elevate=()
echo "Attempting automatic JDK install..." echo "Attempting automatic JDK install..."
if command -v apt-get >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then
pm="apt-get" pm="apt-get"
@ -212,19 +213,18 @@ install_jdk_hint() {
fi fi
if [[ $EUID -ne 0 ]]; then if [[ $EUID -ne 0 ]]; then
local sudo_cmd=(sudo)
if ! command -v sudo >/dev/null 2>&1; then if ! command -v sudo >/dev/null 2>&1; then
echo "sudo not found; please run with root privileges for package install." echo "sudo not found; please run with root privileges for package install."
return 1 return 1
fi fi
elevate=(sudo)
fi fi
if [[ "$pm" == "apt-get" ]]; then if [[ "$pm" == "apt-get" ]]; then
echo "apt-get install -y openjdk-17-jdk" echo "apt-get install -y openjdk-17-jdk"
if [[ $AUTO -eq 1 ]]; then if [[ $AUTO -eq 1 ]]; then
if command -v sudo >/dev/null 2>&1; then "${elevate[@]}" apt-get update
sudo apt-get update && sudo apt-get install -y openjdk-17-jdk "${elevate[@]}" apt-get install -y openjdk-17-jdk
fi
else else
echo "Run as manual step first: sudo apt-get update && sudo apt-get install -y openjdk-17-jdk" echo "Run as manual step first: sudo apt-get update && sudo apt-get install -y openjdk-17-jdk"
return 1 return 1
@ -232,14 +232,14 @@ install_jdk_hint() {
elif [[ "$pm" == "dnf" ]]; then elif [[ "$pm" == "dnf" ]]; then
echo "dnf install -y java-17-openjdk-devel" echo "dnf install -y java-17-openjdk-devel"
if [[ $AUTO -eq 1 ]]; then if [[ $AUTO -eq 1 ]]; then
sudo dnf install -y java-17-openjdk-devel "${elevate[@]}" dnf install -y java-17-openjdk-devel
else else
return 1 return 1
fi fi
else else
echo "pacman -S --noconfirm jdk17-openjdk" echo "pacman -S --noconfirm jdk17-openjdk"
if [[ $AUTO -eq 1 ]]; then if [[ $AUTO -eq 1 ]]; then
sudo pacman -S --noconfirm jdk17-openjdk "${elevate[@]}" pacman -S --noconfirm jdk17-openjdk
else else
return 1 return 1
fi fi
@ -305,7 +305,7 @@ install_sdk_components() {
echo "Cannot install SDK packages without sdkmanager." echo "Cannot install SDK packages without sdkmanager."
return 1 return 1
fi fi
"$sdkmanager_path" --sdk_root="${ANDROID_HOME}" --list | head -n 40 | sed -n '1,40p' "$sdkmanager_path" --sdk_root="${ANDROID_HOME}" --list | sed -n '1,40p'
echo "Installing required SDK components: platform-tools, platform-android-${SDK_VERSION}, build-tools-${BUILDTOOLS_VERSION}" echo "Installing required SDK components: platform-tools, platform-android-${SDK_VERSION}, build-tools-${BUILDTOOLS_VERSION}"
if [[ $AUTO -eq 1 ]]; then if [[ $AUTO -eq 1 ]]; then
yes | "$sdkmanager_path" --sdk_root="${ANDROID_HOME}" --install "platform-tools" "platforms;android-${SDK_VERSION}" "build-tools;${BUILDTOOLS_VERSION}" yes | "$sdkmanager_path" --sdk_root="${ANDROID_HOME}" --install "platform-tools" "platforms;android-${SDK_VERSION}" "build-tools;${BUILDTOOLS_VERSION}"
@ -336,7 +336,7 @@ check_editor_settings() {
run_export_hint() { run_export_hint() {
echo echo
echo "Example export commands:" echo "Example export commands:"
echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-release \"Android\" builds/v0.5.1-prealpha/android/NETFISHING.apk" echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-release \"Android\" builds/${PROJECT_VERSION}/android/NETfishing.apk"
echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-debug \"Android\" builds/android/NETfishing-debug.apk" echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-debug \"Android\" builds/android/NETfishing-debug.apk"
} }
@ -354,7 +354,12 @@ fi
if [[ $INSTALL -eq 1 ]]; then if [[ $INSTALL -eq 1 ]]; then
echo echo
print_status INFO "Attempting dependency install path..." print_status INFO "Attempting dependency install path..."
if [[ -z "$JAVA_HOME" || ! -x "$JAVA_HOME/bin/java" ]]; then if [[ \
-z "$JAVA_HOME" \
|| ! -x "$JAVA_HOME/bin/java" \
|| ! -x "$JAVA_HOME/bin/javac" \
|| ! -x "$JAVA_HOME/bin/keytool" \
]]; then
install_jdk_hint || true install_jdk_hint || true
fi fi
@ -377,11 +382,11 @@ if [[ $INSTALL -eq 1 ]]; then
fi fi
print_status ERR "Dependency check failed with ${MISSING} issue(s)." print_status ERR "Dependency check failed with ${MISSING} issue(s)."
cat <<'TIPS' cat <<TIPS
Suggested manual recovery: Suggested manual recovery:
1) Install OpenJDK 17 JDK. 1) Install OpenJDK 17 JDK.
2) Install Android SDK command line tools and run: 2) Install Android SDK command line tools and run:
sdkmanager --sdk_root="${ANDROID_HOME}" --install "platform-tools" "platforms;android-33" "build-tools;34.0.0" sdkmanager --sdk_root="${ANDROID_HOME}" --install "platform-tools" "platforms;android-${SDK_VERSION}" "build-tools;${BUILDTOOLS_VERSION}"
3) Set JAVA_HOME and ANDROID_HOME in your shell and Godot Exporter settings. 3) Set JAVA_HOME and ANDROID_HOME in your shell and Godot Exporter settings.
4) Re-run this script without --install (verification), then re-run Godot Android export. 4) Re-run this script without --install (verification), then re-run Godot Android export.
TIPS TIPS