SlideShare una empresa de Scribd logo
1 de 12
Réduire la taille de son
APK
Jacques Giraudel (freelance)
jacquesgiraudel.com
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)
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
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
Réduire le code
▣ Classes compilées dans un fichier dex (projet et libs)
▣ Proguard
□ Optimisation
□ Shrinking (suppression code mort)
□ Minification
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-
rules.pro'
}
}
}
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
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"
}
}
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
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
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
}
}
}
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)
Merci!
Des questions?
Template CC

Más contenido relacionado

Destacado

Les menaces applicatives
Les menaces applicativesLes menaces applicatives
Les menaces applicativesBee_Ware
 
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...Cyber Security Alliance
 
CustomerGauge B2b Net Promoter Score Measurement
CustomerGauge B2b Net Promoter Score MeasurementCustomerGauge B2b Net Promoter Score Measurement
CustomerGauge B2b Net Promoter Score MeasurementCustomerGauge
 
Présentation Identités Actives
Présentation Identités ActivesPrésentation Identités Actives
Présentation Identités ActivesFing
 
StHack 2014 - Ninon Eyrolles Obfuscation 101
StHack 2014 - Ninon Eyrolles Obfuscation 101StHack 2014 - Ninon Eyrolles Obfuscation 101
StHack 2014 - Ninon Eyrolles Obfuscation 101StHack
 
La PoblacióN EspañOla Esquema
La PoblacióN EspañOla EsquemaLa PoblacióN EspañOla Esquema
La PoblacióN EspañOla EsquemaLuz García
 
T=Cnicas Y Ter=Pias Thermae
T=Cnicas Y Ter=Pias ThermaeT=Cnicas Y Ter=Pias Thermae
T=Cnicas Y Ter=Pias ThermaeAcquanews
 
Grupo 03 analisis
Grupo 03  analisisGrupo 03  analisis
Grupo 03 analisistallera
 
No Renunciare
No RenunciareNo Renunciare
No Renunciarealmapv
 
Sierra Club QC
Sierra Club QCSierra Club QC
Sierra Club QCRoseBas
 
Le pilotage par la capacité
Le pilotage par la capacitéLe pilotage par la capacité
Le pilotage par la capacitéitSMF France
 
Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013. Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013. Carmen Urbano
 

Destacado (20)

Java Bytecodes by Example
Java Bytecodes by ExampleJava Bytecodes by Example
Java Bytecodes by Example
 
Les menaces applicatives
Les menaces applicativesLes menaces applicatives
Les menaces applicatives
 
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
 
CustomerGauge B2b Net Promoter Score Measurement
CustomerGauge B2b Net Promoter Score MeasurementCustomerGauge B2b Net Promoter Score Measurement
CustomerGauge B2b Net Promoter Score Measurement
 
Présentation Identités Actives
Présentation Identités ActivesPrésentation Identités Actives
Présentation Identités Actives
 
StHack 2014 - Ninon Eyrolles Obfuscation 101
StHack 2014 - Ninon Eyrolles Obfuscation 101StHack 2014 - Ninon Eyrolles Obfuscation 101
StHack 2014 - Ninon Eyrolles Obfuscation 101
 
La PoblacióN EspañOla Esquema
La PoblacióN EspañOla EsquemaLa PoblacióN EspañOla Esquema
La PoblacióN EspañOla Esquema
 
Tobón
TobónTobón
Tobón
 
T=Cnicas Y Ter=Pias Thermae
T=Cnicas Y Ter=Pias ThermaeT=Cnicas Y Ter=Pias Thermae
T=Cnicas Y Ter=Pias Thermae
 
Grupo 03 analisis
Grupo 03  analisisGrupo 03  analisis
Grupo 03 analisis
 
celebracion dia de computacion
celebracion dia de computacioncelebracion dia de computacion
celebracion dia de computacion
 
No Renunciare
No RenunciareNo Renunciare
No Renunciare
 
Pablo neruda
Pablo nerudaPablo neruda
Pablo neruda
 
Libritos
LibritosLibritos
Libritos
 
[Code Camp 2009] Aplicaciones de tiempo real con Silverlight y ASP.NET - COME...
[Code Camp 2009] Aplicaciones de tiempo real con Silverlight y ASP.NET - COME...[Code Camp 2009] Aplicaciones de tiempo real con Silverlight y ASP.NET - COME...
[Code Camp 2009] Aplicaciones de tiempo real con Silverlight y ASP.NET - COME...
 
