A large APK size can slow down downloads, increase install drop-offs, and impact user experience — especially in countries with slower internet connections.
In this blog, I'll walk you through practical steps that helped me reduce a React Native app's APK size by 50%! 🔥
📦 1. Remove Unused Assets & Libraries
- Audit your project and remove unused images, SVGs, icons, and third-party libraries.
- Check if any dependencies are no longer in use, and uninstall them.
- Delete unnecessary files to clean up your project.
🎨 2. Compress Images
- Use tools like TinyPNG or TinyJPG to compress images without losing visible quality.
- Smaller images = smaller APK!
🖼️ 3. Replace PNGs with WebP Format
- WebP images are typically 25–30% smaller than PNGs.
- You can convert your images to WebP using Android Studio or online converters.
- WebP is supported on Android 4.0+ by default.
🔐 4. Enable ProGuard to Minify Code
- In your
android/gradle.properties
, make sure you enable ProGuard in release builds:
def enableProguardInReleaseBuilds = true
ProGuard shrinks, optimizes, and obfuscates your code by removing unused classes, methods, and fields.
This results in a much smaller APK size.
🛡️ 5. Add an Effective ProGuard Rules File
Here’s a sample ProGuard configuration optimized for React Native apps:
# ------- SOF --------
# React Native
-keep class com.facebook.react.** { *; }
-dontwarn com.facebook.react.**
# FastImage
-keep public class com.dylanvann.fastimage.* { *; }
# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
## Remove unused code and classes
#-assumenosideeffects class com.fasterxml.jackson.databind.ObjectMapper {
# boolean canDeserialize(java.lang.Class);
#}
# Remove unused OkHttp classes
-dontwarn okhttp3.internal.**
-dontwarn okio.**
# Remove unused Firebase Analytics classes
-dontwarn com.google.android.gms.internal.measurement.**
# Keep only necessary JSC (JavaScriptCore) classes
-keep class com.facebook.jni.** { *; }
-keep class com.facebook.react.bridge.** { *; }
-keep class com.facebook.react.modules.systeminfo.** { *; }
# Keep native modules and their methods
-keep class * extends com.facebook.react.bridge.NativeModule {
*;
}
-keepclassmembers class * {
@com.facebook.react.bridge.ReactMethod *;
}
# Keep the names of classes/members accessed via reflection
-keepclassmembers class ** {
@com.facebook.react.bridge.ReactMethod *;
}
# Keep classes used in the JavaScript bundle
-keep class com.facebook.react.turbomodule.** { *; }
-keep class com.facebook.react.uimanager.** { *; }
-keep class com.facebook.react.animated.** { *; }
# Keep classes for ProGuard initialization
-keep class com.facebook.react.proguard.** { *; }
# SVG Support
-keep public class com.horcrux.svg.** { *; }
✅ This ProGuard configuration ensures that:
- Only required React Native classes are kept.
- Libraries like FastImage, Glide, and SVG remain functional.
- Unused methods and classes are removed to save space.
📊 Results
By applying all the above strategies, I was able to reduce the APK size by almost 50%! 🚀
This not only improves the user experience but also positively impacts download rates and app store rankings.
🎯 Final Checklist
- Remove unused assets and libraries
- Compress images using TinyPNG
- Replace PNGs with WebP
- Enable ProGuard
- Add a solid ProGuard rules file
Hope this guide helps you achieve a super light APK for your React Native app! 🚀
Feel free to share your APK size reduction journey in the comments! 🙌