Optimisation des performances Android-apk minceur

1. Code
2. Ressources
3. Bibliothèque dynamique

Structure de l'APK

Contient les répertoires suivants:

  • assets /: Contient les ressources de l'application, qui peuvent être obtenues via l'objet AssetManager.
  • lib /: contient le code compilé pour le niveau du processeur. Ce répertoire a un sous-répertoire pour chaque type de plate-forme, tel que armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 et mips.
  • res /: contient des ressources qui n'ont pas été compilées dans resources.arsc.
  • META-INF /: contient les fichiers de signature CERT.SF et CERT.RSA, ainsi que les fichiers MANIFEST.MF. (Annotation: vérifiez si ce fichier APK a été modifié par d'autres)

Contient les fichiers suivants:

  • classes.dex: contient des classes au format de fichier dex qui peuvent être comprises par la machine virtuelle Dalvik / Art.
  • resources.arsc: contient les ressources compilées. Ce fichier contient le contenu xml de toutes les configurations dans le répertoire res / values. L'outil d'empaquetage compile le contenu xml sous forme binaire et le compresse. Ces contenus incluent les chaînes de langue et les styles, ainsi que les contenus qui ne sont pas directement stockés dans le fichier resources.arsc, mais le chemin d'accès au contenu est donné, comme les fichiers de mise en page et les images. Table de mappage des ressources
  • AndroidManifest.xml: contient les principaux fichiers de configuration Android. Ce fichier répertorie le nom de l'application, la version, les autorisations d'accès et les fichiers de bibliothèque référencés. Le fichier est stocké au format binaire xml. (Annotation: le fichier peut également voir la minSdkVersion, la targetSdkVersion et d'autres informations de l'application)

Utiliser des graphiques vectoriels SVG

Importation SVG

SVG (Scalable Vector Graphics), graphiques vectoriels évolutifs. SVG ne dégrade pas la qualité de l'image en raison de la mise à l'échelle comme les bitmaps. L'avantage est qu'il peut réduire la taille de l'APK (par exemple, si vous utilisez des images png, vous devez placer plusieurs ensembles d'images avec différentes résolutions dans des répertoires tels que drawable et drawable-xhdpi, sinon l'image png deviendra floue en raison du zoom). Il est souvent utilisé pour de simples petites icônes. La recommandation officielle est d'utiliser SVG lorsque l'image est inférieure à 200 * 200. Lorsque l'image est grande, le temps de dessin de l'image SVG sera plus long. Pour les grandes images telles que l'image d'arrière-plan de la page de démarrage de l'application, SVG ne peut pas être utilisé et les images Webp peuvent être utilisées pour réduire la taille de l'image.

svg est défini par xml, et le nœud racine svg standard est <svg>.

Android ne prend en charge que <vector>, nous pouvons vectoriser la <svg>conversion svg du nœud racine <vector>.

Ouvrez le projet dans Android Studio, faites un clic droit dans le répertoire res -> nouveau -> Vector Asset
Insérez la description de l'image ici

Insérez la description de l'image ici

Conversion par lots SVG

S'il y a plusieurs svgs qui doivent être convertis en vecteurs Android, vous pouvez utiliser l'outil tiers svg2vector pour effectuer une conversion par lots.

Exécutez la commande de conversion:

java -jar svg2vector-cli-1.0.0.jar -d. -oa -h 20 -w 20

-d Spécifie le répertoire où se trouve le fichier svg
-o affiche le répertoire de l'image vectorielle android
-h définit la hauteur du
svg converti -w définit la largeur du svg converti

SVG non pris en charge

Si le fichier SVG contient des fonctions non prises en charge, un message d'erreur s'affiche en bas de Vector Asset Studio, comme illustré dans la figure:
Insérez la description de l'image ici
Exemples de fonctions non prises en charge:
Effets de filtre: Les effets de projection, de flou et de matrice de couleurs ne sont pas pris en charge.
Texte: il est recommandé d'utiliser d'autres outils pour convertir du texte en formes.

Les graphiques vectoriels sont rétrocompatibles

Les versions antérieures à Android 5.0 (API 21) ne prennent pas en charge les graphiques vectoriels. Il existe deux façons de s'adapter à l'aide de Vector Asset Studio: générer des fichiers PNG et utiliser des bibliothèques de support.

Méthode 1: générer une image au format png

Vector Asset Studio peut convertir des graphiques vectoriels en bitmaps de différentes tailles pour chaque densité d'écran pendant la construction. La configuration dans build.gradle est la suivante:

SVG est applicable au plugin Gradle 1.5 et supérieur;

android { defaultConfig { // Version 5.0 (API 21) et inférieure, génère des images png avec des dimensions spécifiées à partir d'images svg generatedDensities = ['xhdpi', 'xxhdpi'] } }




Méthode 2: bibliothèque de support

La configuration dans build.gradle est la suivante, applicable au plugin Gradle 2.0 et supérieur:
android { // Gradle Plugin 2.0+ defaultConfig { // Utilisez la classe VectorDrawableCompat dans la bibliothèque de support pour prendre en charge VectorDrawable vectorDrawables dans la version 2.1 et ultérieure . useSupportLibrary = true } } dependencies { // La version de la bibliothèque de support doit être 23.2 ou supérieure compile'com.android.support: appcompat-v7: 23.2.0 ' }









À ce stade, vous devez utiliser l'attribut app: srcCompat au lieu de l'attribut android: src pour utiliser les graphiques vectoriels, comme suit:
Insérez la description de l'image ici

Modification de la couleur du vecteur

Nous pouvons modifier individuellement la couleur d'une certaine partie du diagramme vectoriel, comme le montre la figure:
Insérez la description de l'image ici

Insérez la description de l'image ici
Insérez la description de l'image ici

Shader de teinte

Bien que nous ayons dit précédemment, vous pouvez modifier la couleur du diagramme vectoriel directement dans le fichier xml, mais il n'est pas recommandé de le modifier directement. Nous rendons généralement le vecteur noir, puis utilisons le shader Tint pour modifier la couleur du diagramme vectoriel.

Modifier la couleur: et
Insérez la description de l'image ici
si nous voulons obtenir un effet de clic?

Teinte shader-cliquez pour changer la couleur

Créez deux sélecteurs et utilisez-les normalement.

sélecteur tirable battery_selector.xml
Insérez la description de l'image ici

sélecteur de couleur battery_tint_selector.xml
Insérez la description de l'image ici
use
Insérez la description de l'image ici

Interface binaire d'application ABI

Le premier système Android ne supportait presque que l'architecture de processeur ARM v5, mais savez-vous maintenant combien de types il prend en charge? 7 sortes!

Le système Android prend actuellement en charge les sept architectures de CPU différentes suivantes: ARMv5, ARMv7 (à partir de 2010), x86 (à partir de 2011), MIPS (à partir de 2012), ARMv8, MIPS64 et x86_64 (à partir de 2014), Chacun est associé à un ABI correspondant.

ABI est l'abréviation de Application Binary Interface, qui définit comment les fichiers binaires (en particulier les fichiers .so) s'exécutent sur la plate-forme système correspondante, à partir du jeu d'instructions utilisé, de l'alignement de la mémoire à la bibliothèque de fonctions système disponible.

Sur le système Android, chaque architecture CPU correspond à un ABI: armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64.

AIDEZ-MOI Jeu (s) d'instructions pris en charge Remarques
armeabi ARMV5TE et versions ultérieures , Thumb-1 Pas de flotteur dur
armeabi-v7a armeabi , Thumb-2 , VFPv3-D16 , Autre , en option Incompatible avec les appareils ARMv5, v6
arm64-v8a AArch-64
x86 x86 (IA-32), MMX, SSE / 2/3, SSSE3 Pas de support pour MOVBE ou SSE4
x86_64 x86-64 , MMX , SSE / 2/3 , SSE3 , SSE4.1 , SSE4.2 , POPCNT
mips MIPS32r1 et versions ultérieures
mips64 MIPS64r6

L'analyse de chaque version est la suivante:

  • mips / mips64: rarement utilisé dans les téléphones mobiles et peut être ignoré
  • x86 / x86_64: les téléphones mobiles avec une architecture x86 incluront un ensemble d'instructions d'outil de transcodage dynamique appelé Houdini fourni par Intel pour atteindre la compatibilité avec arm .so, puis considéreront la part de marché x86 inférieure à 1%, et x86 liés deux. donc peut aussi être ignoré
  • armeabi: ARM v5 Il s'agit d'une version assez ancienne, qui ne prend pas en charge le matériel pour les calculs en virgule flottante, et présente des goulots d'étranglement de performance lorsque de nombreux calculs sont nécessaires.
  • armeabi-v7a: la version grand public actuelle d'ARM v7
  • arm64-v8a: prise en charge 64 bits

ps: informations relatives à ARM v8:

ARM lui-même ne possède pas de technologie de conception de puces 64 bits. En novembre 2011, il a passé l'acquisition d'une partie des droits d'utilisation de la technologie de l'architecture du processeur MIPS64 et l'a conçu en conjonction avec certaines fonctionnalités d'ARM. C'est-à-dire: parmi les trois architectures majeures de MIPS, ARM et X86, le seul ARM sans technologie 64 bits a obtenu le 64 bits grâce à l'acquisition de MIPS.

L'architecture dite ARMv8 est développée en ajoutant à l'architecture MIPS64 la technologie TrustZone, la technologie de virtualisation et la technologie SIMD avancée NEON qui sont déjà dans l'architecture ARMv7.

L'architecture ARMv8 64 bits contient deux états d'exécution: AArch32 (également appelé ARMv7) et AArch64 (ARMv8). L'état d'exécution AArch64 introduit un nouveau jeu d'instructions A64 (basé sur l'architecture MIPS64 acquise) pour la technologie de traitement 64 bits, et l'état d'exécution AArch32 prendra en charge le jeu d'instructions ARM existant. Par conséquent, le processeur ARM 64 bits contient des architectures ARMv7 32 bits et ARMv8 64 bits. Par conséquent: en voyant cela, vous devez comprendre que les processeurs ARM64 bits et les processeurs 64 bits informatiques sont deux concepts complètement incompatibles. Ce n'est pas que le 64 bits peut être nativement rétrocompatible avec les programmes 32 bits, mais via 64 bits L'architecture 32 bits intégrée au processeur exécute des programmes 32 bits. Pour le dire clairement, il n'exécute pas de programmes 32 bits sous forme 64 bits, mais sous forme 32 bits pour exécuter des programmes 32 bits.

Étant donné que le nouveau processeur 64 bits contient deux architectures et que la technologie de processus n'a pas été améliorée (28 nm), en même temps, sur les téléphones mobiles et les tablettes, la surface de la puce est strictement limitée et ne peut pas être augmentée de manière excessive, ce qui conduit à une répartition uniforme des processeurs ARM 64 bits Le nombre de transistors dans chaque architecture a fortement chuté, c'est-à-dire de l'architecture 32 bits dans le processeur 64 bits, pour le processeur 32 bits de même spécification, non seulement les performances ne se sont pas améliorées, mais les performances ont diminué dans une certaine mesure. Mais les fabricants de processeurs doivent donner aux consommateurs une explication pour mieux promouvoir le 64 bits, de sorte que les fabricants doivent améliorer les performances dans d'autres domaines pour compenser la perte causée par la réduction du nombre de transistors CPU. Par exemple: remplacez le GPU par de meilleures performances, augmentez la bande passante de la mémoire, un seul cœur virtuel multicœur pour améliorer les performances d'un seul cœur, des éditeurs de logiciels exécutant conjointement pour modifier le poids du score de fonctionnement (augmentation du score du GPU, réduction du poids du score du processeur), etc. De cette façon, les forces et les faiblesses sont maximisées, et finalement arrivées aux mains des consommateurs, fonctionnant avec le logiciel en cours d'exécution, il est en effet amélioré, les utilisateurs sont heureux et les poches des fabricants se gonflent.

Pour résumer, le processeur ARM64 bits est plus approprié pour l'appeler ARM32 + 64 au sens strict. Par rapport au processeur ARM32 bits, il a une régression et une marge d'amélioration, mais c'est précisément à cause de la rétrogression qu'ARM a inspiré l'avancement d'ARM. La volonté de la faire évoluer radicalement, il faut dire que c'est une sorte de progrès. Mais ARM64 est-il vraiment utile sur les téléphones mobiles? Je peux seulement dire que c'est vraiment inutile pour le moment, mais ce sera peut-être dans le futur.

Google a officiellement déclaré qu'Android prend en charge le 64 bits depuis longtemps. C'est vrai. D'Android 4.0 à Android 4.4, les systèmes Android prennent en charge le matériel 64 bits, mais cela signifie uniquement que le pilote sous-jacent prend en charge 64 bits et peut fonctionner. Sur du matériel 64 bits, rien de plus. Cependant, la couche supérieure exécutant le logiciel, qu'il s'agisse de la machine virtuelle Dalvik ou de la machine virtuelle ART, est de 32 bits. En d'autres termes, tant que votre système de téléphonie mobile est Android4.0-4.4, même si votre processeur est 64 bits, vous ne pouvez exécuter des programmes 32 bits que sous une machine virtuelle 32 bits, même si les vrais programmes 64 bits sont devant vous, Il ne peut pas non plus être installé.

Android L a commencé à prendre en charge les machines virtuelles ART 32 bits et 64 bits, avec un processeur 64 bits, exécutant à juste titre un logiciel 64 bits. Mais le problème se pose à nouveau, aucun éditeur de logiciel n'est prêt à développer des programmes 64 bits.

ARMv8 est un bon jeu d'instructions, qui non seulement prend en charge les futurs programmes 64 bits, mais est également rétrocompatible avec les programmes 32 bits existants. Avec la prise en charge d'ARMv8, les futurs systèmes d'exploitation de téléphones mobiles 64 bits, tels qu'Android L 64 bits, peuvent prendre en charge simplement et efficacement les applications 32 bits existantes, vous n'avez donc pas à vous soucier des problèmes de compatibilité.

Grand et petit

Le mode big-endian signifie que l'octet haut de données est stocké dans l'adresse basse de la mémoire et l'octet bas de données est stocké dans l'adresse haute de la mémoire. Ce mode de stockage est un peu similaire au traitement des données sous forme de chaîne: L'adresse passe de petite à grande, et les données sont placées de haut en bas, ce qui est cohérent avec nos habitudes de lecture.

Le mode petit-boutiste signifie que l'octet haut de données est stocké dans l'adresse haute de la mémoire et l'octet bas de données est stocké dans l'adresse basse de la mémoire. Ce mode de stockage combine efficacement les adresses haute et basse de l'adresse et le poids des bits de données. La partie haute adresse a un poids élevé et la partie basse adresse a un poids faible.

Pourquoi y a-t-il une distinction entre les modèles grand et petit boutiste? En effet, dans les systèmes informatiques, nous utilisons des octets comme unité, et chaque unité d'adresse correspond à un octet et un octet équivaut à 8 bits.

Par exemple, une telle donnée: 0x11223344 converti en binaire est 00010001 00100010 00110011 01000100

Après le stockage big-endian, ce que nous voyons est 00010001 00100010 00110011 01000100, soit 11 22 33 44 en hexadécimal.

Après le stockage little-endian, ce que nous voyons est 01000100 00110011 00100010 00010001 qui est 44 33 22 11 en hexadécimal

Situation actuelle

À l'heure actuelle, les puces de la série 80x86 d'Intel sont les seules puces qui insistent encore sur l'utilisation du petit-boutiste. Les puces ARM utilisent le petit-boutiste par défaut, mais peuvent être commutées sur le grand-boutiste; tandis que MIPS et d'autres puces utilisent tout le stockage big-endian ou fournissent des options pour prendre en charge le big-endian— Vous pouvez basculer entre les grandes et les petites extrémités. De plus, le traitement des grands et petits endian est également lié à l'implémentation du compilateur. En langage C, la valeur par défaut est little endian (mais dans certaines implémentations de microcontrôleurs, il est basé sur big endian, comme Keil 51C). Java est indépendant de la plateforme. C'est du big endian. Big endian est généralement utilisé pour transmettre des données sur le réseau

Je suppose que tu aimes

Origine blog.csdn.net/yzpbright/article/details/109276599
conseillé
Classement