Most of a React Native 36,878 APK is native code: React Native, Hermes 11,328 and every native module ship as .so libraries, once per CPU architecture (ABI). The template builds four ABIs, so a universal APK carries four copies. These are BookNest's real sizes; the release rows come from the finished app of Publishing:
| Build | ABIs | Size |
|---|---|---|
| Debug APK, universal | 4 | 159.8 MB |
| Debug APK, -PreactNativeArchitectures=x86_64 | 1 | 47.1 MB |
| Release APK, arm64-v8a and x86_64 | 2 | 97.8 MB |
| Release AAB, same two ABIs | 2 | 65.1 MB |
| Play download for one phone, from that AAB | 1 | 38.3-39.5 MB |
In order of payoff:
Upload an Android App Bundle (.aab), not an APK. EAS Build 6,418 's production profile does this by default; Google Play 1 then generates APKs per device, so each phone downloads only its own ABI and screen density.
Build only the ABIs you need for APKs you share directly (buildArchs in the expo-build-properties plugin); most current phones are arm64-v8a.
Turn on R8 234 and resource shrinking with enableMinifyInReleaseBuilds and enableShrinkResourcesInReleaseBuilds in expo-build-properties. R8 removes unused Java and Kotlin code, so test the release build: code reached only by reflection needs a keep rule in proguard-rules.pro.
Audit dependencies. Every native library adds .so files to every ABI.
Older advice, such as enableDangerousExperimentalLeanBuilds and the expo build:android service, belongs to Expo 6,418 's retired classic builds and no longer applies.