[Java] Optimisation de l'application Android avant sa sortie


Answers

Track et squash allocations. Plus vous allouez, plus souvent le garbage collector devra fonctionner, empêchant votre processus de faire quoi que ce soit d'autre pendant des périodes relativement longues, comme 100ms ou plus.

Le meilleur outil que je connaisse est le Allocation Tracker inclus dans DDMS .

Non seulement GC peut avoir un impact sur l'expérience utilisateur, mais les allocations superflues et GC consomment certaines ressources informatiques.

Voici un exemple et un petit tour. Dans mon application, j'ai une horloge qui montre l'heure (audio) actuelle, y compris dixième de secondes. Ceci est mis à jour souvent. Et TextView effectue des allocations en interne chaque fois que vous appelez setText () avec un CharSequence. Mais il n'alloue rien avec la variante setText (char [] text, int start, int len). Ce n'est pas documenté, et personne n'a répondu quand j'ai demandé à ce sujet.

Il y en a beaucoup comme ça. Et c'est une des raisons pour lesquelles mon application contient 50% de code natif (mais il y a d'autres raisons).

En dehors de cela, je peux vous recommander d'expérimenter avec ProGuard . Il effectue plusieurs passes d'optimisation et enregistre les informations telles que les méthodes inutilisées dans le projet, ce qui peut vous aider à supprimer les restes dans votre code.

Question

Je suis dans une situation " spéciale " sur l' efficacité de mon programme. Maintenant, je suis à une phase où j'ai besoin d'améliorer les performances de l'application et de réduire la consommation de la batterie .

Avant la question:

Maintenant, je suis curieux de connaître les correctifs spéciaux d' autres développeurs qu'ils ont utilisés pour optimiser leurs propres applications. Des choses que les utilisateurs peuvent ne jamais reconnaître ou faire attention. Cependant, les corrections augmenteront la durée de vie de la batterie ou contribueront à améliorer la maintenance de l'application.

Alors, quel est votre truc (s) d'optimisation unique?

Je suis dans une situation particulière où je suis vraiment à la recherche de connaissances et je pense que ce sera une excellente occasion de partager les connaissances des développeurs sur une situation dans laquelle ils ont tous été.

S'il vous plaît, votez pour de bonnes réponses car cela encouragera les grands développeurs à partager leurs connaissances.




Quelques conseils qui peuvent vous aider à optimiser votre application en termes d' interface utilisateur :

  • utilisez convertView pour les adaptateurs de liste - il serait très coûteux de créer une nouvelle vue dans Adapter.getView() car cette routine est appelée pour chaque position de la liste. L'utilisation de convertView vous permet de réutiliser la vue déjà créée. Bon exemple (avec l'utilisation de ViewHolder ) peut être trouvé dans ApiDemos .

  • Il se peut que vos mises en page ne soient pas entièrement optimisées et puissent être améliorées (par exemple en fusionnant ou en supprimant des parents). Android tool layoutopt trouvera une telle situation pour vous. Il peut être utilisé avec HierarchyViewer pour inspecter des vues individuelles. Plus d'infos here .

  • supprimer l'arrière-plan drawable - cadre Android utilisé pour (a-t-il encore?) un problem avec la détection de ce que les vues doivent être dessinées. Il est possible que votre dessin (par défaut) ne soit dessiné que pour être ensuite masqué par votre interface utilisateur opaque. Pour se débarrasser de ce dessin inutile, il suffit d'enlever le fond dessinable.

Cela peut être fait en utilisant un style personnalisé

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>

Quelques conseils qui peuvent vous aider à optimiser votre application en termes d'utilisation de la batterie :

  • vérifiez le type de mise en réseau et attendez que l'utilisateur entre dans la zone avec le wifi ou la 3G (et pas l'itinérance) et seulement alors permettez-lui d'utiliser la connexion

  • utiliser gzip pour les données textuelles chaque fois que possible pour accélérer le téléchargement et l'analyse syntaxique

  • recycler les objets Java complexes tels que XmlPullParserFactory / BitmapFactory / StringBuilder / Matcher etc.

Pour plus d'astuces de batterie, voir Coding for Life - Battery Life, That Is .




Je suppose que l'utilisation de variables "finales" partout où c'est possible pourrait aussi améliorer la vitesse d'exécution.




Pour les applications avec plusieurs activités, vérifiez que vous ne redémarrez pas les activités qui doivent simplement être mises en avant en utilisant les indicateurs Intent appropriés. Vérifiez que votre tas est sous contrôle et que les vues, liaisons et contextes inutiles ne sont pas créés.

Je trouve le meilleur outil pour vous montrer tout cela car l'application fonctionne:

adb shell dumpsys meminfo 'your apps package name'



Si vous avez des opérations réseau, essayez de réutiliser la même instance httpclient. Évitez d'utiliser des expressions régulières.







Je sais que je me joindrai un peu plus tard à cette conversation mais il serait parfait d'avoir beaucoup de bons conseils dans un endroit, donc j'espère que ce fil sera vivant et mis à jour assez souvent. Mes conseils:

  • Ne bloquez pas le thread d'interface utilisateur avec des travaux coûteux, l'utilisateur quittera s'il n'y a pas de réponse de l'application (utilisez AsyncThreads).
  • Utilisez le LINT , nouvel outil qui analyse les sources de projets Android pour détecter d'éventuels bugs.

..sera mis à jour..