Analyse de la solution d'optimisation des performances Android la plus complète de l'histoire

L'optimisation des performances dans Android est divisée selon les aspects suivants :

optimisation de la mise en page

Optimisation du réseau

Optimisation du package d'installation

optimisation de la mémoire

Caton optimisation

démarrer l'optimisation

……

1. Optimisation de la mise en page

L'essence de l'optimisation de la mise en page est de réduire la hiérarchie de la vue. Les schémas d'optimisation de mise en page courants sont les suivants :

  • Dans le cas où LinearLayout et RelativeLayout peuvent compléter la mise en page, LinearLayout est préféré, ce qui peut réduire le niveau de View, mais notez que le même composant peut prendre beaucoup de temps pour dessiner RelativeLayout

  • Utilisez la balise <include> pour extraire les parties communes des composants de mise en page couramment utilisés pour les réutiliser.

  • Utilisez la balise < ViewStub > pour charger les mises en page inutilisées, le chargement différé (chargé dans l'activité si nécessaire)

  • Utilisez les balises < Merge > pour réduire les niveaux d'imbrication de la mise en page

2. Optimisation du dessin

L'optimisation du dessin signifie que la méthode onDraw de View doit éviter d'effectuer un grand nombre d'opérations, ce qui se traduit principalement par deux aspects :

1. Ne créez pas de nouveaux objets locaux dans onDraw.

Étant donné que la méthode onDraw peut être appelée fréquemment, un grand nombre d'objets temporaires seront générés en un instant, ce qui non seulement occupe trop de mémoire, mais oblige également le système à effectuer des gc plus fréquemment, ce qui réduit l'efficacité d'exécution du programme.

2. Ne faites pas de tâches chronophages dans la méthode onDraw,

Des milliers d'opérations de boucle ne peuvent pas être effectuées. Bien que chaque boucle soit très légère, un grand nombre de boucles occupent toujours des tranches de temps CPU, ce qui rendra le processus de dessin de la vue peu fluide.

Selon les normes du modèle d'optimisation des performances officiellement données par Google, la fréquence de dessin de View est garantie à 60fps est la meilleure, ce qui nécessite que le temps de dessin de chaque image ne dépasse pas 16ms (16ms = 1000/60), bien que il est difficile pour le programme de garantir le temps de 16ms , mais il est toujours pratique de minimiser la complexité dans la méthode onDraw.

3. Optimisation du réseau

Les schémas d'optimisation de réseau courants sont les suivants :

  • Minimisez les requêtes réseau et fusionnez autant que possible

  • Évitez la résolution DNS. La requête de nom de domaine peut prendre des centaines de millisecondes et il peut y avoir un risque de piratage DNS. Vous pouvez utiliser la méthode d'ajout de mises à jour IP dynamiques en fonction des besoins de l'entreprise ou passer à la méthode d'accès au nom de domaine lorsque l'accès à la méthode IP échoue.

  • Une grande quantité de données est chargée par pagination

  • La transmission de données réseau adopte la compression GZIP

  • Rejoignez le cache des données réseau pour éviter les requêtes réseau fréquentes

  • Lors du téléchargement d'images, compressez les images si nécessaire

4. Optimisation du package d'installation

  • Le cœur de l'optimisation du package d'installation consiste à réduire la taille de l'apk. Les solutions courantes sont les suivantes :

  • Réduisez les fichiers de ressources inutiles dans l'application, tels que les images, et compressez les images autant que possible sans affecter l'effet de l'APP, ce qui a un certain effet

  • Lorsque vous utilisez la bibliothèque SO, conservez d'abord la version v7 de la bibliothèque SO et supprimez les autres versions de la bibliothèque SO. La raison en est qu'en 2018, la version v7 de la bibliothèque SO peut répondre à la plupart des exigences du marché.Ce n'était peut-être pas possible pour les téléphones mobiles il y a huit ou neuf ans, mais nous n'avons pas besoin de nous adapter aux téléphones mobiles obsolètes . L'effet de la réduction du volume d'apk dans le développement réel est très important. Si vous utilisez beaucoup de bibliothèques SO, par exemple, une version de la bibliothèque SO a un total de 10 Mo, alors ne conservez que la version v7, supprimez les armeabi et v8 versions de la bibliothèque SO, et le total peut être réduit.20M de volume.

  • optimisation des ressources res

    (1) N'utilisez qu'un seul ensemble d'images et utilisez des images haute résolution.

    (2) Conception de l'interface utilisateur Installez le plug-in TinyPNG dans ps pour compresser les images sans perte.

    (3) images svg : la description de certaines images sacrifie la puissance de calcul du CPU pour gagner de la place. Principes utilisés : icônes simples.

    (4) L'image utilise le format WebP (https://developers.google.com/speed/webp/) (Facebook, Tencent, Taobao l'utilisent.) Inconvénient : Le chargement est beaucoup plus lent qu'en PNG. Mais la configuration est relativement élevée. Outils : http://isparta.github.io/

    (5) Utilisez tintcolor (android - Changez la couleur dessinable par programmation) pour obtenir un effet d'inversion de bouton.

  • Optimisation du code

    (1) Réaliser la simplification logique des modules fonctionnels

    (2) L'outil Lint vérifie les fichiers inutiles et répertorie les ressources inutiles dans "UnusedResources : ressources inutilisées" et les supprime.

    (3) Supprimez les bibliothèques dépendantes inutiles.

  • optimisation des ressources lib

    (1) Ressources téléchargées dynamiquement.

    (2) Le plug-in de certains modules est ajouté dynamiquement.

    (3) Clipping et compression de ces fichiers.

  • actifs optimisation des ressources

    (1) Il est préférable d'utiliser un format de compression avec perte pour les fichiers audio, tels que opus, mp3 et d'autres formats, mais il est préférable de ne pas utiliser le format de compression de musique sans perte.

    (2) Pour compresser le fichier de police ttf, vous pouvez utiliser l'outil FontCreator pour extraire uniquement le texte dont vous avez besoin. Par exemple, lors de l'affichage de la date, seules les polices numériques sont nécessaires, mais l'utilisation de la bibliothèque de polices d'origine peut nécessiter une taille de 10 Mo. Si vous extrayez simplement les polices dont vous avez besoin, le fichier de police généré ne fait que 10 Ko.

  • Obfuscation de code.

  • Utilisez l'outil d'obfuscateur de code proGuard, qui inclut la minification, l'optimisation, l'obscurcissement, etc.

  • Brancher

  • Les modules fonctionnels peuvent être placés sur le serveur et chargés si nécessaire.

  • Compression extrême 7z

