otimização de aplicações android

Post on 21-Dec-2014

1.328 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Rafael Lisboa Pereira

Orientador: Prof. Dr. Arlindo Flavio da Conceição

Técnicas de otimização de desempenho 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

Android

Primeira versão - 2007

SO + plataforma para dispositivos móveis

Google e Open Handset Alliance

Software livre (Apache Software License v2)

Android

Motivação

Desempenho é essencial

Recursos limitados de hardware Bateria

Pouca pesquisa

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

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

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

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

Programação Android

Linguagem Java, mas em um ambiente diferente

Máquina virtual

Interação com o usuário

Hardware

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

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;}

}

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

(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

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)

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

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;

}

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];

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;

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;

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;

Uso de código nativo

Aumenta a complexidade do aplicativo

Impacto positivo na performance

Compilação Perda de compatibilidade

Consumo de energia

Dispositivos móveis: poderosos!

Bateria: autonomia de 12 horas...

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)

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

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%)

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

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

Consumo de energia

Faltam modelos adequados para avaliar o consumo de energia

Recursos fornecidos pelo sistema são insuficientes

Comunicação

Importante funcionalidade dos dispositivos móveis

Requer muita energia

Sujeito a tarifas

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)

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

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

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

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

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.

top related