Otimização de Aplicações Android

1.631 visualizações

Publicada em

Técnicas de otimização de desempenho de aplicações Android.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.631
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
22
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Otimização de Aplicações Android

  1. 1. Técnicas de otimização dedesempenho de aplicações Android Rafael Lisboa Pereira Orientador: Prof. Dr. Arlindo Flavio da Conceição
  2. 2. Roteiro Introdução O sistema Android Tópicos  Boas práticas  Uso de código nativo  Consumo de energia  Comunicação Conclusão
  3. 3. Android Primeira versão - 2007 SO + plataforma para dispositivos móveis Google e Open Handset Alliance Software livre (Apache Software License v2)
  4. 4. Android
  5. 5. Motivação Desempenho é essencial  Recursos limitados de hardware Bateria  Pouca pesquisa
  6. 6. Objetivo Estudar o funcionamento do Android e seus componentes  Ponto inicial para investigações mais aprofundadas sobre os diversos aspectos de otimização de aplicativos Android
  7. 7. O sistema Android Kernel Linux 2.6 Aplicações executadas na máquina virtual Dalvik Desenvolvimento em sintaxe Java  Classes do projeto Apache Harmony Android SDK
  8. 8. Máquina virtual Dalvik Não é uma máquina virtual Java! Uma instância por aplicativo  Segurança entre processos Dalvík: vilarejo de pescadores da Islândia
  9. 9. Componentes de uma aplicação Principais:  Activity: interface com o usuário  Service: thread de execução em segundo plano  BroadcastReceiver: escuta mensagens do sistema  ContentProvider: fornece dados a outros aplicativos Vantagem: incentiva o uso de componentes de outros aplicativos
  10. 10. Programação Android Linguagem Java, mas em um ambiente diferente  Máquina virtual  Interação com o usuário  Hardware
  11. 11. Boas práticas de programação Básicos:  Não realizar tarefas desnecessárias  Sempre que possível, não usar a memória Criação de objetos Palavras-chave static e final para valores constantes
  12. 12. Boas práticas de programação Versão aprimorada da sintaxe do for (for-each) static class Foo { int bar; } Foo[] mArray = ... public void A() { int soma = 0; for (int i = 0; i < mArray.length; ++i) { soma += mArray[i].bar; } } public void B() { int soma = 0; Foo[] localArray = mArray; int len = localArray.length; for (int i = 0; i < len; ++i) { soma += localArray[i].bar; } } public void C() { int soma = 0; for (Foo a : mArray) { soma += a.bar; } }
  13. 13. Boas práticas de programação Conhecer e utilizar as bibliotecas padrão  Exemplo: System.arraycopy() Evitar o ANR (Application Not Responding)!  Usar threads para tarefas mais longas Tempo de resposta: máximo de 100 a 200ms
  14. 14. (Não tão) Boas práticas de programação Melhor desempenho, mas... Utilizar vários vetores ao invés de uma matriz  Matriz de int é um vetor de objetos (int, int) Métodos static: chamada cerca de 20% mais rápida Variáveis float: operações 2x mais lentas que int Nem todo hardware implementa divisões
  15. 15. Uso de código nativo Máquina virtual Dalvik – código intermediário (bytecode) Android NDK – execução de funções escritas em C/C++ em modo nativo  Java Native Interface (JNI)
  16. 16. Uso de código nativo – Avaliação Empírica Experimentos:  Latência  Memória  Processamento  int  float  Persistência 10 execuções consecutivas Dispositivo: Motorola Flipout  Processador TI 600 Mhz (ARM), 256MB RAM  Android 2.1
  17. 17. Uso de código nativo – Avaliação empírica Resultados do experimento de latênciaC:JNIEXPORT jint JNICALLnativeMethod(JNIEnv *env,jobject obj) { return 1;}Java:private int dalvikMethod() { return 1;}
  18. 18. Uso de código nativo – Avaliação empírica Resultados do experimento de uso de memóriaC:char A[1000][1000];int i, j;for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { A[i][j] = a; }}return A[999][999];Java:char[][] A = new char[1000][1000];for (int i = 0; i < 1000; ++i) for (int j = 0; j < 1000; ++j) A[i][j] = a;return A[999][999];
  19. 19. Uso de código nativo – Avaliação empírica Resultados do experimento de processamento com variáveis do tipo inteiroC:int i = 0, j = 0;while (i < 2000000+k) { j = i+(i-k); i = j-(i+k); i++;}return i+k;Java:int i = 0, j = 0;while (i < 2000000+k) { j = i+(i-k); i = j-(i+k); i++;}return i+k;
  20. 20. Uso de código nativo – Avaliação empírica Resultados do experimento de processamento com variáveis de ponto flutuanteC:float i = 0.0, j = 0.0;while (i < 2000000+k) { j = i*(i+k); j = j/(i+k); i++;}return i+k;Java:float i = 0, j = 1;while (i < 2000000+k) { j = i*(j+k); j = j/(i-k); i++;}return (int)i+k;
  21. 21. Uso de código nativo – Avaliação empírica Resultados do experimento de escrita de arquivosC:FILE* teste =fopen("/sdcard/teste.native.txt","w+");if (teste != NULL) { int i; for (i = 0; i < 5120; i++) fputc(n, teste);}fclose(teste);return 0;Java:File teste = new File(sdroot, "teste.dalvik.txt");OutputStream os = new FileOutputStream(teste);byte[] r = "r".getBytes();for (int i = 0; i < 5120; i++) os.write(r);os.close();return 0;
  22. 22. Uso de código nativo Aumenta a complexidade do aplicativo Impacto positivo na performance  Compilação Perda de compatibilidade
  23. 23. Consumo de energia Dispositivos móveis: poderosos! Bateria: autonomia de 12 horas...
  24. 24. Consumo de energia – Recursos do Android Gerenciador de bateria API Android:  Recebimento de broadcasts  Nível da bateria (BatteryManager.EXTRA_LEVEL)  Nível máximo da bateria (BatteryManager.EXTRA_SCALE)  Temperatura da bateria (BatteryManager.EXTRA_TEMPERATURE)  Voltagem da bateria (BatteryManager.EXTRA_VOLTAGE)
  25. 25. Consumo de energia O que consome mais energia? (Google I/O 2009)  Serviços de atualização periódica  Transferência de dados via rede (lenta)  Movimentação entre redes
  26. 26. Consumo de energia - Experimentos 1) Comparação: código nativo vs. código Dalvik  Processamento de variáveis float 2) Decaimento da carga Ambiente:  Motorola Flipout (Android 2.1)  Bateria de 1130 mAh, 4.2 Wh, carga 100%  Display ligado (claridade em 10%)
  27. 27. Consumo de energia – Cód. Nativo & Dalvik Dispositivo em “modo avião” Execução em loop de cada código durante 10 minutos Código Dalvik: 0,11% por execução Código nativo: 0,02% por execução
  28. 28. Consumo de energia – Decaimento dabateria Dispositivo conectado a rede de telefonia (GSM) Display exibindo imagem branca Dados de consumo armazenados a cada broadcast Decaimento linear
  29. 29. Consumo de energia Faltam modelos adequados para avaliar o consumo de energia  Recursos fornecidos pelo sistema são insuficientes
  30. 30. Comunicação Importante funcionalidade dos dispositivos móveis Requer muita energia Sujeito a tarifas
  31. 31. Comunicação Avaliação do desempenho  IEEE 802.11 (Wi-Fi) Ambiente  Computador desktop (Ubuntu 11.04)  Motorola Flipout (IEEE 802.11n)  Roteador Linksys WRT54G2 (IEEE 802.11g) Software  Iperf (Linux e Android)
  32. 32. Comunicação 5 cenários  Protocolo TCP (Transfer Control Protocol)  Protocolo UDP (User Datagram Protocol)  datagramas de 500, 1470, 1510 e 2600 bytes 10 experimentos de 60 segundos cada Desktop: servidor, dispositivo móvel: cliente Throughput Jitter Perda de pacotes
  33. 33. Comunicação Resultados  Médias e respectivos desvios padrão Taxa de upload Throughput Jitter Taxa de perda de (tentative) efetivo pacotesTCP 17.79 Mbps – 0.21 17.78 Mbps – 0.23 – –UDP (500) 33.8 Mbps – 1.86 9.5 Mbps – 0.43 1.9 ms – 4.18 71% – 2.12UDP (1470) 20.45 Mbps – 0.22 20.41 Mbps – 0.26 1.6 ms – 0.53 0.2% – 0.18UDP (1510) 48.3 Mbps – 0.3 10.9 Mbps – 0.4 7.4 ms – 6.6 77% – 1UDP (2600) 39 Mbps – 1.4 17.2 Mbps – 0.6 5.4 ms – 5 55% – 0.6
  34. 34. Comunicação UDP possui desempenho melhor que TCP  Não há controle sobre o envio e recebimento de pacotes Tamanho ótimo para pacotes UDP: padrão (1470)  Elevada taxa de perda de pacotes para outros tamanhos
  35. 35. Conclusão Programação para Android  Novos conceitos de modelagem  Engenharia de software vs. desempenho Código nativo  Até 18 vezes mais eficiente  Complexidade e incompatibilidade Consumo de energia  Autonomia da bateria: insuficiente  Economizar... Comunicação  Falta controle do ambiente para estudar redes de maior escala
  36. 36. Referências Bibliográficas Google, Inc. “Android Developers”. 2010. Disponível em http://developer.android.com. Acesso em maio de 2011. Info Q. “Google’s Android SDK bypasses Java ME in favor of Java Lite and Apache Harmony”. 2007. Disponível em http://www.infoq.com/news/2007/11/android-java. Acesso em junho de 2011. NLANR/DAST. Iperf. 2011. Disponível em http://iperf.sf.net. Acesso em junho de 2011. NielsenWire blog. “Android Leads in U.S. Smartphone Market Share and Data Usage”. 2011. Disponível em http://blog.nielsen.com/nielsenwire. Acesso em junho de 2011. Sharkey, J. “Coding for life–battery life, that is”. In: Google IO Developer Conference, 2009. Ferreira, D.; Dey, A.; Kostakos, V. “Understanding human-smartphone concerns: A study of battery life”. 2011.

×