5. Optimisation de la mémoire Android

1. Mécanisme de gestion de la mémoire Android

Les applications Android s'exécutent sur la machine virtuelle Android, et l'allocation de mémoire et la récupération de place sont effectuées par la machine virtuelle Android.

2. Fuites de mémoire courantes

En fait, l'essence des fuites de mémoire est que les objets avec un cycle de vie plus long font référence à des objets avec un cycle de vie plus court.

2.1 Fuites de mémoire

Cause de la fuite mémoire : L'objet alloué sur le tas ne sera plus utilisé, mais le collecteur GC ne peut pas le recycler, et cet objet est référencé par une application forte.

  • Fuites de mémoire causées par des variables statiques

    Solution : définissez la classe interne en tant que classe interne statique ou séparez-la ; utilisez context.getApplicationContext().

  • Fuite de mémoire causée par le mode singleton

    Solution : passez le paramètre context.getApplicationContext().

  • Fuite de mémoire causée par l'animation de la propriété

    Solution : appelez Animator.cancel() dans Activity.onDestroy() pour arrêter l'animation.

  • Fuite de mémoire causée par Handler

    Solution : utilisez la classe interne statique + la référence faible WeakReference ; effacez la file d'attente des messages lorsque la classe externe termine son cycle de vie.

  • fuites de mémoire causées par les threads

    Solution : définissez AsyncTask et Runnable en tant que classes internes statiques ou séparez-les ; utilisez des références faibles pour enregistrer les références de contexte à l'intérieur des threads.

  • Fuites de mémoire causées par des ressources non fermées

    Solution : fermez ou déconnectez-vous à temps lorsque l'activité est détruite. Par exemple:

    ① BroadcastReceiver : appelez unregisterReceiver() pour vous déconnecter ;

    ②Curseur, flux, fichier : appelez close() pour fermer ;

    ③Bitmap : appelez recycle() pour libérer la mémoire (plus besoin de le faire manuellement après la version 2.3).

  • Fuite de mémoire causée par l'adaptateur

    Détails : Au lieu d'utiliser le cache et de ne compter que sur getView() pour réinstancier l'élément à chaque fois, cela exercera une pression sur le gc.

    Solution : utilisez le convertView mis en cache lors de la construction de l'adaptateur.

  • Fuite de mémoire causée par WebView.

    Détails : WebView est spécial, même si sa méthode de destruction est appelée, il provoquera toujours une fuite de mémoire.

    Solution : En fait, la meilleure façon d'éviter les fuites de mémoire causées par WebView est de faire en sorte que l'activité où se trouve WebView se trouve dans un autre processus. Lorsque cette activité se termine, tuez le processus en cours où se trouve WebView. Je me souviens que la WebView d'Ali Dingding est un autre processus. Un processus ouvert doit également utiliser cette méthode pour éviter les fuites de mémoire.

  • fuite de classe de collection

    Détails : Par exemple, il existe des applications statiques telles que des cartes globales, mais elles ne sont pas supprimées à la fin.

    Solution : recycler les collections inutiles pendant onDestry.

