Android avançado (1) Otimização de desempenho de aplicativos

Objetivo e direção da otimização de desempenho

O objetivo da otimização de desempenho é tornar o aplicativo mais rápido, mais estável e mais barato. Os detalhes são os seguintes:

  • Mais rápido: o aplicativo funciona com mais fluidez, não congela e pode responder rapidamente às operações do usuário
  • Mais estável: o aplicativo pode ser executado de forma estável e resolver as necessidades do usuário, e não haverá problemas de travamento do aplicativo (Crash) e nenhuma resposta (ANR) durante o uso do usuário
  • Mais econômico: economize o consumo de recursos, incluindo uso de memória, capacidade da bateria, recursos de rede, etc.

Para os fins acima, os indicadores para otimização do APP são: fluência, estabilidade e economia de recursos.

A implementação específica é a seguinte:

insira a descrição da imagem aqui

fluência

Para reduzir problemas como travamentos e longos tempos de resposta durante o uso, e para fornecer aos usuários uma experiência de operação suave, ele é otimizado principalmente para três aspectos:

  • velocidade de inicialização
  • velocidade de exibição da página
  • velocidade de resposta

velocidade de inicialização

Motivo da otimização: Ao carregar o aplicativo pela primeira vez, ele precisa carregar muitos recursos ou funções lógicas.

Esquema de otimização: adote estratégias como carregamento assíncrono (multi-threading), carregamento passo a passo e carregamento diferido para reduzir as tarefas de carregamento ao iniciar a aplicação, melhorando assim a velocidade de inicialização.

velocidade de exibição da página

Motivo da otimização: há muitos conteúdos (layouts ou controles) a serem desenhados na página, resultando em um tempo de medição de página muito longo; eficiência de desenho de página muito baixa, resultando em um tempo de desenho muito longo.

Esquema de otimização: otimização de layout e otimização de desenho

velocidade de resposta

Motivo da otimização: ocorre ANR no aplicativo, o que faz com que o aplicativo responda lentamente

Solução de otimização: use multithreading para executar um grande número de operações demoradas em threads de trabalho.

Esquema de otimização: use multithreading, coloque muitas operações demoradas em threads de trabalho, como AsyncTask, HandlerThread, etc.

estabilidade

Existem muitos motivos que afetam a estabilidade dos aplicativos Android, principalmente: travamento do aplicativo (Crash), aplicativo que não responde (ANR)

ANR

ANR (Application Not Responding) aparece no programa, fazendo com que o aplicativo responda lentamente ou a tela congele em uma página.

Razões comuns de ANR:

  • O aplicativo não responde aos eventos de entrada do usuário (teclas ou toques) em 5 segundos.
  • O receptor de transmissão (BroadcastReceiver) não concluiu o processamento dos eventos relacionados em 10s.
  • O serviço (Serviço) não pode ser processado dentro de 20s.

Esquema de otimização: use multithreading, coloque muitas operações demoradas em threads de trabalho, como AsyncTask, HandlerThread, etc.

No desenvolvimento real, quando ocorre um ANR em um processo, o sistema criará um arquivo traces.txt no diretório /data/anr, e a causa do ANR pode ser localizada analisando o arquivo

Colidir

Em muitos casos, o programa trava devido a estouro de memória ou OOM.

O sistema Android aloca memória limitada para cada aplicativo. Quando há muitos vazamentos de memória e uso anormal de memória no aplicativo, é fácil fazer com que a memória exigida pelo aplicativo exceda o limite de memória que o sistema pode alocar para ele (OOM ), fazendo com que o programa trave.

Resolver Crash é resolver OOM, e o trabalho envolvido é a otimização da memória.

economia de recursos

Motivo da otimização: Devido ao desempenho limitado do hardware dos dispositivos móveis, é muito importante reduzir o consumo de recursos dos aplicativos

Direção de otimização: tamanho da memória, tamanho do pacote de instalação, consumo de energia e tráfego de rede

Os principais meios incluem: otimização de memória, redução do tamanho do pacote de instalação, redução do tráfego de rede e redução do consumo de energia do aplicativo.
insira a descrição da imagem aqui

