Simplify emulator lifecycle and add ARM64 support in build.sh

This commit is contained in:
Alinson S. Xavier 2026-04-11 10:11:23 -05:00
parent 0467ff1f68
commit c7e754042c

View File

@ -28,6 +28,10 @@ PACKAGE_NAME=org.isoron.uhabits
SDKMANAGER="${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" SDKMANAGER="${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager"
VERSION=$(grep versionName uhabits-android/build.gradle.kts | sed -e 's/.*"\([^"]*\)".*/\1/g') VERSION=$(grep versionName uhabits-android/build.gradle.kts | sed -e 's/.*"\([^"]*\)".*/\1/g')
BOOT_TIMEOUT=360 BOOT_TIMEOUT=360
case "$(uname -m)" in
arm64|aarch64) ARCH="arm64-v8a" ;;
*) ARCH="x86_64" ;;
esac
# Logging # Logging
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -140,11 +144,12 @@ android_accept_licenses() {
} }
android_setup() { android_setup() {
API=$1 local API=$1
AVDNAME=${AVD_PREFIX}${API} local AVDNAME=${AVD_PREFIX}${API}
( (
flock 10 flock 10
log_info "Stopping Android emulator..." log_info "Stopping Android emulator..."
while [[ -n $(pgrep -f ${AVDNAME}) ]]; do while [[ -n $(pgrep -f ${AVDNAME}) ]]; do
pkill -9 -f ${AVDNAME} pkill -9 -f ${AVDNAME}
@ -154,57 +159,53 @@ android_setup() {
run $AVDMANAGER delete avd --name $AVDNAME run $AVDMANAGER delete avd --name $AVDNAME
log_info "Creating new Android virtual device (API $API)..." log_info "Creating new Android virtual device (API $API)..."
run $SDKMANAGER --install "system-images;android-$API;google_apis;x86_64" || return 1 run $SDKMANAGER --install "system-images;android-$API;google_apis;$ARCH" || return 1
run $AVDMANAGER create avd \ run $AVDMANAGER create avd \
--name $AVDNAME \ --name $AVDNAME \
--package "system-images;android-$API;google_apis;x86_64" \ --package "system-images;android-$API;google_apis;$ARCH" \
--device "Nexus 4" || return 1 --device "Nexus 4" || return 1
flock -u 10 flock -u 10
) 10>/tmp/uhabitsTest.lock ) 10>/tmp/uhabitsTest.lock
log_info "Launching emulator..."
EMULATOR_LOG="build/emulator-${API}.log"
$EMULATOR \
-avd $AVDNAME \
-port 6${API}0 \
1>"$EMULATOR_LOG" 2>&1 &
log_info "Waiting for emulator to boot..."
export ADB="$ADB -s emulator-6${API}0"
run timeout $BOOT_TIMEOUT $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82'
if [ $? -ne 0 ]; then
log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds."
return 1
fi
log_info "Saving snapshot..."
run $ADB emu avd snapshot save fresh-install
} }
android_boot_attempt() { android_launch() {
API=$1 local API=$1
AVDNAME=${AVD_PREFIX}${API} local AVDNAME=${AVD_PREFIX}${API}
local PORT=6${API}0
log_info "Stopping Android emulator..." log_info "Stopping Android emulator..."
while [[ -n $(pgrep -f ${AVDNAME}) ]]; do while [[ -n $(pgrep -f ${AVDNAME}) ]]; do
pkill -9 -f ${AVDNAME} pkill -9 -f ${AVDNAME}
done done
log_info "Launching emulator..." log_info "Launching emulator (API $API)..."
EMULATOR_LOG="build/emulator-${API}.log" local EMULATOR_LOG="build/emulator-${API}.log"
$EMULATOR \ $EMULATOR \
-avd $AVDNAME \ -avd $AVDNAME \
-port 6${API}0 \ -port $PORT \
-snapshot fresh-install \ -no-snapshot \
-no-snapshot-save \
-wipe-data \
1>"$EMULATOR_LOG" 2>&1 & 1>"$EMULATOR_LOG" 2>&1 &
export ADB="${ANDROID_HOME}/platform-tools/adb -s emulator-${PORT}"
log_info "Waiting for emulator to boot..." log_info "Waiting for emulator to boot..."
export ADB="$ADB -s emulator-6${API}0" timeout $BOOT_TIMEOUT $ADB wait-for-device shell \
sleep 5 'while [[ -z "$(getprop sys.boot_completed)" ]]; do sleep 1; done; input keyevent 82' &
run timeout $BOOT_TIMEOUT $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82' local WAIT_PID=$!
while kill -0 $WAIT_PID 2>/dev/null; do
if grep -q "FATAL" "$EMULATOR_LOG" 2>/dev/null; then
log_error "Emulator crashed:"
grep "FATAL" "$EMULATOR_LOG"
kill $WAIT_PID 2>/dev/null
wait $WAIT_PID 2>/dev/null
return 1
fi
sleep 2
done
wait $WAIT_PID
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds." log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds."
return 1 return 1
@ -219,16 +220,6 @@ android_boot_attempt() {
log_info "Acquiring wake lock..." log_info "Acquiring wake lock..."
run $ADB shell 'echo android-test > /sys/power/wake_lock' || return 1 run $ADB shell 'echo android-test > /sys/power/wake_lock' || return 1
}
android_boot() {
for attempt in {1..5}; do
android_boot_attempt $1 && return 0
sleep 5
done
log_error "Too many failed attempts. Aborting."
return 1
} }
# shellcheck disable=SC2016 # shellcheck disable=SC2016
@ -236,7 +227,7 @@ android_test() {
API=$1 API=$1
AVDNAME=${AVD_PREFIX}${API} AVDNAME=${AVD_PREFIX}${API}
android_boot $API || return 1 android_launch $API || return 1
if [ -n "$RELEASE" ]; then if [ -n "$RELEASE" ]; then
log_info "Installing release APK..." log_info "Installing release APK..."