Otimização de desempenho do Android - otimização de armazenamento

Método de armazenamento Android

SharedPrefence, armazena dados de configuração simples e outros
SQLite, armazena
arquivos de dados relacionais complexos , geralmente armazena arquivos de log, cache de arquivo local, protobuf, 7z
ContentProvider, acesso a dados de processo cruzado, geralmente usado em conjunto com SQLite e fornece dados para outros processos de aplicativos usar.
Armazenamento de rede, o armazenamento de rede envolve serialização / desserialização (protobuf, xml, json)

SharedPrefence

Comprometa e aplique de SharedPrefence

  • apply não tem valor de retorno e commit retorna booleano para indicar se a modificação foi enviada com sucesso;
  • Commit é enviar de forma síncrona o conteúdo para o disco rígido, e aplicar primeiro envia imediatamente as alterações para a memória e, em seguida, abre um thread assíncrono para enviar para o disco rígido e, se o envio falhar, você não receberá nenhuma notificação.
  • Todo envio de confirmação é um processo síncrono e a eficiência será mais lenta do que aplicar o envio assíncrono. Se você não se preocupa com o sucesso do resultado do envio, o método de aplicação é preferível.
  • Aplicar é gravar no disco usando threads assíncronos e confirmar é gravar no disco de forma síncrona. Portanto, quando usamos o commit no thread principal, precisamos considerar se haverá problemas de ANR. (Não é adequado para grande armazenamento de dados)

Problemas de multi-processo -> mmkv

SQLite

SQLiteStatement
usa transações,
índices,
threads assíncronos e grava bancos de dados para gerenciamento unificado

A Internet

  • Serialização
  • Desserialização

Compressão 7z xml
json
protobuf independente de plataforma
(trabalho)

protobuf

Já existe xml / json, por que usar protobuf

Comparado com xml, json, vantagens protobuf:

  • Conciso: XML requer muito código de análise, enquanto protobuf gera código automaticamente
  • Tamanho pequeno: o tamanho da mensagem é apenas 1/10-1 / 3 de xml
  • Velocidade rápida: a velocidade de análise é 20-100 vezes mais rápida do que xml
  • Use o sistema de compilação Protobuf: você pode gerar códigos de acesso a dados que são mais fáceis de usar na programação
  • Para obter melhor compatibilidade, um princípio do design de Buffers de protocolo é ser capaz de oferecer suporte à compatibilidade ascendente ou descendente.

Desvantagens:
1. O formato binário leva a uma legibilidade ruim.
Para melhorar o desempenho, protobuf usa o formato binário para codificação. Isso leva diretamente a uma legibilidade ruim. Isso afeta diretamente a eficiência de desenvolvimento e teste. É claro que, em circunstâncias normais, o protobuf é muito confiável e não causará maiores problemas.
2. Falta de autodescrição
De modo geral, XML é autodescritivo, enquanto o formato protobuf não. Fornece um formato binário do conteúdo do protocolo, não funcionará se você não corresponder à estrutura que escreveu.

Use protobuf no projeto

Para usar protobuf na linha de comando,
se quiser usar comandos para compilar arquivos protobuf (o sufixo do arquivo protobuf é .proto) em arquivos java, você precisa instalar a ferramenta protobuf e usar o comando protoc para compilar.

Usando protobuf no projeto Android Studio
1) Primeiro, precisamos adicionar o plug-in da ferramenta protobuf ao arquivo global buid.gradle:

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

2) Em seguida, no arquivo app / buid.gradle:

①Adicione este plugin

    apply plugin: 'com.google.protobuf'

②Adicionar dependência

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

③Adicionar configuração 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 {
    
    }
           }
        }
    }
}

④Adicione o diretório do arquivo protobuf (no android {})

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

3) Crie um novo arquivo protobufbean.proto no diretório src / main / java / com / protobufdir e adicione o seguinte 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) Reconstrua o projeto.Quando o AS construir o projeto, o arquivo .proto será gerado em um arquivo java.
Você pode encontrar esses arquivos java gerados no diretório \ app \ build \ generated \ source \ proto \ debug \ java \.
Esses arquivos java gerados encapsulam algumas APIs de serialização e desserialização, que podem estar diretamente no projeto Ligue.

Especificação de linguagem

Definição de mensagem

  • Determine o nome da mensagem e dê a ela um nome significativo.
  • Especifique o tipo de campo
  • Defina o número do campo. Em Protocol Buffers, o número do campo é muito importante. O nome do campo é apenas para referência e geração de código. Deve-se observar que o intervalo de números do campo, dos quais 19.000 ~ 19999 são reservados por Buffers de protocolo.

Restrições de campo

  • obrigatório especifica que o campo deve receber um valor e não deve estar vazio (essa restrição foi removida na v3);
  • O campo opcional especificado é um campo opcional e pode estar vazio. Para campos opcionais, você também pode usar [padrão] para especificar o valor padrão. Se não for especificado, o valor padrão do tipo de campo será usado;
  • Use repetido para especificar o campo como uma coleção

Tipo de campo

  • Vários tipos de mensagem podem ser definidos em um arquivo proto ao mesmo tempo. Ao gerar o código, dependendo da linguagem de destino do código gerado, o método de processamento é diferente. Por exemplo, Java irá gerar um arquivo .java para cada tipo de mensagem.
  • Você pode especificar o tipo do campo como outros tipos de mensagem
  • Use a palavra-chave import para importar outros arquivos proto
  • O tipo de mensagem no arquivo proto também pode ser aninhado
  • No arquivo proto, você pode usar a palavra-chave extensions para reservar uma parte dos números de campo para uso posterior ao estender a terceiros
  • A palavra-chave oneof especifica um conjunto de campos, pelo menos um campo deve receber um valor

Muitos tipos escalares são fornecidos em Buffers de protocolo para usarmos ao definir os tipos de campo:
Insira a descrição da imagem aqui

Protocolo de codificação

Codificação de comprimento variável Base-128

  • A chamada codificação de comprimento variável é o oposto da codificação de comprimento fixo. A codificação de comprimento fixo é representada por um número fixo de bytes. Por exemplo, os números de tipo int32 são fixos usando 4 bytes, enquanto a codificação de comprimento variável requer vários bytes para usar vários bytes. Por exemplo, para o número 1 do tipo int32, apenas 1 byte é suficiente. Existem dois princípios de codificação de comprimento variável Base-128
  • Cada byte usa os 7 bits inferiores para representar o número, exceto para o último byte, o bit mais alto dos outros bytes é definido como 1.
  • Usar ordem de bytes Little-Endian
  • tag-length-valuetag-length-value

Insira a descrição da imagem aqui

Processamento de codificação negativa

  • Adote Codificação ZigZag
  • (n <<1)^(n>>31)或者(n<<1)^(n>>63)

Big-endian sequência de
escrever de alta-primeira ordem, em seguida, baixa sequência endian Escrever baixo
-order
em primeiro lugar, seguida de alta ordem

Protocolo de serialização de buffers de protocolo e aplicação
[Protobuf] Regras de codificação e decodificação de Protobuf em detalhes

Acho que você gosta

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