otimização de layout

A qualidade do desempenho do layout afeta principalmente a velocidade de exibição da página no Android. A essência do layout que afeta o desempenho está em: medição da página e tempo de desenho

Escolha um layout que consuma menos desempenho

  • Layout de baixo custo = função simples = FrameLayout、LinearLayout
  • Layout caro = função complexa =RelativeLayout

Reduza o nível de layout (aninhamento)

  • Princípio: menos níveis de layout ->> menos trabalho para desenho ->> velocidade de desenho rápida ->> melhoria de desempenho
  • Método de otimização: use rótulo de layout e escolha o tipo de layout adequadamente

Observação: é melhor escolher um layout com desempenho de alto custo do que aninhar vários layouts com desempenho de baixo custo

Use tags de layout

Use o atributo de layout wrap_content o mínimo possível

O atributo de layout wrap_content aumentará o custo de cálculo da medição do layout e deve ser usado o mínimo possível; especialmente quando a largura e a altura conhecidas são valores fixos, wrap_content não deve ser usado.

incluir

A tag include> pode se referir ao layout de outro layout em um layout. Isso geralmente é adequado para aplicativos com layouts de interface complexos e layouts compartilhados para interfaces diferentes, como o layout superior, o layout da barra lateral e o layout da barra de guias inferior de um aplicativo . O layout de cada item de ListView e GridView, etc., extrai os layouts usados ​​​​por múltiplas interfaces no mesmo APP e depois referenciá-los por meio de rótulos, o que pode não apenas <include>reduzir a complexidade do layout, mas também conseguir a reutilização do layout ( quando o layout é alterado) Apenas um local precisa ser modificado).

mesclar

A etiqueta de mesclagem é usada para ajudar a reduzir layouts duplicados na árvore de visualização quando um layout contém outro layout.
Os principais pontos de uso de mesclagem:

  • a mesclagem deve ser colocada no nó raiz do arquivo de layout
  • merge não é um ViewGroup, nem uma View, equivale a declarar algumas views, aguardando para serem adicionadas.
  • A etiqueta de mesclagem é adicionada ao contêiner A e, em seguida, todas as visualizações na mesclagem serão adicionadas ao contêiner A.
  • Como a mesclagem não é uma visualização, ela não pode definir o atributo rótulo ou será inválida se estiver definida.
  • Como a etiqueta de mesclagem não é uma visualização, quando o método LayoutInflate.inflate é renderizado, o segundo parâmetro deve especificar um contêiner pai e o terceiro parâmetro deve ser verdadeiro, ou seja, um nó pai deve ser especificado para a visualização na mesclagem.

Exemplo:
sem usar merge:
layout1.xml

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

layout2.xml

<FrameLayout>
   <TextView />
</FrameLayout>

efeito real:

<FrameLayout>
   <FrameLayout>
      <TextView />
   </FrameLayout>
</FrameLayout>

Use mesclagem:
layout1.xml

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

layout2.xml

<merge>
   <TextView />
</merge>

efeito real:

<FrameLayout>
   <TextView />
</FrameLayout>

A diferença entre incluir e mesclar

Como pode ser visto no exemplo acima, include na verdade incorpora outro layout completamente onde ele precisa ser usado. Como todos os componentes devem estar no ViewGroup, isso leva ao uso da tag include. Ao incorporar, haverá uma camada extra de ViewGroup, e usar merge equivale a declarar um ViewGroup virtual, para que possa ser totalmente integrado ao merge. quando incluir onde precisa ser usado.

VerStub

ViewStup é uma visualização leve. A razão pela qual é chamada de visualização leve é ​​que ela não será desenhada durante o carregamento e renderização da página, mas apenas quando você precisar.

A função da tag ViewStub é usada para carregamento lento do layout.Quando o sistema encontra a tag ViewStub, ele não executa o processamento do desenho (como medida, layout, etc.), o que é mais eficiente do que definir a View como oculto ou invisível.

