Este documento ajuda a identificar e corrigir os principais problemas de desempenho do seu app.
Principais problemas de desempenho
Há muitos problemas que podem contribuir para o desempenho ruim em um app. Confira alguns problemas comuns:
- Latência de inicialização
A latência de inicialização é o tempo que leva entre o toque no ícone do app, na notificação ou em outro ponto de entrada e a exibição dos dados do usuário na tela.
Estas são as metas de inicialização recomendadas para seus apps:
- Inicialização a frio em menos de 500 ms. Uma inicialização a frio ocorre quando o app que está sendo iniciado não está presente na memória do sistema. Isso acontece quando é a primeira inicialização do app desde a reinicialização ou desde que o processo do app foi interrompido pelo usuário ou pelo sistema. Uma inicialização a frio exige o máximo de trabalho do sistema, já que ela precisa carregar tudo do armazenamento e inicializar o app. Tente programar a inicialização a frio com uma duração de até 500 ms.
- Inicialização com estado salvo em menos de 200 ms e inicialização a quente em menos de 150 ms. Uma inicialização lenta ocorre quando o processo do aplicativo já está em execução em segundo plano, mas o sistema precisa reinicializar a interface ou trazer a atividade de volta ao primeiro plano, como quando um usuário sai do app e o abre novamente logo depois. Um inicialização a quente é ainda mais rápido porque a atividade do app já está armazenada em cache na memória e só precisa ser trazida para o primeiro plano, sem a necessidade de recriar a hierarquia de visualização. Mantenha as inicializações a quente abaixo de 200 ms e as inicializações a frio abaixo de 150 ms.
- Latências P95 e P99 muito próximas à latência mediana. P95 e P99 representam os 95º e 99º percentis dos tempos de inicialização, enquanto a mediana é o 50º percentil. Quando o app demora muito para iniciar, ele prejudica a experiência do usuário. As comunicações entre processos (IPCs) e a E/S desnecessária durante o caminho crítico de inicialização do app podem enfrentar contenção de bloqueios e introduzir inconsistências.
- Instabilidade de rolagem
Instabilidade é o termo que descreve o problema visual que ocorre quando o sistema não consegue criar e fornecer frames a tempo de direcioná-los à tela na cadência solicitada de 60 hz ou mais. A instabilidade é mais aparente na rolagem, quando, em vez de um fluxo animado suave, podem ocorrer falhas. A instabilidade aparece quando o movimento pausa ao longo do caminho por um ou mais frames, já que o app leva mais tempo para renderizar o conteúdo do que a duração de um frame no sistema.
Defina taxas de atualização de 90 Hz nos seus apps. As taxas de renderização convencionais são de 60 Hz, mas muitos dispositivos mais recentes operam no modo 90 Hz durante interações do usuário, como a rolagem. Alguns dispositivos oferecem suporte a taxas ainda mais altas de até 120 hz.
Para conferir a taxa de atualização usada por um dispositivo em um determinado momento, ative uma sobreposição em Opções do desenvolvedor > Mostrar taxa de atualização na seção Depuração.
- Transições instáveis
Isso é aparente durante interações, como alternar entre guias ou carregar uma nova atividade. Esses tipos de transição precisam ter animação suave, sem incluir atrasos ou oscilação visual.
- Ineficiências de energia
Atividades reduzem a carga da bateria e, consequentemente, a duração dela.
As alocações de memória, provenientes da criação de novos objetos no código, causam trabalho no sistema. Isso ocorre não só porque as alocações exigem esforço do Android Runtime (ART), mas liberar esses objetos mais tarde (coleta de lixo) também exige tempo e esforço.
A alocação de memória e a coleta de lixo ficaram muito mais rápidas e eficientes, principalmente para objetos temporários. Embora fosse uma prática recomendada evitar alocar objetos sempre que possível, sugerimos que você faça o que fizer mais sentido para seu app e sua arquitetura. Salvar em alocações com o risco de um código sem manutenção não é a prática recomendada, considerando os recursos do ART.
No entanto, as alocações exigem esforço. Portanto, lembre-se de que elas podem contribuir para problemas de desempenho se você estiver alocando muitos objetos no loop interno.
Identificar problemas
Para corrigir problemas de desempenho, identifique e inspecione as seguintes jornadas ideais do usuário:
- Fluxos de inicialização comuns, incluindo aqueles da tela de início e notificação.
- Telas em que o usuário rola os dados.
- Transições entre telas.
- Fluxos de longa duração, como navegação ou reprodução de música.
Para cada um desses fluxos, inspecione o que está acontecendo usando as seguintes ferramentas de depuração:
- Perfetto: permite conferir o que está acontecendo em todo o dispositivo com dados de tempo precisos.
- Memory Profiler: permite conferir quais alocações de memória estão acontecendo no heap.
- Simpleperf: mostra um diagrama