DEV Community

Cover image for πŸš€ How to Reduce Your React Native APK Size by 70%
Amit Kumar
Amit Kumar

Posted on • Edited on

πŸš€ How to Reduce Your React Native APK Size by 70%

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 70%! πŸ”₯


πŸ“¦ 1. Remove Unused Assets, Fonts & Libraries

  • Audit your project and remove unused images, SVGs, fonts, 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/app/build.gradle, make sure you enable ProGuard in release builds:
def enableProguardInReleaseBuilds = true

Enter fullscreen mode Exit fullscreen mode

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

In your android/app
/proguard-rules.pro
, add below generics rules.

Here’s a sample ProGuard configuration optimized for React Native apps:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:
-keep class com.facebook.hermes.** { *; }

# ========== CORE REACT NATIVE ==========
-keep class com.facebook.react.** { *; }
-keep class com.facebook.hermes.** { *; }
-keep class com.facebook.soloader.** { *; }
-keep class com.facebook.jni.** { *; }
-keep class com.facebook.hermes.unicode.** { *; }

# Bridge and native modules
-keep public class * extends com.facebook.react.bridge.NativeModule { *; }
-keep class com.facebook.react.bridge.** { *; }
-keepclassmembers class * { @com.facebook.react.bridge.ReactMethod *; }

# View system
-keep @com.facebook.react.uimanager.annotations.ReactProp class * { *; }
-keep @com.facebook.react.uimanager.annotations.ReactPropGroup class * { *; }
-keep class * extends com.facebook.react.uimanager.ViewManager { *; }
-keep class com.facebook.react.uimanager.** { *; }

# JavaScript and events
-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
-keep class * extends com.facebook.react.uimanager.events.Event { *; }

# TurboModules and animation
-keep class com.facebook.react.turbomodule.** { *; }
-keep class com.facebook.react.animated.** { *; }

# ========== THIRD-PARTY LIBRARIES ==========
# React Navigation
-keep class com.swmansion.** { *; }
-dontwarn com.swmansion.**

# Firebase
-keep class io.invertase.firebase.** { *; }
-dontwarn io.invertase.firebase.**
-dontwarn com.google.firebase.**

# Realm
-keep class io.realm.** { *; }
-keep class io.realm.react.** { *; }
-dontwarn io.realm.**

# Async Storage
-keep class com.reactnativecommunity.asyncstorage.** { *; }

# MMKV
-keep class com.reactnativemmkv.** { *; }

# Device Info
-keep class com.learnium.RNDeviceInfo.** { *; }

# Permissions
-keep class com.zoontek.rnpermissions.** { *; }

# Fast Image
-keep class com.dylanvann.fastimage.** { *; }

# SVG
-keep class com.horcrux.svg.** { *; }
-dontwarn com.horcrux.svg.**

# WebView
-keep class com.reactnativecommunity.webview.** { *; }

# Braze
-keep class com.braze.** { *; }
-dontwarn com.braze.**

# ========== NETWORKING ==========
-keepattributes Signature, *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-dontwarn okio.**

# AWS SDK
-keep class com.amazonaws.** { *; }
-dontwarn com.amazonaws.**

# ========== OPTIMIZATIONS ==========
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 3
-allowaccessmodification
-overloadaggressively
-mergeinterfacesaggressively
-repackageclasses ''
-dontusemixedcaseclassnames
-dontpreverify

# Remove logging
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
}

# Debug info
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile


Enter fullscreen mode Exit fullscreen mode

βœ… 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.

πŸ“± 6. Generate Separate APKs per CPU Architecture

In android/app/build.gradle:

def enableSeparateBuildPerCPUArchitecture = true  

android {  
    splits {  
        abi {  
            reset()  
            enable enableSeparateBuildPerCPUArchitecture  
            include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"  
            universalApk false  # Smaller APKs per device  
        }  
    }  
}  
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Why? Instead of one fat APK, this generates smaller, device-specific APKs.


🌍 7. Keep Only Necessary Languages

Reduce resource bloat by keeping only supported languages:

android {  
    defaultConfig {  
        resConfigs "en", "fr"  # Only English & French  
    }  
}  
Enter fullscreen mode Exit fullscreen mode

⚑ 8. Enable Hermes (Faster & Smaller JS Bundle)

Hermes is React Native’s optimized JS engineβ€”it reduces bundle size and speeds up startup.

In android/app/build.gradle:

project.ext.react = [  
    enableHermes: true  
]  
Enter fullscreen mode Exit fullscreen mode

βš™οΈ 9 Advanced ProGuard Setup

πŸ” Enable in android/app/build.gradle

android {
    buildTypes {
        release {
            minifyEnabled true      // Code shrinking
            shrinkResources true   // Removes unused resources
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            crunchPngs true        // Extra PNG compression
            zipAlignEnabled true   // Memory optimization
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

♻️ 10. Native Library Extraction Tweak Big Impact

I noticed a significant size increase after upgrading the app:

β€’ Before upgrade: 112 MB
β€’ After upgrade v0.83: 250 MB

With a simple tweak, I was able to drastically reduce it - the final APK dropped to iust 65 MB

Add the following inside your AndroidManifest . xm] application tag

android:extractNativeLibs="true"

Enter fullscreen mode Exit fullscreen mode

⚠️Important Note

Some community discussions mention that enabling android:extractNativelibs="true" may slightly affect launch performance.

In my case, I thoroughly compared app launch time and runtime behavior before and after applying this change and observed no noticeable performance impact

That said, always test thoroughly on real devices before shipping.


πŸ“Š Results

By applying all the above strategies, I was able to reduce the APK size by almost 70%! πŸš€
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! πŸ™Œ

Top comments (2)

Collapse
 
dreamclarify profile image
Daisy

Nice post

Collapse
 
cryptopreneur69 profile image
Ndinethemba

the is helpful I am busy with my first ever app creation course using HTML and CSS but I believe your info will be useful later for me