Benefícios de usar ViewStub:

  • Pode evitar consumo de desempenho como medida de visualização e layout correspondente ao ViewStub, e só será executado quando for utilizado, por exemplo, para aumentar a velocidade de exibição da página ao iniciar o APP.
  • Comparado com o uso de invisível e desaparecido, quando definido como invisível, o objeto de visualização ocupará a posição, mas o estado será invisível e o objeto ainda será criado, inicializado e ocupará recursos. Se definida como desativada, a visualização não ocupará uma posição no arquivo de layout de layout, mas o objeto ainda será criado, inicializado e ocupará recursos.

A desvantagem do ViewStub é que ele não pode usar tags, é semelhante às tags <merge>em uso<include>

vazamento de memória

Em termos de mecanismo: Java tem GC e não deve haver vazamento de memória. O motivo do vazamento de memória são apenas motivos humanos externos.Manter inconscientemente referências de objetos de modo que o tempo de vida do referenciador > o tempo de vida do referenciado

Causas comuns de vazamentos de memória

Adicionando elementos às coleções

Causa do vazamento de memória: depois que a classe de coleção adiciona elementos, ela ainda se refere ao objeto do elemento da coleção, o que torna o objeto do elemento da coleção não reciclável, resultando em um vazamento de memória

// 通过 循环申请Object 对象 & 将申请的对象逐个放入到集合List
List<Object> objectList = new ArrayList<>();        
       for (int i = 0; i < 10; i++) {
    
    
            Object o = new Object();
            objectList.add(o);
            o = null;
        }
// 虽释放了集合元素引用的本身:o=null)
// 但集合List 仍然引用该对象,故垃圾回收器GC 依然不可回收该对象

Solução:
Como existem muitos elementos em 1 coleção, a maneira mais fácil = esvaziar o objeto da coleção e definir como nulo

// definirobjectList
objectList.clear();
objectList=null;

Membro modificador de palavra-chave estática

O ciclo de vida das variáveis-membro decoradas com a palavra-chave Static = o ciclo de vida da aplicação.

Motivo do vazamento: a variável de membro modificada pela palavra-chave Static refere-se a uma instância que consome muitos recursos (como Contexto) e é fácil ter o ciclo de vida da variável de membro > o ciclo de vida da instância de referência. a instância de referência precisa encerrar o ciclo de vida e ser destruída. Não será reciclada devido à retenção de variáveis ​​estáticas, resultando em vazamentos de memória

public class ClassName {
    
    
 // 定义1个静态变量
 private static Context mContext;
 //...
// 引用的是Activity的context
 mContext = context; 

// 当Activity需销毁时,由于mContext = 静态 & 生命周期 = 应用程序的生命周期,故 Activity无法被回收,从而出现内存泄露
}

solução:

  1. Tente evitar variáveis-membro estáticas referentes a instâncias que consomem muitos recursos (como Contexto).
  2. Use referências fracas (WeakReference) em vez de referências fortes para conter instâncias

classe interna não estática/classe anônima

A classe interna não estática contém uma referência à classe externa, o que impede que a classe externa seja liberada.

Situações comuns são:

  • Crie uma instância estática em uma classe interna não estática
  • Multi-threading: AsyncTask, etc., quando o thread de trabalho está processando a tarefa, ele mantém uma referência à classe externa, fazendo com que a classe externa falhe ao ser GC
  • Mecanismo de entrega de mensagens: Handler, a classe Handler mantém uma referência a uma atividade externa.Quando há mensagens não processadas na fila de mensagens, a Mensagem na fila de mensagens
    mantém uma referência à instância do Handler. Este tipo de dependência de referência torna a Activity incapaz de ser destruída.

insira a descrição da imagem aqui

Objeto de recurso não fechado após uso

Motivo do vazamento: Para o uso de recursos (como transmissão, streaming de arquivos, cursores para operações de banco de dados e recurso de imagem BitMap), se esses recursos não forem fechados ou cancelados a tempo em que a atividade for destruída, ocorrerão vazamentos de memória.

Solução:
Quando a atividade é destruída: feche/saia dos recursos a tempo

otimização de memória

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/baiduwaimai/article/details/131019384
Recomendado
Clasificación