Une application qui met trois secondes à s'ouvrir, c'est déjà trop. Je le sais parce que j'ai regardé les courbes d'abandon d'une appli de réservation que je maintenais : entre le moment où l'utilisateur tapait sur l'icône et celui où il voyait enfin l'écran d'accueil, on perdait presque un tiers des gens. Pas un tiers des "clics lents". Un tiers des installs. Voilà pourquoi optimiser les performances d'une application mobile n'est pas un chantier technique qu'on range dans un backlog : c'est de la rétention déguisée en millisecondes.
Et pourtant, la plupart des équipes que je croise attaquent le problème par le mauvais bout. Elles compressent des images, renomment des variables, activent la minification… puis s'étonnent que rien ne bouge. Le vrai levier, c'est l'ordre dans lequel on fait les choses. Prioriser par gain réel plutôt que par confort de développeur change tout.
Points clés à retenir
- Le temps de démarrage (cold start) pèse plus lourd que n'importe quelle micro-optimisation de code sur la perception de qualité.
- Priorisez par gain / effort : cold start, puis requêtes réseau, puis mémoire, puis taille de l'APK en dernier.
- Mesurez en conditions réelles, pas sur votre téléphone de dev flambant neuf qui ne ressemble à aucun appareil du terrain.
- Les profils de référence et les macrobenchmarks valent mieux qu'une après-midi passée à deviner où ça rame.
- Une régression non surveillée revient toujours. Toujours.
Par où commencer pour optimiser les performances d'une application mobile
La question qu'on me pose le plus souvent, c'est : "par quoi j'attaque ?". Franchement, la réponse est presque toujours la même, et elle en déçoit certains. On commence par le démarrage.
Le démarrage à froid, c'est le moment où votre appli n'est pas du tout en mémoire. Elle doit initialiser la machine virtuelle, charger les classes, monter la première vue. Chaque chose que vous faites en trop à cet instant coûte à l'utilisateur. J'ai vu une appli perdre 1,4 seconde juste parce qu'un SDK d'analytics initialisait tout son cache au lancement, sur le thread principal, alors qu'il aurait pu attendre que la première image soit affichée.
Le piège du thread principal
Règle simple, que j'ai mis des mois à vraiment appliquer : rien de bloquant sur le thread UI pendant le démarrage. Ni accès disque, ni appel réseau, ni décryptage. Tout ce qui n'est pas nécessaire pour peindre le premier écran va ailleurs, plus tard.
Sur ce projet de réservation, on avait un fichier de préférences locales qu'on lisait de manière synchrone pour savoir si l'utilisateur était connecté. Lecture disque sur le thread principal. Résultat : un gel de 200 à 600 ms selon l'appareil, invisible sur mon Pixel de test, très visible sur les téléphones d'entrée de gamme qui constituaient la majorité de notre base.
Le piège de la mesure en intérieur
Avouons-le : on teste tous sur du matériel qui ne ressemble pas à celui de nos utilisateurs. On développe sur un appareil récent, souvent bien chargé en RAM, et on mesure des chiffres flatteurs. Ensuite on déploie, et les courbes de crash remontent sur des modèles qu'on n'a jamais ouverts.
Ce qui a marché pour nous : tester sur un appareil réellement modeste, ou un émulateur volontairement bridé. C'est inconfortable, lent, agaçant. Et c'est exactement l'expérience de la moitié de vos utilisateurs.
Application optimisation Android : ce qui compte vraiment
Sur Android, le terrain de jeu est particulier. La fragmentation matérielle est telle qu'une optimisation "moyenne" ne veut rien dire. Ce qui fonctionne sur une puce récente peut ramper sur un appareil de 2019 encore en circulation.
Profiler avant de toucher au code
Ma règle : aucun changement de performance sans mesure avant / après. Sinon vous optimisez à l'aveugle, et vous ajoutez de la complexité sans gain démontrable. J'ai fait cette erreur tôt — réécrire une boucle "évidemment trop lente" qui, au profilage, prenait 0,3 % du temps CPU total. Trois jours de travail pour rien.
Les outils que j'utilise réellement, dans l'ordre :
- Le profileur système fourni avec l'IDE, pour voir où le temps part.
- Perfetto quand je veux tracer finement les interactions entre threads, notamment le démarrage.
- Les macrobenchmarks pour mesurer le cold start de façon reproductible, chiffre comparable d'une version à l'autre.
- Un monitoring de performance en production, parce que la vraie vie n'est pas votre machine.
Le quatrième point est celui qu'on saute le plus souvent. Et c'est une erreur. Les données de terrain racontent une histoire que le banc de test ignore : tel modèle chauffe, tel autre rame sur le réseau, tel parc d'appareils met systématiquement deux fois plus longtemps.
Les profils de référence, l'arme sous-estimée
Il existe un mécanisme qui permet d'embarquer, avec l'application, un profil des classes et méthodes critiques chargées au démarrage. L'idée : au lieu de laisser le système deviner quoi compiler, vous lui donnez la liste du code chaud. Sur une appli de taille moyenne, le gain sur le démarrage se compte régulièrement en centaines de millisecondes.
Le hic, c'est que beaucoup d'équipes les configurent une fois puis ne les régénèrent jamais. Un profil de référence figé pendant six mois sur une appli qui a changé de moitié, c'est un pansement sur une jambe de bois.
Optimisation des applications One UI : le cas des surcouches constructeur
Et là, on touche à un sujet que les guides génériques évitent soigneusement. Parce qu'il n'est pas confortable.
Les surcouches constructeur — One UI chez Samsung, mais le principe vaut ailleurs — modifient le comportement du système. Gestion de la mémoire plus agressive, mise en veille de processus en arrière-plan, restrictions batterie. Votre application peut être parfaitement optimisée et se faire tuer en tâche de fond par un gestionnaire qui a décidé qu'elle consommait trop.
Pourquoi votre appli meurt en arrière-plan
Concrètement, une surcouche peut :
- Fermer votre service après quelques minutes d'inactivité, même s'il fait un travail légitime.
- Restreindre la fréquence des tâches planifiées, ce qui décale vos synchronisations.
- Prioriser l'autonomie au détriment de la réactivité, avec des seuils différents selon les modèles.
J'ai vu une appli de suivi d'activité perdre des données parce que le service était tué au bout de quatre minutes sur certains appareils, alors qu'il tournait des heures sur d'autres. L'équipe ne l'avait jamais reproduit : personne ne testait sur les bons modèles.
Ce qu'il faut faire, concrètement
Vous ne pouvez pas contourner ces mécanismes, et vous ne devriez pas essayer. Ce qui marche :
- Utiliser les API officielles d'exécution en arrière-plan prévues pour ça, pas des services qui se battent contre le système.
- Rendre votre travail reprenable : si le processus est tué, il doit pouvoir repartir là où il s'était arrêté.
- Tester sur des appareils constructeur réels, pas uniquement sur des références "stock".
- Surveiller les crashes de type processus tué en production, ils racontent une histoire précise.
Désactiver l'optimisation d'application Android : bonne ou mauvaise idée ?
Vous avez sûrement croisé ces tutos qui vous montrent comment désactiver l'optimisation d'une application dans les réglages du téléphone, souvent pour "booster" une appli qui rame ou pour empêcher qu'elle soit fermée. Question légitime. Réponse nuancée.
Ce que fait vraiment cette option
Ces réglages, généralement listés sous forme de liste blanche dans les paramètres batterie, ne "boostent" rien. Ils retirent une application du régime de restrictions automatiques : le système ne la limitera plus autant en arrière-plan. C'est tout.
Sur un appareil Samsung, par exemple, on trouve des réglages qui excluent une appli de la mise en veille. L'effet : le système arrête de la tuer agressivement. Le revers : elle consomme davantage de batterie, et pas qu'un peu.
Quand le conseiller — et quand s'en abstenir
| Situation | Désactiver l'optimisation | Effet attendu |
|---|---|---|
| Appli de messagerie qui rate des notifications en retard | Oui, temporairement | Notifications plus fiables, batterie en hausse |
| Appli qui plante à cause d'un service tué en fond | Non, corriger d'abord | Masque le vrai bug |
| Appli développée par vous, qui semble lente | Non | Aucun effet sur la lenteur réelle |
| Appareil ancien, faible autonomie | À éviter | Décharge plus rapide |
Mon avis, que j'assume : désactiver l'optimisation pour une appli que vous développez est presque toujours une mauvaise idée. Si votre service meurt en arrière-plan, le problème n'est pas le réglage du téléphone, c'est votre architecture. Et si votre appli est lente, ça ne se joue pas là.
Mémoire et réseau : les deux postes qu'on oublie
Le démarrage, c'est le levier le plus visible. Mais une fois l'appli ouverte, deux autres ressources décident si elle reste agréable.
La mémoire
Sur mobile, la mémoire est rare et chère. Une fuite, c'est une appli qui grossit jusqu'à se faire tuer, souvent après plusieurs minutes d'usage, ce qui rend le bug difficile à reproduire. J'ai chassé une fuite pendant deux semaines : une image avec un écouteur jamais détaché. Le correctif tenait en trois lignes.
Le réflexe utile : surveiller la consommation dans la durée, pas au lancement. Une appli qui consomme 80 Mo stables, c'est bien. Une qui passe de 80 à 400 Mo en dix minutes, c'est un problème, même si l'utilisateur ne le sent pas tout de suite.
Le réseau
Le réseau, c'est là où les performances perçues se jouent le plus hors du code. Un appel d'API qui traîne fait plus de mal à l'impression de fluidité qu'une animation saccadée.
Ce que j'applique systématiquement :
- Ne jamais bloquer l'écran en attendant une réponse : afficher un état, puis charger.
- Mettre en cache tout ce qui peut l'être raisonnablement.
- Compresser les échanges, mais pas au point de passer plus de temps à décoder qu'à transmettre.
- Surveiller la latence réelle par région, pas seulement la moyenne globale.
Sur un projet, on a réduit le temps perçu de chargement de la page d'accueil de quasi moitié simplement en chargeant d'abord le contenu textuel et en différant les images et les vidéos. Aucune ligne de code optimisée. Juste un ordre de priorité différent.
Prioriser par ROI, pas par confort
Voilà le point que j'aurais aimé qu'on me martèle au début. Toutes les optimisations ne se valent pas.
Comparator rapide, du plus rentable au moins rentable selon mon expérience :
- Cold start : gros gain perçu, effort modéré. Toujours en premier.
- Requêtes réseau / cache : gain perçu élevé, effort variable selon l'architecture actuelle.
- Mémoire / fuites : gain de stabilité, effort variable, indispensable dès qu'il y a des crashes.
- Rendu UI / animations : gain réel mais souvent surestimé par rapport au reste.
- Taille de l'APK : impact surtout sur l'installation et les mises à jour, pas sur l'usage quotidien.
Franchement, si vous ne pouvez faire qu'une chose cette semaine, faites le cold start. C'est le point où l'utilisateur décide s'il garde votre appli ou pas.
Ce qui ne marche pas (et que tout le monde essaie quand même)
J'ai essayé, comme tout le monde, des choses qui n'ont rien apporté. La minification poussée au maximum sur une appli dont le goulot était le réseau : zéro effet mesurable. La réécriture de code "plus propre" qui n'a jamais changé une courbe. Une migration de bibliothèque motivée uniquement par le mot "rapide" dans la doc.
Le filtre qui m'a le plus servi, c'est une question bête : est-ce que l'utilisateur va le sentir ? Si la réponse est non, ce n'est pas prioritaire, même si c'est satisfaisant techniquement.
Et il reste un angle que personne ne traite vraiment dans les guides d'optimisation : les régressions. Une appli optimisée aujourd'hui redevient lente dans six mois si personne ne surveille. La performance n'est pas un projet, c'est une discipline. Une courbe qui monte en production, un seuil qui se dégrade après une mise à jour, un nouvel appareil qui n'aime pas votre code — il faut le voir avant les utilisateurs.
La prochaine fois que vous ouvrez votre appli, chronométrez. Pas parce que le chiffre est magique. Parce que derrière ce chiffre, il y a quelqu'un qui a tapé sur votre icône et qui attend.