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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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/84] 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}"