Repository navigation
Conversation
…ve code @expo/fingerprint 0.21.5 throws on expo-widgets' Maven-only Gradle plugin, which has no sourceDir, and swallows the error. That dropped every Expo native module from the Android fingerprint, so native patch changes such as the @expo/ui TopAppBar view shipped as OTAs to older store builds. Closes pingdotgg#20170 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a focused Android fingerprinting bug fix that prevents native-module changes from being incorrectly treated as OTA-compatible, with only the corresponding build-versus-OTA decision affected. The dependency patch is explicitly wired into the workspace and lockfile without introducing new components, schemas, sensitive-area changes, or static-analysis overrides. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
|
Note Grok responding on behalf of Julius. Closing this as superseded by #20384, which merged the same |
Closes #20170
Problem
Android beta 2.0.0 (93) crashes as soon as you tap Settings:
Build 93 was cut at 18:52 UTC on Oct 15, with Android fingerprint
035e46c0. At 22:47 UTC, #19994 and #19995 added a nativeTopAppBarViewto our@expo/uipatch and started using it on Android screens. The Android fingerprint didn't change, so CI shipped that JS as an OTA to build 93, which has noTopAppBarView. The same thing happened again at 00:10 UTC.The fingerprint didn't change because it contains no Expo native modules at all.
@expo/fingerprint0.21.5 callspath.relative(root, plugin.sourceDir)on every Expo Gradle plugin.expo-widgetsdeclares a Maven-only plugin (io.github.expo.peek.glance-fork) with nosourceDir, so that call throws. A barecatch {}then returns[]for the whole Expo Android section. This has been broken since the SDK 58 upgrade brought in expo-widgets' Maven-only plugin, and every native change to an Expo module on Android (including our@expo/ui,expo-audioandexpo-sharingpatches) could ship as an OTA to binaries that don't have it. iOS is unaffected.Fix
A pnpm patch for
@expo/fingerprint@0.21.5that skips Gradle plugins without asourceDir. Their id, group and version are still hashed throughexpoAutolinkingConfig:android. The latest canary has the same bug, so there's no version to bump to.Proof
Hashes from
fingerprint:generate --platform androidinapps/mobilewithAPP_VARIANT=production:@expo/ui/.../TopAppBarView.kt2c6fe8a12c6fe8a1(unchanged, so the OTA goes out)f2c8e4fc2d76558b(changed, so CI cuts a new build)The iOS fingerprint is
15c773e0with and without the patch.Before: beta 93 on a POCO F4, tapping Settings
Full video
After
This PR changes how CI fingerprints builds, not the app, so there's no app build that shows the fix on a phone. Fork PRs also get no
EXPO_TOKEN, so the EAS preview build skips. The proof is the fingerprint table above: on this branch, a native change to an Expo module now changes the runtime version, so CI cuts a build instead of shipping an OTA.On a POCO M3, beta 93 installed over build 90 shows both sides. Its own embedded bundle (from before TopAppBar) opens Settings fine. Tapping T3 Account restarts the app into the pending bad OTA, which lands on the sign-in route and draws nothing. On this phone it's a blank screen instead of a crash, and it stays that way on reopen.
Full video
Note for maintainers
Merging this changes the Android fingerprint, so CI cuts a new Android build (the fingerprint already changed with #20067). Beta 93 users still have the crashing OTA until that build reaches them. Rolling runtime
035e46c0805270afe707381d97627b8ca606ecb4back to its embedded bundle on the production channel would unbrick them right away. That bundle is from before TopAppBar.Opus 5.5 via Claude Code, running in T3 Code.
🤖 Generated with Claude Code