@@ -12,21 +12,53 @@ export UNO_UITEST_ANDROID_PROJECT=$BUILD_SOURCESDIRECTORY/Uno.Gallery
1212export UNO_UITEST_BINARY=$BUILD_SOURCESDIRECTORY /Uno.Gallery.UITests/bin/Release/net47/Uno.Gallery.UITests.dll
1313export UNO_EMULATOR_INSTALLED=$BUILD_SOURCESDIRECTORY /build/.emulator_started
1414export UITEST_TEST_TIMEOUT=60m
15- export UNO_UITEST_ANDROIDAPK_PATH=$UNO_UITEST_ANDROIDAPK_BASEPATH /com.nventive.uno.ui.demo-Signed.apk
16- export ANDROID_SIMULATOR_APILEVEL=34
15+
16+ # Prefer the signed APK from build artifacts (Windows job) when available,
17+ # otherwise fall back to the unsigned APK published locally by the UITest job (macOS agent).
18+ APK_FROM_ARTIFACT=" $( ls " $UNO_UITEST_ANDROIDAPK_BASEPATH " /* .apk 2> /dev/null | head -n 1 || true) "
19+ APK_FROM_LOCAL=" $( ls $BUILD_SOURCESDIRECTORY /Uno.Gallery/bin/Release/net9.0-android/android-x64/publish/* .apk 2> /dev/null | head -n 1 || true) "
20+
21+ if [ -f " $APK_FROM_ARTIFACT " ]; then
22+ export UNO_UITEST_ANDROIDAPK_PATH=" $APK_FROM_ARTIFACT "
23+ elif [ -f " $APK_FROM_LOCAL " ]; then
24+ export UNO_UITEST_ANDROIDAPK_PATH=" $APK_FROM_LOCAL "
25+ else
26+ echo " ERROR: APK not found (neither artifact nor local publish)."
27+ exit 1
28+ fi
29+
30+ echo " Using APK: $UNO_UITEST_ANDROIDAPK_PATH "
31+
32+ # .NET 9 UITest workaround (maui#31072): ensure assemblies.blob exists inside the APK
33+ # UITest sometimes refuses to run if no assemblies store is present.
34+ # Related issue: https://github.com/dotnet/maui/issues/31072
35+ command -v zip > /dev/null || { echo " ERROR: 'zip' not found on PATH" ; exit 1; }
36+ tmpdir=" $( mktemp -d) "
37+ touch " $tmpdir /assemblies.blob"
38+ ( cd " $tmpdir " && zip -q " $UNO_UITEST_ANDROIDAPK_PATH " assemblies.blob )
39+ rm -rf " $tmpdir "
40+
41+ export ANDROID_SIMULATOR_APILEVEL=28
1742
1843AVD_NAME=xamarin_android_emulator
1944AVD_CONFIG_FILE=~ /.android/avd/$AVD_NAME .avd/config.ini
2045
2146# Override Android SDK tooling
2247export ANDROID_HOME=$BUILD_SOURCESDIRECTORY /build/android-sdk
2348export ANDROID_SDK_ROOT=$BUILD_SOURCESDIRECTORY /build/android-sdk
49+ export LATEST_CMDLINE_TOOLS_PATH=$ANDROID_SDK_ROOT /cmdline-tools/latest
2450export CMDLINETOOLS=commandlinetools-mac-8512546_latest.zip
2551mkdir -p $ANDROID_HOME
52+
53+ if [ -d $LATEST_CMDLINE_TOOLS_PATH ];
54+ then
55+ rm -rf $LATEST_CMDLINE_TOOLS_PATH
56+ fi
57+
2658wget https://dl.google.com/android/repository/$CMDLINETOOLS
2759unzip $CMDLINETOOLS -d $ANDROID_HOME /cmdline-tools
2860rm $CMDLINETOOLS
29- mv $ANDROID_SDK_ROOT /cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT /cmdline-tools/latest
61+ mv $ANDROID_SDK_ROOT /cmdline-tools/cmdline-tools $LATEST_CMDLINE_TOOLS_PATH
3062
3163if [[ -f $ANDROID_HOME /platform-tools/platform-tools/adb ]]
3264then
3668
3769AVD_NAME=xamarin_android_emulator
3870AVD_CONFIG_FILE=~ /.android/avd/$AVD_NAME .avd/config.ini
71+ EMU_UPDATE_FILE=~ /.android/emu-update-last-check.ini
72+ SDK_MGR_TOOLS_FLAG=.sdk_toolkit_installed
73+
74+ mkdir -p $UNO_UITEST_SCREENSHOT_PATH
75+
76+ install_android_sdk () {
77+ SIMULATOR_APILEVEL=$1
78+
79+ if [[ ! -f $SDK_MGR_TOOLS_FLAG ]];
80+ then
81+ touch $SDK_MGR_TOOLS_FLAG
3982
40- # Install Android SDK emulators and SDKs
41- if [ ! -f " $UNO_EMULATOR_INSTALLED " ];
83+ echo " y" | $LATEST_CMDLINE_TOOLS_PATH /bin/sdkmanager --sdk_root=${ANDROID_HOME} --install ' tools' | tr ' \r' ' \n' | uniq
84+ echo " y" | $LATEST_CMDLINE_TOOLS_PATH /bin/sdkmanager --sdk_root=${ANDROID_HOME} --install ' platform-tools' | tr ' \r' ' \n' | uniq
85+ echo " y" | $LATEST_CMDLINE_TOOLS_PATH /bin/sdkmanager --sdk_root=${ANDROID_HOME} --install ' build-tools;35.0.0' | tr ' \r' ' \n' | uniq
86+ echo " y" | $LATEST_CMDLINE_TOOLS_PATH /bin/sdkmanager --sdk_root=${ANDROID_HOME} --install ' extras;android;m2repository' | tr ' \r' ' \n' | uniq
87+ fi
88+
89+ echo " y" | $LATEST_CMDLINE_TOOLS_PATH /bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " platforms;android-$SIMULATOR_APILEVEL " | tr ' \r' ' \n' | uniq
90+ echo " y" | $LATEST_CMDLINE_TOOLS_PATH /bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " system-images;android-$SIMULATOR_APILEVEL ;google_apis_playstore;x86_64" | tr ' \r' ' \n' | uniq
91+ }
92+
93+
94+ if [[ ! -f $EMU_UPDATE_FILE ]];
4295then
43- echo " y" | $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " tools" | tr ' \r' ' \n' | uniq
44- echo " y" | $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " platform-tools" | tr ' \r' ' \n' | uniq
45- echo " y" | $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " build-tools;35.0.0" | tr ' \r' ' \n' | uniq
46- echo " y" | $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " platforms;android-$ANDROID_SIMULATOR_APILEVEL " | tr ' \r' ' \n' | uniq
47- echo " y" | $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " extras;android;m2repository" | tr ' \r' ' \n' | uniq
96+ touch $EMU_UPDATE_FILE
97+ fi
4898
99+ if [[ ! -f $AVD_CONFIG_FILE ]];
100+ then
49101 # Install AVD files
50- echo " y" | $ANDROID_HOME /cmdline-tools/latest/bin/sdkmanager --sdk_root=${ANDROID_HOME} --install " system-images;android-$ANDROID_SIMULATOR_APILEVEL ;google_apis;x86_64"
102+ install_android_sdk $ANDROID_SIMULATOR_APILEVEL
103+ install_android_sdk 34
104+ install_android_sdk 35
105+
106+ if [[ -f $ANDROID_HOME /platform-tools/platform-tools/adb ]]
107+ then
108+ # It appears that the platform-tools 29.0.6 are extracting into an incorrect path
109+ mv $ANDROID_HOME /platform-tools/platform-tools/* $ANDROID_HOME /platform-tools
110+ fi
51111
52112 # Create emulator
53- echo " no" | $ANDROID_HOME /cmdline-tools/latest/ bin/avdmanager create avd -n $AVD_NAME --abi " x86_64" -k " system-images;android-$ANDROID_SIMULATOR_APILEVEL ;google_apis ;x86_64" --sdcard 128M --force
113+ echo " no" | $LATEST_CMDLINE_TOOLS_PATH / bin/avdmanager create avd -n " $AVD_NAME " --abi " x86_64" -k " system-images;android-$ANDROID_SIMULATOR_APILEVEL ;google_apis_playstore ;x86_64" --sdcard 128M --force
54114
55115 # based on https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#hardware
56116 # >> Agents that run macOS images are provisioned on Mac pros with a 3 core CPU, 14 GB of RAM, and 14 GB of SSD disk space.
@@ -59,27 +119,29 @@ then
59119 # Bump the heap size as the tests are stressing the application
60120 echo " vm.heapSize=256M" >> $AVD_CONFIG_FILE
61121
62- echo $ANDROID_HOME /emulator/emulator -list-avds
122+ $ANDROID_HOME /emulator/emulator -list-avds
123+
124+ echo " Checking for hardware acceleration"
125+ $ANDROID_HOME /emulator/emulator -accel-check
63126
64127 echo " Starting emulator"
65128
129+ # kickstart ADB
130+ $ANDROID_HOME /platform-tools/adb devices
131+
66132 # Start emulator in background
67- nohup $ANDROID_HOME /emulator/emulator \
68- -avd $AVD_NAME \
69- -skin 1280x800 \
70- -memory 4096 \
71- -no-window \
72- -gpu swiftshader_indirect \
73- -no-snapshot \
74- -noaudio \
75- -no-boot-anim \
76- -prop ro.debuggable=1 \
77- > $BUILD_ARTIFACTSTAGINGDIRECTORY /android-emulator-log.txt 2>&1 &
78-
79- touch " $UNO_EMULATOR_INSTALLED "
80- fi
133+ nohup $ANDROID_HOME /emulator/emulator -avd " $AVD_NAME " -skin 1280x800 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim > $UNO_UITEST_SCREENSHOT_PATH /android-emulator-log.txt 2>&1 &
81134
82- mkdir -p $UNO_UITEST_SCREENSHOT_PATH
135+ # Wait for the emulator to finish booting
136+ source $BUILD_SOURCESDIRECTORY /build/scripts/android-uitest-wait-systemui.sh 500
137+
138+ else
139+ # Restart the emulator to avoid running first-time tasks
140+ $ANDROID_HOME /platform-tools/adb reboot
141+
142+ # Wait for the emulator to finish booting
143+ source $BUILD_SOURCESDIRECTORY /build/scripts/android-uitest-wait-systemui.sh 500
144+ fi
83145
84146cp $UNO_UITEST_ANDROIDAPK_PATH $UNO_UITEST_SCREENSHOT_PATH
85147
0 commit comments