Small app size is directly related to download success, particularly in emerging markets with poor network device connections or low network speeds. This can result in lower app usage rates, which in turn lowers the scope and reach of your audience. However, there are multiple ways to help reduce the size of your app.
Best practices
Upload app as Android App Bundle
The easiest way to gain immediate app size savings when publishing to Google Play is by uploading your app as an Android App Bundle, which is a new publishing format that includes all your app’s compiled code and resources, and defers APK generation and signing to Google Play.
Reduce runtime code size
Check for code that your app doesn't use at runtime, for example any large classes or auto-generated code. Code optimizers like R8 can help optimize and shrink code size, but they can't deal with code guarded by runtime-constants. Replace the check flags with compile-time constants to make the best use of various optimization tools. You can enable code and resource shrinking in your gradle configuration file:
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
}
}
}
Remove unnecessary layouts
Merge unused layouts with small UI changes and remove any unnecessary layouts to reduce overall app code size. Additionally, you can dynamically render layouts and views wherever possible. This lets you avoid drawing static templates and apply alternate layouts without the technical overhead.
Re-evaluate infrequently used features
Specifically optimize for Android (Go edition) by disabling features that have low daily active user (DAU) metrics. Examples of this include removing complex animations, large GIF files, or any other aesthetic additions not necessary for app success.
Utilize dynamic delivery
Play Feature Delivery uses advanced capabilities of app bundles, allowing certain features of your app to be delivered conditionally or downloaded on demand. You can use feature modules for custom delivery. A unique benefit of feature modules is the ability to customize how and when different features of your app are downloaded onto devices running Android 5.0 (API level 21) or higher.
Reduce translatable string size
You can use the Android Gradle resConfigs
property to remove
alternative resource files that your app doesn't need. If you're using a
library that includes language resources (such as AppCompat or Google Play
Services), then your app includes all translated language strings for library
messages, regardless of app translation. If you'd like to keep only the
languages that your app officially supports, you can specify those languages
using the resConfig
property. Any resources for languages not specified are
removed.
To limit your language resources to just English and French, you can edit
defaultConfig
as shown below:
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}
Use selective translation
If a given string isn't visible in the app's UI, then you don't have to translate it. Strings for the purpose of debugging, exception messages, or URLs should be string literals in code, not resources.
For example, don't bother translating URLs.
<string name="car_frx_device_incompatible_sol_message">
This device doesn\'t support Android Auto.\n
<a href="https://support.google.com/androidauto/answer/6395843">Learn more</a>
</string>
You may recognize <
and >
, as these are escape characters for
<
and >
. They’re needed here because if you were to put an <a>
tag inside
of a <string>
tag, then the Android resource compiler drops them since it
doesn't recognize the tag. However, this means that you’re translating the HTML
tags and the URL to 78 languages. Instead, you can remove the HTML:
<string name="car_frx_device_incompatible_sol_message">
This device doesn\'t support Android Auto.
</string>
Combine native binaries with common dependencies
If your app has different Java Native Interface (JNI) implementations with common underlying dependencies, then the various binaries are increasing the APK size with redundant components. You can combine several JNI binaries into a single JNI binary file while keeping the Java and JNI files separate. This can reduce your APK size quite dramatically.