expo: OTA updates cause Android (only) to crash on startup; requires new published release to resolve

Summary

I’ve set up and have had OTA updates running perfectly fine on previous SDK versions, but it seems to be around SDK 40 that OTA updates on Android just crash on every startup. In order to resolve this I have to publish a full new version on the Android store, which somewhat defeats the purpose of OTA updates.

Managed or bare workflow? If you have ios/ or android/ directories in your project, the answer is bare!

managed

What platform(s) does this occur on?

Android

SDK Version (managed workflow only)

40.0.1

Environment

  Expo CLI 4.1.6 environment info:
    System:
      OS: macOS 11.1
      Shell: 5.8 - /bin/zsh
    Binaries:
      Node: 12.20.1 - ~/.nvm/versions/node/v12.20.1/bin/node
      Yarn: 1.22.10 - /usr/local/bin/yarn
      npm: 6.14.10 - ~/.nvm/versions/node/v12.20.1/bin/npm
      Watchman: 4.9.0 - /usr/local/bin/watchman
    SDKs:
      iOS SDK:
        Platforms: iOS 14.3, DriverKit 20.2, macOS 11.1, tvOS 14.3, watchOS 7.2
    IDEs:
      Xcode: 12.3/12C33 - /usr/bin/xcodebuild
    npmPackages:
      expo: ^40.0.0 => 40.0.1
      react: 16.13.1 => 16.13.1
      react-dom: 16.13.1 => 16.13.1
      react-native: https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz => 0.63.2
      react-native-web: ~0.13.12 => 0.13.18
    npmGlobalPackages:
      expo-cli: 4.1.6
    Expo Workflow: managed
> yarn list expo-updates
yarn list v1.22.10
warning Filtering by arguments is deprecated. Please use the pattern option instead.
├─ expo-updates@0.4.1

Reproducible demo or steps to reproduce from a blank project

Actual error provided via adb logcat on a device with the published app installed following an update & restart:

Immediately following update:

02-02 11:27:20.522  9588 12805 E ReactNativeJS: Error: Expo native runtime is not available: something went wrong and we aren't sure what it was. Please post more information and get support at https://forums.expo.io.
02-02 11:27:20.529  9588 12805 E ReactNativeJS: Invariant Violation: Module AppRegistry is not a registered callable module (calling runApplication)
--------- switch to system
02-02 11:27:20.540  1545  3275 W NetworkPolicy: shared quota unsupported; generating rule for each iface
--------- switch to main
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: CatalystInstanceImpl caught native exception
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: com.facebook.react.common.JavascriptException: Error: Expo native runtime is not available: something went wrong and we aren't sure what it was. Please post more information and get support at https://forums.expo.io., stack:
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: <unknown>@13:184
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: <unknown>@9:66
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: <unknown>@8:7183
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: <unknown>@6:45
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: d@2:875
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: global code@3742:3
02-02 11:27:20.551  9588 12806 E unknown:ReactNative:
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at com.facebook.react.modules.core.ExceptionsManagerModule.reportException(ExceptionsManagerModule.java:83)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at java.lang.reflect.Method.invoke(Native Method)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at android.os.Handler.handleCallback(Handler.java:938)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at android.os.Looper.loop(Looper.java:223)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
02-02 11:27:20.551  9588 12806 E unknown:ReactNative: 	at java.lang.Thread.run(Thread.java:923)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: Caught exception
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: com.facebook.react.common.JavascriptException: Error: Expo native runtime is not available: something went wrong and we aren't sure what it was. Please post more information and get support at https://forums.expo.io., stack:
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: <unknown>@13:184
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: <unknown>@9:66
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: <unknown>@8:7183
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: <unknown>@6:45
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: v@2:1473
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: d@2:875
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: global code@3742:3
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager:
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at com.facebook.react.modules.core.ExceptionsManagerModule.reportException(ExceptionsManagerModule.java:83)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at java.lang.reflect.Method.invoke(Native Method)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at android.os.Handler.handleCallback(Handler.java:938)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at android.os.Looper.loop(Looper.java:223)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
02-02 11:27:20.551  9588 12806 E unknown:DisabledDevSupportManager: 	at java.lang.Thread.run(Thread.java:923)
--------- switch to crash
02-02 11:27:20.551  9588 12806 E AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
02-02 11:27:20.551  9588 12806 E AndroidRuntime: Process: {app_id}, PID: 9588
02-02 11:27:20.551  9588 12806 E AndroidRuntime: com.facebook.react.common.JavascriptException: Error: Expo native runtime is not available: something went wrong and we aren't sure what it was. Please post more information and get support at https://forums.expo.io., stack:
02-02 11:27:20.551  9588 12806 E AndroidRuntime: <unknown>@13:184
02-02 11:27:20.551  9588 12806 E AndroidRuntime: v@2:1473
02-02 11:27:20.551  9588 12806 E AndroidRuntime: <unknown>@9:66
02-02 11:27:20.551  9588 12806 E AndroidRuntime: v@2:1473
02-02 11:27:20.551  9588 12806 E AndroidRuntime: <unknown>@8:7183
02-02 11:27:20.551  9588 12806 E AndroidRuntime: v@2:1473
02-02 11:27:20.551  9588 12806 E AndroidRuntime: <unknown>@6:45
02-02 11:27:20.551  9588 12806 E AndroidRuntime: v@2:1473
02-02 11:27:20.551  9588 12806 E AndroidRuntime: d@2:875
02-02 11:27:20.551  9588 12806 E AndroidRuntime: global code@3742:3
02-02 11:27:20.551  9588 12806 E AndroidRuntime:
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at com.facebook.react.modules.core.ExceptionsManagerModule.reportException(ExceptionsManagerModule.java:83)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:938)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:223)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
02-02 11:27:20.551  9588 12806 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:923)

iOS appears unaffected - published updates download & restart with no problem.

Update triggered in code by a button press:

    await Updates.fetchUpdateAsync();
    await Updates.reloadAsync();

Last Android build using EAS Jan 31, 2021 7:57 PM

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 3
  • Comments: 19 (7 by maintainers)

Most upvoted comments

I can confirm, that running expo publish with --target bare solved the issue. Thanks 👍

So I have great news! I installed these 2 packages in my project:

yarn add babel-plugin-transform-inline-environment-variables react-native-dotenv

I was then able to set NODE_ENV=production in my .env file and do an ‘expo publish’

OTA Updates are working perfectly now!

Yea, I’m looking into this response here. I’ll give it a shot and let you know the result.

https://github.com/apollographql/apollo-client/issues/7446#issuecomment-767660631

expo publish produces a “production” bundle, but i don’t know if you have your own way of specifying what that means and maybe that’s different? either way this looks like something that has been answered on amplify-js related threads, and it is unrelated to expo

it looks like it’s caused by graphql-js expecting to be run on a server environment where NODE_ENV is always set, you can workaround (i think) by running NODE_ENV=production expo publish