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! 🙌