Compilando o Android para a BeagleBone Black

Android para BeagleBone Black

O objetivo deste artigo é compartilhar minha experiência na construção, a partir dos fontes,  do sistema operacional para dispositivos móveis Android para a BeagleBone Black (BBB).

Acredito que ambos os componentes dispensam introduções e comentários. Mas, em todo caso, segue uma breve introdução: o Android é um sistema operacional de código aberto, criado e mantido pelo Google, para ser usado originalmente em dispositivos móveis como aparelhos celulares e tablets. A Beaglebone Black é uma placa do tipo 'open source hardware', desenvolvida por uma comunidade de projetistas de hardware com o objetivo de oferecer uma solução simples, de baixo custo e flexível para seus projetos. Inicialmente pensada como uma placa para projetos de eletrônica para hobbistas, esta placa se mostrou um computador embarcado de grande potencial e baixo custo, podendo ser aplicada em diversos projetos de sistemas embarcados.

Atualmente o uso do Android não se restringe a dispositivos móveis. Este sistema operacional tem sido usado para diversas outras aplicações. Entre suas vantagens, destaca-se:

  • Plataforma de desenvolvimento de software bem definida e robusta, mantida pelo Google;
  • Ambiente de desenvolvimento baseado na linguagem Java, que possui uma enorme massa crítica de desenvolvedores;
  • Plataforma de código aberto facilita o acesso aos recursos e informações;
  • Royalties Free - competitividade em custo do produto final.

Hoje vemos o Android operando em televisores, eletrodomésticos e equipamentos industriais específicos. Para aplicação nestes cenários, hardware dedicado é construído para estes projetos e, com isso, o sistema operacional deve ser adaptado para operar neste novo cenário.

A motivação deste artigo é apresentar, de forma resumida, como dar o pontapé inicial neste mundo, digamos, um pouco mais 'baixo nível'.

Então vamos começar! Para compilar o Android, usou-se a versão Rowboat, específica para processadores da família Sitara, da Texas Instruments. Este guia é uma adaptação do material presente no próprio site do projeto e pretendo detalhar ou explicar melhor as instruções presentes naquele tutorial.

Pré-requisitos

Para compilar o Android, é mandatório se ter um sistema operacional 64bits!

No meu caso, eu usei o UBUNTU 12.04 LTS 64 BITS.

Outro requisito mandatório: JAVA 6 (JDK).

A última versão disponível para Java é a 7. Você deve entrar no site da Oracle e baixar a JDK correta, dentro da opção de 'versões anteriores'. E, para a versão Linux, você não deve baixar o arquivo RPM. Você deve baixar o arquivo BIN.

Com sorte, este link irá direto para o download. Segue abaixo um simples procedimento para instalação:

Ao final deste processo, o Java estará instalado em /opt e a variável PATH estará pronta para executar esta versão do Java instalada. Vale lembrar que caso o computador seja reiniciado ou a janela de terminal fechar, a ultima instrução deverá ser executada novamente.

Uma vez instalado o Java, vamos instalar os pacotes necessários para realização da compilação.

 Com estas configurações, podemos começar a compilar o Android.

Passo 1 - download dos fontes

O primeiro passo é construir a estrutura de diretórios:

O diretorio bbb é o diretório principal do projeto.

O diretório bbb/bin é onde será instalado o utilitário repo.

O diretório bbb/rowboat-android é onde se encontram os arquivos de compilação do Android.

Uma vez construída a estrutura de diretório, vamos baixar e instalar o utilitário repo.

Repo é um utilitário construído para facilitar o uso do git para download de diversos repositórios diferentes, oriundo de diferentes fontes e de diferentes branches. Trata-se de um utilitário que talvez mereça um artigo específico sobre ele.

Com o repo devidamente instalado, vamos baixar os fontes do Android.

Agora é hora de relaxar, assistir aquele filme ou ler um livro ou navegar na internet. Esta etapa demora .... e muito.

