otimização de aplicações android

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

Upload: peslpinguim

Post on 21-Dec-2014

1.328 views

Category:

Technology


4 download

DESCRIPTION

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

TRANSCRIPT

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