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
Agenda Performance em layouts ViewStub, include, merge Main Thread Tipos de problema Ferramentas Demo
Overview do processo de boot
Processo de boot
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 nicaçã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
BINDER
BINDER PROCESS A PROCESS B USER DATA USER DATA Transmission Binder Protocol BC_TRANSACTION Reception Binder Protocol BR_TRANSACTION BINDER DRIVER KERNEL SPACE
BINDER
RECURSOS
Recursos RELÓGIO CELULAR - SMALL CELULAR - LARGE CELULAR - XLARGE 32-154 MB 32-256 MB 32-512 MB 48-768 MB BINDER 1 MB https://developer.android.com/reference/android/os/transactiontoolargeexception.html https://source.android.com/compatibility/android-cdd.html
GERENCIAMENTO DE MEMÓRIA
Garbage Collector
Gerenciamento de memória 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 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 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 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;
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()
Gerenciamento de memória Como otimizar o Bitmap em memória
Gerenciamento de memória Como otimizar o Bitmap em memória
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
Performance em layouts
Performance em layouts ViewStub - Carrega views por demanda o que faz o layout da tela principal ser carregada de forma mais rápida
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.
Main Thread
Main Thread
Tipos de problemas
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
FERRAMENTAS
Ferramentas Hierarchy View
Ferramentas Device Monitor
Ferramentas Device Monitor - Android Studio
Ferramentas TraceView - Timeline
Ferramentas TraceView - Profile
Ferramentas Android Lint
DEMO
Demo Objetivo Dado uma sequência de números inteiros em um array mova os zeros para o final do array.
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
Obrigado! Wagner Batista wbatista@ciandt.com