COIN/Android: Move android_emulator_launcher.sh to qt5.git

The android emulator launcher script is mainly used in CI and thus
makes sense to be moved there. This also makes it easier to make changes
without having to wait for submodule updates.

ANDROID_EMULATOR_RUNNER is defined in qt5's Android provisioning script.

Also, change the order of instructions execution to set COIN_CTEST_RESULTSDIR
env variable before running the emulator script. That var points to the path
to where the emulator logs are saved.

Task-number: QTQAINFRA-5596
Change-Id: If6ac285fecdc49611c398e8185e6e3e6b9c353fb
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Assam Boudjelthia 2023-06-28 16:09:18 +03:00
parent 27b06e50e0
commit abe7c77d6d
5 changed files with 3 additions and 116 deletions

View File

@ -208,7 +208,6 @@ function(qt_internal_create_wrapper_scripts)
DESTINATION "${INSTALL_LIBEXECDIR}")
qt_internal_create_qt_configure_tests_wrapper_script()
qt_internal_install_android_helper_scripts()
endfunction()
function(qt_internal_create_qt_configure_tests_wrapper_script)
@ -256,9 +255,3 @@ function(qt_internal_create_qt_configure_tests_wrapper_script)
DESTINATION "${INSTALL_BINDIR}")
endif()
endfunction()
function(qt_internal_install_android_helper_scripts)
qt_path_join(destination "${QT_INSTALL_DIR}" "${INSTALL_LIBEXECDIR}")
qt_copy_or_install(PROGRAMS "${CMAKE_CURRENT_SOURCE_DIR}/util/android/android_emulator_launcher.sh"
DESTINATION "${destination}")
endfunction()

View File

@ -61,6 +61,7 @@ instructions:
condition: property
property: features
contains_value: AbortTestingOnFirstFailure
- !include "{{qt/qtbase}}/coin_module_test_android_start_emulator.yaml"
- type: ExecuteCommand
command: "{{.Env.TESTS_ENV_PREFIX}} ctest {{.Env.CTEST_ARGS}}"
executeCommandArgumentSplitingBehavior: SplitAfterVariableSubstitution

View File

@ -3,10 +3,10 @@ instructions:
- type: Group
instructions:
- type: ExecuteCommand
command: "{{.Env.LIBEXEC_INSTALL_DIR}}/android_emulator_launcher.sh"
command: "{{.Env.ANDROID_EMULATOR_RUNNER}}"
maxTimeInSeconds: 600
maxTimeBetweenOutput: 300
userMessageOnFailure: "Failed to start emulator, check coin log and ~/emulator.log"
userMessageOnFailure: "Failed to start emulator, check coin log and testresults log files."
enable_if:
condition: property
property: features

View File

@ -2,7 +2,6 @@ type: Group
instructions:
# The build env is needed on MSVC so that tst_qmake can properly build apps / libraries.
- !include "{{qt/qtbase}}/prepare_building_env.yaml"
- !include "{{qt/qtbase}}/coin_module_test_android_start_emulator.yaml"
- !include "{{qt/qtbase}}/coin_module_test_qnx_start_emulator.yaml"
# The test env vars are needed to pick the proper prefix.bat file.
- !include "{{qt/qtbase}}/cmake_setup_running_tests_env_vars.yaml"

View File

@ -1,106 +0,0 @@
#!/bin/bash
# Copyright (C) 2021 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_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
function check_for_android_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
# "finishes" booting and getprop shows bootanim=stopped and
# boot_completed=1. But sometimes not all packages have been installed (`pm
# list packages` shows only 16 packages installed), and after around half a
# minute the boot animation starts spinning (bootanim=running) again despite
# boot_completed=1 all the time. After some minutes the boot animation stops
# again and the list of packages contains 80 packages. Only then the device is
# 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
# "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'`
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 start-server
if check_for_android_device
then
echo "Emulator is already running but it shouldn't be. Aborting\!"
exit 3
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 &
emulator_pid=$!
disown $emulator_pid
echo "Waiting for emulated device to appear..."
$ADB_EXEC wait-for-device
echo "Waiting a few minutes for the emulator to fully boot..."
emulator_status=down
for i in `seq 300`
do
sleep 1
if check_for_android_device && check_if_fully_booted
then
emulator_status=up
break
fi
done
# If emulator status is still offline after timeout period,
# we can assume it's stuck, and we must restart it
if [ $emulator_status = up ]
then
echo "Emulator started successfully"
break
else
if [ $counter -lt $EMULATOR_MAX_RETRIES ]
then
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 ]
then
echo "Emulator failed to start, reached maximum number of retries. Aborting\!"
exit 2
fi
fi
done
exit 0