Como compilar uma ROM com o source CyanogenMod 10.1
Por Miguel Almeida para o Pplware
Provavelmente todos vocês já viram a quantidade de ROMs que existem para os mais variados equipamentos, mas faz alguma ideia de como estas são criadas? Isto inclui muitos equipamentos e múltiplos projetos, como são o caso da comunidade CyanogenMod, AOKP (Android Open Kang Project), Code Aurora, entre outras…
Este artigo tem como objetivo explicar e ensinar as noções básicas de como configurar um sistema para começar a construir ROMs para Android a partir do código fonte. Para isso é necessário ter uma instalação de raiz ou numa máquina virtual de um sistema operativo baseado em Linux (Debian, pode ser outra versão) 32 ou 64bits.
Neste caso específico usei o Ubuntu 12.10 Quantal Quetzal de 64bits, se por acaso usarem o Fedora os comandos utilizados vão ser ligeiramente diferentes. Para a instalação deste sistema operativo podem seguir este guia.
Antes de começarmos as configurações devemos ter em atenção o espaço existente no disco rígido, o código fonte do Android ocupa cerca de 8/9 GB e com a compilação para um dispositivo cerca de 25 a 30 GB.
O desenvolvimento Android tem alguns requisitos, chamados de dependências no Linux, alguns deles o Oracle (Sun) Java Development Kit version 6, Python, Git, GNU Make, entre outros…
Configurações:
CyanogenMod 10.1 - Jellybean
1º Passo: Ter o sistema atualizado, para isso executar na consola (CTRL + ALT + T):
sudo apt-get update |
2º Passo: Instalar as dependências
sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.8-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev openjdk-6-jre openjdk-6-jdk pngcrush schedtool libxml2-utils |
2.1: Só instalar para 64 bits:
sudo apt-get install g++-multilib lib32z1-dev lib32ncurses5-dev lib32readline-gplv2-dev gcc-4.7-multilib g++-4.5-multilib |
Se precisarem de ver mais alguma dependência podem consultar o site oficial do Android aqui
3º Passo: Preparar Repo
Esta é uma ferramenta que permite fazer o download do código fonte do Android, automaticamente a partir de centenas de repositórios individuais.
Criar os diretórios/pastas e instalar repo:
mkdir -p ~/bin mkdir -p ~/cm10.1 curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo chmod a+x ~/bin/repo |
Colocar a pasta ~/bin como caminho executável, para permitir a execução do comando repo seja usado fora dessa mesma pasta.
export PATH=${PATH}:~/bin |
4º Passo: Iniciar a sincronização com o código fonte da CyanogenMod 10.1
cd ~/cm10.1 repo init -u git://github.com/CyanogenMod/android.git -b cm-10.1 |
5º Passo: Download do código fonte. Poderá demorar cerca de 2/3h dependendo a velocidade da Internet.
repo sync |
Nota: Até este ponto é genérico para todos os equipamentos, mas o próximo passo já é específico para um equipamento.
6º Passo: Neste passo vamos preparar o código específico para um equipamento, Google/LG Nexus 4 que tem a “alcunha” de mako nos repositórios CyanogenMod.
. build/envsetup.sh && breakfast mako |
7º Passo: Download ou extração dos Proprietary Files, também chamados de blobs
cd .. mkdir -p ~/cm10.1/vendor/lge/mako git clone git://github.com/asm19/vendor_lge_mako.git rsync -av --delete ~/vendor_lge_mako/ ~/cm10.1/vendor/lge/mako/ --exclude='.git*' |
As instruções acima são para o download dos ficheiros que se encontra no meu github, mas como disse estes podem ser extraídos diretamente do equipamento. Para os extraírem terão que ter o adb (Ver onde diz: Configuring USB Access) a funcionar no Ubuntu e depois ir à pasta onde se encontra os ficheiros do Nexus 4, se seguiram os passos acima estes deverão estar em:
cd ~/cm10.1/device/lge/mako |
E executar:
./extract-files.sh |
Nota: É importante que estes ficheiros sejam devidamente extraídos, pois sem eles vão ter erros na compilação e ter algumas funcionalidades desativadas, como touch, camara, entre outras...
8º Passo: Download das aplicações prebuilt (pré-construídas) necessárias para a compilação, Terminal Emulator:
cd ~/cm10.1/vendor/cm ./get-prebuilts |
9º Passo: Ativar cache (para a compilação ser mais rápida) e iniciar a compilação.
cd ~/cm10.1/ export USE_CCACHE=1 . build/envsetup.sh && croot && brunch mako |
Se tiver feito todos os passos sem erros, a ROM vai começar a ser compilada. O tempo de compilação varia de computador para computador, no meu com um i7 3610QM de 2.3 - 3.3Ghz, 12GB de RAM demora cerca de 1h.
10º Passo: Após a compilação terminar vão ter a vossa ROM compilada num .zip e este é apresentado com o md5 correspondente, que se encontra em:
~/cm10.1/out/target/product/mako |
Está assim finalizado o processo de compilação e já têm a vossa ROM criada, podem flashar o vosso equipamento através do ClockworkMod.
Considerações finais:
- Sempre que quiserem compilar basta repetir o 9º Passo;
- Neste caso específico o kernel é compilado no decorrer da compilação da ROM, o mesmo não precisa de ser compilado à parte;
- Sempre que quiserem ver se há novas alterações ao código fonte que é desenvolvido pela comunidade CyanogenMod basta consultarem o Code Review da CyangonMod.
- Se pretenderem atualizar os ficheiros do código fonte já existentes no vosso computador, de modo a obter estas atualizações, é só irem ao vosso diretório através da consola e voltar atualizar a repo com o comando:
repo sync |
- Se o vosso dispositivo não for oficialmente suportado pela comunidade têm que ter as configurações básicas do mesmo, bem como os Proprietary Files, sendo necessário alguns ajustes. Esta fase já requer alguns conhecimentos sobre o código fonte do Android.
É desta que se vai aventurar no desenvolvimento de ROMs Android?
“O Pplware e o autor deste artigo, Miguel Almeida, não se responsabilizam por quaisquer danos causados por instruções, inerentes ao artigo ou aos comentários, que possam resultar na perda da garantia do equipamento.”
Este artigo tem mais de um ano
Bom artigo!
E ainda bem que aqui foi colocado porque tenho algumas questoes… as tags breakfast, brunch, lunch e outras… o que significam?
Obrigado
MKA é uma derivação melhorada do comando make. O make é lento então foi adicionado o SCHED_BATCH para melhorar a performance do comando. Mka serve para executar a compilação.
Breakfast: é o comando para configurar o build da rom, para que equipamento a rom é destinada.
Brunch: É simples, brunch é equivalente a breakfast [device name] && mka bacon
Bacon: é um termo usado pela CyanogenMod, este termo quer dizer compilar a ROM para o equipamento escolhido.
Lunch: O lunch é exactamente o mesmo que o breakfast, no entanto, com este podes escolher uma build não oficiais, por exemplo versões especiais.
Blizard,
Podes ver a explicação que o Hélder Ferreira deu porque está correcta. No entanto se quiseres ver algumas “derivações” dos mesmos e ficares a saber mais alguns comandos podes dar uma vista de olhos aqui: http://goo.gl/RJ9hu
Normalmente só uso o lunch, brunch ou o make bacon.
Concluindo a explicação do lunch, este comando permite escolher qual a versão da CM que queres compilar, Nightly, Stable, Experimental, Official, Unofficial… Isto basicamente só são tags, porque o conteúdo vai ser o mesmo.
Dando um exemplo rápido: lunch cm_blade-NIGHTLY
Sendo que isto pode ser chamado antes com o:
export CM_NIGHTLY=1
Em que já não necessitas de o colocar no lunch.
Obrigado a ambos!
Boas…
não é preciso compilar codigo para a architectura ARM??
Sei que o java não, mas…e o resto…li assim por alto e vi a integração das bibliotecas, o que me fez sentido, mas não vi o processo normal de um cross compilar tool chain…
Atenção neste assunto do android sou “jogador de bancada”, ja andei a “curtir” noutras arquitecturas com crosscompilers, e pode ser um Horror configurar aquilo e compilar toda a cadeia de aplicativos para crosscompiling, não sei se é o caso aqui?
Os meus Parabéns ao Miguel Almeida pelo Artigo e ao Pedro Pinto pela Publicação.
cmps
boas…
acho que encontrei qualquer coisa 😀 no passo 6 e em diante penso eu…
mas esta muito simplificado, com scripts a fazer muita coisa pelo que percebi…?!
cmps
Bom artigo!!
Sendo curioso como sou ..é desta que o telemovel vai à viola 😉
Bom artigo! Mas ao ler «i7 3610QM de 2.3 – 3.3Ghz, 12GB de RAM demora cerca de 1h», fiquei logo a pensar que o Core2 Duo T7200 com 2 GB de ram deve ir lá para as 8 horas…
eh eh eh, Não é propriamente rendering…mas é uma questão de experimentares e depois contares a tua aventura 🙂
Varia muito de máquina para máquina, mas é capaz de demorar cerca de 3h. 😀
Depois da primeira build as seguintes são feitas em meros minutos, uma vez que só têm em conta as partes que foram modificadas. Também é preciso ver que isto tem mais a ver com disco e RAM do que CPU na verdade, num core-2-duo compilo em menos de 1h mas tenho um SSD por debaixo e 8GB de RAM. Se compilar no TTY com DirectFB também acelera o processo porque a verbosidade de texto atrasa o processo 😉
O melhor artigo de todos os tempo!
Repito: o MELHOR!
Obrigado! 🙂
ai que o meu android ta quase a chegar 😛
Tens um erro no 4º passo
diz cd ~/cm10.
é cd ~/cm10.1
Foi ao passar para o artigo do wordpress, também já tinha reparado. O Pedro já compõe assim que chegar.
Obrigado
Eu bem que gostava de tentar isto pa minha tablet, mas n tem suporte da comunidade, é uma growing gt712…
pena—
Se a marca disponibilizar o código dos proprietary libs, kernel e drivers, sempre podes tentar compilar uma unofficial build.
Mas aqui requer bons conhecimentos do sistema Android e da linguagem usada pelo Android.
pois, eu queria saber fazer isso, para por o android 4.2 no meu bq edison 😀
Tal como explico no passo 7, consegues ter esses ficheiros com o: ./extract-files.sh
Mas tens que ter este ficheiro construído e veres quais as libs que precisas, ou seja, pré-compiladas.
Excelente artigo!
Se eu soubesse onde podia encontrar os Proprietary Files para o meu companheiro (Huawei U8510), aventurava-me, pois já o tentei fazer, mas como não sei onde os encontrar, vai ter de ficar para uma próxima 🙁
João Pedro,
Vê aqui: http://goo.gl/yF0wS
Esses ficheiros não são meus, não garanto que funcionem.
Assim que puder testo. Obrigado
“…vamos preparar o código específico para um equipamento, Google/LG Nexus 4 que tem a “alcunha” de mako nos repositórios CyanogenMod.”
Como saber a “alcunha” do meu equipamento…e outros, existe alguma lista? Eu tenho um TMN Smart A7 aka ZTE V875, e nao existem custom roms pra ele, estava interessado em aventurar-me, abradesso todas as sujestoes…
Todos os equipamentos oficias suportados pela comunidade CyanogenMod têm uma “alcunha”, os restantes não a têm porque nem sequer existem na comunidade. Podes sempre ser tu a montar a árvore dos ficheiros e dares a “alcunha” que quiseres. 😉
já agora por exemplo é possivel eu pegar no codigo de um device parecido com o meu sony xperia miro e modificar os files de maneira a conseguir correr o 10.1 lá?
Eu tenho alguma experiencia em programação mas onde posso aprender mais sobre a cyanogen mod e como criar um mod para o meu device?
Da pa ver aqui a alcunha:
http://wiki.cyanogenmod.org/index.php?title=Devices
xiiii…lá vou eu perder umas horas para tentar compilar a minha própria ROM
Acho que este artigo está muito bom, agora deveriam fazer um segundo a explicar como personalizar as ROM’s como por exemplo mais básico como tirar e por aplicações que já vem na própria ROM, temas e essas coisas …
Android,
Estás te a referir às stock ROMs das operadoras que vêem nos equipamentos?
Se assim for em primeiro lugar terás que ter:
root
2º Poderás ligar o equipamento ao PC e por adb consegues remover as aplicações, ou então instalar uma aplicação que te permita aceder ao sistema de ficheiros (Root Explorer, por exemplo).
3º As aplicações de sistema encontram-se na pasta app:
/system/app/
Aqui já as podes remover, mas cuidado com o que vais remover, pois são aplicações de sistema.
Se te estavas a referir à personalização das ROMs antes da compilação, no que toca a temas, toques, imagens, da CM que são adicionadas, a maior parte do conteúdo encontra-se em:
/vendor/cm/
Explora esses ficheiros e retiras ou metes em comentário o que não desejas que seja adicionado à ROM.
Bom artigo, disse que foi necessário 1h para compilar a rom, o disco usado foi um ssd?
Não, de momento não tenho aqui nenhum ssd. Em principio reduzirá o tempo, mas não muito.
Boas, lamento mas um ssd torna o processo bastante mais rápido…eu consigo compilar em menos de 15 minutos.
Excelente artigo mesmo, acho que também me vou aventurar com note… um pequeno aparte… visto esta comunidade estar a abarrotar de pessoal culto, empreendedor e visionário… que tal a construção de uma costum rom android com o carimbo pplware? hein? uma ideia a ponderar não?
Parabéns pelo artigo Miguel… Quando tiver entediado tentarei replicar este tutorial para o meu Nexus 4.
É engraçado verificar a dimensão do código-fonte e o tempo necessário para compilar e linkar cada um dos componentes que compõem um sistema deste género. Muitas vezes damos as coisas como adquiridas e reclamamos quando encontramos um ou outro bug, mas esquecemos da complexidade inerente a um projeto deste tipo com milhares de linhas de código e imensas particularidades. Depois de olharmos para o código fonte e assistirmos a um processo de compilação como este, é que ficamos com uma pequena ideia do pequeno milagre que é isto tudo funcionar.
A primeira vez que tive este noção foi nos tempos em que utilizava o Gentoo, em que o OpenOffice demorava 12 horas a compilar no hardware que tinha na altura…
A maneira mais fácil de adicionar/trocar repositórios é usar um local manifest, fazer checkout de cada um individualmente é bastante trabalhoso. Com um local_manifest configurado correctamente basta um repo sync e fica logo tudo perfeito 😛
Eu utilizo o Mac OS 10.8.2 para compilar e é preciso alguns truques para conseguir montar o ambiente, se alguém estiver interressado posso fornecer uns links para alguns artigos.
Venham eles!
Se quiser instalar o CyanogenMod 10.1 num Sony Xperia S desbloqueado por onde é que começo?
Boas, eu tenho um lg maximo pro mas e da tmn dá para faser o root e por um sistema mais avançado??
um guide para desenvolvimento de drivers para android 4 é que era bom para estes lados 😡 quem conseguir algum site ou coisa parecida por favor que aposte aqui. brg. pref. desenvolvimento em java
Ora aqui está exactamente o que andava à procura!
Caro Miguel Almeida permita-me a questão e se eu quiser juntar partes de AOKP?
Fazer algo como uma rom Híbrida CM / AOKP?
já ficava feliz que houvesse uma nightly build para o galaxy S duos…
Boas, eu tenho um lg maximo pro mas e da tmn dá para faser o root e por um sistema android mais avançado??
Aguem ME PODE AJUDAR eu tenho um lg C660 mas e da tmn dá para UM SISTEMA ANDROID MAIS AVANÇADO ??
Ola, primeiramente gostaria de parabenizar pelo site e artigo, ambos perfeitos.
Agora gostaria de saber se poderia me ajudar, como foi dito no artigo existe uma parte especifica para o dispositivo da LG, eu tenho um GAlaxy S Advance – GT-I9070, e gostaria de configurar um repositório não oficial para ele, neste caso o repositorio seria configurado.
NO XDA tem um tópico de DEV da rom: http://forum.xda-developers.com/showthread.php?t=2108362 e no d-h.st
http://d-h.st/users/diego-ch/?fld_id=9947#files
no GIT HUB: https://github.com/diego-ch
Bem quero configurar esses repos mas não consigo..
Gostaria de ajuda obg
Muito bom o seu post. Queria te pedir pra vc criar uma ROM cyanogenmod para RAZR d3 xt920 pois já fucei em tudo da web mas não existe nenhuma rom custom pra ele. Ajude aí cara. Não só eu mais uns 500mil usuários vão te agradecer
Recompilando o android e possivel, por exemplo, ao plugar o carregado o celular ligue? Normalmente ele mostra carregando. Preciso que ele ligue o aparelho.
tenho um tablet e quero compilar uma versao cyano nele mas nao enconteri nenhuma disponivel preciso de ajuda para extrai oas arquivos dele com adb e etc sou muito noob me ajudem
o código específico para um equipamento,esse caso como seria feito para um outro aparelho
samsug,HTC ,e outros
estou usando o ubuntu 14.04 e quando instalo g++-4.5-multilib, me apresenta um erro.
E: Impossível encontrar o pacote g++-4.5-multilib
E: Não foi possível encontrar o pacote através da expressão regular ‘g++-4.5-multilib’
como corrigir isso???
Olá, digite:
gcc -v
g++ -v
Observe que versão irá aparecer… no meu caso:
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
Então substitua na linha de comando:
…. gcc-4.5-multilib g++-4.5-multilib
Por:
…. gcc-4.8-multilib g++-4.8-multilib
Observe que no meu caso a versão gcc e g++ era 4.8!!!!