Ao final desta execução, temos os seguintes componentes:

  • Bootloader u-boot
  • Kernel Linux
  • Toolchain
  • Fontes do Android (equivalente à distribuição ou root filesystem, em uma arquitetura Linux embarcado padrão)

Vale lembrar que o Rowboat é uma adaptação do Android para processadores da Texas Instruments. Em uma compilação padrão do Android, a partir de seus fontes, o bootloader e o kernel Linux são tratados separadamente.

Passo 2 - Compilação

De posse de todos os arquivos necessários, vamos compilar!

De acordo com as instruções do projeto, existem duas abordagem: a de compilar tudo (vencedora) e a de compilar por partes. Vou descrever separadamente e comentar cada uma das abordagens. Porém, a que eu realizei com sucesso foi a primeira.

Independente da forma a ser usada para compilar, o primeiro passo é deixar o toolchain disponível na variável PATH de seu terminal.

Passo 2.1 - Compilando tudo de uma só vez

Sem mais delongas, para compilar tudo de uma vez:

Outro momento de relaxamento. Este procedimento demora. Mas, ao final, teremos todos os componentes necessários.

Passo 2.2 - Compilação por componentes

A grande vantagem de compilar separadamente está no fato de que é possível realizar personalizações individuais em cada um dos componentes. Quando apenas um componente necessita de compilação, a reconstrução completa do sistema não é necessária e, com isso, a geração individual dos componentes se torna mais prática.

Os subitens a seguir descrevem como compilar os componentes elementares do Android.

Passo 2.2.1 - Bootloader

O bootloader usado para realizar o boot do Android é o u-boot, empregado em praticamente todos os sistemas embarcados baseados em processadores ARM.

Os comandos abaixo realizam a compilação do bootloader:

A primeira chamada de make apaga toda compilação e configuração anterior que tenha sido feita anteriormente.

A segunda chamada de make configura os parâmetros do código fonte para compilação específica para a Beaglebone Black.

Por fim, a terceira chamada de make compila o projeto, gerando os binários necessários do bootloader.

Passo 2.2.2 - Kernel Linux

O Android utiliza como base o sistema operacional Linux. Na época do lançamento, o Android tinha patches específicos para atender às suas necessidades de funcionamento. A partir da versão 3.3 do kernel Linux, estes patches foram integrados ao mainline Linux. Desta forma, o kernel Linux presente neste projeto possui os patches desenvolvidos pela Texas Instruments e pela comunidade BeagleBoard de forma a funcionar de forma apropriada na BeagleBone Black.

O procedimento para compilação do kernel padrão é apresentado abaixo.

A compilação do kernel Linux possui o mesmo conceito de compilação do U-boot. O primeiro make apaga qualquer vestígio de compilação e configuração anterior. O segundo make realiza a configuração específica para a Beaglebone Black. O terceiro make realiza a compilação e gera a imagem final de kernel Linux.

Passo 2.2.3 - Root filesystem

Para compilação da distribuição Android é feita através dos seguinte comandos:

Estes comandos compilam os componentes e controem o sistema de arquivos.

Para compilar as bibliotecas e drivers SGX para aceleração gráfica, devemos executar o seguinte comando:

Por fim, devemos criar um arquivo tarball para que uma imagem possa ser criada em um cartão SD. Para isso, este último comando deve ser executado:

Ao final destas execuções, temos o sistema de arquivos pronto para geração da imagem no cartão SD.

Passo 3 - construção do cartão SD

Uma vez compilados todos os componentes do sistema, agora é a hora de gerar uma imagem para o cartão SD.

Este artigo descreve como construir um cartão SD para a Beaglebone Black. A transferência para o e-MMC presente na placa não será descrita neste documento. E precisamos de um cartão SD de pelo menos 4 GB de memória para a correta construção do sistema.

