From d8ce0233e34de0244d6932f8e12dfda44b687ed7 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 14:48:12 -0500 Subject: [PATCH 01/86] Add enable_android_sdk_checks option for Android emulator testing --- .../scripts/android/android-emulator-tests.sh | 74 +++++++++++++++++++ .github/workflows/swift_package_test.yml | 17 ++++- 2 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/scripts/android/android-emulator-tests.sh diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh new file mode 100644 index 00000000..49f65117 --- /dev/null +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -0,0 +1,74 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the Swift.org open source project +## +## Copyright (c) 2025 Apple Inc. and the Swift project authors +## Licensed under Apache License v2.0 with Runtime Library Exception +## +## See https://swift.org/LICENSE.txt for license information +## See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +## +##===----------------------------------------------------------------------===## + +set -euo pipefail + +log() { printf -- "** %s\n" "$*" >&2; } +error() { printf -- "** ERROR: %s\n" "$*" >&2; } +fatal() { error "$@"; exit 1; } + +ANDROID_API=28 +ANDROID_EMULATOR_ARCH="x86_64" +EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" +EMULATOR_NAME="swiftemu" +ANDROID_PROFILE="Pixel 6" + +# see if the Android SDK is even installed +echo "CHECKING FOR ANDROID SDK" +find / -name sdkmanager || true +echo "DONE CHECKING FOR ANDROID SDK" + +# install and start an Android emulator +sdkmanager --list_installed +yes | sdkmanager --licenses > /dev/null +sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" +avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" +emulator -list-avds +# launch the emulator in the background; we will cat the logs at the end +nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log & +adb logcat 2>&1 > logcat.log & + +# create a staging folder where we copy the test executable +# and all the dependent libraries to copy over to the emulator +STAGING="android-test-${PACKAGE}" +rm -rf .build/"${STAGING}" +mkdir .build/"${STAGING}" + +# for the common case of tests referencing their own files as hardwired resource paths +if [[ -d Tests ]]; then + cp -a Tests .build/"${STAGING}" +fi + +cd .build/ +cp -a debug/*.xctest "${STAGING}" +cp -a debug/*.resources "${STAGING}" || true +cp -a ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so "${STAGING}" +cp -a ${SWIFT_ANDROID_SDK_HOME}/swift-android/swift-resources/usr/lib/swift-${ANDROID_EMULATOR_ARCH_TRIPLE}/android/*.so "${STAGING}" + +adb push ${STAGING} /data/local/tmp/ + +cd - + +TEST_CMD="./${PACKAGE}PackageTests.xctest" +TEST_SHELL="cd /data/local/tmp/${STAGING}" +TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" + +# Run test cases a second time with the Swift Testing library +# We additionally need to handle the special exit code EXIT_NO_TESTS_FOUND (69 on Android), +# which can happen when the tests link to Testing, but no tests are executed +# see: https://github.com/swiftlang/swift-package-manager/blob/1b593469e8ad3daf2cc10e798340bd2de68c402d/Sources/Commands/SwiftTestCommand.swift#L1542 +TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library swift-testing && [ \$? -eq 0 ] || [ \$? -eq 69 ]" + +# run the test executable +adb shell "${TEST_SHELL}" + diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index a81d047d..d3afa9c1 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -198,6 +198,10 @@ on: type: boolean description: "Boolean to enable building with the Swift SDK for Android. Defaults to false" default: false + enable_android_sdk_checks: + type: boolean + description: "Boolean to enable testing with the Swift SDK for Android. Defaults to false" + default: false enable_macos_checks: type: boolean description: "Boolean to enable macOS testing. Defaults to false" @@ -592,9 +596,9 @@ jobs: os_version: ${{ fromJson(inputs.linux_os_versions) }} exclude: - ${{ fromJson(inputs.android_exclude_swift_versions) }} - - ${{ fromJson((!inputs.enable_android_sdk_build && inputs.android_sdk_versions) || '[]') }} - - ${{ fromJson((!inputs.enable_android_sdk_build && inputs.android_ndk_versions) || '[]') }} - - ${{ fromJson((!inputs.enable_android_sdk_build && inputs.linux_os_versions) || '[]') }} + - ${{ fromJson((!(inputs.enable_android_sdk_build || inputs.enable_android_sdk_checks) && inputs.android_sdk_versions) || '[]') }} + - ${{ fromJson((!(inputs.enable_android_sdk_build || inputs.enable_android_sdk_checks) && inputs.android_ndk_versions) || '[]') }} + - ${{ fromJson((!(inputs.enable_android_sdk_build || inputs.enable_android_sdk_checks) && inputs.linux_os_versions) || '[]') }} container: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} steps: @@ -642,9 +646,14 @@ jobs: done - name: Pre-build run: ${{ inputs.linux_pre_build_command }} + # TODO: move this after Install Swift SDK for Android and build + - name: Run Android tests on emulator + if: ${{ inputs.enable_android_sdk_checks }} + run: | + ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" - name: Install Swift SDK for Android and build env: - BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} + BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} ${{ inputs.enable_android_sdk_checks && "--build-tests" }} run: | ${{ inputs.android_sdk_pre_build_command }} ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} From b7d0a759100e7398fbcfdbc65ba4fadb679e0418 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 14:49:39 -0500 Subject: [PATCH 02/86] Update build flags --- .github/workflows/swift_package_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d3afa9c1..a659a048 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -653,7 +653,7 @@ jobs: ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" - name: Install Swift SDK for Android and build env: - BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} ${{ inputs.enable_android_sdk_checks && "--build-tests" }} + BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} ${{ inputs.enable_android_sdk_checks && '--build-tests' }} run: | ${{ inputs.android_sdk_pre_build_command }} ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} From 51883a599958a04c335f06a100f1df7fd762927d Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 14:52:04 -0500 Subject: [PATCH 03/86] Pull request enable_android_sdk_checks: true --- .github/workflows/pull_request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index d50222c2..1c16a2e6 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -40,7 +40,7 @@ jobs: # Android android_sdk_pre_build_command: | cd tests/TestPackage - enable_android_sdk_build: true + enable_android_sdk_checks: true # Windows windows_build_command: | cd tests/TestPackage @@ -56,7 +56,7 @@ jobs: # Android android_sdk_pre_build_command: | cd tests/TestPackage - enable_android_sdk_build: true + enable_android_sdk_checks: true # Windows windows_build_command: | cd tests/TestPackage From 427b18b60386116fa80f87f6a4b5735a2c300e0b Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 14:56:57 -0500 Subject: [PATCH 04/86] Fix script location --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- .github/workflows/swift_package_test.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 49f65117..c7f04339 100644 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -25,7 +25,7 @@ ANDROID_PROFILE="Pixel 6" # see if the Android SDK is even installed echo "CHECKING FOR ANDROID SDK" -find / -name sdkmanager || true +find / -type f -name sdkmanager || true echo "DONE CHECKING FOR ANDROID SDK" # install and start an Android emulator diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index a659a048..aa4c981d 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -630,6 +630,8 @@ jobs: run: | if [ "${{ github.repository }}" = "swiftlang/github-workflows" ]; then echo "root=$GITHUB_WORKSPACE" >> $GITHUB_OUTPUT + elif [ "${{ github.repository }}" = "swift-android-sdk/github-workflows" ]; then + echo "root=$GITHUB_WORKSPACE" >> $GITHUB_OUTPUT else echo "root=$GITHUB_WORKSPACE/github-workflows" >> $GITHUB_OUTPUT fi From c0823910cb215950123f0edacc34e57279a107ed Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 14:58:07 -0500 Subject: [PATCH 05/86] Fix script permissions --- .github/workflows/scripts/android/android-emulator-tests.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 .github/workflows/scripts/android/android-emulator-tests.sh diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh old mode 100644 new mode 100755 From 1d76ea74446c9e0ae287f5452f9c53af157b1666 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 15:08:50 -0500 Subject: [PATCH 06/86] Download the Android SDK --- .../scripts/android/android-emulator-tests.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index c7f04339..bd642d42 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -23,11 +23,21 @@ EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_A EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Pixel 6" -# see if the Android SDK is even installed +# download and install the Android SDK +mkdir ~/android-sdk +cd ~/android-sdk +curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip +unzip commandlinetools.zip + +export ANDROID_HOME=${PWD} echo "CHECKING FOR ANDROID SDK" -find / -type f -name sdkmanager || true +find . -type f -name sdkmanager || true echo "DONE CHECKING FOR ANDROID SDK" +#export PATH=${PATH}: + +cd - + # install and start an Android emulator sdkmanager --list_installed yes | sdkmanager --licenses > /dev/null From b7e9a5d49d21e272559eaefbbc32132dc5604def Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 15:12:03 -0500 Subject: [PATCH 07/86] Update the Android SDK --- .github/workflows/scripts/android/android-emulator-tests.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index bd642d42..676239a7 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -29,12 +29,13 @@ cd ~/android-sdk curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip -export ANDROID_HOME=${PWD} echo "CHECKING FOR ANDROID SDK" find . -type f -name sdkmanager || true echo "DONE CHECKING FOR ANDROID SDK" -#export PATH=${PATH}: +export PATH=${PATH}:${PWD}/cmdline-tools/bin + +#export ANDROID_HOME=${PWD} cd - From 1e9bf250f0e8923b54cfd6dcb3bc671b1f886535 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 15:37:00 -0500 Subject: [PATCH 08/86] Install Android SDK using package manager --- .../scripts/android/android-emulator-tests.sh | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 676239a7..7dff731a 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -23,21 +23,34 @@ EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_A EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Pixel 6" -# download and install the Android SDK -mkdir ~/android-sdk -cd ~/android-sdk -curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -unzip commandlinetools.zip - -echo "CHECKING FOR ANDROID SDK" -find . -type f -name sdkmanager || true -echo "DONE CHECKING FOR ANDROID SDK" - -export PATH=${PATH}:${PWD}/cmdline-tools/bin +install_package() { + # Detect package manager + if command -v apt >/dev/null 2>&1; then + INSTALL_PACKAGE_COMMAND="apt update -q && apt install -yq" + elif command -v dnf >/dev/null 2>&1; then + INSTALL_PACKAGE_COMMAND="dnf install -y" + elif command -v yum >/dev/null 2>&1; then + INSTALL_PACKAGE_COMMAND="yum install -y" + else + fatal "No supported package manager found" + fi + eval "$INSTALL_PACKAGE_COMMAND $1" +} + +install_package android-sdk +# download and install the Android SDK +#mkdir ~/android-sdk +#cd ~/android-sdk +#curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip +#unzip commandlinetools.zip + +#echo "CHECKING FOR ANDROID SDK" +#find . -type f -name sdkmanager || true +#echo "DONE CHECKING FOR ANDROID SDK" +#export PATH=${PATH}:${PWD}/cmdline-tools/bin #export ANDROID_HOME=${PWD} - -cd - +#cd - # install and start an Android emulator sdkmanager --list_installed From b19a2f97a3a281b13124951974d5e4dc1e212d40 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 15:43:22 -0500 Subject: [PATCH 09/86] Update the Android SDK --- .../scripts/android/android-emulator-tests.sh | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 7dff731a..f608ced2 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -37,20 +37,18 @@ install_package() { eval "$INSTALL_PACKAGE_COMMAND $1" } -install_package android-sdk +install_package openjdk # download and install the Android SDK -#mkdir ~/android-sdk -#cd ~/android-sdk -#curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -#unzip commandlinetools.zip - -#echo "CHECKING FOR ANDROID SDK" -#find . -type f -name sdkmanager || true -#echo "DONE CHECKING FOR ANDROID SDK" -#export PATH=${PATH}:${PWD}/cmdline-tools/bin -#export ANDROID_HOME=${PWD} -#cd - +mkdir ~/android-sdk +cd ~/android-sdk +export ANDROID_HOME=${PWD} + +curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip +unzip commandlinetools.zip + +export PATH=${PATH}:${PWD}/cmdline-tools/bin +cd - # install and start an Android emulator sdkmanager --list_installed From 4312ecec224607c217ba2de750bc74146f734301 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 15:52:03 -0500 Subject: [PATCH 10/86] Install Java --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index f608ced2..c27a3c01 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -37,7 +37,7 @@ install_package() { eval "$INSTALL_PACKAGE_COMMAND $1" } -install_package openjdk +install_package java-17-openjdk-devel # download and install the Android SDK mkdir ~/android-sdk From 728894a750a560ea819e7f205601759cf0ce8001 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 15:54:35 -0500 Subject: [PATCH 11/86] Install Java --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index c27a3c01..88c500a6 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -37,7 +37,7 @@ install_package() { eval "$INSTALL_PACKAGE_COMMAND $1" } -install_package java-17-openjdk-devel +install_package java-17-openjdk-devel || install_package openjdk-17-jdk # download and install the Android SDK mkdir ~/android-sdk From cb08f995776205c1b8b0c65de43fe28ebbc7a262 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:04:23 -0500 Subject: [PATCH 12/86] Install commandline tools in correct directory --- .../scripts/android/android-emulator-tests.sh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 88c500a6..1f0ffa08 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -37,18 +37,23 @@ install_package() { eval "$INSTALL_PACKAGE_COMMAND $1" } +command -v curl >/dev/null || install_package curl + +# /usr/lib/jvm/java-17-openjdk-amd64 install_package java-17-openjdk-devel || install_package openjdk-17-jdk # download and install the Android SDK mkdir ~/android-sdk -cd ~/android-sdk +pushd ~/android-sdk export ANDROID_HOME=${PWD} curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip - -export PATH=${PATH}:${PWD}/cmdline-tools/bin -cd - +mv cmdline-tools latest +mkdir cmdline-tools +mv latest cmdline-tools +export PATH=${PATH}:${PWD}/cmdline-tools/latest/bin +popd # install and start an Android emulator sdkmanager --list_installed From 4d8249c5a9ab44d629a33dc049159cabd80ddb0d Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:14:58 -0500 Subject: [PATCH 13/86] Update Android SDK --- .../scripts/android/android-emulator-tests.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 1f0ffa08..12bebb81 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -40,13 +40,15 @@ install_package() { command -v curl >/dev/null || install_package curl # /usr/lib/jvm/java-17-openjdk-amd64 -install_package java-17-openjdk-devel || install_package openjdk-17-jdk +log "Installing Java" +install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto # download and install the Android SDK mkdir ~/android-sdk pushd ~/android-sdk export ANDROID_HOME=${PWD} +log "Installing Android cmdline-tools" curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip mv cmdline-tools latest @@ -56,11 +58,21 @@ export PATH=${PATH}:${PWD}/cmdline-tools/latest/bin popd # install and start an Android emulator + +log "Listing installed Android SDKs" sdkmanager --list_installed + +log "Updating Android licenses" yes | sdkmanager --licenses > /dev/null + +log "Installing Android emulator" sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" + +log "Creating Android emulator" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" emulator -list-avds + +log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log & adb logcat 2>&1 > logcat.log & From bad3c647db0e707128e98ef4bf6186c045942960 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:17:41 -0500 Subject: [PATCH 14/86] Update Android SDK --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 12bebb81..c00ee00a 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -63,7 +63,8 @@ log "Listing installed Android SDKs" sdkmanager --list_installed log "Updating Android licenses" -yes | sdkmanager --licenses > /dev/null +yes | sdkmanager --licenses +#> /dev/null log "Installing Android emulator" sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" From 06d6ff7f25a5b6e5a87b362b69957f0e0d8d758a Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:21:04 -0500 Subject: [PATCH 15/86] Update Android SDK --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index c00ee00a..3c76c7e4 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -63,8 +63,7 @@ log "Listing installed Android SDKs" sdkmanager --list_installed log "Updating Android licenses" -yes | sdkmanager --licenses -#> /dev/null +yes | sdkmanager --licenses > /dev/null || true log "Installing Android emulator" sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" From 3c29f25567b829ca2c4925f84424e23d0fbbe6d7 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:25:44 -0500 Subject: [PATCH 16/86] Use different Android emulator device --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 3c76c7e4..13b2cf15 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -21,7 +21,7 @@ ANDROID_API=28 ANDROID_EMULATOR_ARCH="x86_64" EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" EMULATOR_NAME="swiftemu" -ANDROID_PROFILE="Pixel 6" +ANDROID_PROFILE="Nexus 10" install_package() { # Detect package manager From 988484d253e5ccbddd18ea14eb1fbd70b46c0da7 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:37:34 -0500 Subject: [PATCH 17/86] Update path to Android emulator --- .../scripts/android/android-emulator-tests.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 13b2cf15..f18e6f38 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -54,7 +54,10 @@ unzip commandlinetools.zip mv cmdline-tools latest mkdir cmdline-tools mv latest cmdline-tools -export PATH=${PATH}:${PWD}/cmdline-tools/latest/bin +export PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/latest:${ANDROID_HOME}/platform-tools:${PATH} + +find . -name emulator + popd # install and start an Android emulator @@ -75,7 +78,10 @@ emulator -list-avds log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log & -adb logcat 2>&1 > logcat.log & +#adb logcat 2>&1 > logcat.log & + +log "Waiting for Android emulator startup" +adb wait-for-any-device # create a staging folder where we copy the test executable # and all the dependent libraries to copy over to the emulator From cbf8812e633987366882554a3c28ad30df0d0647 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:47:33 -0500 Subject: [PATCH 18/86] Update path to Android emulator --- .../scripts/android/android-emulator-tests.sh | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index f18e6f38..cd16a490 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -41,23 +41,27 @@ command -v curl >/dev/null || install_package curl # /usr/lib/jvm/java-17-openjdk-amd64 log "Installing Java" +# Java packages are named different things on different distributions install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto +log "JAVA_HOME: ${JAVA_HOME}" + +# TODO: java-17-amazon-corretto does not add to JAVA_HOME +log "Checking: /usr/lib/jvm/" +ls /usr/lib/jvm/ || true +log "Checking: /usr/lib/jvm/java-17-amazon-corretto.x86_64" +ls /usr/lib/jvm/java-17-amazon-corretto.x86_64 || true # download and install the Android SDK +log "Installing Android cmdline-tools" mkdir ~/android-sdk pushd ~/android-sdk export ANDROID_HOME=${PWD} - -log "Installing Android cmdline-tools" curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip mv cmdline-tools latest mkdir cmdline-tools mv latest cmdline-tools export PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/latest:${ANDROID_HOME}/platform-tools:${PATH} - -find . -name emulator - popd # install and start an Android emulator @@ -75,9 +79,18 @@ log "Creating Android emulator" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" emulator -list-avds +log "Enable KVM" +# enable KVM on Linux, else error on emulator launch: +# CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). +echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules +sudo udevadm control --reload-rules +sudo udevadm trigger --name-match=kvm + log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end -nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim 2>&1 > emulator.log & +nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & +#2>&1 > emulator.log & + #adb logcat 2>&1 > logcat.log & log "Waiting for Android emulator startup" From 3620be4c848c582106cd23c86dcc7fde3f010d86 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:50:24 -0500 Subject: [PATCH 19/86] Update path to Android emulator --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index cd16a490..e8feb62e 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -43,7 +43,8 @@ command -v curl >/dev/null || install_package curl log "Installing Java" # Java packages are named different things on different distributions install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto -log "JAVA_HOME: ${JAVA_HOME}" +log "JAVA_HOME: ${JAVA_HOME}" || true +which java || true # TODO: java-17-amazon-corretto does not add to JAVA_HOME log "Checking: /usr/lib/jvm/" From 97923bdbe1e3b2b009e24de28b1b7d0be9cfb17a Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 16:54:21 -0500 Subject: [PATCH 20/86] Fix check for JAVA_HOME --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index e8feb62e..bcedc9d5 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -43,7 +43,7 @@ command -v curl >/dev/null || install_package curl log "Installing Java" # Java packages are named different things on different distributions install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto -log "JAVA_HOME: ${JAVA_HOME}" || true +#log "JAVA_HOME: ${JAVA_HOME}" || true which java || true # TODO: java-17-amazon-corretto does not add to JAVA_HOME From 0c5279365e56942464e78c9a6347a781ab934944 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 17:06:37 -0500 Subject: [PATCH 21/86] Install sudo --- .github/workflows/scripts/android/android-emulator-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index bcedc9d5..b906eb7e 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -38,6 +38,7 @@ install_package() { } command -v curl >/dev/null || install_package curl +command -v sudo >/dev/null || install_package sudo # /usr/lib/jvm/java-17-openjdk-amd64 log "Installing Java" From 8b7cdf548757260e5fd75635cebb71d9fa640198 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 17:15:38 -0500 Subject: [PATCH 22/86] Better JAVA_HOME check --- .../scripts/android/android-emulator-tests.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index b906eb7e..51461aed 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -42,9 +42,17 @@ command -v sudo >/dev/null || install_package sudo # /usr/lib/jvm/java-17-openjdk-amd64 log "Installing Java" + +#JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/} +if [[ ! -z "${JAVA_HOME}" ]]; then + log "JAVA_HOME: ${JAVA_HOME}" || true +fi + +log "Checking: /usr/lib/jvm/" +ls /usr/lib/jvm/ || true + # Java packages are named different things on different distributions install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto -#log "JAVA_HOME: ${JAVA_HOME}" || true which java || true # TODO: java-17-amazon-corretto does not add to JAVA_HOME From b3634159a05994048e33fac2a3695ebe9c540941 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 17:16:18 -0500 Subject: [PATCH 23/86] Try not enabling KVM --- .github/workflows/scripts/android/android-emulator-tests.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 51461aed..3f1ea363 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -92,9 +92,9 @@ emulator -list-avds log "Enable KVM" # enable KVM on Linux, else error on emulator launch: # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). -echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules -sudo udevadm control --reload-rules -sudo udevadm trigger --name-match=kvm +#echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules +#sudo udevadm control --reload-rules +#sudo udevadm trigger --name-match=kvm log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end From 9c38d019ec1a69f718ce85087652b95aedef4c2b Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 17:25:10 -0500 Subject: [PATCH 24/86] Try not enabling KVM --- .github/workflows/scripts/android/android-emulator-tests.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 3f1ea363..19bb1d37 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -44,9 +44,9 @@ command -v sudo >/dev/null || install_package sudo log "Installing Java" #JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/} -if [[ ! -z "${JAVA_HOME}" ]]; then - log "JAVA_HOME: ${JAVA_HOME}" || true -fi +#if [[ ! -z "${JAVA_HOME}" ]]; then +# log "JAVA_HOME: ${JAVA_HOME}" || true +#fi log "Checking: /usr/lib/jvm/" ls /usr/lib/jvm/ || true From 4031eee0e94f998c5cf91cc31fadc4bc21eac909 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 17:53:38 -0500 Subject: [PATCH 25/86] Fix install path for Android AVD --- .github/workflows/scripts/android/android-emulator-tests.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 19bb1d37..cfc33b64 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -72,6 +72,8 @@ mv cmdline-tools latest mkdir cmdline-tools mv latest cmdline-tools export PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/latest:${ANDROID_HOME}/platform-tools:${PATH} +export ANDROID_SDK_HOME=${ANDROID_HOME} +export ANDROID_AVD_HOME=${ANDROID_SDK_HOME}/avd popd # install and start an Android emulator @@ -87,9 +89,11 @@ sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;a log "Creating Android emulator" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" + +log "Listing Android emulators" emulator -list-avds -log "Enable KVM" +#log "Enable KVM" # enable KVM on Linux, else error on emulator launch: # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). #echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules From 560f60a542464307d0f65acc9017ddc7300c9831 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 18:03:48 -0500 Subject: [PATCH 26/86] Try to install KVM --- .../scripts/android/android-emulator-tests.sh | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index cfc33b64..82cc3487 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -22,6 +22,7 @@ ANDROID_EMULATOR_ARCH="x86_64" EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" +ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 install_package() { # Detect package manager @@ -61,6 +62,9 @@ ls /usr/lib/jvm/ || true log "Checking: /usr/lib/jvm/java-17-amazon-corretto.x86_64" ls /usr/lib/jvm/java-17-amazon-corretto.x86_64 || true +log "Installing KVM" +install_package qemu-kvm || install_package kvm + # download and install the Android SDK log "Installing Android cmdline-tools" mkdir ~/android-sdk @@ -93,22 +97,25 @@ avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${AN log "Listing Android emulators" emulator -list-avds -#log "Enable KVM" +log "Enable KVM" +emulator -accel-check || true + # enable KVM on Linux, else error on emulator launch: # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). -#echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules -#sudo udevadm control --reload-rules -#sudo udevadm trigger --name-match=kvm +echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules +sudo udevadm control --reload-rules +sudo udevadm trigger --name-match=kvm +emulator -accel-check log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end -nohup emulator -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & +nohup emulator -no-metrics -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & #2>&1 > emulator.log & #adb logcat 2>&1 > logcat.log & log "Waiting for Android emulator startup" -adb wait-for-any-device +timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device # create a staging folder where we copy the test executable # and all the dependent libraries to copy over to the emulator From b09c11b4426c5512afec6ffe2f69a03d2f8cb713 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 18:15:42 -0500 Subject: [PATCH 27/86] Try to install KVM --- .../scripts/android/android-emulator-tests.sh | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 82cc3487..9b4850c4 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -43,27 +43,15 @@ command -v sudo >/dev/null || install_package sudo # /usr/lib/jvm/java-17-openjdk-amd64 log "Installing Java" - -#JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/} -#if [[ ! -z "${JAVA_HOME}" ]]; then -# log "JAVA_HOME: ${JAVA_HOME}" || true -#fi - -log "Checking: /usr/lib/jvm/" -ls /usr/lib/jvm/ || true - # Java packages are named different things on different distributions -install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto -which java || true +command -v java >/dev/null || install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto + +export PATH=${PATH}:/usr/lib/jvm/java/bin:/usr/lib/jvm/jre/bin +command -v java -# TODO: java-17-amazon-corretto does not add to JAVA_HOME -log "Checking: /usr/lib/jvm/" -ls /usr/lib/jvm/ || true -log "Checking: /usr/lib/jvm/java-17-amazon-corretto.x86_64" -ls /usr/lib/jvm/java-17-amazon-corretto.x86_64 || true log "Installing KVM" -install_package qemu-kvm || install_package kvm +install_package qemu-kvm || install_package kvm || install_package @virt # download and install the Android SDK log "Installing Android cmdline-tools" From 1ef5eb51983d0abb6a8072091ce42a609a352fc0 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 18:18:53 -0500 Subject: [PATCH 28/86] Just run tests on a single config --- .github/workflows/pull_request.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 1c16a2e6..1d53cc94 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -9,6 +9,7 @@ on: jobs: tests_with_docker_embedded_swift: + if: false # TODO: re-enable name: Test Embedded Swift SDKs uses: ./.github/workflows/swift_package_test.yml with: @@ -21,6 +22,7 @@ jobs: enable_embedded_wasm_sdk_build: true tests_with_docker: + if: false # TODO: re-enable name: Test with Docker uses: ./.github/workflows/swift_package_test.yml with: @@ -65,6 +67,7 @@ jobs: windows_os_versions: '["windows-2022", "windows-11-arm"]' tests_macos: + if: false # TODO: re-enable name: Test uses: ./.github/workflows/swift_package_test.yml with: @@ -77,6 +80,7 @@ jobs: xcrun swift build build_tests_ios: + if: false # TODO: re-enable name: Build iOS Tests uses: ./.github/workflows/swift_package_test.yml with: From 83625097c30831a930b03c49f6df405026b26768 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 18:25:42 -0500 Subject: [PATCH 29/86] Try installing KVM --- .../scripts/android/android-emulator-tests.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 9b4850c4..e3753e7f 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -49,9 +49,18 @@ command -v java >/dev/null || install_package java-17-openjdk-devel || install_p export PATH=${PATH}:/usr/lib/jvm/java/bin:/usr/lib/jvm/jre/bin command -v java - log "Installing KVM" -install_package qemu-kvm || install_package kvm || install_package @virt +#install_package qemu-kvm || install_package kvm || install_package @virt +# https://help.ubuntu.com/community/KVM/Installation +install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils +sudo adduser `id -un` libvirt +sudo adduser `id -un` kvm +virsh list --all +ls -la /var/run/libvirt/libvirt-sock +ls -l /dev/kvm +rmmod kvm +modprobe -a kvm +ls /etc/udev/rules.d/99-kvm4all.rules || true # download and install the Android SDK log "Installing Android cmdline-tools" From f0a2e9119770453d94b1c97988adb2b8d7d8e688 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 18:29:21 -0500 Subject: [PATCH 30/86] Try installing KVM --- .../scripts/android/android-emulator-tests.sh | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index e3753e7f..fd689e5f 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -23,6 +23,8 @@ EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_A EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 +# TODO: require that this be set by an argument +ANDROID_NDK_HOME="${ANDROID_NDK_HOME:-${ANDROID_HOME}}" install_package() { # Detect package manager @@ -53,13 +55,13 @@ log "Installing KVM" #install_package qemu-kvm || install_package kvm || install_package @virt # https://help.ubuntu.com/community/KVM/Installation install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -sudo adduser `id -un` libvirt -sudo adduser `id -un` kvm -virsh list --all -ls -la /var/run/libvirt/libvirt-sock -ls -l /dev/kvm -rmmod kvm -modprobe -a kvm +sudo adduser `id -un` libvirt || true +sudo adduser `id -un` kvm || true +virsh list --all || true +ls -la /var/run/libvirt/libvirt-sock || true +ls -l /dev/kvm || true +rmmod kvm || true +modprobe -a kvm || true ls /etc/udev/rules.d/99-kvm4all.rules || true # download and install the Android SDK @@ -128,10 +130,10 @@ fi cd .build/ cp -a debug/*.xctest "${STAGING}" cp -a debug/*.resources "${STAGING}" || true -cp -a ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/*/sysroot/usr/lib/${ANDROID_EMULATOR_ARCH_TRIPLE}-linux-android/libc++_shared.so "${STAGING}" -cp -a ${SWIFT_ANDROID_SDK_HOME}/swift-android/swift-resources/usr/lib/swift-${ANDROID_EMULATOR_ARCH_TRIPLE}/android/*.so "${STAGING}" +cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" +cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING}" -adb push ${STAGING} /data/local/tmp/ +adb push "${STAGING}" /data/local/tmp/ cd - From c97c292303ea0cb7911ab259a8b10aec0d719511 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 18:31:06 -0500 Subject: [PATCH 31/86] Try installing KVM --- .../workflows/scripts/android/android-emulator-tests.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index fd689e5f..22bd77a4 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -23,8 +23,6 @@ EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_A EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 -# TODO: require that this be set by an argument -ANDROID_NDK_HOME="${ANDROID_NDK_HOME:-${ANDROID_HOME}}" install_package() { # Detect package manager @@ -55,8 +53,8 @@ log "Installing KVM" #install_package qemu-kvm || install_package kvm || install_package @virt # https://help.ubuntu.com/community/KVM/Installation install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -sudo adduser `id -un` libvirt || true -sudo adduser `id -un` kvm || true +sudo adduser "$(id -un)" libvirt || true +sudo adduser "$(id -un)" kvm || true virsh list --all || true ls -la /var/run/libvirt/libvirt-sock || true ls -l /dev/kvm || true @@ -69,6 +67,9 @@ log "Installing Android cmdline-tools" mkdir ~/android-sdk pushd ~/android-sdk export ANDROID_HOME=${PWD} +# TODO: require that this be set by an argument +export ANDROID_NDK_HOME="${ANDROID_NDK_HOME:-${ANDROID_HOME}}" + curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip mv cmdline-tools latest From 693222562634465080632908ecb74f9dc751bc57 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 19:22:16 -0500 Subject: [PATCH 32/86] Try running emulator with -no-accel --- .../scripts/android/android-emulator-tests.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 22bd77a4..d69a5a9a 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -102,14 +102,15 @@ emulator -accel-check || true # enable KVM on Linux, else error on emulator launch: # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). -echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules -sudo udevadm control --reload-rules -sudo udevadm trigger --name-match=kvm -emulator -accel-check +#echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules +#sudo udevadm control --reload-rules +#sudo udevadm trigger --name-match=kvm +#emulator -accel-check log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end -nohup emulator -no-metrics -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & +# TODO: -no-accel disables the need for KVM, but is very slow +nohup emulator -no-accel -no-metrics -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & #2>&1 > emulator.log & #adb logcat 2>&1 > logcat.log & From 88e55ce3173acba49493b521b946d2d89078d73c Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 19:34:43 -0500 Subject: [PATCH 33/86] Try running tests --- .../workflows/scripts/android/android-emulator-tests.sh | 3 +++ .github/workflows/swift_package_test.yml | 9 ++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index d69a5a9a..b1c9a3b5 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -24,6 +24,9 @@ EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 +# FIXME: pass this in with an argument +PACKAGE="TestPackage" + install_package() { # Detect package manager if command -v apt >/dev/null 2>&1; then diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index aa4c981d..1ef18634 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -648,17 +648,16 @@ jobs: done - name: Pre-build run: ${{ inputs.linux_pre_build_command }} - # TODO: move this after Install Swift SDK for Android and build - - name: Run Android tests on emulator - if: ${{ inputs.enable_android_sdk_checks }} - run: | - ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" - name: Install Swift SDK for Android and build env: BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} ${{ inputs.enable_android_sdk_checks && '--build-tests' }} run: | ${{ inputs.android_sdk_pre_build_command }} ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} + if [[ "${{ inputs.enable_android_sdk_checks }}" == "true" ]]; then + # install and launch the emulator and run the tests + ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" + fi windows-build: name: Windows (${{ matrix.swift_version }} - ${{ matrix.os_version }}) From dedd2a86b622ebd1a36512115008b3d6d0218cf2 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 19:39:31 -0500 Subject: [PATCH 34/86] Try running tests --- .github/workflows/swift_package_test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 1ef18634..13581dc1 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -651,6 +651,7 @@ jobs: - name: Install Swift SDK for Android and build env: BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} ${{ inputs.enable_android_sdk_checks && '--build-tests' }} + shell: bash run: | ${{ inputs.android_sdk_pre_build_command }} ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} From 67efdb90efba48df2d9391b4402242c51295d999 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 19:56:36 -0500 Subject: [PATCH 35/86] Try running tests --- .../workflows/scripts/android/android-emulator-tests.sh | 7 +++++++ .github/workflows/swift_package_test.yml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index b1c9a3b5..e7bdcc72 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -44,6 +44,9 @@ install_package() { command -v curl >/dev/null || install_package curl command -v sudo >/dev/null || install_package sudo +log "Show Disk Space" +df -h + # /usr/lib/jvm/java-17-openjdk-amd64 log "Installing Java" # Java packages are named different things on different distributions @@ -75,6 +78,7 @@ export ANDROID_NDK_HOME="${ANDROID_NDK_HOME:-${ANDROID_HOME}}" curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip +rm commandlinetools.zip mv cmdline-tools latest mkdir cmdline-tools mv latest cmdline-tools @@ -110,6 +114,9 @@ emulator -accel-check || true #sudo udevadm trigger --name-match=kvm #emulator -accel-check +log "Show Disk Space" +df -h + log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end # TODO: -no-accel disables the need for KVM, but is very slow diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 13581dc1..d19ce370 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -650,7 +650,7 @@ jobs: run: ${{ inputs.linux_pre_build_command }} - name: Install Swift SDK for Android and build env: - BUILD_FLAGS: ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} ${{ inputs.enable_android_sdk_checks && '--build-tests' }} + BUILD_FLAGS: ${{ inputs.enable_android_sdk_checks && '--build-tests' }} ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} shell: bash run: | ${{ inputs.android_sdk_pre_build_command }} From 1889eba0671eff7aca79ecaf9083a720c31281f5 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 20:02:51 -0500 Subject: [PATCH 36/86] Try freeing disk space --- .../scripts/android/android-emulator-tests.sh | 20 +++++++++---------- .github/workflows/swift_package_test.yml | 3 +++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index e7bdcc72..f65672fa 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -56,17 +56,17 @@ export PATH=${PATH}:/usr/lib/jvm/java/bin:/usr/lib/jvm/jre/bin command -v java log "Installing KVM" -#install_package qemu-kvm || install_package kvm || install_package @virt +###install_package qemu-kvm || install_package kvm || install_package @virt # https://help.ubuntu.com/community/KVM/Installation -install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -sudo adduser "$(id -un)" libvirt || true -sudo adduser "$(id -un)" kvm || true -virsh list --all || true -ls -la /var/run/libvirt/libvirt-sock || true -ls -l /dev/kvm || true -rmmod kvm || true -modprobe -a kvm || true -ls /etc/udev/rules.d/99-kvm4all.rules || true +#install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils +#sudo adduser "$(id -un)" libvirt || true +#sudo adduser "$(id -un)" kvm || true +#virsh list --all || true +#ls -la /var/run/libvirt/libvirt-sock || true +#ls -l /dev/kvm || true +#rmmod kvm || true +#modprobe -a kvm || true +#ls /etc/udev/rules.d/99-kvm4all.rules || true # download and install the Android SDK log "Installing Android cmdline-tools" diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d19ce370..a3f748b0 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -606,6 +606,9 @@ jobs: run: swift --version - name: Clang version run: clang --version + - name: Free Disk Space + run: | + rm -rf /opt/microsoft /opt/google /usr/share/dotnet /opt/ghc /usr/local/share/boost - name: Checkout repository uses: actions/checkout@v4 if: ${{ matrix.os_version != 'amazonlinux2' }} From 5c112a8fdbf300f03193fdf01262cc5b7f5a7c93 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 20:12:07 -0500 Subject: [PATCH 37/86] Try freeing disk space --- .github/workflows/pull_request.yml | 12 ++++++++---- .../scripts/android/android-emulator-tests.sh | 2 +- .github/workflows/swift_package_test.yml | 5 ++++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 1d53cc94..4d11eb05 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -9,7 +9,8 @@ on: jobs: tests_with_docker_embedded_swift: - if: false # TODO: re-enable + # TODO: re-enable + if: false name: Test Embedded Swift SDKs uses: ./.github/workflows/swift_package_test.yml with: @@ -22,7 +23,8 @@ jobs: enable_embedded_wasm_sdk_build: true tests_with_docker: - if: false # TODO: re-enable + # TODO: re-enable + if: false name: Test with Docker uses: ./.github/workflows/swift_package_test.yml with: @@ -67,7 +69,8 @@ jobs: windows_os_versions: '["windows-2022", "windows-11-arm"]' tests_macos: - if: false # TODO: re-enable + # TODO: re-enable + if: false name: Test uses: ./.github/workflows/swift_package_test.yml with: @@ -80,7 +83,8 @@ jobs: xcrun swift build build_tests_ios: - if: false # TODO: re-enable + # TODO: re-enable + if: false name: Build iOS Tests uses: ./.github/workflows/swift_package_test.yml with: diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index f65672fa..4167dad3 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -120,7 +120,7 @@ df -h log "Starting Android emulator" # launch the emulator in the background; we will cat the logs at the end # TODO: -no-accel disables the need for KVM, but is very slow -nohup emulator -no-accel -no-metrics -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & +nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & #2>&1 > emulator.log & #adb logcat 2>&1 > logcat.log & diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index a3f748b0..f09e3c75 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -608,7 +608,10 @@ jobs: run: clang --version - name: Free Disk Space run: | - rm -rf /opt/microsoft /opt/google /usr/share/dotnet /opt/ghc /usr/local/share/boost + df -h + # need to free space or the emulator runs out + rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium + df -h - name: Checkout repository uses: actions/checkout@v4 if: ${{ matrix.os_version != 'amazonlinux2' }} From 8551570c86a1236a5b82e079be50ca3dbf15090e Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Fri, 12 Dec 2025 20:33:47 -0500 Subject: [PATCH 38/86] Try freeing disk space --- .github/workflows/swift_package_test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index f09e3c75..f873120a 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -611,6 +611,7 @@ jobs: df -h # need to free space or the emulator runs out rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium + du -skh /*/*/* || true df -h - name: Checkout repository uses: actions/checkout@v4 From a714374bcf9629c635627d678230d027017d33b3 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 11:54:32 -0500 Subject: [PATCH 39/86] Try freeing disk space --- .github/workflows/swift_package_test.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index f873120a..3587e29f 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -611,6 +611,14 @@ jobs: df -h # need to free space or the emulator runs out rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium + rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node /usr/bin/docc /__t/CodeQ /__t/Python + echo "du top-level" + du -skhc / || true + echo "du second level" + du -skhc /* || true + echo "du this level" + du -skhc /* || true + du -skh /*/*/* || true df -h - name: Checkout repository From 1c088a2daf3f1c17ffa09916ad598f3d8c1510a7 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 13:42:04 -0500 Subject: [PATCH 40/86] Use x86_64-linux-android for test cases --- .../scripts/android/android-emulator-tests.sh | 1 + .github/workflows/swift_package_test.yml | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 4167dad3..51b2b720 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -22,6 +22,7 @@ ANDROID_EMULATOR_ARCH="x86_64" EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" +ANDROID_EMULATOR_ARCH_TRIPLE="x86_64-linux-android" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 # FIXME: pass this in with an argument diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 3587e29f..d1acb9e7 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -611,15 +611,14 @@ jobs: df -h # need to free space or the emulator runs out rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium + # frees ~4G rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node /usr/bin/docc /__t/CodeQ /__t/Python - echo "du top-level" - du -skhc / || true - echo "du second level" - du -skhc /* || true - echo "du this level" - du -skhc /* || true - - du -skh /*/*/* || true + #echo "du top-level" + #du -skhc / || true + #echo "du second level" + #du -skhc /* || true + echo "du third level" + du -skhc /*/* || true df -h - name: Checkout repository uses: actions/checkout@v4 From 345a468dcb2abe81d80e7c2a915e42372d2b84e2 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 14:19:20 -0500 Subject: [PATCH 41/86] Use x86_64-linux-android for test cases --- .../workflows/scripts/android/android-emulator-tests.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 51b2b720..d60a065f 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -19,10 +19,11 @@ fatal() { error "$@"; exit 1; } ANDROID_API=28 ANDROID_EMULATOR_ARCH="x86_64" +# x86_64=x86_64, armv7=arm +ANDROID_EMULATOR_ARCH_TRIPLE="${ANDROID_EMULATOR_ARCH}" EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" -ANDROID_EMULATOR_ARCH_TRIPLE="x86_64-linux-android" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 # FIXME: pass this in with an argument @@ -100,6 +101,11 @@ log "Installing Android emulator" sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" log "Creating Android emulator" +ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini +mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" +echo '' > "${ANDROID_AVD_CONFIG}" +# ~2G partition side +echo 'disk.dataPartition.size=2000000000' > "${ANDROID_AVD_CONFIG}" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" log "Listing Android emulators" @@ -119,6 +125,7 @@ log "Show Disk Space" df -h log "Starting Android emulator" + # launch the emulator in the background; we will cat the logs at the end # TODO: -no-accel disables the need for KVM, but is very slow nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & From c299a2dff406d28642f0b5a78d91748fc3e358d8 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 14:27:56 -0500 Subject: [PATCH 42/86] Fix AVD partition size --- .../workflows/scripts/android/android-emulator-tests.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index d60a065f..7e037d50 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -102,11 +102,10 @@ sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;a log "Creating Android emulator" ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini -mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" -echo '' > "${ANDROID_AVD_CONFIG}" -# ~2G partition side -echo 'disk.dataPartition.size=2000000000' > "${ANDROID_AVD_CONFIG}" +#mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" +# ~2G partition side +echo 'disk.dataPartition.size=2000000000' >> "${ANDROID_AVD_CONFIG}" log "Listing Android emulators" emulator -list-avds From 8204a10d5ac843a17897a1000c0d6a5e11e85f01 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 14:46:52 -0500 Subject: [PATCH 43/86] Fix AVD partition size --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 7e037d50..15b529c6 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -102,9 +102,9 @@ sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;a log "Creating Android emulator" ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini -#mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" # ~2G partition side +mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" echo 'disk.dataPartition.size=2000000000' >> "${ANDROID_AVD_CONFIG}" log "Listing Android emulators" From 5b015d8bf8b300be17050143ad47a0350ace48f3 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 15:04:41 -0500 Subject: [PATCH 44/86] Fix AVD partition size --- .../workflows/scripts/android/android-emulator-tests.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 15b529c6..a2e15013 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -101,11 +101,11 @@ log "Installing Android emulator" sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" log "Creating Android emulator" -ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -# ~2G partition side -mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" -echo 'disk.dataPartition.size=2000000000' >> "${ANDROID_AVD_CONFIG}" +ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini +#mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" +# ~2G partition size +#echo 'disk.dataPartition.size=2000000000' >> "${ANDROID_AVD_CONFIG}" log "Listing Android emulators" emulator -list-avds From d0d4b4cc2be5bbd8a96cb756f87a81ca3440fbaa Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 15:35:25 -0500 Subject: [PATCH 45/86] Fix location of libc++_shared.so --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index a2e15013..17e1d5fc 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -146,6 +146,8 @@ if [[ -d Tests ]]; then cp -a Tests .build/"${STAGING}" fi +find ~/ -name libc++_shared.so + cd .build/ cp -a debug/*.xctest "${STAGING}" cp -a debug/*.resources "${STAGING}" || true From bf044752e8eeb64b83e87785f4d95c9f940a409c Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 15:59:33 -0500 Subject: [PATCH 46/86] Fix location of libc++_shared.so --- .../scripts/android/android-emulator-tests.sh | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 17e1d5fc..cb546ff4 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -26,9 +26,6 @@ EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 -# FIXME: pass this in with an argument -PACKAGE="TestPackage" - install_package() { # Detect package manager if command -v apt >/dev/null 2>&1; then @@ -135,30 +132,37 @@ nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${E log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device +log "Find libc++_shared.so" +find / -name 'libc++_shared.so' + +log "Prepare Swift test package" + # create a staging folder where we copy the test executable # and all the dependent libraries to copy over to the emulator -STAGING="android-test-${PACKAGE}" +STAGING="swift-android-test" rm -rf .build/"${STAGING}" mkdir .build/"${STAGING}" -# for the common case of tests referencing their own files as hardwired resource paths +# for the common case of tests referencing +# their own files as hardwired resource paths if [[ -d Tests ]]; then cp -a Tests .build/"${STAGING}" fi -find ~/ -name libc++_shared.so - cd .build/ -cp -a debug/*.xctest "${STAGING}" -cp -a debug/*.resources "${STAGING}" || true -cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" +TEST_PACKAGE=$(ls -1 debug/*.xctest | tail -n 1 | xargs basename) +cp -a debug/"${TEST_PACKAGE}" "${STAGING}" +find debug/ -name '*.resources' -exec cp -a {} "${STAGING}" \; cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING}" +cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" + +log "Copy Swift test package to emulator" adb push "${STAGING}" /data/local/tmp/ cd - -TEST_CMD="./${PACKAGE}PackageTests.xctest" +TEST_CMD="./${TEST_PACKAGE}" TEST_SHELL="cd /data/local/tmp/${STAGING}" TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" @@ -168,6 +172,7 @@ TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" # see: https://github.com/swiftlang/swift-package-manager/blob/1b593469e8ad3daf2cc10e798340bd2de68c402d/Sources/Commands/SwiftTestCommand.swift#L1542 TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library swift-testing && [ \$? -eq 0 ] || [ \$? -eq 69 ]" +log "Run Swift package tests" + # run the test executable adb shell "${TEST_SHELL}" - From b0b45952926d24d08b27cf333f9892c37908de96 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 16:05:14 -0500 Subject: [PATCH 47/86] Fix location of libc++_shared.so --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index cb546ff4..a4a8293a 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -154,7 +154,8 @@ TEST_PACKAGE=$(ls -1 debug/*.xctest | tail -n 1 | xargs basename) cp -a debug/"${TEST_PACKAGE}" "${STAGING}" find debug/ -name '*.resources' -exec cp -a {} "${STAGING}" \; cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING}" -cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" +#cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" +cp -a /root/.swiftpm/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" log "Copy Swift test package to emulator" From b0fc2748192cb1c71a80146a3100cef31c3761c4 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 16:10:33 -0500 Subject: [PATCH 48/86] Fix location of libc++_shared.so --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index a4a8293a..424266b1 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -132,9 +132,6 @@ nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${E log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device -log "Find libc++_shared.so" -find / -name 'libc++_shared.so' - log "Prepare Swift test package" # create a staging folder where we copy the test executable From 6433df285b8237236fea88441374ab0cfd127fef Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 16:21:32 -0500 Subject: [PATCH 49/86] Fix location of libc++_shared.so --- .github/workflows/scripts/android/android-emulator-tests.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 424266b1..996974f7 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -132,6 +132,12 @@ nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${E log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device +log "Find libc++_shared.so" +find / -name 'libc++_shared.so' || true + +log "Find libFoundation.so" +find / -name 'lib*Foundation*.so' || true + log "Prepare Swift test package" # create a staging folder where we copy the test executable From bbc4a12a990a189a80318510f89e7bfbd1b0fb62 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 16:29:42 -0500 Subject: [PATCH 50/86] Fix location of libc++_shared.so --- .../workflows/scripts/android/android-emulator-tests.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 996974f7..63073aab 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -26,6 +26,10 @@ EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 +export SWIFTPM_HOME=/root/.swiftpm +export SWIFT_ANDROID_SDK_HOME="${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ +export ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d + install_package() { # Detect package manager if command -v apt >/dev/null 2>&1; then @@ -157,8 +161,7 @@ TEST_PACKAGE=$(ls -1 debug/*.xctest | tail -n 1 | xargs basename) cp -a debug/"${TEST_PACKAGE}" "${STAGING}" find debug/ -name '*.resources' -exec cp -a {} "${STAGING}" \; cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING}" -#cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" -cp -a /root/.swiftpm/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" +cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" log "Copy Swift test package to emulator" From 4f6703e6967c988137345da18653fc3b976e746f Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 16:39:27 -0500 Subject: [PATCH 51/86] Fix location of Swift SDK for Android --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 63073aab..7d15c0af 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -27,7 +27,8 @@ ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 export SWIFTPM_HOME=/root/.swiftpm -export SWIFT_ANDROID_SDK_HOME="${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ +# e.g., /root/.swiftpm/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ +export SWIFT_ANDROID_SDK_HOME=(ls -1 "${SWIFTPM_HOME}"/swift-sdks/swift-*android.artifactbundle | tail -n 1) export ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d install_package() { From 707adbd67b202cd1292d7e60b444412e1d7ef7d9 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 16:48:04 -0500 Subject: [PATCH 52/86] Fix location of Swift SDK for Android --- .../workflows/scripts/android/android-emulator-tests.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 7d15c0af..e010db60 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -27,8 +27,8 @@ ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 export SWIFTPM_HOME=/root/.swiftpm -# e.g., /root/.swiftpm/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ -export SWIFT_ANDROID_SDK_HOME=(ls -1 "${SWIFTPM_HOME}"/swift-sdks/swift-*android.artifactbundle | tail -n 1) +export SWIFT_ANDROID_SDK_HOME="${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ +export SWIFT_ANDROID_SDK_HOME=$(ls -1 "${SWIFTPM_HOME}"/swift-sdks/swift-*android.artifactbundle | tail -n 1) export ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d install_package() { @@ -104,7 +104,7 @@ sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;a log "Creating Android emulator" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini +#ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini #mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" # ~2G partition size #echo 'disk.dataPartition.size=2000000000' >> "${ANDROID_AVD_CONFIG}" @@ -158,7 +158,7 @@ if [[ -d Tests ]]; then fi cd .build/ -TEST_PACKAGE=$(ls -1 debug/*.xctest | tail -n 1 | xargs basename) +TEST_PACKAGE=$(find debug/ -name '*.xctest' | tail -n 1 | xargs basename) cp -a debug/"${TEST_PACKAGE}" "${STAGING}" find debug/ -name '*.resources' -exec cp -a {} "${STAGING}" \; cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING}" From 6cab1f3c6638237dd0483466898a98c6a9f67dc5 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 17:13:08 -0500 Subject: [PATCH 53/86] Fix location of Swift SDK for Android --- .../scripts/android/android-emulator-tests.sh | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index e010db60..c6d6445f 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -27,10 +27,13 @@ ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 export SWIFTPM_HOME=/root/.swiftpm -export SWIFT_ANDROID_SDK_HOME="${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ -export SWIFT_ANDROID_SDK_HOME=$(ls -1 "${SWIFTPM_HOME}"/swift-sdks/swift-*android.artifactbundle | tail -n 1) +#export SWIFT_ANDROID_SDK_HOME="${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ +export SWIFT_ANDROID_SDK_HOME=$(find "${SWIFTPM_HOME}"/swift-sdks -maxdepth 1 -name 'swift-*android.artifactbundle' | tail -n 1) export ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d +log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" +log "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}" + install_package() { # Detect package manager if command -v apt >/dev/null 2>&1; then @@ -137,12 +140,6 @@ nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${E log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device -log "Find libc++_shared.so" -find / -name 'libc++_shared.so' || true - -log "Find libFoundation.so" -find / -name 'lib*Foundation*.so' || true - log "Prepare Swift test package" # create a staging folder where we copy the test executable From e9109523d280c45322105236640347f5cc05de5d Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 17:22:31 -0500 Subject: [PATCH 54/86] Fix location of Swift SDK for Android --- .../scripts/android/android-emulator-tests.sh | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index c6d6445f..07c3c81b 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -144,31 +144,32 @@ log "Prepare Swift test package" # create a staging folder where we copy the test executable # and all the dependent libraries to copy over to the emulator -STAGING="swift-android-test" -rm -rf .build/"${STAGING}" -mkdir .build/"${STAGING}" +STAGING_DIR="swift-android-test" +rm -rf .build/"${STAGING_DIR}" +mkdir .build/"${STAGING_DIR}" # for the common case of tests referencing # their own files as hardwired resource paths if [[ -d Tests ]]; then - cp -a Tests .build/"${STAGING}" + cp -a Tests .build/"${STAGING_DIR}" fi cd .build/ TEST_PACKAGE=$(find debug/ -name '*.xctest' | tail -n 1 | xargs basename) -cp -a debug/"${TEST_PACKAGE}" "${STAGING}" -find debug/ -name '*.resources' -exec cp -a {} "${STAGING}" \; -cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING}" -cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING}" +cp -a debug/"${TEST_PACKAGE}" "${STAGING_DIR}" +find debug/ -name '*.resources' -exec cp -a {} "${STAGING_DIR}" \; +cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING_DIR}" +cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" log "Copy Swift test package to emulator" -adb push "${STAGING}" /data/local/tmp/ +ANDROID_TMP_FOLDER="/data/local/tmp" +adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" cd - TEST_CMD="./${TEST_PACKAGE}" -TEST_SHELL="cd /data/local/tmp/${STAGING}" +TEST_SHELL="cd ${ANDROID_TMP_FOLDER}/${STAGING_DIR}" TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" # Run test cases a second time with the Swift Testing library From 6563fe6e23aecb9cded5ddc5922ae678fd3b9a60 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 17:28:11 -0500 Subject: [PATCH 55/86] Fix location of Swift SDK for Android --- .github/workflows/scripts/android/android-emulator-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 07c3c81b..a3b31062 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -181,4 +181,5 @@ TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library swift-testing && [ \$ log "Run Swift package tests" # run the test executable +adb shell "ls ${ANDROID_TMP_FOLDER}" adb shell "${TEST_SHELL}" From 7d58ee6bc671fcb39db050381c532d6cf584a71c Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 17:37:57 -0500 Subject: [PATCH 56/86] Fix location of Swift SDK for Android --- .../scripts/android/android-emulator-tests.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index a3b31062..755806b3 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -26,10 +26,10 @@ EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 -export SWIFTPM_HOME=/root/.swiftpm -#export SWIFT_ANDROID_SDK_HOME="${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ -export SWIFT_ANDROID_SDK_HOME=$(find "${SWIFTPM_HOME}"/swift-sdks -maxdepth 1 -name 'swift-*android.artifactbundle' | tail -n 1) -export ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d +SWIFTPM_HOME=/root/.swiftpm +# e.g., "${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ +SWIFT_ANDROID_SDK_HOME=$(find "${SWIFTPM_HOME}"/swift-sdks -maxdepth 1 -name 'swift-*android.artifactbundle' | tail -n 1) +ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" log "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}" @@ -163,7 +163,7 @@ cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROI log "Copy Swift test package to emulator" -ANDROID_TMP_FOLDER="/data/local/tmp" +ANDROID_TMP_FOLDER="/data/local/tmp/${STAGING_DIR}" adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" cd - From c705e86537c76e00143241df87cdc6e0f0ace6de Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Sun, 14 Dec 2025 17:45:25 -0500 Subject: [PATCH 57/86] Fix location of Swift SDK for Android --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 755806b3..3bb2b793 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -169,7 +169,7 @@ adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" cd - TEST_CMD="./${TEST_PACKAGE}" -TEST_SHELL="cd ${ANDROID_TMP_FOLDER}/${STAGING_DIR}" +TEST_SHELL="cd ${ANDROID_TMP_FOLDER}" TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" # Run test cases a second time with the Swift Testing library From e56b090cc2d3498e11e7de7d0501c784b5580eb4 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 11:19:44 -0500 Subject: [PATCH 58/86] Set AVD partition size --- .../scripts/android/android-emulator-tests.sh | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 3bb2b793..5cf05a22 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -80,12 +80,13 @@ log "Installing Android cmdline-tools" mkdir ~/android-sdk pushd ~/android-sdk export ANDROID_HOME=${PWD} -# TODO: require that this be set by an argument -export ANDROID_NDK_HOME="${ANDROID_NDK_HOME:-${ANDROID_HOME}}" curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip unzip commandlinetools.zip rm commandlinetools.zip +# a quirk of the archive is that its root is cmdline-tools, +# but when executed they are expected to be at cmdline-tools/latest +# or else the other relative paths are not identified correctly mv cmdline-tools latest mkdir cmdline-tools mv latest cmdline-tools @@ -99,18 +100,18 @@ popd log "Listing installed Android SDKs" sdkmanager --list_installed -log "Updating Android licenses" +log "Updating Android SDK licenses" yes | sdkmanager --licenses > /dev/null || true log "Installing Android emulator" -sdkmanager --install "${EMULATOR_SPEC}" "emulator" "platform-tools" "platforms;android-${ANDROID_API}" +sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_API}" "${EMULATOR_SPEC}" log "Creating Android emulator" avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -#ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini -#mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" +ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini +mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" # ~2G partition size -#echo 'disk.dataPartition.size=2000000000' >> "${ANDROID_AVD_CONFIG}" +echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" log "Listing Android emulators" emulator -list-avds @@ -130,12 +131,9 @@ df -h log "Starting Android emulator" -# launch the emulator in the background; we will cat the logs at the end -# TODO: -no-accel disables the need for KVM, but is very slow -nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -avd "${EMULATOR_NAME}" -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim & -#2>&1 > emulator.log & - -#adb logcat 2>&1 > logcat.log & +# launch the emulator in the background +# -no-accel disables the need for KVM, but is very slow +nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${EMULATOR_NAME}" & log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device @@ -154,7 +152,8 @@ if [[ -d Tests ]]; then cp -a Tests .build/"${STAGING_DIR}" fi -cd .build/ +pushd .build/ + TEST_PACKAGE=$(find debug/ -name '*.xctest' | tail -n 1 | xargs basename) cp -a debug/"${TEST_PACKAGE}" "${STAGING_DIR}" find debug/ -name '*.resources' -exec cp -a {} "${STAGING_DIR}" \; @@ -166,7 +165,7 @@ log "Copy Swift test package to emulator" ANDROID_TMP_FOLDER="/data/local/tmp/${STAGING_DIR}" adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" -cd - +popd TEST_CMD="./${TEST_PACKAGE}" TEST_SHELL="cd ${ANDROID_TMP_FOLDER}" @@ -175,11 +174,10 @@ TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" # Run test cases a second time with the Swift Testing library # We additionally need to handle the special exit code EXIT_NO_TESTS_FOUND (69 on Android), # which can happen when the tests link to Testing, but no tests are executed -# see: https://github.com/swiftlang/swift-package-manager/blob/1b593469e8ad3daf2cc10e798340bd2de68c402d/Sources/Commands/SwiftTestCommand.swift#L1542 +# see: https://github.com/swiftlang/swift-package-manager/blob/main/Sources/Commands/SwiftTestCommand.swift#L1571 TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library swift-testing && [ \$? -eq 0 ] || [ \$? -eq 69 ]" log "Run Swift package tests" # run the test executable -adb shell "ls ${ANDROID_TMP_FOLDER}" adb shell "${TEST_SHELL}" From 25c305b64cbe7de3543236cdf507b23db764d8fa Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 11:34:37 -0500 Subject: [PATCH 59/86] Set AVD partition size --- .github/workflows/scripts/android/android-emulator-tests.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 5cf05a22..b45c75f9 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -107,11 +107,14 @@ log "Installing Android emulator" sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_API}" "${EMULATOR_SPEC}" log "Creating Android emulator" -avdmanager create avd -n "${EMULATOR_NAME}" -k "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" +avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" +find "${ANDROID_AVD_HOME}" ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" # ~2G partition size echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" +log "Checking Android emulator" +find "${ANDROID_AVD_HOME}" log "Listing Android emulators" emulator -list-avds From 4a197ee3384e8f054498fbebf3a09d3ee5ca08af Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 11:40:04 -0500 Subject: [PATCH 60/86] Set AVD partition size --- .../workflows/scripts/android/android-emulator-tests.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index b45c75f9..5e4b8005 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -62,7 +62,7 @@ command -v java >/dev/null || install_package java-17-openjdk-devel || install_p export PATH=${PATH}:/usr/lib/jvm/java/bin:/usr/lib/jvm/jre/bin command -v java -log "Installing KVM" +#log "Installing KVM" ###install_package qemu-kvm || install_package kvm || install_package @virt # https://help.ubuntu.com/community/KVM/Installation #install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils @@ -108,7 +108,10 @@ sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_AP log "Creating Android emulator" avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -find "${ANDROID_AVD_HOME}" + +find "${ANDROID_AVD_HOME}" || true +find "~/.android" || true + ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" # ~2G partition size From 6841907c074c46ec7fda1ccf1b119c43c8c31ebb Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 11:46:44 -0500 Subject: [PATCH 61/86] Set AVD partition size --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 +-- .github/workflows/swift_package_test.yml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 5e4b8005..056ce1e4 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -109,8 +109,7 @@ sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_AP log "Creating Android emulator" avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -find "${ANDROID_AVD_HOME}" || true -find "~/.android" || true +find / -name 'swiftemu.avd' ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d1acb9e7..d2a1ae73 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -612,7 +612,7 @@ jobs: # need to free space or the emulator runs out rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium # frees ~4G - rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node /usr/bin/docc /__t/CodeQ /__t/Python + rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node* /__t/CodeQL /__t/Python #echo "du top-level" #du -skhc / || true #echo "du second level" From 4a2a9c70ebb4aa50dc390054e0cbd9ccae4c5f1c Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 11:52:51 -0500 Subject: [PATCH 62/86] Set AVD partition size --- .github/workflows/scripts/android/android-emulator-tests.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 056ce1e4..cee56da7 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -92,7 +92,7 @@ mkdir cmdline-tools mv latest cmdline-tools export PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/latest:${ANDROID_HOME}/platform-tools:${PATH} export ANDROID_SDK_HOME=${ANDROID_HOME} -export ANDROID_AVD_HOME=${ANDROID_SDK_HOME}/avd +export ANDROID_AVD_HOME=${HOME}/.android/avd popd # install and start an Android emulator @@ -109,10 +109,8 @@ sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_AP log "Creating Android emulator" avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -find / -name 'swiftemu.avd' - ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini -mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" +#mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" # ~2G partition size echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" log "Checking Android emulator" From a86bcba589dab2c2b7895a95036d5bed3ae10099 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 11:58:31 -0500 Subject: [PATCH 63/86] Set AVD partition size --- .../workflows/scripts/android/android-emulator-tests.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index cee56da7..3e17f683 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -108,19 +108,22 @@ sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_AP log "Creating Android emulator" avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" +echo "Searching for emulator in: ${ANDROID_AVD_HOME}" +find "${ANDROID_AVD_HOME}" || true +echo "Searching for emulator in: /" +find / | grep "${EMULATOR_NAME}" || true ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini #mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" # ~2G partition size echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" log "Checking Android emulator" -find "${ANDROID_AVD_HOME}" log "Listing Android emulators" emulator -list-avds -log "Enable KVM" -emulator -accel-check || true +#log "Enable KVM" +#emulator -accel-check || true # enable KVM on Linux, else error on emulator launch: # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). From ca5f01ddaa7a8b300132669609355462023977dc Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:07:33 -0500 Subject: [PATCH 64/86] Set AVD partition size --- .github/workflows/scripts/android/android-emulator-tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 3e17f683..68b06cab 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -92,7 +92,7 @@ mkdir cmdline-tools mv latest cmdline-tools export PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/latest:${ANDROID_HOME}/platform-tools:${PATH} export ANDROID_SDK_HOME=${ANDROID_HOME} -export ANDROID_AVD_HOME=${HOME}/.android/avd +export ANDROID_AVD_HOME=${ANDROID_HOME}/.android/avd popd # install and start an Android emulator @@ -114,7 +114,7 @@ echo "Searching for emulator in: /" find / | grep "${EMULATOR_NAME}" || true ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini -#mkdir -p "$(dirname ${ANDROID_AVD_CONFIG})" +#mkdir -p $(dirname "${ANDROID_AVD_CONFIG}") # ~2G partition size echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" log "Checking Android emulator" From 1add73b21317d7a7e3b7ac497b3c1ea50e1e12e3 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:08:24 -0500 Subject: [PATCH 65/86] Set AVD partition size --- .../scripts/android/android-emulator-tests.sh | 1 + .github/workflows/swift_package_test.yml | 14 -------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 68b06cab..63a4976a 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -118,6 +118,7 @@ ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini # ~2G partition size echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" log "Checking Android emulator" +cat "${ANDROID_AVD_CONFIG}" log "Listing Android emulators" emulator -list-avds diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d2a1ae73..d19ce370 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -606,20 +606,6 @@ jobs: run: swift --version - name: Clang version run: clang --version - - name: Free Disk Space - run: | - df -h - # need to free space or the emulator runs out - rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium - # frees ~4G - rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node* /__t/CodeQL /__t/Python - #echo "du top-level" - #du -skhc / || true - #echo "du second level" - #du -skhc /* || true - echo "du third level" - du -skhc /*/* || true - df -h - name: Checkout repository uses: actions/checkout@v4 if: ${{ matrix.os_version != 'amazonlinux2' }} From 1ecdca9250f142bb8106f743a67537f57a91c7c9 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:18:32 -0500 Subject: [PATCH 66/86] Set AVD partition size --- .../workflows/scripts/android/android-emulator-tests.sh | 7 ++++--- .github/workflows/swift_package_test.yml | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 63a4976a..a751f96b 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -113,15 +113,16 @@ find "${ANDROID_AVD_HOME}" || true echo "Searching for emulator in: /" find / | grep "${EMULATOR_NAME}" || true +log "Configuring Android emulators" +emulator -list-avds + ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini #mkdir -p $(dirname "${ANDROID_AVD_CONFIG}") # ~2G partition size -echo 'disk.dataPartition.size=1024MB' >> "${ANDROID_AVD_CONFIG}" +echo 'disk.dataPartition.size=2GB' >> "${ANDROID_AVD_CONFIG}" log "Checking Android emulator" cat "${ANDROID_AVD_CONFIG}" -log "Listing Android emulators" -emulator -list-avds #log "Enable KVM" #emulator -accel-check || true diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d19ce370..14a24134 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -606,6 +606,13 @@ jobs: run: swift --version - name: Clang version run: clang --version + - name: Free Disk Space + run: | + df -h + # need to free space or the Android emulator runs out + # frees ~4G + rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node* /__t/CodeQL /__t/Python + df -h - name: Checkout repository uses: actions/checkout@v4 if: ${{ matrix.os_version != 'amazonlinux2' }} From ea1eb0aaee682c551fe64b2922a327786a0f0f8d Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:29:08 -0500 Subject: [PATCH 67/86] Run without a docker container --- .../scripts/android/android-emulator-tests.sh | 66 +------------------ .github/workflows/swift_package_test.yml | 32 ++++----- 2 files changed, 15 insertions(+), 83 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index a751f96b..bbedbc7d 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -48,55 +48,7 @@ install_package() { eval "$INSTALL_PACKAGE_COMMAND $1" } -command -v curl >/dev/null || install_package curl -command -v sudo >/dev/null || install_package sudo - -log "Show Disk Space" -df -h - -# /usr/lib/jvm/java-17-openjdk-amd64 -log "Installing Java" -# Java packages are named different things on different distributions -command -v java >/dev/null || install_package java-17-openjdk-devel || install_package openjdk-17-jdk || install_package java-openjdk17 || install_package java-17-amazon-corretto - -export PATH=${PATH}:/usr/lib/jvm/java/bin:/usr/lib/jvm/jre/bin -command -v java - -#log "Installing KVM" -###install_package qemu-kvm || install_package kvm || install_package @virt -# https://help.ubuntu.com/community/KVM/Installation -#install_package qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -#sudo adduser "$(id -un)" libvirt || true -#sudo adduser "$(id -un)" kvm || true -#virsh list --all || true -#ls -la /var/run/libvirt/libvirt-sock || true -#ls -l /dev/kvm || true -#rmmod kvm || true -#modprobe -a kvm || true -#ls /etc/udev/rules.d/99-kvm4all.rules || true - -# download and install the Android SDK -log "Installing Android cmdline-tools" -mkdir ~/android-sdk -pushd ~/android-sdk -export ANDROID_HOME=${PWD} - -curl --connect-timeout 30 --retry 3 --retry-delay 2 --retry-max-time 60 -fsSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -unzip commandlinetools.zip -rm commandlinetools.zip -# a quirk of the archive is that its root is cmdline-tools, -# but when executed they are expected to be at cmdline-tools/latest -# or else the other relative paths are not identified correctly -mv cmdline-tools latest -mkdir cmdline-tools -mv latest cmdline-tools -export PATH=${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/tools:${ANDROID_HOME}/build-tools/latest:${ANDROID_HOME}/platform-tools:${PATH} -export ANDROID_SDK_HOME=${ANDROID_HOME} -export ANDROID_AVD_HOME=${ANDROID_HOME}/.android/avd -popd - # install and start an Android emulator - log "Listing installed Android SDKs" sdkmanager --list_installed @@ -123,25 +75,13 @@ echo 'disk.dataPartition.size=2GB' >> "${ANDROID_AVD_CONFIG}" log "Checking Android emulator" cat "${ANDROID_AVD_CONFIG}" - -#log "Enable KVM" -#emulator -accel-check || true - -# enable KVM on Linux, else error on emulator launch: -# CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). -#echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules -#sudo udevadm control --reload-rules -#sudo udevadm trigger --name-match=kvm -#emulator -accel-check - -log "Show Disk Space" -df -h +log "Check Hardware Acceleration (KVM)" +emulator -accel-check log "Starting Android emulator" # launch the emulator in the background -# -no-accel disables the need for KVM, but is very slow -nohup emulator -no-accel -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${EMULATOR_NAME}" & +nohup emulator -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${EMULATOR_NAME}" & log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 14a24134..41d60b5a 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -586,21 +586,17 @@ jobs: ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --embedded-wasm --flags="$BUILD_FLAGS" ${{ matrix.swift_version }} android-sdk-build: - name: Swift SDK for Android Build (${{ matrix.swift_version }} - ${{ matrix.os_version }} - NDK ${{ matrix.ndk_version }}) + name: Swift SDK for Android Build (${{ matrix.swift_version }} - NDK ${{ matrix.ndk_version }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: swift_version: ${{ fromJson(inputs.android_sdk_versions) }} ndk_version: ${{ fromJson(inputs.android_ndk_versions) }} - os_version: ${{ fromJson(inputs.linux_os_versions) }} exclude: - ${{ fromJson(inputs.android_exclude_swift_versions) }} - ${{ fromJson((!(inputs.enable_android_sdk_build || inputs.enable_android_sdk_checks) && inputs.android_sdk_versions) || '[]') }} - ${{ fromJson((!(inputs.enable_android_sdk_build || inputs.enable_android_sdk_checks) && inputs.android_ndk_versions) || '[]') }} - - ${{ fromJson((!(inputs.enable_android_sdk_build || inputs.enable_android_sdk_checks) && inputs.linux_os_versions) || '[]') }} - container: - image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} steps: - name: Swift version run: swift --version @@ -609,39 +605,35 @@ jobs: - name: Free Disk Space run: | df -h - # need to free space or the Android emulator runs out - # frees ~4G - rm -rf /__t/PyPy /__t/Ruby /__t/go /__t/node* /__t/CodeQL /__t/Python + # need to free space or the emulator runs out + rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium df -h - name: Checkout repository uses: actions/checkout@v4 - if: ${{ matrix.os_version != 'amazonlinux2' }} - - name: Checkout repository - uses: actions/checkout@v1 - if: ${{ matrix.os_version == 'amazonlinux2' }} - name: Checkout swiftlang/github-workflows repository - if: ${{ matrix.os_version != 'amazonlinux2' && github.repository != 'swiftlang/github-workflows' }} uses: actions/checkout@v4 with: repository: swiftlang/github-workflows path: github-workflows - - name: Checkout swiftlang/github-workflows repository - if: ${{ matrix.os_version == 'amazonlinux2' && github.repository != 'swiftlang/github-workflows' }} - uses: actions/checkout@v1 - with: - repository: swiftlang/github-workflows - path: ${{ github.event.repository.name }}/github-workflows - ref: main - name: Determine script-root path id: script_path run: | if [ "${{ github.repository }}" = "swiftlang/github-workflows" ]; then echo "root=$GITHUB_WORKSPACE" >> $GITHUB_OUTPUT elif [ "${{ github.repository }}" = "swift-android-sdk/github-workflows" ]; then + # TODO: for testing in fork, remove when ready to merge echo "root=$GITHUB_WORKSPACE" >> $GITHUB_OUTPUT else echo "root=$GITHUB_WORKSPACE/github-workflows" >> $GITHUB_OUTPUT fi + - name: Enable KVM + if: ${{ inputs.enable_android_sdk_checks }} + run: | + # enable KVM on Linux for tests, else error on emulator launch: + # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - name: Provide token if: ${{ inputs.needs_token }} run: | From 4411d7e1f74fac03e05221311120fd3642cd0e4e Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:34:22 -0500 Subject: [PATCH 68/86] Run without a docker container --- .../scripts/android/android-emulator-tests.sh | 14 -------------- .github/workflows/swift_package_test.yml | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index bbedbc7d..d1119f7b 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -34,20 +34,6 @@ ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" log "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}" -install_package() { - # Detect package manager - if command -v apt >/dev/null 2>&1; then - INSTALL_PACKAGE_COMMAND="apt update -q && apt install -yq" - elif command -v dnf >/dev/null 2>&1; then - INSTALL_PACKAGE_COMMAND="dnf install -y" - elif command -v yum >/dev/null 2>&1; then - INSTALL_PACKAGE_COMMAND="yum install -y" - else - fatal "No supported package manager found" - fi - eval "$INSTALL_PACKAGE_COMMAND $1" -} - # install and start an Android emulator log "Listing installed Android SDKs" sdkmanager --list_installed diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 41d60b5a..ce51383e 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -606,7 +606,7 @@ jobs: run: | df -h # need to free space or the emulator runs out - rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium + sudo rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium df -h - name: Checkout repository uses: actions/checkout@v4 From a0c6393c18873f7d236ebe9cfe0d63f231a551bd Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:44:36 -0500 Subject: [PATCH 69/86] Run without a docker container --- .github/workflows/scripts/android/android-emulator-tests.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index d1119f7b..57e0bc07 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -26,13 +26,11 @@ EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 -SWIFTPM_HOME=/root/.swiftpm +SWIFTPM_HOME="${XDG_CONFIG_HOME}"/swiftpm # e.g., "${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ SWIFT_ANDROID_SDK_HOME=$(find "${SWIFTPM_HOME}"/swift-sdks -maxdepth 1 -name 'swift-*android.artifactbundle' | tail -n 1) -ANDROID_NDK_HOME="${SWIFTPM_HOME}"/android-ndk-r27d log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" -log "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}" # install and start an Android emulator log "Listing installed Android SDKs" @@ -92,7 +90,7 @@ TEST_PACKAGE=$(find debug/ -name '*.xctest' | tail -n 1 | xargs basename) cp -a debug/"${TEST_PACKAGE}" "${STAGING_DIR}" find debug/ -name '*.resources' -exec cp -a {} "${STAGING_DIR}" \; cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING_DIR}" -cp -a "${ANDROID_NDK_HOME}"/toolchains/llvm/prebuilt/*/sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" +cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" log "Copy Swift test package to emulator" From a5a207b82fe61d03e8516b86b6e02982fb029074 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:55:14 -0500 Subject: [PATCH 70/86] Run without a docker container --- .../scripts/android/android-emulator-tests.sh | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 57e0bc07..f60e951b 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -17,11 +17,6 @@ log() { printf -- "** %s\n" "$*" >&2; } error() { printf -- "** ERROR: %s\n" "$*" >&2; } fatal() { error "$@"; exit 1; } -ANDROID_API=28 -ANDROID_EMULATOR_ARCH="x86_64" -# x86_64=x86_64, armv7=arm -ANDROID_EMULATOR_ARCH_TRIPLE="${ANDROID_EMULATOR_ARCH}" -EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 @@ -30,10 +25,52 @@ SWIFTPM_HOME="${XDG_CONFIG_HOME}"/swiftpm # e.g., "${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ SWIFT_ANDROID_SDK_HOME=$(find "${SWIFTPM_HOME}"/swift-sdks -maxdepth 1 -name 'swift-*android.artifactbundle' | tail -n 1) +ANDROID_SDK_TRIPLES="x86_64-unknown-linux-android28" + +while [[ $# -gt 0 ]]; do + case $1 in + --android) + INSTALL_ANDROID=true + shift + ;; + --android-ndk-version=*) + ANDROID_NDK_VERSION="${1#*=}" + shift + ;; + --android-sdk-triple=*) + ANDROID_SDK_TRIPLES+=("${1#*=}") + shift + ;; + -*) + fatal "Unknown option: $1" + ;; + *) + if [[ -z "$SWIFT_VERSION_INPUT" ]]; then + SWIFT_VERSION_INPUT="$1" + else + fatal "Multiple Swift versions specified: $SWIFT_VERSION_INPUT and $1" + fi + shift + ;; + esac +done + +# extract the API level from the end of the triple +ANDROID_API="${ANDROID_EMULATOR_ARCH_TRIPLE/*-unknown-linux-android/}" +# extract the build arch from the beginning of the triple +ANDROID_EMULATOR_ARCH="${ANDROID_EMULATOR_ARCH_TRIPLE/-unknown-linux-android*/}" + +# x86_64=x86_64, armv7=arm +ANDROID_EMULATOR_ARCH_TRIPLE="${ANDROID_EMULATOR_ARCH}" + +EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" + log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" # install and start an Android emulator log "Listing installed Android SDKs" +export PATH="${PATH}:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/build-tools/latest:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin" + sdkmanager --list_installed log "Updating Android SDK licenses" From edb124043f345f9cb5b06f68c6b6bb01ffa4805b Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 12:59:18 -0500 Subject: [PATCH 71/86] Fix ANDROID_SDK_TRIPLE --- .../workflows/scripts/android/android-emulator-tests.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index f60e951b..9ed73fdf 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -25,7 +25,7 @@ SWIFTPM_HOME="${XDG_CONFIG_HOME}"/swiftpm # e.g., "${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ SWIFT_ANDROID_SDK_HOME=$(find "${SWIFTPM_HOME}"/swift-sdks -maxdepth 1 -name 'swift-*android.artifactbundle' | tail -n 1) -ANDROID_SDK_TRIPLES="x86_64-unknown-linux-android28" +ANDROID_SDK_TRIPLE="x86_64-unknown-linux-android28" while [[ $# -gt 0 ]]; do case $1 in @@ -38,7 +38,7 @@ while [[ $# -gt 0 ]]; do shift ;; --android-sdk-triple=*) - ANDROID_SDK_TRIPLES+=("${1#*=}") + ANDROID_SDK_TRIPLE="${1#*=}" shift ;; -*) @@ -56,9 +56,9 @@ while [[ $# -gt 0 ]]; do done # extract the API level from the end of the triple -ANDROID_API="${ANDROID_EMULATOR_ARCH_TRIPLE/*-unknown-linux-android/}" +ANDROID_API="${ANDROID_SDK_TRIPLE/*-unknown-linux-android/}" # extract the build arch from the beginning of the triple -ANDROID_EMULATOR_ARCH="${ANDROID_EMULATOR_ARCH_TRIPLE/-unknown-linux-android*/}" +ANDROID_EMULATOR_ARCH="${ANDROID_SDK_TRIPLE/-unknown-linux-android*/}" # x86_64=x86_64, armv7=arm ANDROID_EMULATOR_ARCH_TRIPLE="${ANDROID_EMULATOR_ARCH}" From 77fd5d6fea0e0277471f132a5efb3432f3b3ed44 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 13:05:04 -0500 Subject: [PATCH 72/86] Fix ANDROID_AVD_HOME --- .../scripts/android/android-emulator-tests.sh | 21 ------------------- .github/workflows/swift_package_test.yml | 2 +- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 9ed73fdf..553068b0 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -29,14 +29,6 @@ ANDROID_SDK_TRIPLE="x86_64-unknown-linux-android28" while [[ $# -gt 0 ]]; do case $1 in - --android) - INSTALL_ANDROID=true - shift - ;; - --android-ndk-version=*) - ANDROID_NDK_VERSION="${1#*=}" - shift - ;; --android-sdk-triple=*) ANDROID_SDK_TRIPLE="${1#*=}" shift @@ -81,26 +73,14 @@ sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_AP log "Creating Android emulator" avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" -echo "Searching for emulator in: ${ANDROID_AVD_HOME}" -find "${ANDROID_AVD_HOME}" || true -echo "Searching for emulator in: /" -find / | grep "${EMULATOR_NAME}" || true log "Configuring Android emulators" emulator -list-avds -ANDROID_AVD_CONFIG="${ANDROID_AVD_HOME}"/"${EMULATOR_NAME}".avd/config.ini -#mkdir -p $(dirname "${ANDROID_AVD_CONFIG}") -# ~2G partition size -echo 'disk.dataPartition.size=2GB' >> "${ANDROID_AVD_CONFIG}" -log "Checking Android emulator" -cat "${ANDROID_AVD_CONFIG}" - log "Check Hardware Acceleration (KVM)" emulator -accel-check log "Starting Android emulator" - # launch the emulator in the background nohup emulator -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${EMULATOR_NAME}" & @@ -108,7 +88,6 @@ log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device log "Prepare Swift test package" - # create a staging folder where we copy the test executable # and all the dependent libraries to copy over to the emulator STAGING_DIR="swift-android-test" diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index ce51383e..54b7e228 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -656,7 +656,7 @@ jobs: ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} if [[ "${{ inputs.enable_android_sdk_checks }}" == "true" ]]; then # install and launch the emulator and run the tests - ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" + ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} fi windows-build: From 4f63ef232a6dacc25ef7c6ca3fda39d980e44249 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 13:12:29 -0500 Subject: [PATCH 73/86] Fix ANDROID_AVD_HOME --- .github/workflows/scripts/android/android-emulator-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 553068b0..f39ce6ce 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -72,6 +72,7 @@ log "Installing Android emulator" sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_API}" "${EMULATOR_SPEC}" log "Creating Android emulator" +export ANDROID_AVD_HOME=${XDG_CONFIG_HOME:-$HOME}/.android/avd avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" log "Configuring Android emulators" From fe29bf4a2a6c846bd315a442d47f8ce7c9acf16a Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 13:34:49 -0500 Subject: [PATCH 74/86] Cleanup copy of test resources and executables --- .../scripts/android/android-emulator-tests.sh | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index f39ce6ce..73f5a5f1 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -92,23 +92,22 @@ log "Prepare Swift test package" # create a staging folder where we copy the test executable # and all the dependent libraries to copy over to the emulator STAGING_DIR="swift-android-test" -rm -rf .build/"${STAGING_DIR}" -mkdir .build/"${STAGING_DIR}" +rm -rf "${STAGING_DIR}" +mkdir "${STAGING_DIR}" + +BUILD_DIR=.build/"${ANDROID_SDK_TRIPLE}"/debug + +find "${BUILD_DIR}" -name '*.xctest' -o -name '*.resources' -exec cp -a {} "${STAGING_DIR}" \; + +# also copy required libraries +cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" # for the common case of tests referencing # their own files as hardwired resource paths if [[ -d Tests ]]; then - cp -a Tests .build/"${STAGING_DIR}" + cp -a Tests "${STAGING_DIR}" fi -pushd .build/ - -TEST_PACKAGE=$(find debug/ -name '*.xctest' | tail -n 1 | xargs basename) -cp -a debug/"${TEST_PACKAGE}" "${STAGING_DIR}" -find debug/ -name '*.resources' -exec cp -a {} "${STAGING_DIR}" \; -cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING_DIR}" -cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" - log "Copy Swift test package to emulator" ANDROID_TMP_FOLDER="/data/local/tmp/${STAGING_DIR}" From 0cc3112cc5edaf34977ee9f8bc39053131609470 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 13:39:09 -0500 Subject: [PATCH 75/86] Cleanup copy of test resources and executables --- .../scripts/android/android-emulator-tests.sh | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 73f5a5f1..cdd6bd6e 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -17,7 +17,6 @@ log() { printf -- "** %s\n" "$*" >&2; } error() { printf -- "** ERROR: %s\n" "$*" >&2; } fatal() { error "$@"; exit 1; } -EMULATOR_NAME="swiftemu" ANDROID_PROFILE="Nexus 10" ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 @@ -33,6 +32,10 @@ while [[ $# -gt 0 ]]; do ANDROID_SDK_TRIPLE="${1#*=}" shift ;; + --android-profile=*) + ANDROID_PROFILE="${1#*=}" + shift + ;; -*) fatal "Unknown option: $1" ;; @@ -63,9 +66,8 @@ log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" log "Listing installed Android SDKs" export PATH="${PATH}:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/build-tools/latest:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin" -sdkmanager --list_installed - log "Updating Android SDK licenses" +sdkmanager --list_installed yes | sdkmanager --licenses > /dev/null || true log "Installing Android emulator" @@ -73,7 +75,8 @@ sdkmanager --install "emulator" "platform-tools" "platforms;android-${ANDROID_AP log "Creating Android emulator" export ANDROID_AVD_HOME=${XDG_CONFIG_HOME:-$HOME}/.android/avd -avdmanager create avd --force -n "${EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" +ANDROID_EMULATOR_NAME="swiftemu" +avdmanager create avd --force -n "${ANDROID_EMULATOR_NAME}" --package "${EMULATOR_SPEC}" --device "${ANDROID_PROFILE}" log "Configuring Android emulators" emulator -list-avds @@ -83,7 +86,7 @@ emulator -accel-check log "Starting Android emulator" # launch the emulator in the background -nohup emulator -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${EMULATOR_NAME}" & +nohup emulator -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${ANDROID_EMULATOR_NAME}" & log "Waiting for Android emulator startup" timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device @@ -97,10 +100,11 @@ mkdir "${STAGING_DIR}" BUILD_DIR=.build/"${ANDROID_SDK_TRIPLE}"/debug -find "${BUILD_DIR}" -name '*.xctest' -o -name '*.resources' -exec cp -a {} "${STAGING_DIR}" \; +find "${BUILD_DIR}" -name '*.xctest' -exec cp -av {} "${STAGING_DIR}" \; +find "${BUILD_DIR}" -name '*.resources' -exec cp -av {} "${STAGING_DIR}" \; # also copy required libraries -cp -a "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" +cp -av "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" # for the common case of tests referencing # their own files as hardwired resource paths @@ -113,8 +117,6 @@ log "Copy Swift test package to emulator" ANDROID_TMP_FOLDER="/data/local/tmp/${STAGING_DIR}" adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" -popd - TEST_CMD="./${TEST_PACKAGE}" TEST_SHELL="cd ${ANDROID_TMP_FOLDER}" TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" From c09530dc60f8cf8cede8b858be75849088eb161f Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 13:47:37 -0500 Subject: [PATCH 76/86] Cleanup copy of test resources and executables --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index cdd6bd6e..4953b887 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -117,7 +117,7 @@ log "Copy Swift test package to emulator" ANDROID_TMP_FOLDER="/data/local/tmp/${STAGING_DIR}" adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" -TEST_CMD="./${TEST_PACKAGE}" +TEST_CMD="./*.xctest" TEST_SHELL="cd ${ANDROID_TMP_FOLDER}" TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" From 2f1c57ffc98629ac4606fc558af4f21d56be69c7 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 13:54:51 -0500 Subject: [PATCH 77/86] Break up build and test run into two separate steps --- .github/workflows/swift_package_test.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 54b7e228..5a92b1c8 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -654,10 +654,12 @@ jobs: run: | ${{ inputs.android_sdk_pre_build_command }} ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} - if [[ "${{ inputs.enable_android_sdk_checks }}" == "true" ]]; then - # install and launch the emulator and run the tests - ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} - fi + - name: Install Android Emulator and run tests + if: ${{ inputs.enable_android_sdk_checks }} + shell: bash + run: | + ${{ inputs.android_sdk_pre_build_command }} + ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/android/android-emulator-tests.sh --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} windows-build: name: Windows (${{ matrix.swift_version }} - ${{ matrix.os_version }}) From 614fb271f81741d362a904035e1be28f5afe70fa Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 14:09:07 -0500 Subject: [PATCH 78/86] Add explicit --testing-library arg --- .../scripts/android/android-emulator-tests.sh | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 4953b887..9ae96078 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -18,7 +18,7 @@ error() { printf -- "** ERROR: %s\n" "$*" >&2; } fatal() { error "$@"; exit 1; } ANDROID_PROFILE="Nexus 10" -ANDROID_EMULATOR_LAUNCH_TIMEOUT=300 +ANDROID_EMULATOR_TIMEOUT=300 SWIFTPM_HOME="${XDG_CONFIG_HOME}"/swiftpm # e.g., "${SWIFTPM_HOME}"/swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-12-11-a_android.artifactbundle/ @@ -36,6 +36,10 @@ while [[ $# -gt 0 ]]; do ANDROID_PROFILE="${1#*=}" shift ;; + --android-emulator-timeout=*) + ANDROID_EMULATOR_TIMEOUT="${1#*=}" + shift + ;; -*) fatal "Unknown option: $1" ;; @@ -52,6 +56,7 @@ done # extract the API level from the end of the triple ANDROID_API="${ANDROID_SDK_TRIPLE/*-unknown-linux-android/}" + # extract the build arch from the beginning of the triple ANDROID_EMULATOR_ARCH="${ANDROID_SDK_TRIPLE/-unknown-linux-android*/}" @@ -65,9 +70,9 @@ log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" # install and start an Android emulator log "Listing installed Android SDKs" export PATH="${PATH}:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/build-tools/latest:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin" +sdkmanager --list_installed log "Updating Android SDK licenses" -sdkmanager --list_installed yes | sdkmanager --licenses > /dev/null || true log "Installing Android emulator" @@ -89,7 +94,7 @@ log "Starting Android emulator" nohup emulator -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${ANDROID_EMULATOR_NAME}" & log "Waiting for Android emulator startup" -timeout ${ANDROID_EMULATOR_LAUNCH_TIMEOUT} adb wait-for-any-device +timeout ${ANDROID_EMULATOR_TIMEOUT} adb wait-for-any-device log "Prepare Swift test package" # create a staging folder where we copy the test executable @@ -103,11 +108,11 @@ BUILD_DIR=.build/"${ANDROID_SDK_TRIPLE}"/debug find "${BUILD_DIR}" -name '*.xctest' -exec cp -av {} "${STAGING_DIR}" \; find "${BUILD_DIR}" -name '*.resources' -exec cp -av {} "${STAGING_DIR}" \; -# also copy required libraries +# copy over the required library dependencies cp -av "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" # for the common case of tests referencing -# their own files as hardwired resource paths +# their own files as hardwired paths instead of resources if [[ -d Tests ]]; then cp -a Tests "${STAGING_DIR}" fi @@ -119,11 +124,12 @@ adb push "${STAGING_DIR}" "${ANDROID_TMP_FOLDER}" TEST_CMD="./*.xctest" TEST_SHELL="cd ${ANDROID_TMP_FOLDER}" -TEST_SHELL="${TEST_SHELL} && ${TEST_CMD}" +TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library xctest" # Run test cases a second time with the Swift Testing library -# We additionally need to handle the special exit code EXIT_NO_TESTS_FOUND (69 on Android), -# which can happen when the tests link to Testing, but no tests are executed +# We additionally need to handle the special exit code +# EXIT_NO_TESTS_FOUND (69 on Android), which can happen +# when the tests link to Testing, but no tests are executed # see: https://github.com/swiftlang/swift-package-manager/blob/main/Sources/Commands/SwiftTestCommand.swift#L1571 TEST_SHELL="${TEST_SHELL} && ${TEST_CMD} --testing-library swift-testing && [ \$? -eq 0 ] || [ \$? -eq 69 ]" From 5adabf6ecf83b7fc0cdadf4eec2220e9ee7af383 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 14:29:34 -0500 Subject: [PATCH 79/86] Check with ANDROID_SDK_TRIPLES --- .github/workflows/pull_request.yml | 12 ------------ .github/workflows/swift_package_test.yml | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 4d11eb05..28c5cb73 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -9,8 +9,6 @@ on: jobs: tests_with_docker_embedded_swift: - # TODO: re-enable - if: false name: Test Embedded Swift SDKs uses: ./.github/workflows/swift_package_test.yml with: @@ -23,8 +21,6 @@ jobs: enable_embedded_wasm_sdk_build: true tests_with_docker: - # TODO: re-enable - if: false name: Test with Docker uses: ./.github/workflows/swift_package_test.yml with: @@ -41,10 +37,6 @@ jobs: wasm_sdk_pre_build_command: | cd tests/TestPackage enable_wasm_sdk_build: true - # Android - android_sdk_pre_build_command: | - cd tests/TestPackage - enable_android_sdk_checks: true # Windows windows_build_command: | cd tests/TestPackage @@ -69,8 +61,6 @@ jobs: windows_os_versions: '["windows-2022", "windows-11-arm"]' tests_macos: - # TODO: re-enable - if: false name: Test uses: ./.github/workflows/swift_package_test.yml with: @@ -83,8 +73,6 @@ jobs: xcrun swift build build_tests_ios: - # TODO: re-enable - if: false name: Build iOS Tests uses: ./.github/workflows/swift_package_test.yml with: diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 5a92b1c8..04fab290 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -150,7 +150,7 @@ on: android_sdk_triples: type: string description: "The triples to use when building with the Swift SDK for Android" - default: "[\"aarch64-unknown-linux-android28\", \"x86_64-unknown-linux-android28\"]" + default: "[\"aarch64-unknown-linux-android28\"]" android_ndk_versions: type: string description: "The NDK versions to use when building with the Swift SDK for Android" From 441304968fbb57d186e65372fa4cd2481a115de3 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 14:34:48 -0500 Subject: [PATCH 80/86] Check with ANDROID_SDK_TRIPLES --- .github/workflows/swift_package_test.yml | 31 ++++++++++-------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 04fab290..6ea529c4 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -150,7 +150,7 @@ on: android_sdk_triples: type: string description: "The triples to use when building with the Swift SDK for Android" - default: "[\"aarch64-unknown-linux-android28\"]" + default: "[\"aarch64-unknown-linux-android28\", \"x86_64-unknown-linux-android28\"]" android_ndk_versions: type: string description: "The NDK versions to use when building with the Swift SDK for Android" @@ -602,12 +602,6 @@ jobs: run: swift --version - name: Clang version run: clang --version - - name: Free Disk Space - run: | - df -h - # need to free space or the emulator runs out - sudo rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium - df -h - name: Checkout repository uses: actions/checkout@v4 - name: Checkout swiftlang/github-workflows repository @@ -620,20 +614,9 @@ jobs: run: | if [ "${{ github.repository }}" = "swiftlang/github-workflows" ]; then echo "root=$GITHUB_WORKSPACE" >> $GITHUB_OUTPUT - elif [ "${{ github.repository }}" = "swift-android-sdk/github-workflows" ]; then - # TODO: for testing in fork, remove when ready to merge - echo "root=$GITHUB_WORKSPACE" >> $GITHUB_OUTPUT else echo "root=$GITHUB_WORKSPACE/github-workflows" >> $GITHUB_OUTPUT fi - - name: Enable KVM - if: ${{ inputs.enable_android_sdk_checks }} - run: | - # enable KVM on Linux for tests, else error on emulator launch: - # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - name: Provide token if: ${{ inputs.needs_token }} run: | @@ -654,6 +637,18 @@ jobs: run: | ${{ inputs.android_sdk_pre_build_command }} ${{ steps.script_path.outputs.root }}/.github/workflows/scripts/install-and-build-with-sdk.sh --android --flags="$BUILD_FLAGS" --build-command="${{ inputs.android_sdk_build_command }}" --android-sdk-triple=${{ join(fromJson(inputs.android_sdk_triples), ' --android-sdk-triple=') }} --android-ndk-version="${{ matrix.ndk_version }}" ${{ matrix.swift_version }} + - name: Enable KVM and free disk space + if: ${{ inputs.enable_android_sdk_checks }} + run: | + # enable KVM on Linux for tests, else error on emulator launch: + # CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm). + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + # need to free space or the emulator runs out + sudo rm -rf /opt/microsoft /opt/google /opt/az /opt/ghc /usr/share/dotnet /usr/local/share/boost /opt/hostedtoolcache /usr/local/share/chromium + df -h - name: Install Android Emulator and run tests if: ${{ inputs.enable_android_sdk_checks }} shell: bash From 89d75357c16faf4ec18a1ad3aabf7bb9fbfffd83 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 15:03:46 -0500 Subject: [PATCH 81/86] Cleanup --- .github/workflows/scripts/android/android-emulator-tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 9ae96078..2688f420 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -109,7 +109,8 @@ find "${BUILD_DIR}" -name '*.xctest' -exec cp -av {} "${STAGING_DIR}" \; find "${BUILD_DIR}" -name '*.resources' -exec cp -av {} "${STAGING_DIR}" \; # copy over the required library dependencies -cp -av "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" +cp -av "${SWIFT_ANDROID_SDK_HOME}"/swift-android/swift-resources/usr/lib/swift-"${ANDROID_EMULATOR_ARCH_TRIPLE}"/android/*.so "${STAGING_DIR}" +cp -av "${SWIFT_ANDROID_SDK_HOME}"/swift-android/ndk-sysroot/usr/lib/"${ANDROID_EMULATOR_ARCH_TRIPLE}"-linux-android/libc++_shared.so "${STAGING_DIR}" # for the common case of tests referencing # their own files as hardwired paths instead of resources From c0e37d70ee574df5c9ad7dd76ea6025665cf9fb7 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 15 Dec 2025 15:08:45 -0500 Subject: [PATCH 82/86] Quote ANDROID_EMULATOR_TIMEOUT for shellcheck --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 2688f420..0a4c492b 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -94,7 +94,7 @@ log "Starting Android emulator" nohup emulator -no-metrics -partition-size 1024 -memory 4096 -wipe-data -no-window -no-snapshot -noaudio -no-boot-anim -avd "${ANDROID_EMULATOR_NAME}" & log "Waiting for Android emulator startup" -timeout ${ANDROID_EMULATOR_TIMEOUT} adb wait-for-any-device +timeout "${ANDROID_EMULATOR_TIMEOUT}" adb wait-for-any-device log "Prepare Swift test package" # create a staging folder where we copy the test executable From 15a740d35e7f058cc73ab30a2b80ed251c9054fd Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Tue, 16 Dec 2025 10:24:35 -0500 Subject: [PATCH 83/86] Add log message about which triple is under test --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 0a4c492b..2b1aae92 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -63,6 +63,8 @@ ANDROID_EMULATOR_ARCH="${ANDROID_SDK_TRIPLE/-unknown-linux-android*/}" # x86_64=x86_64, armv7=arm ANDROID_EMULATOR_ARCH_TRIPLE="${ANDROID_EMULATOR_ARCH}" +log "Running tests for ${ANDROID_SDK_TRIPLE}" + EMULATOR_SPEC="system-images;android-${ANDROID_API};default;${ANDROID_EMULATOR_ARCH}" log "SWIFT_ANDROID_SDK_HOME=${SWIFT_ANDROID_SDK_HOME}" From 5f4d9bfce671bdf95159cc42cc948595a6f4f806 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Tue, 16 Dec 2025 21:56:23 -0500 Subject: [PATCH 84/86] Add warning when Package.swift contains macros --- .github/workflows/scripts/android/android-emulator-tests.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 2b1aae92..87fe5b42 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -120,6 +120,10 @@ if [[ -d Tests ]]; then cp -a Tests "${STAGING_DIR}" fi +# warn about macros in packages, as per +# https://github.com/swiftlang/github-workflows/pull/215#discussion_r2621335245 +grep -q '\.macro(' Package.swift && log "WARNING: Packages with macros are known to have issues with cross-compilation: https://github.com/swiftlang/swift-package-manager/issues/8094" || true + log "Copy Swift test package to emulator" ANDROID_TMP_FOLDER="/data/local/tmp/${STAGING_DIR}" From 2eb42fe5e6567308037a0041c7159e041c6fedd1 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 29 Dec 2025 14:20:57 -0500 Subject: [PATCH 85/86] Fix syntax for shellcheck --- .github/workflows/scripts/android/android-emulator-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/android/android-emulator-tests.sh b/.github/workflows/scripts/android/android-emulator-tests.sh index 87fe5b42..b346b0f7 100755 --- a/.github/workflows/scripts/android/android-emulator-tests.sh +++ b/.github/workflows/scripts/android/android-emulator-tests.sh @@ -122,7 +122,7 @@ fi # warn about macros in packages, as per # https://github.com/swiftlang/github-workflows/pull/215#discussion_r2621335245 -grep -q '\.macro(' Package.swift && log "WARNING: Packages with macros are known to have issues with cross-compilation: https://github.com/swiftlang/swift-package-manager/issues/8094" || true +! grep -lq '\.macro(' Package.swift || log "WARNING: Packages with macros are known to have issues with cross-compilation: https://github.com/swiftlang/swift-package-manager/issues/8094" log "Copy Swift test package to emulator" From 8a7fc1c3e4b6021ab9156cf09a89ba9196be0cd1 Mon Sep 17 00:00:00 2001 From: Marc Prud'hommeaux Date: Mon, 5 Jan 2026 12:38:23 -0500 Subject: [PATCH 86/86] Add input parameter description for android_sdk_triples clarifying that the last triple in the list is used for emulator testing --- .github/workflows/swift_package_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 6ea529c4..e0ac6893 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -149,7 +149,7 @@ on: default: "swift build" android_sdk_triples: type: string - description: "The triples to use when building with the Swift SDK for Android" + description: "The triples to use when building with the Swift SDK for Android. The final triple in the list will be used for the emulator testing and should match the host architecture." default: "[\"aarch64-unknown-linux-android28\", \"x86_64-unknown-linux-android28\"]" android_ndk_versions: type: string