Perrenoud. construir competencias entrevista
Perrenoud. construir competencias entrevistaPerrenoud. construir competencias entrevista
Perrenoud. construir competencias entrevista
 
Sierra Club QC
Sierra Club QCSierra Club QC
Sierra Club QC
 
Le pilotage par la capacité
Le pilotage par la capacitéLe pilotage par la capacité
Le pilotage par la capacité
 
Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013. Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
Ayudas a la internacionalización de las empresas aragonesas para el año 2013.
 
[Run Reloaded] Qué hay de nuevo en ASP.NET 4.0 (Eugenio Serrano)
[Run Reloaded] Qué hay de nuevo en ASP.NET 4.0 (Eugenio Serrano)[Run Reloaded] Qué hay de nuevo en ASP.NET 4.0 (Eugenio Serrano)
[Run Reloaded] Qué hay de nuevo en ASP.NET 4.0 (Eugenio Serrano)
 

Similar a Réduire la taille de son apk

OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...
OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...
OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...Paris Open Source Summit
 
LLVM, clang & c++
LLVM, clang & c++LLVM, clang & c++
LLVM, clang & c++cppfrug
 
Introduction à GStreamer
Introduction à GStreamerIntroduction à GStreamer
Introduction à GStreamerNicolas Hennion
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasBruno Bonnin
 
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...
Docker nice meetup #1   construire, déployer et exécuter vos applications, ...Docker nice meetup #1   construire, déployer et exécuter vos applications, ...
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...adri1s
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewOSInet
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
GDG Rennes - Bootcamp Initiation Android - Théorie
GDG Rennes - Bootcamp Initiation Android -  ThéorieGDG Rennes - Bootcamp Initiation Android -  Théorie
GDG Rennes - Bootcamp Initiation Android - ThéorieHoracio Gonzalez
 
Rouabhi algiers meetup
Rouabhi algiers meetupRouabhi algiers meetup
Rouabhi algiers meetupSamir Rouabhi
 

Similar a Réduire la taille de son apk (18)

OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...
OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...
OWF12/PAUG Conf Days Render script, sylvain galand, software engineer at geny...
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
LLVM, clang & c++
LLVM, clang & c++LLVM, clang & c++
LLVM, clang & c++
 
Introduction à GStreamer
Introduction à GStreamerIntroduction à GStreamer
Introduction à GStreamer
 
Paug renderscript-mars-2013
Paug renderscript-mars-2013Paug renderscript-mars-2013
Paug renderscript-mars-2013
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pas
 
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...
Docker nice meetup #1   construire, déployer et exécuter vos applications, ...Docker nice meetup #1   construire, déployer et exécuter vos applications, ...
Docker nice meetup #1 construire, déployer et exécuter vos applications, ...
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TView
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
GDG Rennes - Bootcamp Initiation Android - Théorie
GDG Rennes - Bootcamp Initiation Android -  ThéorieGDG Rennes - Bootcamp Initiation Android -  Théorie
GDG Rennes - Bootcamp Initiation Android - Théorie
 
introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
 
Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015
 
Rouabhi algiers meetup
Rouabhi algiers meetupRouabhi algiers meetup
Rouabhi algiers meetup
 
The Future of Javascript
The Future of JavascriptThe Future of Javascript
The Future of Javascript
 
The future of JavaScript
The future of JavaScriptThe future of JavaScript
The future of JavaScript
 

Réduire la taille de son apk

  • 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
  • 5. Réduire le code ▣ Classes compilées dans un fichier dex (projet et libs) ▣ Proguard □ Optimisation □ Shrinking (suppression code mort) □ Minification android { ... buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard- rules.pro' } } }
  • 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)

Notas del editor

  1. 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.)
  2. APK Analyzer sorti avec Android Studio 2.2
  3. 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
  4. 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
  5. Proguard : Outil de sécurité Optimisation : dont suppression paramètres inutilisées Shrinking Proguard
  6. 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)
  7. arsc : fichiers res/values Shrinking des ressources
  8. 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)
  9. Conseils Google Article Realm sur l’optimisation de la compilation
  10. Splits d’APK Configurer les Splits d’APK Plugin Jenkins pour automatiser le delivery sur le Store (support des splits d’apk)
  11. 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
  12. 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