Motorola Mobility


                                       Peter van der Linden
                               Evangelista da tecnologia Android
                    Plataformas e serviços para desenvolvedores

                                           Brasil - #appsum11br




Gráficos cada vez mais rápidos:
utilização de NDK e Renderscript
MOTODEV App Summit 2011                                                                       Page 2




1      INSTALANDO AS FERRAMENTAS

2      ESCREVA UM CÓDIGO C

3      CRIE UM CÓDIGO C

4      CHAMANDO C A PARTIR DE JAVA (O JNI)

5      RESUMO - Encerrando, Controle de qualidade




                                                    © 2011 Motorola Mobility, © 2011Versão 1.0
                                                                              Inc.  Motorola Mobility, Inc.
MOTODEV App Summit 2011                              Page 3




POR QUE CÓDIGOS C/C++ NO ANDROID?



        • Open GL

        • Desempenho

        • Portar!




                                © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                Page 4



Limitações C++ do NDK

 • Originalmente para escrever partes de desempenho
   crítico de código em C
   • Você não precisa de abstração OOP para isso (e
       a Dalvik VM é bastante rápida, com a compilação JIT
       desde 2.2)

 • O suporte de C++ é um tanto restrito
   • exceções não são suportadas
   • bugs conhecidos em invocações do
      construtor/destrutor estáticas

 • Assim, é mais provável que o código NDK seja escrito
   em C do que em C++
                                                  © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                   Page 5




Arquiteturas de CPU SUPORTADADAS
    • o NDK suporta dois conjuntos de instruções ARM:
          • ARMv5TE (inclui instruções Thumb-1). Esse é o target
            padrão e o código compilado para ele será executado em
            todos os dispositivos com Android baseado em ARM.
            Escolha outro target, mudando uma linha no makefile do
            Application.mk.
          • O ARMv7-A (inclui instruções Thumb-2 e VFPv3-D16,
            com suporte opcional para instruções NEON/VFPv3-D32).
            O código compilado para ARMv7-A funcionará apenas em
            dispositivos como o Verizon Droid ou Motorola XOOM que
            possuem uma CPU v7. O código para NEON só
            funcionará em um ARMv7 com suporte para NEON.

    • Há uma terceira arquitetura "em construção"
      (experimental, sem suporte):
          • conjunto de instruções x86
                                                                     © 2011 Motorola Mobility, Inc.
INSTALANDO AS FERRAMENTAS


 MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings,   Versão 1.0
 LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola
 Mobility, Inc. Todos os direitos reservados.
MOTODEV App Summit 2011                                                Page 7




Baixando o Native Development Kit

 • Verifique a compatibilidade: XP ou Vista, MacOS X 10.5,
   Ubuntu

 • Baixe o arquivo zip de 50 MB ou tar.bz2 em:
        http://developer.android.com/sdk/ndk/index.html

 • Faça a descompactação dele em qualquer lugar, lembre-se
   de onde em $NDK
       export NDK=~/android-ndk-r5b

 • Requer o GNU make e GNU awk! Usuários do Windows -
   instalar o Cygwin 1.7 ou mais recente
                                                  © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                              Page 8




Usuários do Windows
 • Baixe e instale o Cygwin 1.7 ou mais recente
 • Ferramentas de linha de comando Unix/Linux para
   usuários do Windows
        http://cygwin.com




                                                © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                Page 9




Dicas para Windows e MacOS X

• Não use nomes de caminhos com espaços entre eles! Em
  qualquer lugar!
• O Cygwin instala somente os pacotes básicos.
• Você precisa dos pacotes de desenvolvimento. É simples
  instalar todo o branch “Devel”.
    1. Execute o setup.exe.
    2. Clique na palavra “Default” (Padrão) próxima ao nó
       da raiz “Devel”.
    3. “Default” altera para “Install” para o nó Devel.
    4. Clique em “next” (Avançar) para instalar. Vá almoçar
       enquanto a instalação é realizada.
    5. Deixe-o criar um ícone do console cygwin na sua área
       de trabalho.
    6. Digite "make -v" no console cygwin para verificar se
                                                  © 2011 Motorola Mobility, Inc.

       está tudo OK.
MOTODEV App Summit 2011                                                Page 10




Descompacte o Native Development Kit
• Contem sete pastas, e uma série de coisas para ler:




                                                  © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                   Page 11



Pastas NDK




 • build: 4 pastas de scripts awk e shell, makefiles para compilar os seus
   arquivos C/C++
 • docs: cerca de 20 arquivos de texto (Perguntas frequentes sobre o NDK);
   acesse pelo navegador o arquivo documentation.html
 • plataforms: .h e arquivos de sistema library.so para os vários níveis de API
 • samples: uma série de exemplos de funcionamento
 • sources: algumas fontes para os elementos relacionadas ao sistema
 • tests: scripts para testar o próprio NDK. Provavelmente aqui por engano.
 • toolchains: toolchains de cross-compiler


                                                                     © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                           Page 12




Adicionar suporte de C/C++ ao Eclipse

• O Eclipse tem um plug-in para C/C++, assim como para o Android

• Consiga isso usando o Eclipse
        Help (Ajuda) > Install new software (Instalar novo software)

• Digite http://download.eclipse.org/releases/helios/ no campo “work
  with” (trabalhar com) (ou qualquer versão que você usa)