A construção do cartão SD é dividida em dois passos: consolidação dos arquivo e geração da imagem.

Passo 3.1 - Consolidação dos arquivos binários

Vamos criar um diretório específico para armazenar os binários gerados. Os comandos abaixo realizam este procedimento.

Os arquivos envolvidos neste diretório são os seguintes:

  • uImage - imagem do Kernel Linux no formato suportado pelo U-boot
  • MLO - bootstrapper. Primeiro binário a ser executado quando o processador é ativado
  • u-boot.img - imagem do bootloader U-boot, chamado pelo MLO após ativação do processador
  • uEnv_beagleboneblack.txt - arquivo com as variáveis de parâmetros lidas pelo U-boot ao iniciar o sistema operacional
  • rootfs.tar.bz2 - sistema de arquivos com o Android
  • mkmmc-android.sh - script que cria o cartão SD com a imagem do Android

Preparado o ambiente, vamos criar o cartão SD.

Passo 3.2 - Geração do cartão SD

Uma vez preparado o ambiente, a etapa final é construir o cartão SD propriamente dito.

O primeiro passo é adicionar o cartão SD no computador. O Ubuntu detecta automaticamente o cartão SD. Se ele não estiver vazio, ele deve montar as partições presentes no cartão SD.  Isso significa que os drivers necessários para acesso deste cartão são ativados automaticamente (recurso conhecido como hotplugging). Este mapeamento implica em arquivos presentes no diretório /dev do sistema operacional.

Para descobrir qual é o arquivo correspondente ao sistema, executamos o seguinte comando:

No meu caso, o cartão SD se encontra em /dev/sdb.

Por fim, executamos o script que gera o cartão SD.

 Ao final do procedimento, o cartão estará pronto para uso.

Passo 4 - Boot da imagem

Agora que temos tudo pronto, vamos testar!

Para rodar o Android, é mandatório que a placa tenha uma fonte de energia que não seja o cabo USB. Para visualizar em um monitor, a CPU demanda energia. Recomendo que se use uma fonte de pelo menos 1.5 A.

Eu particularmente gosto de ver o boot pelo console. E, para isso, tenho meu cabo FTDI sempre à mão. Mas não é necessário, uma vez que sua CPU esteja ligado com um monitor no conector HDMI e um mouse no conector USB host.

Desligue sua Beaglebone Black da energia.

Conecte o cartão SD na placa.

Pressione o botão USER/BOOT.

Ligue a placa com o botão pressionado.

Na primeira vez leva um tempo a mais para se ter o Android surgindo na tela. Nas próximas será mais rápido.

Abaixo as mensagens de console do Android, vistas pelo cabo FTDI.

Nas próximas inicializações (talvez) não seja necessário apertar novamente o botão USER/BOOT. Caso não funcione, pressione novamente o botão para iniciar a placa.

Abaixo uma imagem na TV do Android rodando pela Beaglebone Black.

Android para BeagleBone Black
Figura 1: Android na Beaglebone Black

Conclusão

Este artigo procura ilustrar de forma simplificada como construir uma imagem Android para uma BeagleBone Black. Espero que possa ajudar aos aventureiros em suas primeiras viagens em um nível mais baixo neste badalado sistema operacional embarcado.

Uma vez com uma imagem Android presente em sua Beaglebone Black, você poder começar a desenvolver software utilizando os conceitos apresentados pelo artigo do André Prado.

 

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.

Flavio De Castro Alves Filho
Sócio fundador da Phi Innovations e Professor das disciplinas de sistemas de tempo real e padrões e aplicações de sistemas operacionais do curso de pós graduação em eletrônica embarcada automotiva oferecido pelo SAE (Society of Automotive Engineers).Formado em Engenharia Elétrica pela UNICAMP, com especialização na Ecole Centrale de Lyon, na França, atua há mais de 10 anos em projetos de sistemas embarcados. Trabalhou com projetos de hardware e software embarcado para os setores de pagamento eletrônico, aeroespacial, defesa, segurança, equipamentos médicos, telecomunicações e energia. Atuou em projetos no Brasil e no exterior (França e Alemanha).Começou suas atividades com Linux em 1996 e suas atividades empreendedoras em 2008. É um geek e apaixonado pelo Do-It Yourself (DIY).

