Top Banner
Peter van der Linden Evangelista da tecnologia Android Plataformas e serviços para desenvolvedores Brasil - #appsum11br Motorola Mobility Gráficos cada vez mais rápidos: utilização de NDK e Renderscript
48

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

May 27, 2015

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Gráficos cada vez mais rápidos utilização de NDK e Renderscript

Peter van der LindenEvangelista da tecnologia Android

Plataformas e serviços para desenvolvedores

Brasil - #appsum11br

Motorola Mobility

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

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

2Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

Versão 1.0© 2011 Motorola Mobility, Inc.

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

3Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

• Open GL

• Desempenho

• Portar!

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

4Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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++

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

5Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Arquiteturas de CPU SUPORTADADAS• o NDK suporta dois conjuntos de instruções ARM:

• ARMv5TE (inclui instruções Thumb-1). Esse é o targetpadrã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

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

INSTALANDO AS FERRAMENTAS

Versão 1.0MOTOROLA 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 MotorolaMobility, Inc. Todos os direitos reservados.

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

7Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

8Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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 Windowshttp://cygwin.com

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

9Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

está tudo OK.

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

10Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Descompacte o Native Development Kit

• Contem sete pastas, e uma série de coisas para ler:

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

11Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

12Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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 “workwith” (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)

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

13Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

(Instalar novo software)

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

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 MotorolaMobility, Inc. Todos os direitos reservados.

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

15Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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.

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

16Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Criar o projeto Androidda maneira usual

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

17Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

18Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

19Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Preencha a pasta jni em seu projeto

saudar

Criando arquivos na pasta jni

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

20Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Criando mkfile na pasta jni

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

21Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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 := $(call my-dir)

include $(CLEAR_VARS)

# nosso arquivofonte e a biblioteca criada# a partirdeleLOCAL_MODULE := helloLOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

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

22Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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 SystemAward 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

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

23Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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!");}

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

24Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Código C explicadoQuando 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 argumentosO método C é chamado de "Java“_classname_activity_methodname

• ... parece, mas não é, um vazamento de memória?

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

Jstring Java_com_greet_MyActivity_myCFunction(JNIEnv* env, jobject javaThis) {

return (*env)->NewStringUTF(env, "Hello from native code!");}

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

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 MotorolaMobility, Inc. Todos os direitos reservados.

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

26Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

27Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

28Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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/jni$ $NDK/ndk-build

Compile thumb : hello <= hello.cSharedLibrary : libhello.soInstall : libhello.so => libs/armeabi/libhello.so

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

29Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

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 MotorolaMobility, Inc. Todos os direitos reservados.

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

31Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

• Comece com o aplicativo de base criado no Eclipse

package com.greet;

import android.app.Activity;import android.os.Bundle;

public class MyActivity extends Activity {/** Chamado quando a Activity écriada pela primeira vez. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);

}}

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

32Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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"static {

System.loadLibrary("hello");}

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

33Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

private native String myCFunction();

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

34Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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”).

import static android.widget.Toast.*;import android.widget.Toast;

. . .

String msg = myCFunction();Toast.makeText(this, msg, LENGTH_LONG).show();

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

35Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Juntando tudopackage com.greet;

import android.app.Activity;import android.os.Bundle;import static android.widget.Toast.*;import android.widget.Toast;

public class MyActivity extends Activity {

static { System.loadLibrary("hello"); }

private native String myCFunction();

@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);

String msg = myCFunction();

Toast.makeText(this, msg, LENGTH_LONG).show();}

}

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

36Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

Resumo

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

38Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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

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

39Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011 Página

Versão 1.0© 2010 Motorola Mobility, Inc.

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 appsBooks 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!

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

40Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011 Página

Versão 1.0© 2010 Motorola Mobility, Inc.

Exemplo de renderscript

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

41Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011 Página

Versão 1.0© 2010 Motorola Mobility, Inc.

App Books e Renderscript

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

42Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011 Página

Versão 1.0© 2010 Motorola Mobility, Inc.

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

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

43Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011 Página

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!

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

44Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011 Página

Versão 1.0

Exemplo de arquivo .rs (a partir de exemplos do Honeycomb)

#pragma rsjava_package_name(com.android.rs.helloworld)#include "rs_graphics.rsh"// Headers com APIs gráficas

// gTouchX e gTouchY são variáveisque serão obtidas através de// reflexão para o uso pela API java. Podemos usá-las para notificar// o script de eventos de toque.intgTouchX;intgTouchY;

// Esse éinvocado automaticamente quando o script é criadovoid init() {

gTouchX = 50.0f;gTouchY = 50.0f;

}

introot(intlaunchID) {// Apaga a cor do planofundorsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);// Informa o runtime que a cor dafonte deveterrsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);//Nos apresentaao mundo esboçando uma saudação// no local em que o usuáriotocou a telarsgDrawText("Hello World!", gTouchX, gTouchY);

// O valor de retornoinforma ao RS aproximadamente quantas vezes// redesenhar; nesse caso 20 msreturn 20;

}

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

45Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

Perguntas?@motodev

@motodevbr

Brasil - #appsum11brArgentina - #appsum11arMéxico - #appsum11mx

Atendimento on lineTerca-feira, 2 de junho

14 hs Sao Paulo, Buenos Aires12 hs Cidade do Mexico

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

46Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

obrigado

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

47Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

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.

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

48Page

© 2011 Motorola Mobility, Inc.

MOTODEV App Summit 2011

LicençasOs 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.