• Advertências comuns sobre proxies de rede no trabalho (defina-os
   em MOTODEV Studio > Preferences (Preferências) > Network Conn.
  (Conexão de rede)

• Clique em Programming Langs (Linguagens de programação) >
  C/C++ Development Tools (Ferramentas de desenvolvimento)

                                                              © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                 Page 13




    • Há um plugin para C/C++, assim como para o
    Android

    • Consiga isso usando o Eclipse
           Help (Ajuda)> Install new software
    (Instalar novo software)




                                                   © 2011 Motorola Mobility, Inc.
Escreva seu código C

 MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings,
 LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola
 Mobility, Inc. Todos os direitos reservados.
MOTODEV App Summit 2011                                                           Page 15




Abordagem geral

      •Comece com um aplicativo Android em Java, e adicione
      pedaços NDK a ele.

      •Coloque sua fontes C/C++ nativas em $PROJECT/jni:

      •Crie o seu código nativo em bibliotecas (libraries).

      •Seu código Java do Android pode chamar código nessas
      bibliotecas nativas.

      •O código nativo também pode chamar de volta em Java, e
      acesso objetos Java.




                                                              © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                         Page 16




                          Criar o projeto Android
                          da maneira usual




                                           © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                        Page 17




Crie a pasta jni para seu projeto

       •    Destaque o projeto Eclipse que usará o código nativo

       •    O nome do seu pacote é usado para acessar o código
            nativo, então mantenha-o curto e simples, por exemplo,
            "com.greet" para propósitos de treinamento

       •    File (Arquivo) > New (Novo) > Folder (Pasta)
                 • atribua-lhe o nome de "jni"

       •    Dentro dessa pasta jni recém-criada, nós adicionaremos
               • um makefile
               • alguns arquivos C

                                                           © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                        Page 18




Adicione dois arquivos à pasta jni em seu projeto

       • File (Arquivo) > New (Novo) > Other (Outro) ...
       • Selecione General (Geral), File (Arquivo) e, em
         seguida, procurar
       • Escolha a pasta jni, com o nome de
         "Android.mk“ > Finish (Finalizar)
       • Repita, criando um arquivo "myhello.c", também na
         pasta jni
       • Isso oferece a você
              • jni/Android.mk
              • jni/myhello.c

                                                           © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                   Page 19




Preencha arquivos na pasta jni
 Criando a pasta jni em seu projeto

    saud
    ar




                                      © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                           Page 20




Criando mkfile na pasta jni




                              © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                      Page 21




Preencha o makefile Android.mk
       • Edite o arquivo jni/Android.mk que você acabou de criar
       • Coloque essas palavras mágicas no makefile


        LOCAL_PATH := $ l my-d r
                       (cal   i)

        i lude $
         nc     (CLEAR_VARS)

        # nosso arqu vo fon e e a b b io
                     i     t       i l teca c iada
                                             r
        # a par i le
               t rde
        LOCAL_M O D ULE : he lo
                             = l
        LOCAL_SRC_FILES : he lo c
                              = l .

        i lude $
         nc     (BUILD_SHARE D_LIBRARY)



                                                         © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                 Page 22




Desvio em relação ao make
       • O make foi criado por Stu Feldman em 1977, no Bell Labs
       • Em 2003, o Dr. Feldman recebeu o prêmio ACM Software System
         Award pela criação dessa ferramenta amplamente difundida.
       • Você não ficou sabendo disso por mim, mas a tradição de
         software diz que...



        # Cada comando que segue a linha de dependência,
        # ou seja, o TARGET à esquerda, deve ser indentado por um
        # caracter TAB.

        target: componente-a-construir
            <TAB>comandos-para-construi-lo



                                                                    © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                              Page 23




Crie o código C na pasta jni

       •Edite o arquivo jni/myhello.c que você acabou de criar
       •Coloque essas palavras mágicas no arquivo C
       •Usa o objeto JNIEnv para criar uma string de Java a partir
       de um literal


        #incluir <string.h>
        #incluir <jni.h>

        jstring Java_com_greet_MyActivity_myCFunction
                    (JNIEnv* env, jobject javaThis) {
          return (*env)->NewStringUTF(env, "Hello from native
        code!");
        }
                                                                 © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                         Page 24




Código C explicado
      Quando o JVM invoca uma função nativa, ele passa
      • um indicador JNIEnv (estrutura que tem a interface da JVM para C)
      • um ponteiro jobject (o objeto "this")
      • quaisquer argumentos de Java declarados pelo método Java.

      Esses tipos vêm de #include <jni.h> (veja em "plataforms")
      Seu método de C deve ser escrito para esperar esses argumentos
      O método C é chamado de "Java“_classname_activity_methodname



       #incluir <string.h>
       #incluir <jni.h>

       Jstring Java_com_greet_MyActivity_myCFunction
                   (JNIEnv* env, jobject javaThis) {
         return (*env)->NewStringUTF(env, "Hello from native code!");
       }
      • ... parece, mas não é, um vazamento de memória?
                                                                            © 2011 Motorola Mobility, Inc.
Crie um código C

 MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings,
 LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola
 Mobility, Inc. Todos os direitos reservados.
MOTODEV App Summit 2011                                                    Page 26



Chamadas entre linguagens



    •O Android segue o caminho normal para falar entre
    Java e C

    •JNI – Java Native Interface

    •Link para documentação do JNI
           http://java.sun.com/docs/books/jni/

    •Isso inclui um livro completo, um tutorial, exemplos, etc


                                                      © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                  Page 27



Crie uma biblioteca C
  • Abra uma janela de terminal, e cd para a pasta do projeto jni
  • Use o script "NDK-build" do diretório NDK (apenas um invólucro GNU
    Make) (pode colocar $NDK em seu caminho, se você quiser)
  • O script compila o código C, o transforma em uma biblioteca
    compartilhada (“shared library”)
  • Move o libhello.so para um novo projeto de pasta libs/armeabi




                                                                    © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                      Page 28



Abordagem geral para a construção de uma biblioteca

    • Salve arquivos no Eclipse
    • Abra uma janela de terminal e cd na pasta jni do seu projeto
    • Execute o script NDK-build para transformar o seu código em C
      em um arquivo .so
    • Essa lib *. so será adicionada no arquivo do aplicativo APK.
    • File (Arquivo) > Refresh (Atualizar) no Eclipse (para sincronizar
      com o sistema de arquivos)

 $ cd MYECLIPSEPROJECT/ i
                      jn
 $ $NDK/ndk-bu ld
              i

 Co mpi e thumb : he l <= helo
       l             lo      l .c
 SharedL ibrary :l bhe l
                  i lo.so
 Ins l
    tal     :l b l .so => l /armeab /ibhe lo
             i he lo      ibs      il l .so


                                                                          © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                     Page 29



CRIE SUA BIBLIOTECA: resumo


 • O Eclipse não compila seu código NDK, o GNU Make sim

 • O plugin C/C++ dá-lhe as cores de sintaxe e de edição (apenas)

 • Execute o "NDK-build " script após cada edição de seu código C

 • Depois clique em File > Refresh, (F5), para manter o Eclipse em
   sincronia com seus arquivos nativos




                                                       © 2011 Motorola Mobility, Inc.
O Lado Java do JNI

 MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings,
 LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola
 Mobility, Inc. Todos os direitos reservados.
MOTODEV App Summit 2011                                                          Page 31



Código Java que chama para o código nativo

  • Comece com o aplicativo de base criado no Eclipse

package com.greet;

impor andro
     t     id.app.Actvt ;
                    iiy
impor andro
     t     id.os.Bund ;
                     le

pub ic cl
   l     ass MyAct i y ex
                  ivt tends Ac ivt {
                                t iy
  / * Chamado quando a Actvt é cr
   *                        iiy    iada pe p i ra vez. *
                                          la rmei       /
   @ Over ide
          r
  pub i vo onCreate
      lc id           (Bund savedIns
                            le        tanceSta e) {
                                              t
     super .onCreate(savedInstanceSta ;
                                     te)
     setContentV iew(R.layout in)
                             .ma ;
  }
}

                                                            © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                               Page 32



Adicione o carregamento da biblioteca

  • Adicione a chamada para carregar a nossa biblioteca
    nativa libhello.so
  • o nome deve corresponder ao nome da biblioteca
    sem “lib” e “.so”
  • assim libhello.so é "hello"
s t c{
 ta i
   Sys em.
      t loadLibrary "he l " ;
                   ( lo)
}




                                                 © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                          Page 33



Adicione a declaração da função nativa

  • Adicione a declaração de protótipo da função nativa

  • No lado C, ela tem dois argumentos explícitos, um envp, um this

  • Mas no lado Java, esses argumentos estão implícitos


 p i te na i Str myCFunct )
  r va    t ve ing       ion( ;




                                                            © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                          Page 34



Adicione a chamada para a função nativa

    • Nós pegaremos a string de C e exibiremos alertas para o usuário
    (usando um “toast”).


impor s t c andro .
     t ta i       id widget Toast *
                           .     .;
impor andro
     t      id.widget.Toas ;
                          t

   ...

  Sr
   t ing msg = myCFunct )
                       ion( ;
  Toas .
       t makeText th msg, LEN GTH_LO N G).show()
                 ( is,                          ;




                                                            © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                        Page 35



Juntando tudo
 package com.greet
                 ;

 impor andro .app.Ac ivt ;
      t     id      t iy
 impor andro .os Bund ;
      t     id .     le
 impor s i andro d.w
      t tatc     i idget Toast *
                          .   .;
 impor andro .w
      t     id idget.Toas ;
                         t

 pub ic c
    l lass MyAct v ty ex
                ii      tends Ac ivt {
                                t iy

 s t c { Sys
  ta i      tem.loadLibrary " l " ;}
                           ( he lo )

 pr te natve S r
   iva   i    t ing myCFunct )
                            ion( ;

     @ Override
     pub i vo onCreate(Bund savedIns
        l c id               le        tanceSta {
                                               te)
       super.onCreate(savedInstanceState);
       setConten iew(R.
                tV      layout in)
                              .ma ;

         Sr
          t ing msg = myCFunct )
                             ion( ;

         Toas .makeText th ,msg, LENGT H_LON G).show()
             t         ( is                           ;
     }
 }

                                                          © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                        Page 36




                          © 2011 Motorola Mobility, Inc.
Resumo
MOTODEV App Summit 2011                                                   Page 38




O COMEÇO

 Este pode ser um belo começo para um longo caminho

 • http://groups.google.com/group/android-ndk/topics

 • http://java.sun.com/docs/books/jni/

 • http://developer.android.com/sdk/ndk/index.html




                                                     © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                Page
                                                                                       Página39




Renderscript
• Nova API com gráficos 3D de alto
  desempenho
• Foi usada no Froyo para papéis de
  parede animados
• É usada no Honeycomb para as apps
  Books e YouTube
• O Honeycomb apresenta o
  Renderscript como uma API pública


• Para executar códigos críticos em que
  as APIs de estrutura tradicionais Open
  GL ES não são rápidas o suficiente!
                                           © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc.
                                                                   © 2011 Versão 1.0
MOTODEV App Summit 2011                                               Page
                                                                       Página40



Exemplo de renderscript




                           © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc.
                                                   © 2011 Versão 1.0
MOTODEV App Summit 2011                                               Page
                                                                       Página41



App Books e Renderscript




                           © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc.
                                                   © 2011 Versão 1.0
MOTODEV App Summit 2011                                                                     Page
                                                                                             Página42




API do Renderscript

• Uma API de "computação" para localizar pontos de movimento em 3D
• Um API de "renderização" para desenhar texturas sobre os pontos
• Uma linguagem de script baseada em C para acessar essa API
• Único objetivo: espremer até a última gota de desempenho gráfico!
• Abordagem: a API é uma fina camada sobre os recursos que são
  suportados pelo hardware
• http://community.developer.motorola.com/t5/MOTODEV-
  Blog/Introduction-to-Renderscript/ba-p/12136




                                                 © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc.
                                                                         © 2011 Versão 1.0
MOTODEV App Summit 2011                                                        Page
                                                                                Página43




API do Renderscript

• As ferramentas de construção do Android compilam seu arquivo .rs do
  Renderscript para bytecode intermediário.
• e o empacota no arquivo .apk do seu aplicativo.
• No dispositivo, o bytecode é compilado (durante a execução - JIT) para
  código de máquina, que é otimizado para o dispositivo exato em que
  está sendo executado
• O código de máquina é armazenado em cache para uso futuro
• Isso elimina a necessidade de destinar uma arquitetura específica
  durante o processo de desenvolvimento. Excelente!




                                                            © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                     Page
                                                                                            Página44

Exemplo de arquivo .rs (a partir de exemplos do
Honeycomb)
    #pragma rsjava_package_name(com.andro . s l
                                           id r .he lowor )
                                                        ld
    # lude "
     inc    rs_graph cs rsh"/ Headers com APIs g f cas
                    i .     /                    rá i

    / gTouchX e gTouchY são var
    /                            iáve que serão obt
                                     is            idas a ravés de
                                                         t
    / re lexão para o uso pe API java Podemos usá- para no ii r
    / f                     la        .            las        tf ca
    / o sc ip de eventos de toque.
    /      r t
    i t gTouchX;
     n
    i t gTouchY;
     n

    / Esse éi
     /        nvocado automaticamente quando o scr t é c i
                                                  ip    rado
    vo int ){
       id i(
        gTouchX = 50 ;
                    .0f
        gTouchY = 50 ;
                    .0f
    }

    i troo (
     n     t intlaunchID) {
       / Apaga a cor do p
        /                 lano fundo
       rsgClearCo (0.0 , 0 f 0.0 , 0 f ;
                    lor f .0 , f .0 )
       / In r o run ime que a cor da fonte deve t
        / fo ma         t                        er
       rsgFontCo r .0f 1 f 1 0f 1 f ;
                   lo (1 , .0 , . , .0 )
       //Nos apresenta ao mundo esboçando uma saudação
       / no loca em que o usuár o tocou a te
        /        l               i          la
       rsgDrawText "He lo Wor d! , gTouchX, gTouchY)
                      ( l      l "                  ;

        / O va or de re
         /    l        tornoin r ao RS aprox mada mente quantas vezes
                              fo ma         i
        / redesenhar nesse caso 20 ms
         /           ;                                                         Versão 1.0
                                                                        © 2011 Motorola Mobility, Inc.
        re rn 20;
          tu
    }
MOTODEV App Summit 2011                                                        Page 45




                            Perguntas?
                                  @motodev
                                  @motodevbr

                              Brasil - #appsum11br
                            Argentina - #appsum11ar
                             México - #appsum11mx

                               Atendimento on line
                              Terca-feira, 2 de junho
                          14 hs Sao Paulo, Buenos Aires
                             12 hs Cidade do Mexico
                                                          © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                   Page 46




                          obrigado



                                     © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                                     Page 47




Licenças

Os exemplos de código fonte exibidos nessa apresentação podem ser licenciados sob a Licença
   Apache, Versão 2 da seguinte maneira:


    Copyright © 2010, Android Open Source Project. Todos os direitos reservados, exceto onde
    expressamente indicado o contrário.


    Licenciado sob a Licença Apache, Versão 2.0 (a "Licença"); você não pode usar esse arquivo exceto
    em conformidade com a Licença. Você pode obter uma cópia da Licença em
    http://www.apache.org/licenses/LICENSE-2.0.


    A menos que exigido pela lei aplicável ou acordado por escrito, o software distribuído sob a Licença é
    distribuído "NA CONDIÇÃO QUE SE ENCONTRA", SEM GARANTIAS OU CONDIÇÕES DE
    QUALQUER TIPO, sejam expressas ou implícitas. Consulte a Licença para o idioma específico que
    governam as permissões e limitações sob a Licença.




                                                                                        © 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011                                                                                                   Page 48




Licenças
Os exemplos de código fonte exibidos nessa apresentação podem ser licenciados sob a Licença
   BSD, da seguinte maneira:


Copyright © 2010-2011, Motorola, Inc. Todos os direitos reservados exceto quando expressamente indicado.
A redistribuição e utilização em formas de fonte e binário, com ou sem modificação, são permitidas de acordo com as
    seguintes condições:
  As redistribuições de código fonte devem manter o aviso de direitos autorais acima, esta lista de condições e a seguinte
   isenção de responsabilidade.
  As redistribuições em formulários binários devem reproduzir o aviso de copyright acima, esta lista de condições e a
   seguinte isenção de responsabilidade na documentação e/ou outros materiais fornecidos com a distribuição.
  O nome da Motorola, Inc. e os nomes de seus colaboradores não podem ser usados para endossar ou promover
   produtos derivados desse software sem permissão prévia por escrito.


ESTE SOFTWARE É FORNECIDO PELOS DETENTORES E COLABORADORES "COMO TAL" E QUALQUER
   GARANTIA EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO LIMITADO A, AS GARANTIAS DE
   COMERCIALIZAÇÃO E ADEQUAÇÃO PARA UMA FINALIDADE ESPECÍFICA. EM NENHUM CASO A TITULAR DO
   DIREITO OU CONTRIBUINTES DEVEM SER RESPONSÁVEIS POR QUAISQUER DANOS DIRETOS, INDIRETOS,
   ESPECIAIS, EXEMPLARES OU CONSEQUENTES (INCLUINDO, MAS NÃO SE LIMITANDO À AQUISIÇÃO DE
   BENS OU SERVIÇOS, PERDA DE USO, DADOS OU LUCROS; OU INTERRUPÇÃO DE NEGÓCIOS) CAUSADOS E
   SOB QUALQUER TEORIA DE RESPONSABILIDADE, SEJA EM CONTRATO, RESPONSABILIDADE OBJETIVA OU
   (INCLUINDO NEGLIGÊNCIA OU NÃO) DECORRENTE DE QUALQUER MANEIRA DO USO DO SOFTWARE,
   MESMO QUE DA POSSIBILIDADE DE TAIS DANOS.



                                                                                                      © 2011 Motorola Mobility, Inc.

Gráficos cada vez mais rápidos utilização de NDK e Renderscript

  • 1.
    Motorola Mobility Peter van der Linden Evangelista da tecnologia Android Plataformas e serviços para desenvolvedores Brasil - #appsum11br Gráficos cada vez mais rápidos: utilização de NDK e Renderscript
  • 2.
    MOTODEV App Summit2011 Page 2 1 INSTALANDO AS FERRAMENTAS 2 ESCREVA UM CÓDIGO C 3 CRIE UM CÓDIGO C 4 CHAMANDO C A PARTIR DE JAVA (O JNI) 5 RESUMO - Encerrando, Controle de qualidade © 2011 Motorola Mobility, © 2011Versão 1.0 Inc. Motorola Mobility, Inc.
  • 3.
    MOTODEV App Summit2011 Page 3 POR QUE CÓDIGOS C/C++ NO ANDROID? • Open GL • Desempenho • Portar! © 2011 Motorola Mobility, Inc.
  • 4.
    MOTODEV App Summit2011 Page 4 Limitações C++ do NDK • Originalmente para escrever partes de desempenho crítico de código em C • Você não precisa de abstração OOP para isso (e a Dalvik VM é bastante rápida, com a compilação JIT desde 2.2) • O suporte de C++ é um tanto restrito • exceções não são suportadas • bugs conhecidos em invocações do construtor/destrutor estáticas • Assim, é mais provável que o código NDK seja escrito em C do que em C++ © 2011 Motorola Mobility, Inc.
  • 5.
    MOTODEV App Summit2011 Page 5 Arquiteturas de CPU SUPORTADADAS • o NDK suporta dois conjuntos de instruções ARM: • ARMv5TE (inclui instruções Thumb-1). Esse é o target padrão e o código compilado para ele será executado em todos os dispositivos com Android baseado em ARM. Escolha outro target, mudando uma linha no makefile do Application.mk. • O ARMv7-A (inclui instruções Thumb-2 e VFPv3-D16, com suporte opcional para instruções NEON/VFPv3-D32). O código compilado para ARMv7-A funcionará apenas em dispositivos como o Verizon Droid ou Motorola XOOM que possuem uma CPU v7. O código para NEON só funcionará em um ARMv7 com suporte para NEON. • Há uma terceira arquitetura "em construção" (experimental, sem suporte): • conjunto de instruções x86 © 2011 Motorola Mobility, Inc.
  • 6.
    INSTALANDO AS FERRAMENTAS MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, Versão 1.0 LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola Mobility, Inc. Todos os direitos reservados.
  • 7.
    MOTODEV App Summit2011 Page 7 Baixando o Native Development Kit • Verifique a compatibilidade: XP ou Vista, MacOS X 10.5, Ubuntu • Baixe o arquivo zip de 50 MB ou tar.bz2 em: http://developer.android.com/sdk/ndk/index.html • Faça a descompactação dele em qualquer lugar, lembre-se de onde em $NDK export NDK=~/android-ndk-r5b • Requer o GNU make e GNU awk! Usuários do Windows - instalar o Cygwin 1.7 ou mais recente © 2011 Motorola Mobility, Inc.
  • 8.
    MOTODEV App Summit2011 Page 8 Usuários do Windows • Baixe e instale o Cygwin 1.7 ou mais recente • Ferramentas de linha de comando Unix/Linux para usuários do Windows http://cygwin.com © 2011 Motorola Mobility, Inc.
  • 9.
    MOTODEV App Summit2011 Page 9 Dicas para Windows e MacOS X • Não use nomes de caminhos com espaços entre eles! Em qualquer lugar! • O Cygwin instala somente os pacotes básicos. • Você precisa dos pacotes de desenvolvimento. É simples instalar todo o branch “Devel”. 1. Execute o setup.exe. 2. Clique na palavra “Default” (Padrão) próxima ao nó da raiz “Devel”. 3. “Default” altera para “Install” para o nó Devel. 4. Clique em “next” (Avançar) para instalar. Vá almoçar enquanto a instalação é realizada. 5. Deixe-o criar um ícone do console cygwin na sua área de trabalho. 6. Digite "make -v" no console cygwin para verificar se © 2011 Motorola Mobility, Inc. está tudo OK.
  • 10.
    MOTODEV App Summit2011 Page 10 Descompacte o Native Development Kit • Contem sete pastas, e uma série de coisas para ler: © 2011 Motorola Mobility, Inc.
  • 11.
    MOTODEV App Summit2011 Page 11 Pastas NDK • build: 4 pastas de scripts awk e shell, makefiles para compilar os seus arquivos C/C++ • docs: cerca de 20 arquivos de texto (Perguntas frequentes sobre o NDK); acesse pelo navegador o arquivo documentation.html • plataforms: .h e arquivos de sistema library.so para os vários níveis de API • samples: uma série de exemplos de funcionamento • sources: algumas fontes para os elementos relacionadas ao sistema • tests: scripts para testar o próprio NDK. Provavelmente aqui por engano. • toolchains: toolchains de cross-compiler © 2011 Motorola Mobility, Inc.
  • 12.
    MOTODEV App Summit2011 Page 12 Adicionar suporte de C/C++ ao Eclipse • O Eclipse tem um plug-in para C/C++, assim como para o Android • Consiga isso usando o Eclipse Help (Ajuda) > Install new software (Instalar novo software) • Digite http://download.eclipse.org/releases/helios/ no campo “work with” (trabalhar com) (ou qualquer versão que você usa) • Advertências comuns sobre proxies de rede no trabalho (defina-os em MOTODEV Studio > Preferences (Preferências) > Network Conn. (Conexão de rede) • Clique em Programming Langs (Linguagens de programação) > C/C++ Development Tools (Ferramentas de desenvolvimento) © 2011 Motorola Mobility, Inc.
  • 13.
    MOTODEV App Summit2011 Page 13 • Há um plugin para C/C++, assim como para o Android • Consiga isso usando o Eclipse Help (Ajuda)> Install new software (Instalar novo software) © 2011 Motorola Mobility, Inc.
  • 14.
    Escreva seu códigoC MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola Mobility, Inc. Todos os direitos reservados.
  • 15.
    MOTODEV App Summit2011 Page 15 Abordagem geral •Comece com um aplicativo Android em Java, e adicione pedaços NDK a ele. •Coloque sua fontes C/C++ nativas em $PROJECT/jni: •Crie o seu código nativo em bibliotecas (libraries). •Seu código Java do Android pode chamar código nessas bibliotecas nativas. •O código nativo também pode chamar de volta em Java, e acesso objetos Java. © 2011 Motorola Mobility, Inc.
  • 16.
    MOTODEV App Summit2011 Page 16 Criar o projeto Android da maneira usual © 2011 Motorola Mobility, Inc.
  • 17.
    MOTODEV App Summit2011 Page 17 Crie a pasta jni para seu projeto • Destaque o projeto Eclipse que usará o código nativo • O nome do seu pacote é usado para acessar o código nativo, então mantenha-o curto e simples, por exemplo, "com.greet" para propósitos de treinamento • File (Arquivo) > New (Novo) > Folder (Pasta) • atribua-lhe o nome de "jni" • Dentro dessa pasta jni recém-criada, nós adicionaremos • um makefile • alguns arquivos C © 2011 Motorola Mobility, Inc.
  • 18.
    MOTODEV App Summit2011 Page 18 Adicione dois arquivos à pasta jni em seu projeto • File (Arquivo) > New (Novo) > Other (Outro) ... • Selecione General (Geral), File (Arquivo) e, em seguida, procurar • Escolha a pasta jni, com o nome de "Android.mk“ > Finish (Finalizar) • Repita, criando um arquivo "myhello.c", também na pasta jni • Isso oferece a você • jni/Android.mk • jni/myhello.c © 2011 Motorola Mobility, Inc.
  • 19.
    MOTODEV App Summit2011 Page 19 Preencha arquivos na pasta jni Criando a pasta jni em seu projeto saud ar © 2011 Motorola Mobility, Inc.
  • 20.
    MOTODEV App Summit2011 Page 20 Criando mkfile na pasta jni © 2011 Motorola Mobility, Inc.
  • 21.
    MOTODEV App Summit2011 Page 21 Preencha o makefile Android.mk • Edite o arquivo jni/Android.mk que você acabou de criar • Coloque essas palavras mágicas no makefile LOCAL_PATH := $ l my-d r (cal i) i lude $ nc (CLEAR_VARS) # nosso arqu vo fon e e a b b io i t i l teca c iada r # a par i le t rde LOCAL_M O D ULE : he lo = l LOCAL_SRC_FILES : he lo c = l . i lude $ nc (BUILD_SHARE D_LIBRARY) © 2011 Motorola Mobility, Inc.
  • 22.
    MOTODEV App Summit2011 Page 22 Desvio em relação ao make • O make foi criado por Stu Feldman em 1977, no Bell Labs • Em 2003, o Dr. Feldman recebeu o prêmio ACM Software System Award pela criação dessa ferramenta amplamente difundida. • Você não ficou sabendo disso por mim, mas a tradição de software diz que... # Cada comando que segue a linha de dependência, # ou seja, o TARGET à esquerda, deve ser indentado por um # caracter TAB. target: componente-a-construir <TAB>comandos-para-construi-lo © 2011 Motorola Mobility, Inc.
  • 23.
    MOTODEV App Summit2011 Page 23 Crie o código C na pasta jni •Edite o arquivo jni/myhello.c que você acabou de criar •Coloque essas palavras mágicas no arquivo C •Usa o objeto JNIEnv para criar uma string de Java a partir de um literal #incluir <string.h> #incluir <jni.h> jstring Java_com_greet_MyActivity_myCFunction (JNIEnv* env, jobject javaThis) { return (*env)->NewStringUTF(env, "Hello from native code!"); } © 2011 Motorola Mobility, Inc.
  • 24.
    MOTODEV App Summit2011 Page 24 Código C explicado Quando o JVM invoca uma função nativa, ele passa • um indicador JNIEnv (estrutura que tem a interface da JVM para C) • um ponteiro jobject (o objeto "this") • quaisquer argumentos de Java declarados pelo método Java. Esses tipos vêm de #include <jni.h> (veja em "plataforms") Seu método de C deve ser escrito para esperar esses argumentos O método C é chamado de "Java“_classname_activity_methodname #incluir <string.h> #incluir <jni.h> Jstring Java_com_greet_MyActivity_myCFunction (JNIEnv* env, jobject javaThis) { return (*env)->NewStringUTF(env, "Hello from native code!"); } • ... parece, mas não é, um vazamento de memória? © 2011 Motorola Mobility, Inc.
  • 25.
    Crie um códigoC MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola Mobility, Inc. Todos os direitos reservados.
  • 26.
    MOTODEV App Summit2011 Page 26 Chamadas entre linguagens •O Android segue o caminho normal para falar entre Java e C •JNI – Java Native Interface •Link para documentação do JNI http://java.sun.com/docs/books/jni/ •Isso inclui um livro completo, um tutorial, exemplos, etc © 2011 Motorola Mobility, Inc.
  • 27.
    MOTODEV App Summit2011 Page 27 Crie uma biblioteca C • Abra uma janela de terminal, e cd para a pasta do projeto jni • Use o script "NDK-build" do diretório NDK (apenas um invólucro GNU Make) (pode colocar $NDK em seu caminho, se você quiser) • O script compila o código C, o transforma em uma biblioteca compartilhada (“shared library”) • Move o libhello.so para um novo projeto de pasta libs/armeabi © 2011 Motorola Mobility, Inc.
  • 28.
    MOTODEV App Summit2011 Page 28 Abordagem geral para a construção de uma biblioteca • Salve arquivos no Eclipse • Abra uma janela de terminal e cd na pasta jni do seu projeto • Execute o script NDK-build para transformar o seu código em C em um arquivo .so • Essa lib *. so será adicionada no arquivo do aplicativo APK. • File (Arquivo) > Refresh (Atualizar) no Eclipse (para sincronizar com o sistema de arquivos) $ cd MYECLIPSEPROJECT/ i jn $ $NDK/ndk-bu ld i Co mpi e thumb : he l <= helo l lo l .c SharedL ibrary :l bhe l i lo.so Ins l tal :l b l .so => l /armeab /ibhe lo i he lo ibs il l .so © 2011 Motorola Mobility, Inc.
  • 29.
    MOTODEV App Summit2011 Page 29 CRIE SUA BIBLIOTECA: resumo • O Eclipse não compila seu código NDK, o GNU Make sim • O plugin C/C++ dá-lhe as cores de sintaxe e de edição (apenas) • Execute o "NDK-build " script após cada edição de seu código C • Depois clique em File > Refresh, (F5), para manter o Eclipse em sincronia com seus arquivos nativos © 2011 Motorola Mobility, Inc.
  • 30.
    O Lado Javado JNI MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 Motorola Mobility, Inc. Todos os direitos reservados.
  • 31.
    MOTODEV App Summit2011 Page 31 Código Java que chama para o código nativo • Comece com o aplicativo de base criado no Eclipse package com.greet; impor andro t id.app.Actvt ; iiy impor andro t id.os.Bund ; le pub ic cl l ass MyAct i y ex ivt tends Ac ivt { t iy / * Chamado quando a Actvt é cr * iiy iada pe p i ra vez. * la rmei / @ Over ide r pub i vo onCreate lc id (Bund savedIns le tanceSta e) { t super .onCreate(savedInstanceSta ; te) setContentV iew(R.layout in) .ma ; } } © 2011 Motorola Mobility, Inc.
  • 32.
    MOTODEV App Summit2011 Page 32 Adicione o carregamento da biblioteca • Adicione a chamada para carregar a nossa biblioteca nativa libhello.so • o nome deve corresponder ao nome da biblioteca sem “lib” e “.so” • assim libhello.so é "hello" s t c{ ta i Sys em. t loadLibrary "he l " ; ( lo) } © 2011 Motorola Mobility, Inc.
  • 33.
    MOTODEV App Summit2011 Page 33 Adicione a declaração da função nativa • Adicione a declaração de protótipo da função nativa • No lado C, ela tem dois argumentos explícitos, um envp, um this • Mas no lado Java, esses argumentos estão implícitos p i te na i Str myCFunct ) r va t ve ing ion( ; © 2011 Motorola Mobility, Inc.
  • 34.
    MOTODEV App Summit2011 Page 34 Adicione a chamada para a função nativa • Nós pegaremos a string de C e exibiremos alertas para o usuário (usando um “toast”). impor s t c andro . t ta i id widget Toast * . .; impor andro t id.widget.Toas ; t ... Sr t ing msg = myCFunct ) ion( ; Toas . t makeText th msg, LEN GTH_LO N G).show() ( is, ; © 2011 Motorola Mobility, Inc.
  • 35.
    MOTODEV App Summit2011 Page 35 Juntando tudo package com.greet ; impor andro .app.Ac ivt ; t id t iy impor andro .os Bund ; t id . le impor s i andro d.w t tatc i idget Toast * . .; impor andro .w t id idget.Toas ; t pub ic c l lass MyAct v ty ex ii tends Ac ivt { t iy s t c { Sys ta i tem.loadLibrary " l " ;} ( he lo ) pr te natve S r iva i t ing myCFunct ) ion( ; @ Override pub i vo onCreate(Bund savedIns l c id le tanceSta { te) super.onCreate(savedInstanceState); setConten iew(R. tV layout in) .ma ; Sr t ing msg = myCFunct ) ion( ; Toas .makeText th ,msg, LENGT H_LON G).show() t ( is ; } } © 2011 Motorola Mobility, Inc.
  • 36.
    MOTODEV App Summit2011 Page 36 © 2011 Motorola Mobility, Inc.
  • 37.
  • 38.
    MOTODEV App Summit2011 Page 38 O COMEÇO Este pode ser um belo começo para um longo caminho • http://groups.google.com/group/android-ndk/topics • http://java.sun.com/docs/books/jni/ • http://developer.android.com/sdk/ndk/index.html © 2011 Motorola Mobility, Inc.
  • 39.
    MOTODEV App Summit2011 Page Página39 Renderscript • Nova API com gráficos 3D de alto desempenho • Foi usada no Froyo para papéis de parede animados • É usada no Honeycomb para as apps Books e YouTube • O Honeycomb apresenta o Renderscript como uma API pública • Para executar códigos críticos em que as APIs de estrutura tradicionais Open GL ES não são rápidas o suficiente! © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc. © 2011 Versão 1.0
  • 40.
    MOTODEV App Summit2011 Page Página40 Exemplo de renderscript © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc. © 2011 Versão 1.0
  • 41.
    MOTODEV App Summit2011 Page Página41 App Books e Renderscript © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc. © 2011 Versão 1.0
  • 42.
    MOTODEV App Summit2011 Page Página42 API do Renderscript • Uma API de "computação" para localizar pontos de movimento em 3D • Um API de "renderização" para desenhar texturas sobre os pontos • Uma linguagem de script baseada em C para acessar essa API • Único objetivo: espremer até a última gota de desempenho gráfico! • Abordagem: a API é uma fina camada sobre os recursos que são suportados pelo hardware • http://community.developer.motorola.com/t5/MOTODEV- Blog/Introduction-to-Renderscript/ba-p/12136 © 2010 Motorola Mobility, Inc. Motorola Mobility, Inc. © 2011 Versão 1.0
  • 43.
    MOTODEV App Summit2011 Page Página43 API do Renderscript • As ferramentas de construção do Android compilam seu arquivo .rs do Renderscript para bytecode intermediário. • e o empacota no arquivo .apk do seu aplicativo. • No dispositivo, o bytecode é compilado (durante a execução - JIT) para código de máquina, que é otimizado para o dispositivo exato em que está sendo executado • O código de máquina é armazenado em cache para uso futuro • Isso elimina a necessidade de destinar uma arquitetura específica durante o processo de desenvolvimento. Excelente! © 2011 Motorola Mobility, Inc.
  • 44.
    MOTODEV App Summit2011 Page Página44 Exemplo de arquivo .rs (a partir de exemplos do Honeycomb) #pragma rsjava_package_name(com.andro . s l id r .he lowor ) ld # lude " inc rs_graph cs rsh"/ Headers com APIs g f cas i . / rá i / gTouchX e gTouchY são var / iáve que serão obt is idas a ravés de t / re lexão para o uso pe API java Podemos usá- para no ii r / f la . las tf ca / o sc ip de eventos de toque. / r t i t gTouchX; n i t gTouchY; n / Esse éi / nvocado automaticamente quando o scr t é c i ip rado vo int ){ id i( gTouchX = 50 ; .0f gTouchY = 50 ; .0f } i troo ( n t intlaunchID) { / Apaga a cor do p / lano fundo rsgClearCo (0.0 , 0 f 0.0 , 0 f ; lor f .0 , f .0 ) / In r o run ime que a cor da fonte deve t / fo ma t er rsgFontCo r .0f 1 f 1 0f 1 f ; lo (1 , .0 , . , .0 ) //Nos apresenta ao mundo esboçando uma saudação / no loca em que o usuár o tocou a te / l i la rsgDrawText "He lo Wor d! , gTouchX, gTouchY) ( l l " ; / O va or de re / l tornoin r ao RS aprox mada mente quantas vezes fo ma i / redesenhar nesse caso 20 ms / ; Versão 1.0 © 2011 Motorola Mobility, Inc. re rn 20; tu }
  • 45.
    MOTODEV App Summit2011 Page 45 Perguntas? @motodev @motodevbr Brasil - #appsum11br Argentina - #appsum11ar México - #appsum11mx Atendimento on line Terca-feira, 2 de junho 14 hs Sao Paulo, Buenos Aires 12 hs Cidade do Mexico © 2011 Motorola Mobility, Inc.
  • 46.
    MOTODEV App Summit2011 Page 46 obrigado © 2011 Motorola Mobility, Inc.
  • 47.
    MOTODEV App Summit2011 Page 47 Licenças Os exemplos de código fonte exibidos nessa apresentação podem ser licenciados sob a Licença Apache, Versão 2 da seguinte maneira: Copyright © 2010, Android Open Source Project. Todos os direitos reservados, exceto onde expressamente indicado o contrário. Licenciado sob a Licença Apache, Versão 2.0 (a "Licença"); você não pode usar esse arquivo exceto em conformidade com a Licença. Você pode obter uma cópia da Licença em http://www.apache.org/licenses/LICENSE-2.0. A menos que exigido pela lei aplicável ou acordado por escrito, o software distribuído sob a Licença é distribuído "NA CONDIÇÃO QUE SE ENCONTRA", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam expressas ou implícitas. Consulte a Licença para o idioma específico que governam as permissões e limitações sob a Licença. © 2011 Motorola Mobility, Inc.
  • 48.
    MOTODEV App Summit2011 Page 48 Licenças Os exemplos de código fonte exibidos nessa apresentação podem ser licenciados sob a Licença BSD, da seguinte maneira: Copyright © 2010-2011, Motorola, Inc. Todos os direitos reservados exceto quando expressamente indicado. A redistribuição e utilização em formas de fonte e binário, com ou sem modificação, são permitidas de acordo com as seguintes condições: As redistribuições de código fonte devem manter o aviso de direitos autorais acima, esta lista de condições e a seguinte isenção de responsabilidade. As redistribuições em formulários binários devem reproduzir o aviso de copyright acima, esta lista de condições e a seguinte isenção de responsabilidade na documentação e/ou outros materiais fornecidos com a distribuição. O nome da Motorola, Inc. e os nomes de seus colaboradores não podem ser usados para endossar ou promover produtos derivados desse software sem permissão prévia por escrito. ESTE SOFTWARE É FORNECIDO PELOS DETENTORES E COLABORADORES "COMO TAL" E QUALQUER GARANTIA EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO LIMITADO A, AS GARANTIAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO PARA UMA FINALIDADE ESPECÍFICA. EM NENHUM CASO A TITULAR DO DIREITO OU CONTRIBUINTES DEVEM SER RESPONSÁVEIS POR QUAISQUER DANOS DIRETOS, INDIRETOS, ESPECIAIS, EXEMPLARES OU CONSEQUENTES (INCLUINDO, MAS NÃO SE LIMITANDO À AQUISIÇÃO DE BENS OU SERVIÇOS, PERDA DE USO, DADOS OU LUCROS; OU INTERRUPÇÃO DE NEGÓCIOS) CAUSADOS E SOB QUALQUER TEORIA DE RESPONSABILIDADE, SEJA EM CONTRATO, RESPONSABILIDADE OBJETIVA OU (INCLUINDO NEGLIGÊNCIA OU NÃO) DECORRENTE DE QUALQUER MANEIRA DO USO DO SOFTWARE, MESMO QUE DA POSSIBILIDADE DE TAIS DANOS. © 2011 Motorola Mobility, Inc.