When we develop an app using React Native, we want to make sure that our app can run on as many different devices as possible, by providing resources that are optimized for different CPU architectures, screens as well as many other factors. Unluckily, this also means that every single device, which downloads your app, will receive a bunch of code and resources that are not going to be used at all.
Android App Bundle
The size of an APK can be reduced by 35% by publishing the app in AAB (Android App Bundle) format – official Android Developers blog.
Only compiled code and resources are contained in the AAB bundle. Google play itself generates an optimized APK for every device type based on its specifications and CPU structure.
Old APK at 26.8MB compared to the new AAB at 14.4 to 17.7 MB
Using Android Studio or Command-line tools you can simply build your project as a signed app bundle. To build a signed app bundle from Android studio first, select Build > Generate Signed Bundle/APK from the Android Studio toolbar. The next step is to select the Android App Bundle checkbox and then click the Next button. Then, open the module dropdown, and choose the app as our base module from the list.
Follow the instructions provided on-screen to complete the build process. On completion, Android Studio will generate a .aab file and store it in our computer’s AndroidAppBundle/app/release directory. An Android App Bundle is a file (with the .aab file extension) that you upload to Google Play.
We can also generate signed .aab using the terminal by running the following command in the android folder:
cd android
./gradlew bundleRelease
Enable Resource Shrinking
Resource shrinking can be used to identify and eliminate unnecessary resources. It can be enabled using the following command:
buildTypes {
release {
//Add the following//
shrinkResources true
minifyEnabled true
}
}
Enable Proguard
Proguard is used to shrink, optimize, obfuscate, and preverify class files. it detects and eliminates unused classes, methods and attributes and rename the remaining ones using short and meaningless names. It compresses the Java Bytecode and reduces the size of the app a little bit.
To enable it use the following command:
def enableProguardInReleaseBuilds = true
Enable Separate Builds
This is the alternative of Android App Bundle (.aab). If we do not want to generate aab and stick with apk then this is the way to reduce sizes. Basically 2 major architectures, armeabi & x86, are supported by Android devices. When APK is generated via React Native, it contains the native libraries of both the architectures. In order to generate 2 different APKs use the following command:
Set def enableSeparateBuildPerCPUArchitecture = true
Both of the APKs should be uploaded to Google Play, where each one can be distributed to the correct architecture. This can reduce the size of APK around 7mb to 3.5mb for armeabi and 5mb for x86.
Do you know any other tips for reducing APK size? Do let us know in the comments.