Clarification regarding OTA and EAS builds

Hey Expo team,

Could you clarify how would OTA update behave in the following situation?

Let’s imagine the following release sequence:

  1. The app is built with eas build and the release channel is set to 1.
  2. Small bug fix is published through OTA release channel 1.
  3. New feature is introduced and the app is built with eas build. Because no native code changes are required for the new feature, the same release channel 1 is used. At this point, the built-in JS bundle is newer than the bundle that was published in step 2.

The question is, will the older JS bundle be downloaded in the app that was released in step 3 and as a result, remove the new feature that was introduced?

Old apk/aab will use bundle from step 2
Apk/aab created in step 3 will use a builtin bundle

Thanks for the prompt reply, Wojciech.

Could you help me understand how expo-updates decides whether the published JS bundle should be downloaded or not? Does it consider publishedTime? Do built-in JS bundles have publishedTime as well?

According to this flow chart, there is nothing that prevents older JS bundle to be used (it is compatible, same release channel is used, and it is the latest published bundle).

That flow chart was created before eas build existed, so there was no way to have builtin bundle from existing source code in manged workflow(classic builds always run publish or used last published sources).

Does it consider publishedTime ? Do built-in JS bundles have publishedTime as well?

I’m not familiar with implementation details for that, you can check expo-updates sources for that

I’ve tested it, and you are correct @wkozyra - the new build does not load older updates.

Regarding expo-updates sources, it is somewhat difficult for me to understand it due to my lack of knowledge of Kotlin and Java languages.

Nevertheless, according to this file, the loading of updates depends on manifest filters that are being sent by the server. And according to this documentation, “server MAY send back anything it wishes to be used for filtering the updates”. So after some research, I’m still confused.

Maybe someone else from the expo team could help to clarify what is the logic behind updates and how it is being decided to not load older updates in the above-mentioned scenario.