Optimisation des performances Android-Optimisation du stockage

Méthode de stockage Android

SharedPrefence, stocke des données de configuration simples et d'autres
SQLite, stocke des
fichiers de données relationnelles complexes , stocke généralement des fichiers journaux, un cache de fichiers local, protobuf, 7z
ContentProvider, un accès aux données inter-processus, généralement utilisé en conjonction avec SQLite, et fournit des données à d'autres processus d'application utilisation.
Stockage réseau, le stockage réseau implique la sérialisation / désérialisation (protobuf, xml, json)

Préférence partagée

Engagement et application de SharedPrefence

  • apply n'a pas de valeur de retour et commit renvoie un booléen pour indiquer si la modification a été soumise avec succès;
  • La validation consiste à soumettre le contenu sur le disque dur de manière synchrone, et appliquer d'abord soumet immédiatement les modifications à la mémoire, puis démarre un thread asynchrone à soumettre au disque dur, et si la soumission échoue, vous ne recevrez aucune notification.
  • Toute soumission de validation est un processus synchrone et l'efficacité sera plus lente que l'application de la soumission asynchrone. Si vous ne vous souciez pas de savoir si le résultat de la soumission est réussi, la méthode Apply est préférable.
  • Apply consiste à écrire sur le disque à l'aide de threads asynchrones et la validation consiste à écrire sur le disque de manière synchrone. Ainsi, lorsque nous utilisons commit dans le thread principal, nous devons déterminer s'il y aura des problèmes ANR. (Ne convient pas pour le stockage de données volumineuses)

Problèmes multi-processus -> mmkv

SQLite

SQLiteStatement
utilise des transactions,
utilise des index,
des threads asynchrones et écrit des bases de données pour une gestion unifiée

L'Internet

  • Sérialisation
  • Désérialisation

xml
json
protobuf
compression 7z indépendante de la plate-forme (travail)

protobuf

Il existe déjà xml / json, pourquoi utiliser protobuf

Par rapport aux avantages de xml, json, protobuf:

  • Concis: XML nécessite beaucoup de code d'analyse, tandis que protobuf génère automatiquement du code
  • Petite taille: la taille du message est seulement 1 / 10-1 / 3 de xml
  • Vitesse rapide: la vitesse d'analyse est 20 à 100 fois plus rapide que xml
  • Utilisez le système de compilation Protobuf: vous pouvez générer des codes d'accès aux données plus faciles à utiliser en programmation
  • Pour une meilleure compatibilité, un principe de conception des tampons de protocole est de pouvoir prendre en charge la compatibilité descendante ou ascendante.

Inconvénients:
1. Le format binaire conduit à une mauvaise lisibilité
Afin d'améliorer les performances, protobuf utilise le format binaire pour l'encodage. Cela conduit directement à une mauvaise lisibilité. Cela affecte directement l'efficacité du développement et des tests. Bien sûr, dans des circonstances normales, protobuf est très fiable et ne posera pas de problèmes majeurs.
2. Manque d'auto-description
D'une manière générale, XML est auto-descriptif, alors que le format protobuf ne l'est pas. Donnez-vous un format binaire du contenu du protocole, cela ne fonctionnera pas si vous ne correspondez pas à la structure que vous avez écrite.

Utiliser protobuf dans le projet

Pour utiliser protobuf dans la ligne de commande,
si vous souhaitez utiliser des commandes pour compiler des fichiers protobuf (le suffixe du fichier protobuf est .proto) dans des fichiers java, vous devez installer l'outil protobuf, puis utiliser la commande protoc pour compiler.

Utilisation de protobuf dans le projet de studio Android
1) Tout d'abord, nous devons ajouter le plugin de l'outil protobuf au fichier global buid.gradle:

classpath 'com.google.protobuf: protobuf-gradle-plugin: 0.8.10'

2) Ensuite, dans le fichier app / buid.gradle:

①Ajoutez ce plugin

    apply plugin: 'com.google.protobuf'

②Ajouter une dépendance

     implementation 'com.google.protobuf:protobuf-java:3.7.1'

③Ajout de la configuration protobuf

protobuf {
    
    
    //配置protoc编译器
    protoc {
    
    
        artifact = 'com.google.protobuf:protoc:3.7.1'
    }
    //这里配置生成目录,编译后会在build的目录下生成对应的java文件
   generateProtoTasks {
    
    
        all().each {
    
     task ->
           task.builtins {
    
    
                remove java
           }
           task.builtins {
    
    
                java {
    
    }
           }
        }
    }
}