2.2 Étendre la mémoire

Les SDK des grands fabricants peuvent avoir moins de fuites de mémoire, mais la qualité des SDK de certains petits fabricants est moins fiable. La meilleure façon de gérer cette situation que nous ne pouvons pas changer est d'étendre la mémoire.

Il existe généralement deux façons d'étendre la mémoire :

  • L'une consiste à ajouter l'attribut largeHeap="true" sous Application dans le fichier manifeste, et l'autre consiste à ouvrir plusieurs processus pour la même application afin d'étendre l'espace mémoire total d'une application.

  • La deuxième méthode est en fait très courante.Par exemple, j'ai utilisé le SDK de Getui, et le service de Getui est en fait dans un autre processus séparé.

  • L'optimisation de la mémoire dans Android est généralement open source et limitée. L'open source consiste à étendre la mémoire et la limitation à éviter les fuites de mémoire.

2.3 Outils de détection et d'analyse des fuites mémoire

  • MemoryMonitor : évolution de l'utilisation de la mémoire au fil du temps

  • MAT : fichier HRPOF en entrée, résultats d'analyse en sortie

  • a. Histogramme : affichez différents types d'objets et leurs tailles

  • b.DominateTree : la mémoire occupée par l'objet et sa relation de référence

  • Tutoriel c.MAT

  • LeakCanary : Une bibliothèque de suivi en temps réel des fuites mémoire (principe LeakCanary)

