Des conseils pour réduire la taille de son APK
Version annotée sur
https://docs.google.com/presentation/d/1C2PK_uVD2LIHcIksVa-dHS2iBob0K5H-xYcFr8cSeCk/edit?usp=sharing
1. Réduire la taille de son
APK
Jacques Giraudel (freelance)
jacquesgiraudel.com
2. Sommaire
▣ APK Analyzer
▣ Pas de magie
▣ Réduire
□ le code
□ les ressources
□ les images
□ les bibliothèques natives
▣ Scinder l’APK par configuration (APK Split)
3. APK Analyzer
Visualiser le contenu d’un APK
□ taille des différents éléments
□ visualisation du contenu des différents fichiers compilés
(dex, ressources)
□ comptage de méthodes
4. Pas de magie
▣ 1 APK
□ des classes transformées en dex
□ des xmls
□ des images
□ des bibliothèques natives
□ (des fichiers additionnels)
▣ Jouer sur chaque ensemble
□ non recommandé sur l’APK lui-même
6. Réduire le code
▣ Redex (gratuit)
□ Complémentaire à proguard
□ Optimisations additionnelles (code du dex)
▣ Dexguard (payant)
□ Version avancée de proguard
▣ Amélioration de la vitesse d’exécution
7. Réduire les ressources
▣ Répertoire res et fichier arsc
▣ Shrinking Proguard : suppression ressources inutilisées
□ optimisation avec Dexguard
▣ Suppression des langues inutilisées
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}
8. Réduire les images
▣ Répertoires drawable et mipmap
▣ Compression
□ pngcruncher (outil par défaut)
□ ImageOptim/FileOptimizer (désactiver pngcruncher)
▣ Format d’image
□ Webp
□ Vectoriel (SVG via VectorDrawable)
▣ Rendu depuis le code
9. Réduction des bibliothèques natives
▣ Répertoire lib
▣ Optimisation code
□ code généré inutile
□ énumérations
□ symbole de debug
▣ Optimisation compilation
□ optimisation groupée (vs par unité de compilation)
□ suppression code mort
10. Scinder l’APK par configuration
▣ Types séparables
□ taille et densité
□ architecture CPU
□ version SDK
□ jeu de feature
□ version OpenGL
android {
...
splits {
abi { // Split par ABI (architcture CPU)
enable true // Active le split
reset() // Permet le Split de l’APK
include "x86", "armeabi-v7a", "mips" // Liste les ABI à splitter
}
}
}
11. Conclusion
▣ Gain possible de dizaines de Mo
▣ Outillage de base performant mais perfectible
▣ Amélioration récente au packaging (AS 2.2)
□ taille apk
□ delta de MAJ
□ temps d’installation (v2 de la signature)
Téléchargement : première étape à passer pour l’utilisation de l’application
Limite Store de 100 Mo (malgré tout extensible)
Gros apk rédhibitoire (coût forfait données, durée de téléchargement, etc.)
APK Analyzer sorti avec Android Studio 2.2
Android Studio 2.2
Build > Analyze APK
Taille décompressée (disque) et taille compressée
Limite 64k : force le passage en multidex (long à builder, autres problèmes)
APK Analyzer
Fichiers additionnels : Assets (texture, videos), fichiers properties, textes, signatures
Nettoyer et Mieux compresser
Ne pas réutiliser de compresseur par dessus l’APK (risque de ralentir les algos de MAJ du Play Store)
Non recommandé APK lui-même
Proguard : Outil de sécurité
Optimisation : dont suppression paramètres inutilisées
Shrinking
Proguard
Redex outil facebook / complémentaire à proguard (ordre 25%)
Dexguard : version avancée et payante de proguard, meilleure performance (léger)
Redex
Dexguard (voir également Présentation Eric Lafortune DroidCon NYC 2016 ou antérieure comme celle-ci)
arsc : fichiers res/values
Shrinking des ressources
pngcruncher : outil par défaut de aapt, analyse filtre png et paramètres de déflation pour trouver la meilleure configuration
ImageOptim/FileOptimizer : temps / multiple passe pour trouver une meilleure configuration / résultat aléatoire (peut-être même supérieur à la taille de départ) -> difficile à automatiser
Format webp : compression sans perte plus forte que PNG (30%), non utilisable < 15, avec perte jusqu’à la 16, ok >= 17, plus long à charger
Format vectoriel : SVG/PSD (support limité), 1 image toute densité, plus long à charger à l’exécution (-> petites tailles <200x200)
Difficile à utiliser / bien se poser la question
Rendu depuis le code : drawable (shape), réutilisation tint/rotation/shadow, 9-patch, images dessinées dynamiquement
Références optimisations images (Webp, etc.) :
leaner apks with custom asset minification
official advices (old version)
Conseils Google
Article Realm sur l’optimisation de la compilation
Splits d’APK
Configurer les Splits d’APK
Plugin Jenkins pour automatiser le delivery sur le Store (support des splits d’apk)
Améliorations récentes
Références en vrac :
Série d’article d’un Googler sur la réduction d’APK
Utiliser proguard pour supprimer des classes inutiles d’une lib
Outil appt
Images APK Analyzer tirés de la doc Android (CC 2.5)
Image XML de graphiqastock
Image paysage et ciseaux CC Attribution 3.0 unported