One of the many things that bother me after my React Native app went public is the app size.
Big app size is not a show stopper to continue adding new features to my app, nor it causes anything bad.
So, it has always been the least priority to work on that.
Some say it costs a bit of performance, if the app size is too big.
However, it isn't really critical for any newly launched app for a premature optimization, on the app size.
I've always wanted to fix it (when I have the time), and I think now is the best time, because I can do it for
multiple projects that I am juggling, with the same optimization trick.
And, it's really simple.
NOTE: This is an Android only optimization.
You can do it with any ONE of two ways below:
Simply change your build process from
./gradlew assembleRelease
to
./gradlew bundleRelease
The output will be .aab
file instead of .apk
file.
Note that the .aab
file will not have any significant file size changes compared to the .apk
file.
The reduction in size will only be visible after uploaded the .aab
file to Play Store.
In your project's android/app/build.gradle
file.
Update the following setting.
def enableSeparateBuildPerCPUArchitecture = true
splits {
abi {
...
enable enableSeparateBuildPerCPUArchitecture // be sure to enable here as well
...
}
}
Continue to build the apk as usual.
The output will be multiple .apk
files (usually 4).
Each of the .apk
file will have significant reduction in app size.
Upload all of them to the Play Store for submission.
Worth to note that, the universal '.apk' file will not be built.
(The one that support all architecture, thus the heavy size.)
If you want it to be in the output apk, along with the others, change the following setting.
splits {
abi {
...
enable enableSeparateBuildPerCPUArchitecture
universalApk true // If true, also generate a universal APK
...
}
}
Then you will have 5 .apk
files in the output folder.
Read about why enabling the universalApk
below.
For most of us, switching to use Android App Bundle (aab) is painless.
Thus, recommended to use it.
However, here's are some of the things to consider.
If you use Firebase for internal distribution, you might want to use Separate Build by CPU Architecture
approach, together with universalApk
enabled.
What you can do is, use universal apk file for distribution, and the separated .apk
files for Play Store submission.
So, what about if you are using .aab
file? How can you distribute the app for internal testing?
Well, if there are no existing tools that are already integrated into the app, and need to cater for it, then you might want to consider using Play Store's distribution track.
You can setup automated process to upload the .aab
file after building it to the Play Store track.
This require owner access though.
From what I can tell, after experimenting with both approaches, and using both ways for different apps, in production.
The size reduction benefit is almost identical. In both cases, I got more than 50% in size reduction.
So the size reduction is not much of a deciding factor. Which makes us move to the next point.
For most of the app out there, App Bundle offer hassle-free switch.
While some of the use cases, it might be more complicated to maintain.
If you are not sure, refer to official documentation of Android development.
If you are not convinced, your app doesn't have defined scope and complexity, or your app might grow to eventually having very complicated/advanced use cases, you can stick to separated '.apk' approach.
Otherwise, using .aab
is recommended.
Well this post is not going to elaborate the differences of '.apk' and '.aab', but it is worth doing your research about the topic.
With that said, you will have your Android app with very much reduced size by now!
For my apps, over 50% in reduction.
Cheers!
and
Happy coding!