Release Date: November 12, 2024
Expo SDK 52 includes React Native 0.76 and marks the rollout of React Native's New Architecture by default for all newly created projects.
The New Architecture Rollout
After a year of collaboration with Meta, Software Mansion, and community developers, the New Architecture is now enabled by default for all new projects from SDK 52 onward.
What the Rollout Looks Like
- The New Architecture is enabled by default for all new projects. New projects created with
npx create-expo-app will have newArchEnabled set to true in app.json.
- Existing projects can opt in to the New Architecture after upgrading. It's not required and won't be automatically enabled. SDK 53 will likely enable it by default, and a future 2025 release may remove the ability to use the old architecture.
- Expo Go for SDK 52+ only supports the New Architecture. All Expo SDK packages and included third-party libraries support it. You can opt out by setting
newArchEnabled to false and creating a development build.
Testing Your App
- Ensure you use the latest version of all third-party native libraries
- Run
npx expo-doctor@latest to find incompatibilities with the New Architecture
- Read about known issues and learn how to enable the New Architecture in your app
Highlights
Platform Updates
- iOS deployment target bumped from 13.4 to iOS 15.1, matching React Native 0.76 requirements
- Android
minSdkVersion and compileSdkVersion bumped from 23 to 24 and 34 to 35 respectively
New and Improved Libraries
expo-video - Now stable. Migrated from beta with improvements based on community feedback. More reliable, easier to use, more performant, and more powerful than the Video component from expo-av. Includes lock screen controls and Picture-in-Picture support on both Android and iOS, plus a utility for generating video thumbnails.
expo-audio - New beta library providing a modern, stable, and easy-to-use API for adding audio to apps. Not yet included in Expo Go.
expo-file-system/next - Beta release of a rebuilt library with a new API designed for ease of use. Enables synchronous read/write operations using SharedObjects and advanced features like stateful file handles. Fully backwards compatible.
expo-camera - Many improvements after being promoted from expo-camera/next in SDK 51. Now more robust with Swift Concurrency for improved reliability.
expo-live-photo - New iOS-only library for playing back iOS Live Photos. Added support to expo-image-picker for picking live photos.
expo-image v2 - Introduces the useImage hook for preloading images with size and metadata before rendering. Returns a shared reference to a native image instance that can be passed directly to the Image component. Added onDisplay event when images are displayed on screen.
expo-image-manipulator - New object-oriented, contextual API that is more performant and provides better developer experience.
expo-sqlite improvements:
- New
expo-sqlite/kv-store API provides convenient key/value storage, implementing the same API as @react-native-async-storage/async-storage with synchronous APIs
- Now supports SQLCipher (enable via config plugin)
- Now supports saving databases to shared containers on iOS for app extension sharing
expo-notifications improvements - Many bug fixes and improvements including better FCMv1 support and improved background task support that now runs even when app is terminated.
Other improvements:
- Expo DevTools Plugins now support binary payloads like
Uint8Array
- iOS 18 tinted icons support now available
- Fixed environment variables issue with embedded
expoConfig in expo-constants
- Calendar form sheets now launchable from
expo-calendar
- expo/fetch - WinterCG-compliant Fetch API drop-in replacement with download streaming support
- React Navigation v7 now available (automatic upgrade for Expo Router users)
- React Native DevTools replaces the JavaScript debugger from SDK 47
- Edge-to-edge layouts on Android improved with
react-native-edge-to-edge library support
Splash Screen Improvements
- Migrated to Android 12 SplashScreen API, resolving long-standing issues on Android 12+
- Fade transitions now easier:
SplashScreen.setOptions({ fade: true, duration: 1000 })
- Dark mode splash screens officially supported through the config plugin
- Intent to deprecate the
splash field in favor of the config plugin for developers using Continuous Native Generation
Known Splash Screen Limitations
- Config plugin properties don't apply to the splash-screen view during app launch in Expo Go or development builds—you'll need to rebuild the app to see changes
- Debug builds on Android 13+ show a black screen between splash and app UI when using
preventAutoHideAsync() (doesn't impact release builds; appears to be an Android OS issue)
DOM Components
DOM Components make it easier to incrementally migrate from web to native and provide an escape hatch for integrating any web library into native apps.
Create a React DOM component file (using <div>, <span>, etc.) and add the "use dom" directive to the top. You can then import and use it like a normal component from React Native code. The DOM component renders inside a webview but works through props. Any web library can be used within DOM components.
Expo CLI
- Experimental universal Tree Shaking - Automatically remove unused ESM imports/exports to improve OTA and web performance
- Experimental React Compiler support - Enable with
"experiments": { "reactCompiler": true } in app config
- Fast resolving by default - Up to 15x faster resolution across all platforms (merged into Metro as of React Native 0.76)
- New flag for iOS run command -
npx expo run:ios --binary /path/to/bin
- Improved debugging flag -
EXPO_USE_METRO_REQUIRE=1
- Metro support - Now supports
resolver.requireCycleIgnorePatterns in server bundles
EXPO_USE_METRO_WORKSPACE_ROOT - Now enabled by default for better monorepo support
- pnpm monorepo support - Metro automatically configured for pnpm monorepos
- CSS modules improvements - CSS modules can now import other CSS modules
- Web assets - Now use strings/ImageSource for easier web ecosystem interop
- iOS app config field - Added
ios.appleTeamId to set DEVELOPMENT_TEAM in PBX projects
- Reduced Expo CLI size - Removed dependency on RNC CLI (uses
expo-modules-autolinking instead)
- Eager builds -
npx expo run --eager bundles JavaScript before native compilation
Expo Modules API
- Better SharedRef support - Improved type validation during conversion between packages
- Enhanced SharedObject - New memory pressure handling for better garbage collection
- Time type support -
CMTime (iOS) and Duration (Android) now supported as convertible types
- AppDelegate customization - Added
customizeRootView to ExpoAppDelegateSubscriberProtocol
- Android lifecycle - Added
OnUserLeavesActivity event to lifecycle listeners
- Event management - New
useEvent and useEventListener APIs for simpler event handling
- EventEmitter migration - Migrated to C++ implementation for improved performance
- Third-party AAR support - Extended config to support wrapping third-party AARs via
android.gradleAarProjects
- Web modules - New way to define type-safe web modules with events via
registerWebModule
Expo Router
- Server Components and Server Actions - Early preview of React Server Components support (not for production yet)
- React Navigation v7 - Expo Router now uses v7 (may require changes to underlying React Navigation APIs)
- expo-router/ui API - New headless
<Tabs /> component with Radix-like API for un-styled tab layouts
- expo-router/link - New export for better alignment with upcoming package.json exports support
- legacy_subscribe - Added for broader compatibility with services like Branch
- sitemap Config Plugin - Can now disable the built-in
/_sitemap route with sitemap: false
Expo Application Services (EAS)
- EAS Build worker image updated - iOS builds now use macOS 14.6 and Xcode 16.1
- Bundle JavaScript build step - New step calling
npx expo export:embed --eager improves error detection speed (can be disabled with EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP=1)
- Improved EAS Update dashboards - Better navigation between channels, branches, runtime versions, and deployments; added install stats for update groups
Deprecations
- Push notifications in Expo Go - Will no longer be supported in SDK 53 (warned in SDK 52). Developers should create a development build instead.
- Google Maps in Expo Go for Android - Will no longer be supported in SDK 53 (warned in SDK 52)
- CRSQLite support in expo-sqlite - Deprecated due to lack of active development
- expo-av Video API - Deprecated, use
expo-video instead
Notable Breaking Changes
- Expo Go uses New Architecture - JSC is no longer supported, must use Hermes
- Expo Go for Android - No longer supports Pedometer (use development builds instead)
- expo-camera/legacy - Removed, migrate to
expo-camera
- expo-sqlite/legacy - Removed, migrate to
expo-sqlite
- expo-barcode-scanner - Removed (deprecated in SDK 50), use barcode scanning from
expo-camera instead
- privacy field removed - Unused
privacy field from app.json removed
- create-react-native-app no longer supported - Use
npx create-expo-app instead
- expo-notifications trigger types - Simplified calendar trigger input types
- expo-router type changes - Removed generic from
Href type and navigation hooks/APIs
- expo-router Typed Routes - No longer generate types for partial group
Hrefs
- expo-router navigate method - Behavior changes (refer to React Navigation v7 upgrade guide)
- React state batching - When using New Architecture, state
set functions no longer execute synchronously
- Full screen splash images - No longer supported on Android in
expo-splash-screen
Known Issues
- Developer preview of React Server Components are not for production use
- React Native DevTools "Sources" tab may show ignore list warning; press "Remove from ignore list" and reload
- Yarn v1 may crash/hang during dependency upgrades; manually update
expo to ^52.0.0 in package.json and run yarn, then yarn expo install --fix
Upgrading to Expo SDK 52
- Update EAS CLI:
npm i -g eas-cli
- Upgrade dependencies:
npx expo install expo@^52.0.0 --fix
- Remove unnecessary
resolutions/overrides from package.json
- Check for issues:
npx expo-doctor@latest
- Review deprecations and breaking changes section
- Check the full changelog for all breaking changes
- Upgrade Xcode if needed (Xcode 16+ required, 16.1 recommended)
- For Continuous Native Generation users: Delete android and ios directories
- For non-prebuild users: Run
npx pod-install or use Native project upgrade helper
- Create new development builds if using expo-dev-client
- Consider migrating from Expo Go to development builds
For more help, see the Troubleshooting SDK upgrade guide or join office hours on Wednesdays at 12:00PM Pacific on Discord.