38
Rafael Lisboa Pereira Orientador: Prof. Dr. Arlindo Flavio da Conceição Técnicas de otimização de desempenho de aplicações Android

Otimização de Aplicações Android

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Otimização de Aplicações Android

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

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

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

Android

Page 5: Otimização de Aplicações Android

Motivação

Desempenho é essencial

Recursos limitados de hardware Bateria

Pouca pesquisa

Page 6: Otimização de Aplicações Android

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

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
Page 9: Otimização de Aplicações Android

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

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

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

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

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

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

(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

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

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

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

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

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

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

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

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

Consumo de energia

Dispositivos móveis: poderosos!

Bateria: autonomia de 12 horas...

Page 25: Otimização de Aplicações Android

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

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

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

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

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

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

Comunicação

Importante funcionalidade dos dispositivos móveis

Requer muita energia

Sujeito a tarifas

Page 32: Otimização de Aplicações Android

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

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

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

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

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

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