Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Performance em aplicações Android

Avatar for webbiko webbiko
August 07, 2016

Performance em aplicações Android

Avatar for webbiko

webbiko

August 07, 2016

Other Decks in Technology

Transcript

  1. Agenda Overview do processo de boot Entendendo o processo Zygote

    Recursos reservados para a aplicação Android Binders Gerenciamento de memória no Android Garbage Collector Causa de referências perdidas Cuidados com Bitmaps
  2. Processo de boot Init O init tem a responsabilidade de

    inicializar parte do sistema e rodar o init.rc que carregará parte do sistema Android, dentre eles:. - ser­vice­m­an­ager: ini­cia o binder (respon­sável pela comu­ni­cação entre os processos). - vold: vol­ume dae­mon — con­trola a mon­tagem de volumes de mídia no sis­tema de arquivos. - adbd: android debug­ger bridge dae­mon — servi­dor para comu­ni­ cação com o cliente adb. - installd: servi­dor de insta­lação de pacotes/aplicações (*. apk). - Zygote: O zygote é o pai de todos os proces­sos Java. OBS: O init.rc é escrito em uma linguagem chamada Android Init Language que é composta por Ações, Comandos, Serviços e opções. service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
  3. BINDER KERNEL SPACE BINDER DRIVER Transmission Binder Protocol BC_TRANSACTION Reception

    Binder Protocol BR_TRANSACTION USER DATA USER DATA PROCESS A PROCESS B
  4. Causa de referências perdidas na heap Caso 1: String myString

    = new String("Hello World") myString += ", blz?" FIX - Caso 1: Trocar String por StringBuffer/StringBuilder Caso 2: public interface EventListener<EventResponseType> { public void onEvent(EventResponseType response); } Gerenciamento de memória
  5. Causa de referências perdidas na heap Caso 2: public void

    onResume() { super.onResume(); SomeObject object = new SomeObject(); object.setSuccessListener(new EventListener<Boolean>() { public void onEvent(Boolean response) { Log.d(TAG_NAME, "Valid response? "+response); } }); SomeObjectManager.getSingleton().addObject(object); } Gerenciamento de memória
  6. Causa de referências perdidas na heap FIX - Caso 2:

    public void onDestroy() { super.onDestroy(); SomeObject objectFromBefore = SomeObjectManager.getSingleton().getOurObject(); objectFromBefore.setSuccessListener(null); } Gerenciamento de memória
  7. Gerenciamento de memória Libere memória sempre que possível Callback da

    activity que o framework do android irá chamar para notificar sobre o estado da memória da app. - onTrimMemory() (Android API 14+); - onLowMemory() (Android API anteriores a 14 ); - Para ambos os casos a flag TRIM_MEMORY_UI_HIDDEN será entregue; - onStop ainda deve ser usado para liberar recursos;
  8. Gerenciamento de memória Verifique quanto de memória está disponível antes

    de fazer grandes alocações Verifica o espaço de memória da pilha - Runtime.getRuntime().totalMemory(); Verifica quanto de memória já foi consumido - Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); Verifica o tamanho máximo da pilha - Runtime.getRuntime().maxMemory()
  9. Gerenciamento de memória Resultado Considerando que eu tenho uma imagem

    2048x1536 com um inSampleSize de 4 eu teria uma imagem de 512x384. Aplicando a formula abaixo eu passaria a carregar em memória ao invés de 12MB uma imagem de 0.75 MB. # Of Pixels X Bit Depth ÷ bytes per pixel ÷ 1024 ÷ 1024 = File Size in Megabytes (MB) # Of Pixels = 512x384 == 196608 # Of bit depth == 16 (Considerando uma boa qualidade) (((((512 * 384) * 16) / 4) / 1024) / 1024) -> 0.75 MB * O resultado acima é baseado em um bitmap ARGB_8888
  10. Performance em layouts ViewStub - Carrega views por demanda o

    que faz o layout da tela principal ser carregada de forma mais rápida
  11. Performance em layouts <include> - Use include quando se tem

    layout complexo que pode ser reutilizado. Isso ajudará a evitar multiplas telas idênticas com complexidades diferentes. <merge> - O Uso do merge faz com que elementos raiz redundantes sejam inseridos na hierarquia.
  12. Tipos de Problemas - OutOfMemoryError - TransactionTooLargeException - Android not

    responding (ANR) - Force close - Delay na exibição e execução de tarefas - Database corrompido - Review ruim na play store OBS: Apenas seguindo algumas boas práticas do android uma série de problemas podem ser evitados e consequentemente dores de cabeça. :P
  13. Objetivo Dado uma sequência de números inteiros em um array

    mova os zeros para o final do array. Demo
  14. Demo Resultado - Método um ( O(nˆ2) ) leva muito

    mais tempo - Método dois ( O(n) ) é extremamente rápido comparado com o método um