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:

$ sudo apt-get install arm-linux-gnueabi-gcc

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:

$ sudo apt-get install build-essential bison

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:

$ sudo apt-get install android-tools-adb

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:

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd = 0;
    // Led verde: Ligado
    fd = open("/sys/class/sec/led/led_g", O_WRONLY);
    write(fd, "255", 3);
    close(fd);
    sleep(1);
     
    // Led Vermelho: Ligado
    fd = open("/sys/class/sec/led/led_r", O_WRONLY);
    write(fd, "255", 3);
    close(fd);
    sleep(1);
    
    // Led Azul: Ligado
    fd = open("/sys/class/sec/led/led_b", O_WRONLY);
    write(fd, "255", 3);
    close(fd);
    return 0;
}

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. 

fd = open("/sys/class/sec/led/led_g", O_WRONLY);

 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.

write(fd, "255", 3);
write(fd, "32", 3);

Compilando e iniciando a aplicação nativa

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

$ arm-linux-gnueabi-gcc -o led -static led.c

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

$ adb remount

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

$ adb push led /sdcard/led

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

$ adb shell

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

$ adb push led /

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.

su 0

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

setenforce 0

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

chmod 777 led

É 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:

cd sdcard

6) Execute o programa:

./led

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.
Comentários:
Notificações
Notificar
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
Gilberto
28/10/2014 11:32

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

vinifr
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 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.

Home » Software » Sistemas Operacionais » Cross-compilação de programas estáticos para Android

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: