Skip to content

React Native / Expo SDK 54 app stuck on native splash screen — JS runtime never loads #3080

@ferran-ot

Description

@ferran-ot

Summary

Our React Native (Expo SDK 54) Android app consistently gets stuck on the native splash screen when running on Maestro Cloud. The JavaScript runtime never initializes. The same APK works correctly on Firebase Test Lab and real user devices.

Environment

  • App: React Native 0.81.5, Expo SDK 54, Hermes engine
  • APK: EAS Build (internal distribution, APK format)
  • Maestro Cloud: via mobile-dev-inc/action-maestro-cloud@v2
  • Android API levels tested: 33, 34
  • Device model: pixel_6 (default)

Reproduction

Every test run fails with the same error on the extendedWaitUntil step:

Assertion is false: id: logo-app is visible

The app displays only the native splash screen (black background + logo) for the entire test duration (~90s) and never transitions to the React Native JS UI.

Test flow (debugLaunch.yaml)

appId: com.doctomatic.app
---
- launchApp:
    clearState: true
- takeScreenshot: 01_after_launch
- scroll
- takeScreenshot: 02_after_scroll
- pressKey: Home
- launchApp:
    clearState: false
- takeScreenshot: 03_after_relaunch
- extendedWaitUntil:
    visible:
      id: "logo-app"
    timeout: 60000
- takeScreenshot: 04_logo_visible

Evidence that JS never loads

We instrumented the app with three independent diagnostic channels:

Channel Result
HTTP pings (webhook.site POST at module-level JS) 0 requests received
Sentry (error tracking, Sentry.init() runs at module level) 0 events from test builds
On-screen debug overlay (React state-driven text) Not visible in screenshots

All three are JS-level and none received any data, confirming the React Native bridge / Hermes engine never starts.

Same APK works elsewhere

  • Firebase Test Lab (Robo test): ✅ App launches, navigates, interacts normally
  • Real devices (production users on same APK version): ✅ Sentry receives events from 50+ devices

Failed test runs (Maestro Cloud)

Run ID Date API Level APK
GH Actions #23491261535 2026-03-24 13:13 UTC 34 9nagtYVkrdDM2PbPMhCZ7k.apk
GH Actions #23489324428 2026-03-24 12:26 UTC 33 hpTagrqKyikurMDUpcrcra.apk
GH Actions #23485239253 2026-03-24 10:39 UTC 33 wyFHRY397wew6KtfQNY9of.apk
GH Actions #23439257293 2026-03-23 13:17 UTC 33 (staging build)

What we've tried

  1. Increased extendedWaitUntil timeout to 90s
  2. Added launchApp: permissions: { all: allow }
  3. Disabled version-check modal (SKIP_VERSION_CHECK=true)
  4. Explicitly called SplashScreen.hideAsync() at module level
  5. Downgraded from Expo SDK 55 to SDK 54
  6. Tried API level 33 and 34
  7. Added HTTP pings + Sentry + on-screen overlay for diagnostics

None of these resolved the issue.

Expected behavior

The app should load past the native splash screen within ~5-10 seconds (as it does on Firebase Test Lab and real devices), displaying the login screen with a testID="logo-app" element.

Questions

  1. Are there known issues with Expo/React Native apps on the Maestro Cloud emulator infrastructure?
  2. Does the Maestro Cloud emulator include Google Play Services? (Our app uses Expo push notifications which depend on FCM)
  3. Is there any way to get logcat/adb output from the Maestro Cloud device to see native-level crash logs?
  4. Can we select a different device model or emulator image?

Thank you for your help!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions