Expo 6,418 used to have a managed workflow, with no native code at all, and a bare workflow, where you owned android/ and ios/. Development builds (Development Builds) and config plugins merged them into one idea, Continuous Native Generation (CNG): the native projects are build output, generated from app.json, package.json and the plugins they list, the way dist/ is generated from source. BookNest's .gitignore has listed /android and /ios since the first scaffold. npx expo prebuild does the generating, and --clean deletes the old folders first:
npx expo prebuild --platform android --clean
grep -n "reactNativeArchitectures=" android/gradle.properties- Clearing android ✔ Cleared android code - Creating native directory (./android) ✔ Created native directory - Updating package.json ✔ Updated package.json | no changes - Running prebuild » android: userInterfaceStyle: Install expo-system-ui in your project to enable this feature. ✔ Finished prebuild 30:# ./gradlew <task> -PreactNativeArchitectures=x86_64 63:reactNativeArchitectures=x86_64
It took three seconds. Prebuild copied Expo's Android template, then ran every plugin in app.json: expo-sqlite 6,418 and expo-secure-store added themselves there when npx expo install installed them, the scheme field became an intent filter for booknest://, and BookNest's own plugin (next section) set line 63; line 30 is the template's comment. The warning is worth reading: on Android, userInterfaceStyle is applied by expo-system-ui, so NativeWind's dark mode worked because Android's default already follows the system. The payoff is upgrades: a new Expo SDK means npx expo install expo@latest, npx expo install --fix and another clean prebuild, with no hand-merged native diffs. The cost: any hand edit inside android/ is gone on the next clean prebuild.