Cross-compilação de programas estáticos para Android

Hello World no Android

Introdução

 

A maioria dos dispositivos Android utiliza a arquitetura ARM. Para compilarmos um programa estático para eles precisamos de um cross-compilador que possua os binários compatíveis com a arquitetura para a qual queremos compilar. Neste exemplo vamos utilizar o compilador arm-linux-gnueabi-gcc e um sistema host com o sistema operacional Ubuntu 14.04.

 

 

Preparando o ambiente

 

Precisa-se instalar alguns pacotes como pré-requisitos do sistema host antes de continuarmos. Estes são listados a seguir, juntamente com as instruções para instalação.

 

1) Instale a ferramenta arm-linux-gnueabi-gcc com o comando:

 

2) Alguns pacote são necessários para o processo de build. Estes são:

 

  • GCC;
  • G++ (GCC >= 4.8.0);
  • GNU Make;
  • GNU Bison.

 

 

Execute o seguinte comando para instalação:

 

3) Ferramenta ADB (Android Debug Bridge):

 

Você pode baixar e instalar o adb como parte do pacote do Android SDK. Visite a página Get the Android SDK. Distribuições mais recentes com Linux já possuem o adb em seus repositórios. Para o Ubuntu/Debian digite o comando:

 

Se sua distribuição não possui pacotes disponíveis para o adb, você precisará instalar o Android SDK starter package para sua plataforma.

 

 

Criando um programa nativo para acender os Leds

 

Para este exemplo foi utilizado o device Sony Xperia ZL. Neste programa vamos acender os leds R (red), G (green) e B (blue) de notificação do celular. No caso deste equipamento e alguns outros de outras marcas, os leds são mapeados em:

 

  • /sys/class/sec/led/ ou;
  • /sys/devices/virtual/sec/led.

 

 

Usando a ROM do Android Cyanogenmod foi refeito o teste e precisou serem utilizados os seguintes caminhos:

 

  • /sys/class/leds/lm3533-blue/brightness;
  • /sys/class/leds/lm3533-red/brightness;
  • /sys/class/leds/lm3533-green/brightness.

 

 

Conforme fui testando percebi que cada device tem um caminho diferente dentro de /sys/class dependendo da ROM do fabricante.

 

Escreva o seguinte arquivo para compilação, led.c:

 

Note que nesta linha é aberto o driver led_g para escrita. É o equivalente a você fazer um echo 255 > led_g na linha de comando com o adb shell. 

 

 O valor "255" passado como parâmetro (0xFF) determina a intensidade do brilho do led, que é um valor alto. No entanto, se for passado o valor “32”, o brilho ficará bem baixo.

 

 

 

Compilando e iniciando a aplicação nativa

 

1) Primeiramente compile o arquivo led.c com o comando:

 

2) Mude as permissões no device para read/write com o comando:

 

3) Copie o binário gerado com a ferramenta adb no path sdcard interno do dispositivo:

 

4) Acesse o terminal remoto do device utilizando o seguinte comando:

 

Obs: Note que o binário pode ser copiado para outro path também, por exemplo:

 

Esse comando copiará o binário na raiz do device. Porém, neste caso, para executar o programa é necessário modificar as suas permissões com a sequência de comandos a seguir.

 

 

Este comando significa que você irá entrar como root no sistema

 

 

Desativa o SEAndroid temporariamente para permitir modifcações no sistema. O SEAndroid tem o funcionamento idêntico ao SELinux.

 

 

É dada permissão total para nosso arquivo binário executável.

 

Por padrão em todos os devices o path sdcard já possui a permissão para cópia de arquivos sem necessitar mudar nada. Também é um path que nem como usuário root é possível alterar sua permissão de escrita e leitura.

 

5) Entre no diretório no qual foi copiado o programa:

 

6) Execute o programa:

 

Pronto! Agora os leds piscam do jeito que prevíamos. Veja as imagens a seguir:

 

Android

 Figura 01 - LED vermelho aceso.

 

Android

 Figura 02 - LED verde aceso.

 

Android

 Figura 03 - LED azul aceso.

 

Dependendo da ROM e do fabricante ainda é permitido mesclar cores entre os leds RGB. Na foto abaixo foi habilitado o led R + led B, ai formou esta cor rosa. Conforme é modificado o valor de 0 a 255 de brigthness, são formadas novas cores, resultado da mistura entre as 3 cores primárias.

 

Android

  Figura 04 - LEDs vermelho e azul acesos (cor rosa).

 

 

Conclusão

 

Neste tutorial foi mostrado como criar um programa básico que acessa um driver do celular. Todos os drivers estão lá, e pode-se utilizar também o flash da câmera, entre outros. No próximo artigo vamos abordar como funciona as camadas do Android e como é a comunicação de uma camada alto nível (framework - services - apps) com uma de baixo nível (módulo do kernel, programa nativo em C). A estrutura utilizada por default é C/C++, JNI, Java.

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Priscila Apocalypse
Priscila Pereira Apocalypse é formada em Engenharia da computação no Inatel - Instituto Nacional de Telecomunicações (Julho de 2011). Trabalha atualmente com desenvolvimento de Android applications/services na área de mobile solutions, tem interesse em diversos assuntos no mundo dos embarcados. Aproveita seu tempo livre para criar tutoriais e postar novidades dentro da área.

10
Deixe um comentário

avatar
 
8 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
10 Comment authors
Priscila ApocalypseMatheus FerreiraVinicius MacielGilberto Queiroz CruzMarcelo Rodrigo Dos Santos Andriolli Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Matheus Ferreira
Visitante
Matheus Ferreira

Estava a muitos meses procurando sobre isso! Nem sei como te agradecer Priscila, não achei nem em outras linguas. Incrivel a forma direta que você tratou este assunto, simples e eficaz. Achei seu contato no google plus vou lhe enviar um email. Parabéns!

Priscila Apocalypse
Visitante

Obrigada! Fico feliz que tenha ajudado. Pretendo continuar com os artigos.

Gilberto Queiroz Cruz
Visitante
Gilberto

Estou procurando um hardware para desenvolvimento com Android, voce conhece algum para me indicar

Vinicius Maciel
Visitante
vinifr

A placa da Olimex OLINUXINO ou a Cubieboard versão 1 e 2 já vem com Android na memória flash.

Marcelo Rodrigo Dos Santos Andriolli
Visitante
Marcelo Andriolli

Parabéns Priscila!!! Muita bacana seu artigo!!

Gustavo Oliveira
Visitante
Gustavo Oliveira

Legal, Priscila! Muito bom o artigo, parabéns!

Gustavo Moraes
Visitante
Gustavo Moraes

Estou vislumbrado com o artigo, muito obrigado mesmo por isso!!! Faz muito tempo que procuro algo relacionado a cross-compilação para Android e nunca achei nada organizado e nem em pesquisas estrangeiras acha. Primeiro material decente que encontro na internet, realmente você está de parabéns, simples e direto. Fiz o tutorial aqui seguindo passo a passo e funcionou de primeira no meu Motorola! Genial!!

Ciro Peixoto
Visitante
Ciro Peixoto

Poxa parabens!!! Artigo muito bom.... Sem a enrolação costumeira de quem somente traduz... mostrou que sabe o que faz!

Cleiton Bueno
Visitante

Muito legal o artigo, parabéns!

Anderson Rodrigo Souza
Visitante

Muito bom.