Análise da solução de otimização de desempenho do Android mais completa da história

A otimização de desempenho no Android é dividida nos seguintes aspectos:

otimização de layout

Otimização de rede

Otimização do pacote de instalação

otimização de memória

Otimização de Caton

iniciar a otimização

……

1. Otimização do layout

A essência da otimização de layout é reduzir a hierarquia de visualização. Os esquemas comuns de otimização de layout são os seguintes:

  • No caso em que ambos LinearLayout e RelativeLayout podem completar o layout, o LinearLayout é o preferido, o que pode reduzir o nível de View, mas observe que o mesmo componente pode demorar muito para desenhar RelativeLayout

  • Use a tag <include> para extrair as partes comuns de componentes de layout comumente usados ​​para reutilização.

  • Use a tag < ViewStub > para carregar layouts não utilizados, carregamento lento (carregado na atividade quando necessário)

  • Use tags <Mesclar> para reduzir os níveis de aninhamento de layout

2. Otimização do desenho

A otimização do desenho significa que o método onDraw do View deve evitar a realização de um grande número de operações, o que se reflete principalmente em dois aspectos:

1. Não crie novos objetos locais no onDraw.

Como o método onDraw pode ser chamado com frequência, um grande número de objetos temporários será gerado em um instante, o que não apenas ocupa muita memória, mas também faz com que o sistema gc com mais frequência, reduzindo a eficiência de execução do programa.

2. Não faça tarefas demoradas no método onDraw,

Milhares de operações de loop não podem ser executadas. Embora cada loop seja muito leve, um grande número de loops ainda ocupa fatias de tempo da CPU, o que fará com que o processo de desenho da View não seja suave.

De acordo com os padrões do modelo de otimização de desempenho fornecido oficialmente pelo Google, a frequência de desenho do View é garantida como 60fps é a melhor, o que exige que o tempo de desenho de cada quadro não exceda 16ms (16ms = 1000/60), embora é difícil para o programa garantir o tempo de 16ms , mas é sempre prático minimizar a complexidade no método onDraw.

3. Otimização da rede

Os esquemas comuns de otimização de rede são os seguintes:

  • Minimize as solicitações de rede e mescle o máximo possível

  • Evite a resolução de DNS. A consulta de nome de domínio pode levar centenas de milissegundos e pode haver o risco de sequestro de DNS. Você pode usar o método de adicionar atualizações dinâmicas de IP de acordo com as necessidades de negócios ou alternar para o método de acesso de nome de domínio quando o acesso do método IP falhar.

  • Uma grande quantidade de dados é carregada de forma de paginação

  • A transmissão de dados de rede adota compactação GZIP

  • Junte-se ao cache de dados de rede para evitar solicitações de rede frequentes

  • Ao fazer upload de fotos, comprima as fotos quando necessário

4. Otimização do pacote de instalação

  • O núcleo da otimização do pacote de instalação é reduzir o tamanho do apk. As soluções comuns são as seguintes:

  • Reduza os arquivos de recursos desnecessários no aplicativo, como fotos, e comprima as fotos o máximo possível sem afetar o efeito do APP, o que tem um certo efeito

  • Ao usar a biblioteca SO, mantenha a versão v7 da biblioteca SO primeiro e exclua outras versões da biblioteca SO. A razão é que em 2018, a versão v7 da biblioteca SO pode atender a maioria dos requisitos do mercado. Pode não ser possível para telefones celulares oito ou nove anos atrás, mas não precisamos nos adaptar a telefones celulares desatualizados . O efeito de reduzir o volume do apk no desenvolvimento real é muito significativo. Se você usa muitas bibliotecas SO, por exemplo, uma versão da biblioteca SO tem um total de 10M, mantenha apenas a versão v7, exclua o armeabi e v8 versões da biblioteca SO, e o total pode ser reduzido. Volume de 20M.

  • otimização de recursos res

    (1) Use apenas um conjunto de fotos e use fotos de alta resolução.

    (2) Design de interface do usuário Instale o plug-in TinyPNG no ps para compactar as imagens sem perdas.

    (3) imagens svg: a descrição de algumas imagens sacrifica o poder de computação da CPU para economizar espaço. Princípios utilizados: ícones simples.

    (4) A imagem usa o formato WebP (https://developers.google.com/speed/webp/) (Facebook, Tencent, Taobao estão usando.) Desvantagem: O carregamento é muito mais lento que o PNG. Mas a configuração é relativamente alta. Ferramentas: http://isparta.github.io/

    (5) Use tintcolor (android - altere a cor desenhável programaticamente) para obter o efeito de inversão do botão.

  • Otimização de código

    (1) Realize a simplificação lógica dos módulos funcionais

    (2) A ferramenta Lint verifica arquivos inúteis e lista recursos inúteis em "UnusedResources: Unused resources" e os exclui.

    (3) Remova bibliotecas dependentes inúteis.

  • otimização de recursos lib

    (1) Recursos baixados dinamicamente.

    (2) O plug-in de alguns módulos é adicionado dinamicamente.

    (3) Recorte e compactação de arquivos so.

  • otimização de recursos de ativos

    (1) É melhor usar o formato de compressão com perdas para arquivos de áudio, como opus, mp3 e outros formatos, mas é melhor não usar o formato de música de compressão sem perdas

    (2) Para compactar o arquivo de fonte ttf, você pode usar a ferramenta FontCreator para extrair apenas o texto necessário. Por exemplo, ao exibir a data, apenas fontes digitais são necessárias, mas usar a biblioteca de fontes original pode exigir um tamanho de 10 MB. Se você apenas extrair as fontes necessárias, o arquivo de fonte gerado é de apenas 10 KB.

  • Ofuscação de código.

  • Use a ferramenta ofuscadora de código proGuard, que inclui minificação, otimização, ofuscação e muito mais.

  • Plugar

  • Os módulos de função podem ser colocados no servidor e carregados quando necessário.

  • 7z compressão extrema

5. Otimização de memória do Android

1. Mecanismo de gerenciamento de memória do Android

Os aplicativos Android são executados na máquina virtual Android, e a alocação de memória e a coleta de lixo são executadas pela máquina virtual Android.

2. Vazamentos de memória comuns

Na verdade, a essência dos vazamentos de memória é que os objetos com um ciclo de vida mais longo referem-se a objetos com um ciclo de vida mais curto.

2.1 Vazamentos de memória

Causa do vazamento de memória: o objeto alocado no heap não será mais usado, mas o coletor GC não pode reciclá-lo e esse objeto é referenciado por um aplicativo forte.

  • Vazamentos de memória causados ​​por variáveis ​​estáticas

    Solução: Defina a classe interna como uma classe interna estática ou separe-a, use context.getApplicationContext().

  • Vazamento de memória causado pelo modo singleton

    Solução: passe o parâmetro context.getApplicationContext().

  • Vazamento de memória causado por animação de propriedade

    Solução: Chame Animator.cancel() em Activity.onDestroy() para interromper a animação.

  • Vazamento de memória causado pelo Handler

    Solução: Use classe interna estática + referência fraca WeakReference; limpe a fila de mensagens quando a classe externa terminar seu ciclo de vida.

  • vazamentos de memória causados ​​por threads

    Solução: defina AsyncTask e Runnable como classes internas estáticas ou separe-as; use referências fracas para salvar referências de contexto dentro de threads.

  • Vazamentos de memória causados ​​por recursos não fechados

    Solução: Feche ou efetue logoff a tempo quando a Activity for destruída. Por exemplo:

    ① BroadcastReceiver: Chame unregisterReceiver() para sair;

    ②Cursor, Stream, File: Chame close() para fechar;

    ③Bitmap: chame recycle() para liberar a memória (não há necessidade de manualmente após a versão 2.3).

  • Vazamento de memória causado pelo adaptador

    Detalhes: Em vez de usar o cache e confiar apenas em getView() para reinstanciar o Item todas as vezes, ele pressionará o gc.

    Solução: use o convertView armazenado em cache ao construir o adaptador.

  • Vazamento de memória causado pelo WebView.

    Detalhes: WebView é especial, mesmo que seu método destroy seja chamado, ele ainda causará um vazamento de memória.

    Solução: Na verdade, a melhor maneira de evitar vazamentos de memória causados ​​pelo WebView é fazer a Activity onde o WebView está localizado em outro processo. Quando essa Activity terminar, mate o processo atual onde o WebView está localizado. Lembro que o WebView do Ali Dingding é outro processo. Um processo que é aberto também deve usar esse método para evitar vazamentos de memória.

  • vazamento de classe de coleção

    Detalhes: por exemplo, existem aplicativos estáticos, como mapas globais, mas eles não são excluídos no final.

    Solução: recicle as coletas desnecessárias durante o onDestry.

2.2 Expandir a memória

Os SDKs de grandes fabricantes podem ter menos vazamentos de memória, mas a qualidade dos SDKs de alguns fabricantes pequenos é menos confiável. A melhor maneira de lidar com essa situação que não podemos mudar é expandir a memória.

Geralmente, há duas maneiras de expandir a memória:

  • Uma é adicionar o atributo largeHeap="true" em Application no arquivo de manifesto e a outra é abrir vários processos para o mesmo aplicativo para expandir o espaço total de memória de um aplicativo.

  • O segundo método é realmente muito comum. Por exemplo, eu usei o SDK do Getui, e o serviço do Getui está em outro processo separado.

  • A otimização de memória no Android geralmente é de código aberto e limitação. O código aberto serve para expandir a memória e a limitação serve para evitar vazamentos de memória.

2.3 Ferramentas para detectar e analisar vazamentos de memória

  • MemoryMonitor: Alterações no uso de memória ao longo do tempo

  • MAT: arquivo HRPOF de entrada, resultados de análise de saída

  • a. Histograma: visualize diferentes tipos de objetos e seus tamanhos

  • b.DominateTree: a memória ocupada pelo objeto e seu relacionamento de referência

  • c.MAT tutorial

  • LeakCanary: Uma biblioteca para monitoramento em tempo real de vazamentos de memória (princípio LeakCanary)

6. Plano de otimização de Caton

  • Não execute operações de acesso/IO à rede em arquivos grandes no thread principal

  • Ao desenhar a interface do usuário, tente reduzir o nível de desenho da interface do usuário; reduza o aninhamento de exibição desnecessário, você pode usar a ferramenta Hierarchy Viewer para detectá-lo, que será descrito em detalhes posteriormente;

  • Quando nosso layout usa FrameLayout, podemos alterá-lo para mesclar, o que pode evitar a sobreposição de cálculos entre nosso próprio layout de quadro e o layout de quadro ContentFrameLayout do sistema (medida e layout)

  • Para melhorar a velocidade de exibição, use o ViewStub: ele só será ocupado durante o carregamento. Fica oculto quando não está carregado e ocupa apenas espaço.

  • No caso do mesmo nível de exibição, tente usar LinerLayout em vez de RelativeLayout; como RelativeLayout medirá duas vezes ao medir e LinerLayout medirá uma vez, você pode ver o código-fonte;

  • Exclua propriedades inúteis no controle;

  • Reutilização de layout. Por exemplo, reutilização de layout listView

  • Tente evitar overdrawing (overdraw), por exemplo: o fundo costuma ser fácil de causar overdrawing. Como nosso layout definiu um plano de fundo, o tema MaterialDesign usado ao mesmo tempo será padronizado para um plano de fundo. Neste momento, o fundo adicionado pelo tema deve ser removido;

  • Plano de fundo opcional em XML

  • Otimização de exibição personalizada. Use canvas.clipRect() para ajudar o sistema a identificar essas áreas visíveis, somente dentro desta área será desenhado. Também evite overdrawing.

  • Otimização de inicialização, monitorando a velocidade de inicialização, descobrindo os problemas que afetam a velocidade de inicialização, otimizando a lógica de inicialização e melhorando a velocidade de inicialização do aplicativo. Por exemplo, páginas da tela inicial, otimização razoável do layout, otimização da lógica de carregamento e preparação de dados.

  • Mecanismo de atualização razoável, minimiza o número de atualizações, tenta evitar que muitos threads de CPU sejam executados em segundo plano e reduza a área de atualização.

7. Otimização do consumo de energia

Na verdade, existem muitos motivos para o consumo de energia. Aqui falarei sobre vários esquemas de otimização. O oposto do esquema de otimização é o motivo. Vários esquemas de otimização são os seguintes:

  • Uso razoável do bloqueio wake_lock, o bloqueio wake_lock é principalmente relativo ao modo de suspensão do sistema (aqui é para economizar energia, está feito), o que significa que meu programa adiciona esse bloqueio à CPU e o sistema não irá dormir. objetivo é cooperar plenamente com a operação do nosso programa. Em alguns casos, se você não fizer isso, haverá alguns problemas, como o WeChat e outros pacotes de pulsação de mensagens instantâneas interromperão o acesso à rede logo após o desligamento da tela. Portanto, existem muitos bloqueios de wake_lock usados ​​no WeChat.

  • Use jobScheduler2 para processar centralmente algumas solicitações de rede, e algumas que não precisam ser processadas em tempo hábil podem ser processadas durante o carregamento, como processamento de imagem, download e atualização de APP, etc.;

  • Otimização de cálculos, evitando operações de ponto flutuante, etc.

  • Quando os dados são transmitidos na rede, tente compactar os dados antes da transmissão. É recomendável usar a tecnologia de serialização FlatBuffer, que é muitas vezes mais eficiente que o json. Se você não conhece o FlatBuffer, é recomendável encontrar informações para aprender .

Visando o ponto-chave de "otimização de desempenho", gostaria de compartilhar com você uma "Análise completa de otimização de desempenho do Android em 360°". Este manual de estudo o levará a explorar a otimização de desempenho do Android passo a passo, para que o desempenho do produto pode ser melhorado em todos os aspectos. , espero que gostem.
Este documento tem um total de 721 páginas, 4 grandes pontos e 25 pequenos capítulos, não só tem uma análise detalhada dos princípios subjacentes, mas também casos práticos especiais!

"Análise da otimização de desempenho do Android em 360°"

Capítulo 1 Ideias de design e otimização da qualidade do código

1. Seis princípios

  • Princípio da Responsabilidade Única

  • Princípio da Substituição de Liskov

  • Princípio de Inversão de Dependência

  • Princípio de Segregação de Interface

  • ……

2. Padrões de Projeto

  • Modo estrutural: modo ponte, modo adaptador, modo decorador, modo proxy, modo fachada (aparência)...

  • Padrões criacionais: padrão construtor, padrão singleton, padrão abstrato de fábrica, padrão de método de fábrica...

  • Estruturas de dados: arrays, pilhas, filas, listas encadeadas, árvores...

  • Algoritmos: algoritmos de ordenação, algoritmos de busca...

imagem.png

Capítulo 2 Otimização do desempenho do programa

1. Otimização da velocidade de inicialização e eficiência de execução

  • Análise de partida a frio e partida a quente

  • Solução de tela preto e branco de inicialização de aplicativo

  • Análise e solução de problema de congelamento de APP

  • StrictMode para velocidade de inicialização e otimização da eficiência de execução

  • ……

2. Detecção e otimização de layout

  • Otimização do nível de layout

  • sobre renderização

  • ……

3. Otimização de memória

  • Destruição de memória e vazamentos de memória

  • grande memória

  • Otimização de memória de bitmap

  • Ferramenta de monitoramento de memória de perfil

  • Mat grandes objetos e detecção de vazamento

  • Otimização do consumo de energia

  • Otimização da transmissão de rede e armazenamento de dados Otimização da transmissão de rede e armazenamento de dados

  • Otimização do tamanho do APK

  • adaptação de tela

  • ……

4. Otimização do consumo de energia

  • Soneca&Espera

  • Historiador da bateria

  • agendador de tarefas

  • WorkManager

5. Transmissão de rede e otimização de armazenamento de dados

  • ferramenta de serialização do google protobuf

  • 7z compressão extrema

  • ……

6. Otimização do tamanho do APK

  • APK emagrecimento

  • Princípio de confusão de recursos do WeChat

  • ……

imagem.png

7. Adaptação de tela

  • O princípio da adaptação

  • Princípio de adaptação do qualificador de resolução de tela e do qualificador de menor largura

  • Por que escolher o qualificador menorWidth para adaptação

  • Como se adaptar a outros módulos

  • Perguntas frequentes

    ……

8. Análise do princípio do problema OOM

  • mecanismo de gerenciamento de memória adj

  • Mecanismo de reciclagem de memória JVM e análise de algoritmo GC

  • Resumo dos problemas relacionados ao ciclo de vida

  • Resumo do esquema de compactação de bitmap

  • ……

9. Análise de problemas de ANR

  • Princípio de ajuste de tempo do sistema AMS

  • Análise do princípio de espera do programa

  • Resolução de problemas de ANR

  • ……

10. Solução de monitoramento de falhas

  • Solução de Monitoramento de Camada Java

  • Solução de monitoramento de camada Nativie

  • ……

imagem.png

Capítulo 3 Otimização da eficiência do desenvolvimento

  1. Sistema de controle de versão distribuído Git

Cenário Introdução da Plataforma de Integração Contínua Eficiente Corporativa

Sistema de controle de versão distribuído GIT

  • Gerenciamento de filiais GIT

  • ……

2. Sistema de compilação automática Gradle:

  • Gradle e plugin Android: a relação entre gradle e android gradle plugin, o uso básico da Gradle Transform API...

  • Uso básico da API Gradle Transform: o que é Transform, cenários de uso do Transform, aprendizado da API Transform, tipo de entrada...

  • Desenvolvimento de plug-in personalizado: introdução, preparação, prática do plug-in Gradle, plug-in Gradle personalizado, método do módulo buildSrc...

  • Combate plug-in: empacotamento multicanal, liberação automática de versão...

imagem.png

Capítulo 4 Prática de otimização de desempenho de APP

1. Velocidade de inicialização

  • Fluxo geral de inicialização do aplicativo

  • partida a frio e partida a quente

  • Medição da velocidade de inicialização

  • Iniciar a otimização da janela

  • otimização de thread

  • Otimização de agendamento do sistema

  • otimização de GC

  • Otimização de E/S

  • Reorganização de recursos

  • Otimização do layout da página inicial

  • Otimização de carregamento de classe

  • Escolha a estrutura de inicialização certa

  • Reduza o nível de salto da Atividade

  • Otimização do fornecedor

  • plano de fundo manter vivo

  • ……

imagem.png

  • 2. Fluência

  • Algumas ferramentas e rotinas para análise de problemas de desempenho

  • Análise de dados por meio de dados de desempenho

  • Casos de desempenho causados ​​pelo desempenho da plataforma Android

  • Problemas de desempenho causados ​​pelo próprio aplicativo Android

  • Dados e características comportamentais de memória fraca

  • tesouro de aplicativos

  • Análise de todo o congelamento da máquina causado pelo serviço sem barreiras do método de entrada Xunfei

  • Bytedance: a página de detalhes gráficos e de texto do Toutiao de hoje é aberta em segundos

  • ……

  • 3. A prática de Douyin na otimização de recursos de tamanho de pacote APK

  • Compressão de imagem

  • compatibilidade não intrusiva webp

  • Otimização multi-DPI

  • Consolidação de Recursos Duplicados

  • ShrinkResource modo estrito

  • Confusão de recursos (compatível com o modo aab)

  • ARSC Emagrecimento

  • ……

imagem.png

  • 4. Análise completa da tecnologia de layout responsivo Youku

  • Visão geral da tecnologia de layout responsivo Youku APP

  • Youku APP Layout Responsivo Android Landing

  • Aterrissando na cena da distribuição

  • Aterrissando na cena do consumo

  • Esquema de teste de layout responsivo do Youku APP

  • ……

  • 5. Otimização da rede

  • Otimização do link Taobao móvel na rede

  • Prática do aplicativo Baidu na otimização profunda da rede

  • ……

  • 6. Revele o segredo do projeto de otimização de desempenho Double Eleven Mobile Taobao

  • Realização da regra de um segundo

  • Aumento de 20% no tempo de inicialização e na taxa de quadros da página

  • Economize 50% na memória do telefone Android

  • ……

  • 7. Análise de dependência do código-fonte do link completo do aplicativo AutoNavi

  • Arquitetura da plataforma Gaode APP

  • Princípio básico de realização

  • estrutura do projeto

  • Cenários de Aplicação e Princípios de Implementação

  • ……

  • 8. Compartilhe a experiência prática de matar completamente o OOM

  • Solucionar problemas de vazamentos de memória

  • estratégia de linha de fundo

  • O pico de memória é muito alto

  • Solução de problemas e otimização de imagens extragrandes

  • ……

  • 9. Prática de otimização de memória do terminal WeChat Android

  • Detecção de vazamento de atividade

  • Alocação de bitmap e rastreamento de desalocação

  • Detecção de vazamento de memória nativa

  • monitoramento de threads

  • monitor de memória

  • ……

imagem.png

Resumir

A otimização de desempenho não pode ser resolvida com a atualização de uma ou duas versões, é um requisito contínuo, integração contínua e feedback iterativo. Em projetos reais, no início do projeto, devido às restrições de mão de obra e tempo de conclusão do projeto, a prioridade de otimização de desempenho é relativamente baixa. Quando o projeto é colocado em uso, a prioridade precisa ser elevada. Ao construir uma solução , os pontos de otimização de desempenho também precisam ser considerados antecipadamente, o que reflete as habilidades técnicas de um programador. Espero que esta " análise completa de otimização de desempenho do Android em 360° " possa ajudá-lo.

As informações deste artigo podem ser digitalizadas gratuitamente, digitalizando o cartão de certificação oficial da CSDN abaixo!

Acho que você gosta

Origin blog.csdn.net/YoungOne2333/article/details/126909794
Recomendado
Clasificación