6. Plan d'optimisation Caton

  • N'effectuez pas d'opérations d'accès/E/S au réseau sur des fichiers volumineux dans le thread principal

  • Lorsque vous dessinez l'interface utilisateur, essayez de réduire le niveau de l'interface utilisateur de dessin ; réduisez l'imbrication inutile des vues, vous pouvez utiliser l'outil Hierarchy Viewer pour le détecter, ce qui sera décrit en détail plus tard ;

  • Lorsque notre mise en page utilise FrameLayout, nous pouvons la changer pour fusionner, ce qui peut éviter le chevauchement des calculs entre notre propre mise en page de cadre et la mise en page de cadre ContentFrameLayout du système (mesure et mise en page)

  • Pour améliorer la vitesse d'affichage, utilisez ViewStub : il ne sera occupé qu'au chargement. Il est masqué lorsqu'il n'est pas chargé et ne prend que de la place.

  • Dans le cas du même niveau de vue, essayez d'utiliser LinerLayout au lieu de RelativeLayout ; parce que RelativeLayout mesurera deux fois lors de la mesure, et LinerLayout mesurera une fois, vous pouvez voir leur code source ;

  • Supprimez les propriétés inutiles dans le contrôle ;

  • Réutilisation de la disposition. Par exemple, la réutilisation de la disposition listView

  • Essayez d'éviter le surdessin (overdraw), par exemple: l'arrière-plan est souvent facile à provoquer un surdessin. Étant donné que notre mise en page a défini un arrière-plan, le thème MaterialDesign utilisé en même temps sera par défaut un arrière-plan. À ce stade, l'arrière-plan ajouté par le thème doit être supprimé ;

  • Arrière-plan facultatif en XML

  • Optimisation de la vue personnalisée. Utilisez canvas.clipRect() pour aider le système à identifier ces zones visibles, seule cette zone sera dessinée. Evitez également les dépassements.

  • Optimisation du démarrage, surveillance de la vitesse de démarrage, découverte des problèmes qui affectent la vitesse de démarrage, optimisation de la logique de démarrage et amélioration de la vitesse de démarrage de l'application. Par exemple, les pages d'accueil, l'optimisation raisonnable de la mise en page, l'optimisation de la logique de chargement et la préparation des données.

  • Mécanisme d'actualisation raisonnable, minimisez le nombre d'actualisations, essayez d'éviter que les threads CPU élevés ne s'exécutent en arrière-plan et réduisez la zone d'actualisation.

7. Optimisation de la consommation électrique

Il existe en fait de nombreuses raisons à la consommation d'énergie. Ici, je vais parler de plusieurs schémas d'optimisation. L'opposé du schéma d'optimisation est la raison. Plusieurs schémas d'optimisation sont les suivants :

  • Utilisation raisonnable du verrou wake_lock, le verrou wake_lock est principalement relatif au sommeil du système (ici pour économiser de l'énergie, c'est fait), ce qui signifie que mon programme ajoute ce verrou au CPU et le système ne dormira pas. Le but est de coopérer pleinement avec le fonctionnement de notre programme. Dans certains cas, si vous ne le faites pas, il y aura des problèmes, tels que WeChat et d'autres paquets de pulsation de messagerie instantanée arrêteront l'accès au réseau peu de temps après l'extinction de l'écran. Par conséquent, de nombreux verrous wake_lock sont utilisés dans WeChat.

  • Utilisez jobScheduler2 pour traiter de manière centralisée certaines requêtes réseau, et certaines qui n'ont pas besoin d'être traitées en temps opportun peuvent être traitées pendant la charge, telles que le traitement d'image, le téléchargement et la mise à jour de l'APP, etc. ;

  • Optimisation des calculs, évitement des opérations en virgule flottante, etc.

  • Lorsque des données sont transmises sur le réseau, essayez de compresser les données avant la transmission. Il est recommandé d'utiliser la technologie de sérialisation FlatBuffer, qui est plusieurs fois plus efficace que json. Si vous ne connaissez pas FlatBuffer, il est recommandé de trouver des informations pour apprendre .

Visant le point clé de "l'optimisation des performances", je voudrais partager avec vous une "Analyse complète de l'optimisation des performances Android à 360°". Ce manuel d'étude vous amènera à explorer l'optimisation des performances d'Android étape par étape, afin que les performances du produit peuvent être améliorées dans tous les aspects. , j'espère qu'il vous plaira.
Ce document de 721 pages au total, 4 points majeurs et 25 petits chapitres, propose non seulement une analyse détaillée des principes sous-jacents, mais aussi des cas pratiques particuliers !

"Analyse de l'optimisation globale des performances Android à 360°"

Chapitre 1 Idées de conception et optimisation de la qualité du code

1. Six principes

  • Principe de responsabilité unique

  • Principe de substitution de Liskov

  • Principe d'inversion de dépendance

  • Principe de séparation des interfaces

  • ……

