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:
Figura 01 – LED vermelho aceso.
Figura 02 – LED verde aceso.
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.
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.












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!
Obrigada! Fico feliz que tenha ajudado. Pretendo continuar com os artigos.
Estou procurando um hardware para desenvolvimento com Android, voce conhece algum para me indicar
A placa da Olimex OLINUXINO ou a Cubieboard versão 1 e 2 já vem com Android na memória flash.
Parabéns Priscila!!! Muita bacana seu artigo!!
Legal, Priscila! Muito bom o artigo, parabéns!
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!!
Poxa parabens!!! Artigo muito bom…. Sem a enrolação costumeira de quem somente traduz… mostrou que sabe o que faz!
Muito legal o artigo, parabéns!
Muito bom.