SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
Técnicas de otimização de
desempenho de aplicações
         Android

       Rafael Lisboa Pereira




          Orientador: Prof. Dr. Arlindo Flavio da Conceição
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      Throughput          Jitter          Taxa de perda de
                   (tentative)         efetivo                             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.
Otimização de Aplicações Android

Mais conteúdo relacionado

Mais procurados

Python com baterias incluídas v2.0
Python com baterias incluídas v2.0Python com baterias incluídas v2.0
Python com baterias incluídas v2.0Jonh Edson
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Luciano Ramalho
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Luciano Ramalho
 

Mais procurados (6)

Python com baterias incluídas v2.0
Python com baterias incluídas v2.0Python com baterias incluídas v2.0
Python com baterias incluídas v2.0
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Iteraveis e geradores
Iteraveis e geradoresIteraveis e geradores
Iteraveis e geradores
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)Iteráveis e geradores (versão RuPy)
Iteráveis e geradores (versão RuPy)
 

Destaque

Persistencia de dados em aplicações Android
Persistencia de dados em aplicações AndroidPersistencia de dados em aplicações Android
Persistencia de dados em aplicações AndroidAntonio Marin Neto
 
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016Ramon Mota
 
Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...
Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...
Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...Juliano Padilha
 
Capítulo 08 - desenvolvimento de layouts customizados
Capítulo 08 - desenvolvimento de layouts customizadosCapítulo 08 - desenvolvimento de layouts customizados
Capítulo 08 - desenvolvimento de layouts customizadosMarcio Palheta
 
Capítulo 07 - Acesso a câmera e arquivos armazenados no device
Capítulo 07 - Acesso a câmera e arquivos armazenados no deviceCapítulo 07 - Acesso a câmera e arquivos armazenados no device
Capítulo 07 - Acesso a câmera e arquivos armazenados no deviceMarcio Palheta
 
Capítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSONCapítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSONMarcio Palheta
 
Capítulo 03 - Formulários, menus e navegação entre telas
Capítulo 03 - Formulários, menus e navegação entre telasCapítulo 03 - Formulários, menus e navegação entre telas
Capítulo 03 - Formulários, menus e navegação entre telasMarcio Palheta
 

Destaque (7)

Persistencia de dados em aplicações Android
Persistencia de dados em aplicações AndroidPersistencia de dados em aplicações Android
Persistencia de dados em aplicações Android
 
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
 
Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...
Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...
Arquitetura de Software - Arquiteturas Baseadas em Agentes de Software - Sist...
 
Capítulo 08 - desenvolvimento de layouts customizados
Capítulo 08 - desenvolvimento de layouts customizadosCapítulo 08 - desenvolvimento de layouts customizados
Capítulo 08 - desenvolvimento de layouts customizados
 
Capítulo 07 - Acesso a câmera e arquivos armazenados no device
Capítulo 07 - Acesso a câmera e arquivos armazenados no deviceCapítulo 07 - Acesso a câmera e arquivos armazenados no device
Capítulo 07 - Acesso a câmera e arquivos armazenados no device
 
Capítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSONCapítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSON
 
Capítulo 03 - Formulários, menus e navegação entre telas
Capítulo 03 - Formulários, menus e navegação entre telasCapítulo 03 - Formulários, menus e navegação entre telas
Capítulo 03 - Formulários, menus e navegação entre telas
 

Semelhante a Otimização de Aplicações Android

Internet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine LearningInternet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine LearningAlvaro Viebrantz
 
Matando o Java e Mostrando o Python
Matando o Java e Mostrando o PythonMatando o Java e Mostrando o Python
Matando o Java e Mostrando o PythonOsvaldo Santana Neto
 
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Rodrigo Senra
 
GSoC tcptest - TCP/IP Regression Test
GSoC tcptest - TCP/IP Regression TestGSoC tcptest - TCP/IP Regression Test
GSoC tcptest - TCP/IP Regression TestVictor Hugo Bilouro
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeAlessandro Binhara
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)Ricardo Rufino
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e MonitorizaçãoSAPO Sessions
 
Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...
Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...
Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...Andre Devecchi
 
Software Livre para Aplicações em Robótica
Software Livre para Aplicações em RobóticaSoftware Livre para Aplicações em Robótica
Software Livre para Aplicações em RobóticaLinux User Goup Alagoas
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Intel Software Brasil
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Luciano Palma
 

Semelhante a Otimização de Aplicações Android (20)

ptt
pttptt
ptt
 
Internet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine LearningInternet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine Learning
 
Matando o Java e Mostrando o Python
Matando o Java e Mostrando o PythonMatando o Java e Mostrando o Python
Matando o Java e Mostrando o Python
 
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
 
GSoC tcptest - TCP/IP Regression Test
GSoC tcptest - TCP/IP Regression TestGSoC tcptest - TCP/IP Regression Test
GSoC tcptest - TCP/IP Regression Test
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
J530 4 rmi
J530 4 rmiJ530 4 rmi
J530 4 rmi
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)OpenDevice IoT - 2016 (LowLevel)
OpenDevice IoT - 2016 (LowLevel)
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...
Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...
Um Sistema de Ponto Eletrônico Digital: projeto e implementação de hardware e...
 