2. Modèles de conception

  • Mode structurel : mode pont, mode adaptateur, mode décorateur, mode proxy, mode façade (apparence)...

  • Modèles de création : modèle de construction, modèle de singleton, modèle d'usine abstraite, modèle de méthode d'usine...

  • Structures de données : tableaux, piles, files d'attente, listes chaînées, arbres...

  • Algorithmes : algorithmes de tri, algorithmes de recherche...

image.png

Chapitre 2 Optimisation des performances du programme

1. Optimisation de la vitesse de démarrage et de l'efficacité d'exécution

  • Analyse du démarrage à froid et du démarrage à chaud

  • Solution d'écran noir et blanc de démarrage d'application

  • Analyse et solution du problème de gel de l'application

  • StrictMode pour une vitesse de démarrage et une optimisation de l'efficacité d'exécution

  • ……

2. Détection et optimisation de la mise en page

  • Optimisation au niveau de la mise en page

  • sur le rendu

  • ……

3. Optimisation de la mémoire

  • Écrasement de la mémoire et fuites de mémoire

  • grand souvenir

  • Optimisation de la mémoire bitmap

  • Outil de surveillance de la mémoire des profils

  • Tapis de gros objets et détection de fuites

  • Optimisation de la consommation électrique

  • Optimisation de la transmission réseau et du stockage des données Optimisation de la transmission réseau et du stockage des données

  • Optimisation de la taille de l'APK

  • adaptation à l'écran

  • ……

4. Optimisation de la consommation électrique

  • Sommeil et Veille

  • Historien de la batterie

  • planificateur de tâches

  • WorkManager

5. Optimisation de la transmission du réseau et du stockage des données

  • outil de sérialisation google protobuf

  • Compression extrême 7z

  • ……

6. Optimisation de la taille de l'APK

  • APK Minceur

  • Principe de confusion des ressources WeChat

  • ……

image.png

7. Adaptation à l'écran

  • Le principe d'adaptation

  • Principe d'adaptation du qualificatif de résolution d'écran et du qualificatif smallestWidth

  • Pourquoi choisir le qualificatif smallestWidth pour l'adaptation

  • Comment s'adapter aux autres modules

  • FAQ

    ……

8. Analyse du principe du problème OOM

  • mécanisme de gestion de la mémoire adj.

  • Mécanisme de recyclage de la mémoire JVM et analyse de l'algorithme GC

  • Résumé des problèmes liés au cycle de vie

  • Résumé du schéma de compression Bitmap

  • ……

9. Analyse du problème ANR

  • Principe d'ajustement de l'heure du système AMS

  • Analyse du principe d'attente du programme

  • Résolution des problèmes ANR

  • ……

10. Solution de surveillance des collisions

  • Solution de surveillance de la couche Java

  • Solution de surveillance de couche Nativie

  • ……

image.png

Chapitre 3 Optimisation de l'efficacité du développement

  1. Système de contrôle de version distribué Git

Scénario Introduction d'une plate-forme d'intégration continue efficace pour l'entreprise

Système de contrôle de version distribué GIT

  • Gestion d'agence GIT

  • ……

2. Système de construction automatique Gradle :

  • Plugin Gradle et Android : la relation entre le plugin Gradle et Android Gradle, l'utilisation de base de l'API Gradle Transform...

  • Utilisation de base de l'API Gradle Transform : qu'est-ce que Transform, scénarios d'utilisation de Transform, apprentissage de l'API Transform, type d'entrée...

  • Développement de plug-ins personnalisés : introduction du plug-in Gradle, préparation, pratique, plug-in Gradle personnalisé, méthode du module buildSrc...

  • Plug-in combat : packaging multicanal, sortie de version automatique...

image.png

Chapitre 4 Pratique d'optimisation des performances de l'APP

