summaryrefslogtreecommitdiffstats
path: root/util/android/android_emulator_launcher.sh
diff options
context:
space:
mode:
Diffstat (limited to 'util/android/android_emulator_launcher.sh')
-rwxr-xr-xutil/android/android_emulator_launcher.sh88
1 files changed, 54 insertions, 34 deletions
diff --git a/util/android/android_emulator_launcher.sh b/util/android/android_emulator_launcher.sh
index fb58e86bef9..0a4db818e73 100755
--- a/util/android/android_emulator_launcher.sh
+++ b/util/android/android_emulator_launcher.sh
@@ -1,27 +1,28 @@
#!/bin/bash
-# Copyright (C) 2021 The Qt Company Ltd.
+# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
# This util launches the Android emulator and ensures it doesn't stuck/freeze
# by detecting that and restarting it
set -e
-
-EMULATOR_MAX_RETRIES=5
+EMULATOR_MAX_RETRIES=3
+ADB_MAX_TIMEOUT=180
EMULATOR_EXEC="$ANDROID_SDK_ROOT/emulator/emulator"
ADB_EXEC="$ANDROID_SDK_ROOT/platform-tools/adb"
-if [ -z "${ANDROID_EMULATOR}" ]
-then
- EMULATOR_NAME="@emulator_x86_api_23"
-else
- EMULATOR_NAME="$ANDROID_EMULATOR"
-fi
+LOGCAT_PATH="$COIN_CTEST_RESULTSDIR/emulator_logcat_%iter.txt"
+EMULATOR_RUN_LOG_PATH="$COIN_CTEST_RESULTSDIR/emulator_run_log_%iter.txt"
+if [ -z "${ANDROID_EMULATOR}" ]; then
+ echo "No AVD name provided via ANDROID_EMULATOR env variable. Aborting!"
+ exit 1
+fi
+ANDROID_EMULATOR="${ANDROID_EMULATOR#@}"
function check_for_android_device
{
- $ADB_EXEC devices \
- | awk 'NR==2{print $2}' | grep -qE '^(online|device)$'
+ $ADB_EXEC devices | awk 'NR==2{print $2}' | grep -qE '^(online|device)$'
}
# WARNING: On the very first boot of the emulator it happens that the device
@@ -34,52 +35,71 @@ function check_for_android_device
# fully booted, and only then is dev.bootcomplete=1.
#
# To reproduce the emulator booting as the first time, you have to delete the
-# cached images found inside $HOME/.android especially the
+# cached images found inside $HOME/.android/avd/{avd_name}.avd/ especially the
# "userdata-qemu.img.qcow2" file.
function check_if_fully_booted
{
# The "getprop" command separates lines with \r\n so we trim them
- bootanim=` $ADB_EXEC shell getprop init.svc.bootanim | tr -d '\r\n'`
- boot_completed=`$ADB_EXEC shell getprop sys.boot_completed | tr -d '\r\n'`
- bootcomplete=` $ADB_EXEC shell getprop dev.bootcomplete | tr -d '\r\n'`
+ bootanim=$( timeout 1 "$ADB_EXEC" shell getprop init.svc.bootanim | tr -d '\r\n')
+ boot_completed=$(timeout 1 "$ADB_EXEC" shell getprop sys.boot_completed | tr -d '\r\n')
+ bootcomplete=$( timeout 1 "$ADB_EXEC" shell getprop dev.bootcomplete | tr -d '\r\n')
echo "bootanim=$bootanim boot_completed=$boot_completed bootcomplete=$bootcomplete"
[ "$bootanim" = stopped ] && [ "$boot_completed" = 1 ] && [ "$bootcomplete" = 1 ]
}
-
-
-for counter in `seq ${EMULATOR_MAX_RETRIES}`
+for counter in $(seq ${EMULATOR_MAX_RETRIES})
do
+ $ADB_EXEC kill-server
$ADB_EXEC start-server
-
+ sleep 1
if check_for_android_device
then
- echo "Emulator is already running but it shouldn't be. Aborting\!"
- exit 3
+ echo "Emulator is already running but it shouldn't be. Terminating it now..."
+ pkill '^qemu-system-' || true
+ sleep 5
fi
- echo "Starting emulator, try ${counter}/${EMULATOR_MAX_RETRIES}"
- $EMULATOR_EXEC $EMULATOR_NAME \
- -gpu swiftshader_indirect -no-audio -partition-size 4096 \
- -cores 4 -memory 16000 -no-snapshot-load -no-snapshot-save \
- </dev/null >$HOME/emulator.log 2>&1 &
+ LOGCAT_PATH=${LOGCAT_PATH//%iter/${counter}}
+ EMULATOR_RUN_LOG_PATH=${EMULATOR_RUN_LOG_PATH//%iter/${counter}}
+
+ echo "Starting emulator ${ANDROID_EMULATOR}, try ${counter}/${EMULATOR_MAX_RETRIES}" \
+ | tee "${EMULATOR_RUN_LOG_PATH}"
+ $EMULATOR_EXEC -avd "$ANDROID_EMULATOR" \
+ -gpu swiftshader_indirect -no-audio -no-window -no-boot-anim \
+ -cores 4 -memory 16000 -partition-size 4096 \
+ -detect-image-hang -restart-when-stalled -no-snapshot-save \
+ -no-nested-warnings -logcat '*:v' -logcat-output "${LOGCAT_PATH}" \
+ </dev/null >"${EMULATOR_RUN_LOG_PATH}" 2>&1 &
emulator_pid=$!
disown $emulator_pid
- echo "Waiting for emulated device to appear..."
- $ADB_EXEC wait-for-device
+ echo "Waiting ${ADB_MAX_TIMEOUT} seconds for emulated device to appear..."
+ timeout ${ADB_MAX_TIMEOUT} "$ADB_EXEC" wait-for-device
+
+ # Due to some bug in Coin/Go, we can't have the emulator command stream
+ # the output to the console while in the background, as Coin will continue
+ # waiting for it. So, rely on re-directing all output to a log file and
+ # then printing it out after the emulator is started.
+ echo "######## Printing out the emulator command logs ########"
+ cat "${EMULATOR_RUN_LOG_PATH}"
+ echo "########################################################"
echo "Waiting a few minutes for the emulator to fully boot..."
emulator_status=down
- for i in `seq 300`
+
+ time_start=${SECONDS}
+ duration=0
+
+ while [ $duration -lt ${ADB_MAX_TIMEOUT} ]
do
sleep 1
- if check_for_android_device && check_if_fully_booted
+ if check_for_android_device && check_if_fully_booted
then
emulator_status=up
break
fi
+ duration=$(( SECONDS - time_start ))
done
# If emulator status is still offline after timeout period,
@@ -89,12 +109,13 @@ do
echo "Emulator started successfully"
break
else
- if [ $counter -lt $EMULATOR_MAX_RETRIES ]
+ if [ "$counter" -lt "$EMULATOR_MAX_RETRIES" ]
then
- echo "Emulator failed to start, forcefully killing current instance and re-starting emulator"
+ echo "Emulator failed to start," \
+ "forcefully killing current instance and re-starting emulator"
kill $emulator_pid || true
sleep 5
- elif [ $counter -eq $EMULATOR_MAX_RETRIES ]
+ elif [ "$counter" -eq "$EMULATOR_MAX_RETRIES" ]
then
echo "Emulator failed to start, reached maximum number of retries. Aborting\!"
exit 2
@@ -102,5 +123,4 @@ do
fi
done
-
exit 0