Minicurso Java
Minicurso JavaMinicurso Java
Minicurso Java
 
XML-RPC.pdf
XML-RPC.pdfXML-RPC.pdf
XML-RPC.pdf
 
Software Livre para Aplicações em Robótica
Software Livre para Aplicações em RobóticaSoftware Livre para Aplicações em Robótica
Software Livre para Aplicações em Robótica
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 

Mais de PeslPinguim

Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao ArduinoPeslPinguim
 
Aula 4 redes Inclusão Digital
Aula 4 redes Inclusão DigitalAula 4 redes Inclusão Digital
Aula 4 redes Inclusão DigitalPeslPinguim
 
Aula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão DigitalAula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão DigitalPeslPinguim
 
Aula 3 software Inclusão Digital
Aula 3 software Inclusão DigitalAula 3 software Inclusão Digital
Aula 3 software Inclusão DigitalPeslPinguim
 
Aula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão DigitalAula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão DigitalPeslPinguim
 
Aula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão DigitalAula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão DigitalPeslPinguim
 
Aula 1 apresentacao
Aula 1 apresentacaoAula 1 apresentacao
Aula 1 apresentacaoPeslPinguim
 
Aula 5 internet Inclusão Digital
Aula 5 internet Inclusão DigitalAula 5 internet Inclusão Digital
Aula 5 internet Inclusão DigitalPeslPinguim
 
Apresentação1_
Apresentação1_Apresentação1_
Apresentação1_PeslPinguim
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10PeslPinguim
 
Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5PeslPinguim
 
Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4PeslPinguim
 
Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1PeslPinguim
 
Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7PeslPinguim
 
Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3PeslPinguim
 
Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2PeslPinguim
 
Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9PeslPinguim
 
Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 PeslPinguim
 
Eletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoroEletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoroPeslPinguim
 

Mais de PeslPinguim (20)

Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Aula 4 redes Inclusão Digital
Aula 4 redes Inclusão DigitalAula 4 redes Inclusão Digital
Aula 4 redes Inclusão Digital
 
Aula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão DigitalAula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão Digital
 
Aula 3 software Inclusão Digital
Aula 3 software Inclusão DigitalAula 3 software Inclusão Digital
Aula 3 software Inclusão Digital
 
Aula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão DigitalAula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão Digital
 
Aula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão DigitalAula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão Digital
 
Apresentação1
Apresentação1Apresentação1
Apresentação1
 
Aula 1 apresentacao
Aula 1 apresentacaoAula 1 apresentacao
Aula 1 apresentacao
 
Aula 5 internet Inclusão Digital
Aula 5 internet Inclusão DigitalAula 5 internet Inclusão Digital
Aula 5 internet Inclusão Digital
 
Apresentação1_
Apresentação1_Apresentação1_
Apresentação1_
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10
 
Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5
 
Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4
 
Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1
 
Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7
 
Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3
 
Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2
 
Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9
 
Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8
 
Eletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoroEletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoro
 

Otimização de Aplicações Android

  • 1. Técnicas de otimização de desempenho de aplicações Android Rafael Lisboa Pereira Orientador: Prof. Dr. Arlindo Flavio da Conceição
  • 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. Android  Primeira versão - 2007  SO + plataforma para dispositivos móveis  Google e Open Handset Alliance  Software livre (Apache Software License v2)
  • 5. Motivação  Desempenho é essencial  Recursos limitados de hardware Bateria   Pouca pesquisa
  • 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. 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.
  • 9. 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
  • 10. 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
  • 11. Programação Android  Linguagem Java, mas em um ambiente diferente  Máquina virtual  Interação com o usuário  Hardware
  • 12. 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
  • 13. 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; } }
  • 14. 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
  • 15. (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
  • 16. 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)
  • 17. 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
  • 18. 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; }
  • 19. 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];
  • 20. 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;
  • 21. 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;
  • 22. 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;
  • 23. Uso de código nativo  Aumenta a complexidade do aplicativo  Impacto positivo na performance  Compilação  Perda de compatibilidade
  • 24. Consumo de energia  Dispositivos móveis: poderosos!  Bateria: autonomia de 12 horas...
  • 25. 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)
  • 26. 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
  • 27. 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%)
  • 28. 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
  • 29. 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
  • 30. Consumo de energia  Faltam modelos adequados para avaliar o consumo de energia  Recursos fornecidos pelo sistema são insuficientes
  • 31. Comunicação  Importante funcionalidade dos dispositivos móveis  Requer muita energia  Sujeito a tarifas
  • 32. 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)
  • 33. 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
  • 34. Comunicação  Resultados  Médias e respectivos desvios padrão Taxa de upload Throughput Jitter Taxa de perda de (tentative) efetivo 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
  • 35. 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
  • 36. 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
  • 37. 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.