Shrinking React Native Binaries: ProGuard, R8, Assets, and Hermes Bytecode
John Hambardzumian · Full Stack & Mobile Developer | Node.js, React Native, PHP, Laravel | 7+ Years Building Scalable Web & Mobile AppsApr 11, 20265 min readBinary size affects install conversion, update churn, and storage-constrained devices. React Native apps bundle JavaScript, Hermes bytecode, native libraries, and assets—each layer offers optimization levers governed by Google Play and App Store packaging rules.
Android: R8, shrinking, and keep rules
Enable R8 full mode with carefully maintained ProGuard keep rules for reflection-heavy SDKs. Misconfigured shrinking causes NoSuchMethodError at runtime—validate release builds on minimal hardware. Use Android App Bundle for split APKs by ABI and density.
iOS: bitcode (historical), stripping, and linker flags
Follow Xcode recommendations for dead code stripping and link-time optimization where supported. Audit embedded frameworks for duplicate symbols and version skew.
JavaScript and Hermes
Hermes bytecode reduces parse cost; still audit Metro bundle composition for duplicate dependencies. Enable inline requires where compatible to defer module evaluation.
Media diet
Serve vector graphics, compress PNGs, adopt WebP or AVIF where decoders exist. Remove unused fonts and localize large video assets via CDN download post-install when appropriate.
Dynamic delivery
Consider Play Feature Delivery or modularization for seldom-used features—balance with cold start complexity and QA surface.
Conclusion
Track download size and installed size as product metrics. Regressions should trigger the same scrutiny as crash spikes.

Written by John Hambardzumian
Full Stack & Mobile Developer | Node.js, React Native, PHP, Laravel | 7+ Years Building Scalable Web & Mobile Apps. Focused on React Native and full-stack development.