Optimización del rendimiento de Android: optimización del almacenamiento

Método de almacenamiento de Android

SharedPrefence, almacena datos de configuración simples y otros
SQLite, almacena
archivos de datos relacionales complejos , generalmente almacena archivos de registro, caché de archivos locales, protobuf, 7z
ContentProvider, acceso a datos entre procesos, generalmente utilizado junto con SQLite, y proporciona datos a otros procesos de aplicaciones utilizar.
Almacenamiento en red, el almacenamiento en red implica serialización / deserialización (protobuf, xml, json)

SharedPrefence

Comprometerse y aplicar SharedPrefence

  • apply no tiene valor de retorno y commit devuelve boolean para indicar si la modificación se envió correctamente;
  • Confirmar consiste en enviar el contenido al disco duro de forma sincrónica, y aplicar inmediatamente envía los cambios a la memoria y luego abre un hilo asincrónico para enviarlo al disco duro, y si el envío falla, no recibirá ninguna notificación.
  • Todo envío de confirmación es un proceso sincrónico, y la eficiencia será más lenta que la aplicación de envío asincrónico. Si no le importa el éxito del resultado del envío, se prefiere el método de aplicación.
  • Aplicar es escribir en el disco usando subprocesos asincrónicos y confirmar es escribir en el disco de forma sincrónica. Entonces, cuando usamos commit en el hilo principal, debemos considerar si habrá problemas de ANR. (No apto para almacenamiento de datos de gran tamaño)

Problemas multiproceso -> mmkv

SQLite

SQLiteStatement
usa transacciones,
usa índices,
subprocesos asincrónicos y escribe bases de datos para una administración unificada

La Internet

  • Publicación por entregas
  • Deserialización

xml
json
protobuf
compresión 7z independiente de la plataforma (trabajo)

protobuf

Ya existe xml / json, ¿por qué usar protobuf?

Comparado con xml, json, ventajas de protobuf:

  • Conciso: XML requiere mucho código de análisis, mientras que protobuf genera código automáticamente
  • Tamaño pequeño: el tamaño del mensaje es solo 1 / 10-1 / 3 de xml
  • Velocidad rápida: la velocidad de análisis es 20-100 veces más rápida que xml
  • Utilice el sistema de compilación Protobuf: puede generar códigos de acceso a datos que son más fáciles de usar en la programación
  • Para una mejor compatibilidad, un principio del diseño de búferes de protocolo es poder admitir compatibilidad ascendente o descendente.

Desventajas:
1. El formato binario conduce a una legibilidad deficiente.
Para mejorar el rendimiento, protobuf utiliza el formato binario para la codificación. Esto conduce directamente a una legibilidad deficiente. Esto afecta directamente la eficiencia del desarrollo y las pruebas. Por supuesto, en circunstancias normales, protobuf es muy confiable y no causará mayores problemas.
2. Falta de autodescripción
En términos generales, XML es una autodescripción, mientras que el formato protobuf no lo es. Darle un formato binario del contenido del protocolo, no funcionará si no coincide con la estructura que escribió.

Usa protobuf en el proyecto

Para usar protobuf en la línea de comandos,
si desea usar comandos para compilar archivos protobuf (el sufijo del archivo protobuf es .proto) en archivos java, debe instalar la herramienta protobuf y luego usar el comando protocol para compilar.

Uso de protobuf en el proyecto de estudio de Android
1) Primero, necesitamos agregar el complemento de la herramienta protobuf al archivo global buid.gradle:

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

2) Luego, en el archivo app / buid.gradle:

①Añadir este complemento

    apply plugin: 'com.google.protobuf'

②Añadir dependencia

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

③Añadir configuración de 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 {
    
    }
           }
        }
    }
}

④Añadir el directorio del archivo protobuf (en android {})

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

3) Cree un nuevo archivo protobufbean.proto en el directorio src / main / java / com / protobufdir y agregue el siguiente código:

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) Reconstruir el proyecto Cuando el proyecto de compilación AS, el archivo .proto se generará en un archivo java.
Puede encontrar estos archivos java generados en el directorio \ app \ build \ generate \ source \ proto \ debug \ java \.
Estos archivos java generados encapsulan algunas API de serialización y deserialización, que pueden estar directamente en el proyecto Llamada.

Especificación de idioma

Definición de mensaje

  • Determina el nombre del mensaje y dale un nombre significativo.
  • Especifica el tipo de campo
  • Defina el número del campo. En Protocol Buffers, el número del campo es muy importante. El nombre del campo es solo para referencia y generación de código. Cabe señalar que el rango de números del campo, de los cuales 19000 ~ 19999 están reservados por Protocol Buffers.

Restricciones de campo

  • required especifica que el campo debe tener asignado un valor y no debe estar vacío (esta restricción se elimina en v3);
  • El campo opcional especificado es opcional y puede estar vacío. Para los campos opcionales, también puede usar [predeterminado] para especificar el valor predeterminado. Si no se especifica, se usará el valor predeterminado del tipo de campo;
  • Utilice repetido para especificar el campo como una colección

Tipo de campo

  • Se pueden definir varios tipos de mensajes en un archivo proto al mismo tiempo. Al generar código, dependiendo del idioma de destino del código generado, el método de procesamiento es diferente. Por ejemplo, Java generará un archivo .java para cada tipo de mensaje.
  • Puede especificar el tipo de campo como otros tipos de mensajes
  • Utilice la palabra clave de importación para importar otros archivos proto
  • El tipo de mensaje en el archivo proto también se puede anidar
  • En el archivo proto, puede usar la palabra clave extensiones para reservar una parte de los números de campo para su uso posterior cuando se extienda a terceros
  • La palabra clave oneof especifica un conjunto de campos, al menos a un campo se le debe asignar un valor

Se proporcionan muchos tipos escalares en Protocol Buffers para que los usemos al definir tipos de campo:
Inserte la descripción de la imagen aquí

Protocolo de codificación

Codificación de longitud variable Base-128

  • La denominada codificación de longitud variable es lo opuesto a la codificación de longitud fija. La codificación de longitud fija se representa mediante un número fijo de bytes. Por ejemplo, los números de tipo int32 se fijan utilizando 4 bytes, mientras que la codificación de longitud variable requiere varios bytes para utilizar varios bytes. Por ejemplo, para el número 1 de tipo int32, solo 1 byte es suficiente. Hay dos principios de codificación de longitud variable Base-128
  • Cada byte utiliza los 7 bits inferiores para representar el número, excepto el último byte, el bit más alto de los demás bytes se establece en 1.
  • Usar orden de bytes Little-Endian
  • valor-longitud-etiqueta-valor-longitud-etiqueta

Inserte la descripción de la imagen aquí

Procesamiento de codificación negativa

  • Adopte la codificación ZigZag
  • (n <<1)^(n>>31)或者(n<<1)^(n>>63)

BigEndian secuencia de
escritura de alto orden primero, luego baja la secuencia endian Escribir baja
-order
primero, después de orden superior

Protocol Buffers protocolo de serialización y aplicación
[Protobuf] Reglas de codificación y decodificación de Protobuf en detalle

Supongo que te gusta

Origin blog.csdn.net/yzpbright/article/details/109261927
Recomendado
Clasificación