otimização de aplicações android
DESCRIPTION
Técnicas de otimização de desempenho de aplicações Android.TRANSCRIPT
![Page 1: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/1.jpg)
Rafael Lisboa Pereira
Orientador: Prof. Dr. Arlindo Flavio da Conceição
Técnicas de otimização de desempenho de aplicações
Android
![Page 2: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/2.jpg)
Roteiro
Introdução
O sistema Android
Tópicos Boas práticas Uso de código nativo Consumo de energia Comunicação
Conclusão
![Page 3: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/3.jpg)
Android
Primeira versão - 2007
SO + plataforma para dispositivos móveis
Google e Open Handset Alliance
Software livre (Apache Software License v2)
![Page 4: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/4.jpg)
Android
![Page 5: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/5.jpg)
Motivação
Desempenho é essencial
Recursos limitados de hardware Bateria
Pouca pesquisa
![Page 6: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/6.jpg)
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
![Page 7: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/7.jpg)
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
![Page 8: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/8.jpg)
![Page 9: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/9.jpg)
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
![Page 10: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/10.jpg)
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
![Page 11: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/11.jpg)
Programação Android
Linguagem Java, mas em um ambiente diferente
Máquina virtual
Interação com o usuário
Hardware
![Page 12: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/12.jpg)
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
![Page 13: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/13.jpg)
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;}
}
![Page 14: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/14.jpg)
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
![Page 15: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/15.jpg)
(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
![Page 16: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/16.jpg)
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)
![Page 17: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/17.jpg)
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
![Page 18: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/18.jpg)
Uso de código nativo – Avaliação empírica
Resultados do experimento de latência
C:
JNIEXPORT jint JNICALL nativeMethod(JNIEnv *env, jobject obj) {
return 1;}
Java:
private int dalvikMethod() {return 1;
}
![Page 19: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/19.jpg)
Uso de código nativo – Avaliação empírica
Resultados do experimento de uso de memória
C:
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];
![Page 20: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/20.jpg)
Uso de código nativo – Avaliação empírica
Resultados do experimento de processamento com variáveis do tipo inteiro
C:
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;
![Page 21: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/21.jpg)
Uso de código nativo – Avaliação empírica
Resultados do experimento de processamento com variáveis de ponto flutuante
C:
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;
![Page 22: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/22.jpg)
Uso de código nativo – Avaliação empírica
Resultados do experimento de escrita de arquivos
C:
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;
![Page 23: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/23.jpg)
Uso de código nativo
Aumenta a complexidade do aplicativo
Impacto positivo na performance
Compilação Perda de compatibilidade
![Page 24: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/24.jpg)
Consumo de energia
Dispositivos móveis: poderosos!
Bateria: autonomia de 12 horas...
![Page 25: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/25.jpg)
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)
![Page 26: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/26.jpg)
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
![Page 27: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/27.jpg)
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%)
![Page 28: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/28.jpg)
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
![Page 29: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/29.jpg)
Consumo de energia – Decaimento da bateria
Dispositivo conectado a rede de telefonia (GSM)
Display exibindo imagem branca
Dados de consumo armazenados a cada broadcast
Decaimento linear
![Page 30: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/30.jpg)
Consumo de energia
Faltam modelos adequados para avaliar o consumo de energia
Recursos fornecidos pelo sistema são insuficientes
![Page 31: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/31.jpg)
Comunicação
Importante funcionalidade dos dispositivos móveis
Requer muita energia
Sujeito a tarifas
![Page 32: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/32.jpg)
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)
![Page 33: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/33.jpg)
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
![Page 34: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/34.jpg)
Comunicação
Resultados
Médias e respectivos desvios padrão
Taxa de upload (tentative)
Throughput efetivo
Jitter Taxa de perda de pacotes
TCP 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.12
UDP (1470) 20.45 Mbps – 0.22 20.41 Mbps – 0.26 1.6 ms – 0.53 0.2% – 0.18
UDP (1510) 48.3 Mbps – 0.3 10.9 Mbps – 0.4 7.4 ms – 6.6 77% – 1
UDP (2600) 39 Mbps – 1.4 17.2 Mbps – 0.6 5.4 ms – 5 55% – 0.6
![Page 35: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/35.jpg)
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
![Page 36: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/36.jpg)
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
![Page 37: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/37.jpg)
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.
![Page 38: Otimização de Aplicações Android](https://reader030.vdocuments.pub/reader030/viewer/2022020723/54969225b47959a7498b45a2/html5/thumbnails/38.jpg)