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.

[wpseo_breadcrumb]
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
Privacy Settings saved!
Configurações de Privacidade

Entenda quais dados e informações usamos para ter melhor entrega de conteúdo personalizado para você.

These cookies are necessary for the website to function and cannot be switched off in our systems.

Para usar este site, usamos os seguintes cookies tecnicamente exigidos

  • wordpress_test_cookie
  • wordpress_logged_in_
  • wordpress_sec

Decline all Services
Accept all Services