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.

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

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

Linux Embarcado » Cross-compilação de programas estáticos para Android
Comentários:
Notificações
Notificar
guest
10 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Matheus Ferreira
Matheus Ferreira
06/01/2016 15:59

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
Reply to  Matheus Ferreira
13/01/2016 11:32

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

Gilberto Queiroz Cruz
Gilberto
28/10/2014 11:32

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

Vinicius Maciel
vinifr
Reply to  Gilberto
28/10/2014 13:04

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
Marcelo Andriolli
20/10/2014 15:12

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

Gustavo Oliveira
Gustavo Oliveira
29/09/2014 21:30

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

Gustavo Moraes
Gustavo Moraes
25/09/2014 23:31

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
Ciro Peixoto
22/09/2014 13:30

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

Cleiton Bueno
18/09/2014 13:27

Muito legal o artigo, parabéns!

Anderson Rodrigo Souza
17/09/2014 11:09

Muito bom.

Talvez você goste:

Séries

Menu

WEBINAR
 
RISC-V:
Novidades de 2020

 

Data: 26/08 às 19:30h - Apoio: Mouser Elecctronics
 
INSCREVA-SE AGORA »



 
close-link