10
Deixe um comentário

avatar
 
9 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
9 Comment authors
Bruno Rodrigues SilvaFrancisco Erivaldo Fernandes JuniorFlavio De Castro Alves FilhoVictor CruzCleiton Bueno Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Robson Rojas Andrade
Visitante
RobsonRojas

Não consegui executar o repo:

../bin/repo init -u git://gitorious.org/rowboat/manifest.git -m rowboat-jb-am335x.xml
Get https://gerrit.googlesource.com/git-repo/clone.bundle
Get https://gerrit.googlesource.com/git-repo
Get git://gitorious.org/rowboat/manifest.git
fatal: unable to connect to gitorious.org:
gitorious.org[0: 64.13.172.37]: errno=Conexão recusada

fatal: unable to connect to gitorious.org:
gitorious.org[0: 64.13.172.37]: errno=Conexão recusada

Bruno Rodrigues Silva
Visitante
Bruno

Por que é mandatário que o SO e o Java sejam 64bits?

Francisco Erivaldo Fernandes Junior
Visitante
Erivaldo Junior

Saudações Flavio. Você poderia informar como proceder para compilar o Android em uma placa que não seja o Beagle Bone Black? Possuo uma placa chinesa chamada FriendlyArm Mini210S e gostaria de instalar o Android 5.1. Infelizmente, apenas recebi a imagem para o Android 2.3 e 4.0. Tenho o toolchain dessa placa e o código fonte do Android 2.3 e 4.0 dessa placa. É possível proceder para a compilação de uma nova versão? Muito obrigado.

Victor Cruz
Visitante
Victor Cruz

Cara. Eu estava acompanhando o passo-a-passo de toda a linha de comando...

Na parte de baixar fonte do Android: "../bin/repo init -u git://gitorious.org/rowboat/manifest.git -m rowboat-jb-am335x.xml"

Tenho os eguinte erro: "Permission Denied".

Sabe me dizer o porque?!

Flavio De Castro Alves Filho
Visitante

Olá Victor, tudo bem?

Não é problema de permissão de escrita no diretório onde será baixado o Android não?

No tutorial, preve-se que o Android será compilado no diretório home do usuário da estação de trabalho. Caso você tenha usado qualquer outro diretório, problemas com permissão de arquivo podem ocorrer.

Espero ter ajudado.

Abraço,

Flavio

trackback

[…] Compilando Android para a BeagleBone Black […]

Cleiton Bueno
Visitante

Flavio parabéns pelo artigo, excelente iniciativa. Tive alguns problemas realizando do zero e vou postar aqui como resolvi caso acontecer com mais alguém: Primeiro meu host é um Intel Core i5 com Linux Mint 13 Maya 64bits com kernel 3.8. 1) Em adquirir o Java SE JDK por ser um versão old tive que fazer login para baixar o .bin mas é bom ter este cadastro em mãos. 2) Quando execute o o .bin ele não instalou em /opt, então eu movi para /opt e criei um .sh com echo -e 'nexport PATH="/opt/jdk1.6.0_45/bin:$PATH" 3) Iniciei o make, ae notei varias… Leia mais »

Fernando Pimenta
Visitante
Fernando Pimenta

Parabéns pelo artigo, Flávio. Muito bom!

Obrigado por compartilhar sua experiência. Vou encaminhar a um amigo.

Ronaldo Nunez
Visitante

Irado o tutorial! =)

Vinicius F. Maciel
Visitante
Vinicius F. Maciel

Show de bola! Gostei muito desse artigo!