A big APK can affect your application : cost / possibility to download for a user with limited mobile data plan, long download causing a lowered first experience and inability to publish on the store.

Some advice …

Reduce the code

use proguard with shrinking option enabled to minify and delete unused code (including resources)

use Redex to optimize the dex

Reduce the resources

delete the unused languages

consider dynamic selection when using numerous resource qualifiers

use downloadable fonts

Reduce the images

evaluate if your images can be generated declaratively (xml drawable : shape, etc.)

if they include useless spaces then consider using 9-Patch

if they can be obtained by transformation of others (use of tint, rotation, shadow, etc.)

evaluate the support of vectorial formats for your small images (in-app icons, images < 200x200)

evaluate the gain of using the Webp format (lossless compression 30% better than PNG but slower to load)

take advantage of a compressor like FileOptimizer to improve the PNG compression (disable pngcruncher, the default tool)

Reduce the animations

limit the number of frames

use a video compression tool (like FileOptimizer)

Reduce the code of the libraries used

reconsider the size of the libraries you use compared to similar ones

use the specific dependency of the Google services you use

evaluate if it is possible to delete the unused packages with proguard

Reduce the native libraries

clean the code (useless generated code, debug symbols)

do not use enumerations

optimize the compilation

Split your APK

determine and use the best configuration dimensions for your splits (xxhdpi, armeabi/x86, etc.)

use an automatic publishing tool to simplify the management of the resulting APKs

Download the APK in multiple times

use the store expansion files to add additional resources

use the DexClassLoader to load code downloaded after installation

Image credit

Android Developer at jacquesgiraudel.com