From 1c27f95d01d5e9a79566cc32c83c1811923e2e5c Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 10 Jul 2023 15:19:27 +0300 Subject: [PATCH] COIN/Android: improvements to Android Emulator launcher script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't fail silently if the AVD name is not provided. * Add the following flags to the emulator: * -no-window: since we don't really interact with emulator is CI * -no-boot-anim: no need to run the boot animation * -no-snapshot-load: removed because it serves nothing * -detect-image-hang -restart-when-stalled: helps recover the emulator from freezes during execution * Disable warning dialog about nested virtualization. * Terminate the emulator instance if the script expects it to not be running, i.e. save time by attempting to terminate and move on with the script execution instead of simply failing and doing nothing. * Add a timeout to the blocking call 'adb wait-for-device' * Save logcat output to a file for quick access to the logs, and put both emulator and logcat files under testresults folder, which would them available in cases of failure without needing to create a VM for debugging to get the logs. Task-number: QTQAINFRA-5596 Fixes: QTQAINFRA-4628 Change-Id: I751bbec14980a452e02066f4e79d76fe6f3c018f Reviewed-by: Simo Fält --- .../common/linux/android_emulator_launcher.sh | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/coin/provisioning/common/linux/android_emulator_launcher.sh b/coin/provisioning/common/linux/android_emulator_launcher.sh index 42cc3e83..3a861c78 100755 --- a/coin/provisioning/common/linux/android_emulator_launcher.sh +++ b/coin/provisioning/common/linux/android_emulator_launcher.sh @@ -1,26 +1,27 @@ #!/bin/bash -# Copyright (C) 2021 The Qt Company Ltd. +# Copyright (C) 2023 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 +ADB_MAX_TIMEOUT=300 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" +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 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 @@ -33,48 +34,54 @@ 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}` do + $ADB_EXEC kill-server $ADB_EXEC start-server 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 -avd $EMULATOR_NAME \ - -gpu swiftshader_indirect -no-audio -partition-size 4096 \ - -cores 4 -memory 16000 -no-snapshot-load -no-snapshot-save \ - $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-output ${LOGCAT_PATH} \ + ${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 echo "Waiting a few minutes for the emulator to fully boot..." emulator_status=down - for i in `seq 300` + for i in `seq ${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 @@ -90,7 +97,8 @@ do else 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 ] @@ -101,5 +109,4 @@ do fi done - exit 0