diff --git a/.github/workflows/instrumentation-test.yml b/.github/workflows/instrumentation-test.yml
index d5be42a3..885e1e65 100644
--- a/.github/workflows/instrumentation-test.yml
+++ b/.github/workflows/instrumentation-test.yml
@@ -49,17 +49,10 @@ jobs:
       env:
         MAPS_API_KEY: ${{ secrets.SYNCED_GOOGLE_MAPS_API_KEY_ANDROID }}
 
-    - name: Build debug
-      run: ./gradlew assembleDebug
-
     - name: Run instrumentation tests
-      uses: reactivecircus/android-emulator-runner@v2
-      with:
-        api-level: 29
-        target: google_apis
-        arch: x86
-        disable-animations: true
-        script: ./gradlew :app:connectedCheck --stacktrace
+      run: ./gradlew :app:allDevicesCheck -Pandroid.experimental.testOptions.managedDevices.setupTimeoutMinutes=1200 -Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" --info
+        # Due to a bug, setupTimeoutMinutes is actually expressed in seconds. Fix merged into AGP,
+        # but not released yet as of 7.3.1. TODO clean up once property is fixed
 
     - name: Upload test reports
       if: always()
diff --git a/app/build.gradle b/app/build.gradle
index fafb8155..e67fc3a3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -35,6 +35,18 @@ android {
         jvmTarget = '1.8'
         freeCompilerArgs += '-Xopt-in=kotlin.RequiresOptIn'
     }
+
+    testOptions {
+        managedDevices {
+            devices {
+                pixel5api29(com.android.build.api.dsl.ManagedVirtualDevice) {
+                    device = "Pixel 5"
+                    apiLevel = 29
+                    systemImageSource = "google"
+                }
+            }
+        }
+    }
 }
 
 dependencies {