1. Vitesse de démarrage

  • Déroulement général du démarrage de l'application

  • démarrage à froid et démarrage à chaud

  • Mesure de la vitesse de démarrage

  • Optimisation de la fenêtre de démarrage

  • optimisation des threads

  • Optimisation de la planification du système

  • Optimisation du GC

  • Optimisation des E/S

  • Réorganisation des ressources

  • Optimisation de la mise en page de la page d'accueil

  • Optimisation du chargement des classes

  • Choisissez le bon framework de démarrage

  • Réduire le niveau de saut d'activité

  • Optimisation des fournisseurs

  • garder en vie

  • ……

image.png

  • 2. Fluidité

  • Quelques outils et routines pour l'analyse des problèmes de performance

  • Analyse des données à travers les données de performance

  • Cas de performances causés par les performances de la plate-forme Android

  • Problèmes de performances causés par l'application Android elle-même

  • Données et caractéristiques comportementales de la mémoire faible

  • Trésor de l'application

  • Analyse de l'ensemble du gel de la machine causé par le service sans obstacle de la méthode d'entrée Xunfei

  • Bytedance : la page de détails graphiques et textuels de Toutiao d'aujourd'hui s'ouvre en quelques secondes

  • ……

  • 3. La pratique de Douyin dans l'optimisation des ressources de taille de package APK

  • Compression d'images

  • compatibilité webp non intrusive

  • Optimisation multi-DPI

  • Consolidation des ressources en double

  • mode strict de la ressource de rétrécissement

  • Confusion de ressources (compatible avec le mode aab)

  • ARS Minceur

  • ……

image.png

  • 4. Analyse complète de la technologie de mise en page réactive Youku

  • Présentation de la technologie de mise en page réactive Youku APP

  • Youku APP Mise en page réactive Android Landing

  • Atterrir sur la scène de la distribution

  • Atterrir sur la scène de la consommation

  • Schéma de test de mise en page réactive de l'application Youku

  • ……

  • 5. Optimisation du réseau

  • Optimisation des liens mobiles Taobao dans le réseau

  • Pratique de Baidu APP dans l'optimisation profonde du réseau

  • ……

  • 6. Révéler le secret du projet d'optimisation des performances Mobile Taobao Double Eleven

  • Réalisation de la règle de la seconde

  • Augmentation de 20 % du temps de démarrage et de la fréquence d'images de la page

  • Économisez 50 % sur la mémoire du téléphone Android

  • ……

  • 7. Analyse de la dépendance du code source du lien complet de l'application AutoNavi

  • Architecture de la plate-forme d'application Gaode

  • Principe de réalisation de base

  • structuration du projet

  • Scénarios d'application et principes de mise en œuvre

  • ……

  • 8. Partagez l'expérience pratique de tuer complètement OOM

  • Résoudre les fuites de mémoire

  • stratégie de fond

  • Le pic de mémoire est trop élevé

  • Dépannage et optimisation des images extra-larges

  • ……

  • 9. Pratique d'optimisation de la mémoire du terminal WeChat Android

  • Détection de fuite d'activité

  • Suivi de l'allocation et de la désallocation des bitmaps

  • Détection de fuite de mémoire native

  • surveillance des threads

  • moniteur de mémoire

  • ……

image.png

Résumer

L'optimisation des performances ne se résout pas par la mise à jour d'une ou deux versions, c'est une exigence continue, une intégration continue et un retour itératif. Dans les projets réels, au début du projet, en raison des contraintes de main-d'œuvre et de temps de réalisation du projet, la priorité de l'optimisation des performances est relativement faible. Lorsque le projet est mis en service, la priorité doit être augmentée. Lors de la construction d'une solution , les points d'optimisation des performances doivent également être envisagés en amont, ce qui reflète les compétences techniques d'un programmeur. J'espère que cette " Analyse complète de l'optimisation des performances Android à 360° " pourra vous aider.

Les informations contenues dans cet article peuvent être scannées gratuitement en scannant la carte de certification officielle CSDN ci-dessous !

Je suppose que tu aimes

Origine blog.csdn.net/YoungOne2333/article/details/126909794
conseillé
Classement