④Ajoutez le répertoire du fichier protobuf (sous android {})

sourceSets {
    
    
      main {
    
    
          proto {
    
    
              srcDir 'src/main/java/com/protobufdir'
          }
      }
}

3) Créez un nouveau fichier protobufbean.proto dans le répertoire src / main / java / com / protobufdir et ajoutez le code suivant:

syntax = "proto3";
package com.example.protobufdemo;//包名


option java_package = "com.example.protobuf02";
option  java_outer_classname = "Person";
option csharp_namespace = "android";
message _Person{
    
    

    string name = 1;
    int32 id = 2;
    string email = 3;

    enum _PhoneType{
    
    
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }

    message _PhoneNumber{
    
    
        string number =1;
        _PhoneType type = 2;
    }

    repeated _PhoneNumber phone = 4;//数组


}

4) Reconstruire le projet Lors de la construction du projet AS, le fichier .proto sera généré dans un fichier java.
Vous pouvez trouver ces fichiers java générés dans le répertoire \ app \ build \ generated \ source \ proto \ debug \ java \.
Ces fichiers java générés encapsulent des API de sérialisation et de désérialisation, qui peuvent être directement dans le projet Appel.

Spécification de la langue

Définition du message

  • Déterminez le nom du message et donnez au message un nom significatif.
  • Spécifiez le type de champ
  • Définissez le numéro du champ. Dans Protocol Buffers, le numéro du champ est très important. Le nom du champ sert uniquement de référence et de génération de code. Il convient de noter que la plage de numéros du champ, dont 19000 ~ 19999 sont réservés par les tampons de protocole.

Contraintes de terrain

  • obligatoire spécifie que le champ doit recevoir une valeur et ne doit pas être vide (cette contrainte est supprimée dans la v3);
  • Le champ facultatif spécifié est facultatif et peut être vide. Pour les champs facultatifs, vous pouvez également utiliser [par défaut] pour spécifier la valeur par défaut. S'il n'est pas spécifié, la valeur par défaut du type de champ sera utilisée;
  • Utiliser répété pour spécifier le champ en tant que collection

Type de champ

  • Plusieurs types de messages peuvent être définis dans un fichier proto en même temps. Lors de la génération du code, selon la langue cible du code généré, la méthode de traitement est différente. Par exemple, Java générera un fichier .java pour chaque type de message.
  • Vous pouvez spécifier le type de champ comme d'autres types de message
  • Utilisez le mot-clé import pour importer d'autres fichiers proto
  • Le type de message dans le fichier proto peut également être imbriqué
  • Dans le fichier proto, vous pouvez utiliser le mot-clé extensions pour réserver une partie des numéros de champ pour une utilisation ultérieure lors de l'extension à des tiers
  • Le mot-clé oneof spécifie un ensemble de champs, au moins un champ doit avoir une valeur

De nombreux types scalaires sont fournis dans les tampons de protocole que nous pouvons utiliser lors de la définition des types de champ:
Insérez la description de l'image ici

Protocole d'encodage

Codage de longueur variable en base 128

  • Le codage dit de longueur variable est l'opposé du codage de longueur fixe. Le codage de longueur fixe est représenté par un nombre fixe d'octets. Par exemple, les nombres de type int32 sont fixés sur 4 octets, tandis que le codage de longueur variable nécessite plusieurs octets pour utiliser plusieurs octets. Par exemple, pour le nombre 1 de type int32, un seul octet suffit. Il existe deux principes de codage à longueur variable Base-128
  • Chaque octet utilise les 7 bits inférieurs pour représenter le nombre, sauf pour le dernier octet, le bit le plus élevé des autres octets est mis à 1.
  • Utiliser l'ordre des octets Little-Endian
  • valeur-longueur-de-balise-valeur-longueur-de-balise

Insérez la description de l'image ici

Traitement d'encodage négatif

  • Adoptez l'encodage ZigZag
  • (n <<1)^(n>>31)或者(n<<1)^(n>>63)

Séquence big-endian
Écriture d' ordre supérieur d'abord, puis séquence bas de
gamme Écriture d' ordre inférieur d'
abord, puis d'ordre supérieur

Protocol Buffers Protocole de sérialisation et application
[Protobuf] Règles de codage et de décodage Protobuf en détail

Je suppose que tu aimes

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