Entendendo o processo de boot do Android

- por Sergio Prado

Categorias: Android, Beagleboard-xM Tags: , ,

No artigo passado dei uma introdução ao funcionamento interno do sistema operacional Android, sua arquitetura, as alterações no kernel e seus principais componentes de software. Neste artigo vamos estudar o processo de boot que dá vida ao robozinho do Google.

Os testes que realizei foram todos baseados no Gingerbread (Android 2.3) rodando na BeagleBoard-xM. Para quem ainda não leu, uns tempos atrás escrevi um artigo sobre como compilar e executar o Android na BeagleBoard.

VISÃO GERAL

O kernel do Linux chama o processo init, que faz a configuração básica do sistema e inicia processos e serviços, incluindo o zygote, responsável por inicializar a máquina virtual Dalvik, e todos os processos e serviços Java.

Satizfeito com a versão resumida? Aposto que não! Então vamos para uma versão um pouco mais longa…

OS PRIMEIROS ELÉTRONS DE VIDA

Os primeiros elétrons a circularem nas veias do robozinho são totalmente dependentes do hardware. Normalmente a CPU possui um código de boot residente em ROM (bootloader de primeiro nível), responsável por carregar um  bootloader de segundo nível para a memória. Este bootloader pode ainda carregar um outro bootloader de terceiro nível antes de iniciar o kernel do Linux. Na Beagleboard, é isso que acontece:


1. O bootloader de primeiro estágio, residente em ROM, procura por imagens de boot em diversos dispositivos de armazenamento e carrega para a SRAM (limite de 64KB). No nosso caso, ele irá encontrar o X-Loader na flash NAND.

2. O X-Loader, bootloader de segundo estágio, é carregado para a SRAM. Ele inicializa a controladora da DRAM, flash NAND e leitora MMC, e carrega o bootloader de terceiro estágio, que no nosso caso é o U-Boot.

3. O U-Boot, bootloader de terceiro estágio, roda da RAM. Ele inicializa alguns dispositivos de hardware (rede, USB, etc.), carrega a imagem do kernel do Linux na RAM e passa o controle para ele.

4. O kernel roda da RAM e assume o controle do sistema. A partir deste ponto, os bootloaders viraram passado.

Sob o ponto de vista do sistema operacional, o que importa é saber que um bootloader em algum momento será carregado, irá inicializar o hardware, carregar o kernel para a memória e executá-lo.

DENTRO DO KERNEL

O processo de boot do kernel do Linux é idêntico, independentemente da plataforma ser Android, Meego ou Ubuntu. O importante aqui é saber que o kernel fará seu trabalho normalmente, inicializando processos, memória virtual, drivers, dispositivos, sistemas de arquivo, rootfs, etc. Para quem quiser uma descrição do que acontece “under the hood” no kernel, pode dar uma lida no artigo do Gustavo Duarte, da IBM DeveloperWorks e do LinuxJournal.

O que importa é que o kernel, após montar o rootfs, irá chamar um processo de inicialização, que será o processo-pai de todos os processos rodando em userspace no Android. E este processo é o “init“, como podemos ver na linha de comandos do kernel configurada no U-Boot da Beagleboard:

# setenv bootargs 'mem=256M androidboot.console=ttyS2 console=tty0 console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw init=/init rootwait omapfb.video_mode=640x480MR-16@60'

O INIT

Aqui o Android começa a se diferenciar de outros sistemas GNU/Linux. Nada de SysV ou systemd. O Android implementa seu próprio mecanismo de inicialização dos processos básicos do sistema.

A implementação do init encontra-se nos fontes do Android em “system/core/init/init.c“.

Obs: Os fontes do Android estão disponíveis no site do projeto para quem quiser se aventurar.

Segue um trecho do init.c para os mais curiosos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
int main(int argc, char **argv)
{
    int fd_count = 0;
    struct pollfd ufds[4];
    char *tmpdev;
    char* debuggable;
    char tmp[32];
    int property_set_fd_init = 0;
    int signal_fd_init = 0;
    int keychord_fd_init = 0;
 
    printf("bk %s %d\n",__FILE__,__LINE__);
 
    if (!strcmp(basename(argv[0]), "ueventd"))
        return ueventd_main(argc, argv);
 
    printf("bk %s %d\n",__FILE__,__LINE__);
 
    /* clear the umask */
    umask(0);
 
    /* Get the basic filesystem setup we need put
     * together in the initramdisk on / and then we'll
     * let the rc file figure out the rest.
     */
 
    printf("bk %s %d\n",__FILE__,__LINE__);
 
    mkdir("/dev", 0755);
    mkdir("/proc", 0755);
    mkdir("/sys", 0755);
 
    mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
    mkdir("/dev/pts", 0755);
    mkdir("/dev/socket", 0755);
    mount("devpts", "/dev/pts", "devpts", 0, NULL);
    mount("proc", "/proc", "proc", 0, NULL);
    mount("sysfs", "/sys", "sysfs", 0, NULL);
 
    printf("bk pre devnull %s %d\n",__FILE__,__LINE__);
 
    /* We must have some place other than / to create the
     * device nodes for kmsg and null, otherwise we won't
     * be able to remount / read-only later on.
     * Now that tmpfs is mounted on /dev, we can actually
     * talk to the outside world.
     */
    open_devnull_stdio();
 
    ERROR("bk pos devnull, pre log init %s %d\n",__FILE__,__LINE__);
 
    log_init();
 
    ERROR("bk pos log init %s %d\n",__FILE__,__LINE__);
 
    INFO("reading config file\n");
    init_parse_config_file("/init.rc");
 
    ....

Este processo faz algumas inicializações de sistema, criando diretórios e pontos de montagem básicos do Linux como o /proc, o /sys e o /dev, inicializando o sistema de log e abrindo a console.

Uma tarefa importante deste processo é o tratamento de um arquivo de configuração chamado init.rc (veja a linha 57 do código acima). Este arquivo tem objetivos parecidos com o /etc/inittab para quem esta acostumado com o mecanismo de inicialização SysV.

É no init.rc que esta configurada boa parte do restante da inicialização do sistema, incluindo a execução dos serviços básicos do Android, dentre eles:

  • console: inicia o shell ash.
  • servicemanager: inicia o binder (responsável pela comunicação entre os processos).
  • vold: volume daemon – controla a montagem de volumes de mídia no sistema de arquivos.
  • adbd: android debugger bridge daemon – servidor para comunicação com o cliente adb. 
  • media: inicia os servidores multimedia (áudio, vídeo, etc).
  • bootsound: toca um som no boot, lendo um arquivo em /system/media/audio/ui/boot.mp3.
  • installd: servidor de instalação de pacotes/aplicações (*.apk).

Depois de interpretar este arquivo, o init entra em um loop infinito monitorando a ocorrência de eventos e a execução de processos.

Você consegue por exemplo configurar o init.rc para que um processo seja iniciado quando você conectar um pendrive na porta USB, (o init monitora a criação do device node em /dev quando um dispositivo USB for conectado).

Você consegue também configurar um processo para ficar sempre em execução. Se este processo cair (encerrar), o init reinicia ele automaticamente.

Portanto, se você quiser inserir um serviço para ser executado no boot, basta inserir as linhas abaixo no init.rc:

service meu_servico /system/bin/meu_servico
    user meu_servico
    group meu_servico
    oneshot

Neste exemplo, configuramos o serviço “meu_servico” para ser executado apenas uma vez (oneshot) com as permissões de usuário e grupo “meu_servico“.

Para saber mais sobre o init.rc, você pode dar uma olhada na especificação do Android Init Language.

Bom, sabemos então que todos os processos básicos do Android são iniciados através do init.rc. Mas um destes processos é o coração do Android merece uma atenção especial.

O ZYGOTE

O zygote é o pai dos processos Java. Tudo que roda em Java é criado por este processo, que instancia uma máquina virtual Dalvik para executar um processo ou serviço Java. No Gingerbread (Android 2.3), ele é iniciado por estas linhas no init.rc:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media

Ele esta implementado em C++, e seu código-fonte encontra-se em frameworks/base/cmds/app_process/app_main.cpp.

O zygote tem basicamente dois objetivos principais:

  1. Prover uma infraestrutura para a execução de aplicações Java. Primeiramente, ele inicia a máquina virtual Dalvik. Depois, ele inicia um servidor que abre um socket e fica aguardando requisições para execução de aplicações Java. Qualquer requisição de execução de aplicações Java passa por esse servidor, que faz um fork para executar a aplicação em uma outra instancia da VM. O código-fonte deste servidor esta disponível em 
    frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java.
  2. Iniciar o System Server, que gerencia a base dos serviços do sistema operacional Android.

SYSTEM SERVER

A implementação do system server encontra-se em frameworks/base/services/java/com/android/server/SystemServer.java. Ele inicia todos os serviços Java básicos do Android, e são muitos! Dentre eles:

  • Power Manager
  • Activity Manager
  • Telephony Registry
  • Package Manager
  • Context Manager
  • System Context Providers
  • Battery Service
  • Alarm Manager
  • Sensor Service
  • Window Manager
  • Bluetooth Service
  • Mount Service
  • Status Bar Service
  • Hardware Service
  • NetStat Service
  • Connectivity Service
  • Notification Manager
  • DeviceStorageMonitor Service
  • Location Manager
  • Search Service
  • Clipboard Service
  • Checkin Service
  • Wallpaper Service
  • Audio Service
  • HeadsetObserver
  • AdbSettingsObserver

Todos os serviços tem sua importância dentro do ambiente e das aplicações Android. Poderíamos levar um artigo completo para descrever em detalhes cada um deles. O mais importante aqui é entender que cada funcionalidade esta abstraída através de um serviço, e a API do Android disponibiliza funções para as aplicações poderem se comunicar com estes serviços.

Quase no final do boot, o Activity Manager inicia alguns processos básicos, dentre eles o com.android.launcher, que é a aplicação responsável pela interface gráfica do Android.

BOOTCHART

Para quem trabalha portando ou integrando o Android em diferentes hardwares, uma ferramenta interessante é o bootchart, que possibilita gerar um gráfico completo com estatísticas dos processos em execução durante o boot do Android. Quem estiver interessado nesta ferramenta pode dar uma lida neste tutorial do elinux.org.

O gráfico gerado é parecido com este abaixo (clique na imagem abaixo para vê-la em tamanho maior).


No próximo artigo, vou falar sobre como cross-compilar qualquer aplicação open source para o Android. Você poderá inclusive testar esta aplicação cross-compilada no seu smartphone, se tiver acesso de root. Até lá!

Um abraço,

Sergio Prado

  • João Luiz

    muito interessante, Sergio.
    Acompanho seu blog a algum tempo.
    Parabéns !!

  • Joao

    Bom dia!
    Sergio, você já ouviu falar do projeto LinuxStampII?
    http://www.opencircuits.com/Linuxstamp_II_9260
    http://www.thelinuxstamp.com/
    Eu conheço algumas empresas que estão utilizando este projeto (obs: possui todos os fontes)

    • Olá João,

      Não conhecia o projeto. Bem interessante. Só achei o preço um pouco salgado pelo que é oferecido na placa. A BeagleBoard tem muito mais interfaces, memória e capacidade pelos mesmos $130.

      Um abraço e valeu pela dica!

  • Muito bom! O assunto do próximo post me interessa bastante :)
    Abraço!

  • gokernel

    Cara, muito maneiro esse seu blog !!!

    E no android 2.2, existe um meio de interceptar(editando algum arquivo de script) o boot para não iniciar a interface gráfica e ficando somente no modo texto ???

    OBS1: isso é só para "brincar" com o android…lógico, depois REeditaria para funcionar normalmente.

    OBS2: Editaria o script atravez de outra distro(montando como um sdcard) linux, tipo para ter o poder de super usuário.

    E parabéns pelo seu blog, gostei muito e vou continuar acompanhando.

    gokernel.

    • Olá gokernel,

      Claro! Porque não? :)

      Você vai precisar de um shell (o Android tem o ash) e de um dispositivo de framebuffer exportado para /dev. Se o seu dispositivo Android tem estas caracteristicas, basta alterar o script de init.

      Mas já vi que alguns dispotivos Android mudam um pouco a distro. Por exemplo, removendo o script de inicialização e usando alguma outra “bruxaria”, para dificultar o acesso ao device. Mas sempre damos um jeito, não é verdade? :)

      Um abraço.

  • gokernel

    @Sergio Prado:
    "… Mas sempre damos um jeito, não é verdade? :)"

    Sim, a gente "se vira", ou manda pra a assistência se virar. hahasaahah.

    Já que não vai iniciar a GUI não tem jeito de fazer(digitar pra executar comandos nativos linux) pois o touch não funcionaria … o único jeito de "continuar brincando" seria fazer funcionar algum teclado externo…

    Vai ser divertido se ver um tablet android funcionando "igual" ou linux e depois continuar iniciando a GUI normalmente. ;)

    Seu blog já está nas páginas inicias do meu Opera Mobile … acompanhando !!!

    Abraço.

  • woiski

    Muito bom. Obrigado pelas informações.

  • Caio

    Cara ! Está de parabéns pelo site e pelas informações…Sempre tive a curiosidade de aprender sobre sistemas embarcados e microprocessadores para os mesmos, porém, estava com dificuldade em entender o boot, mas, agora, seus tópicos sanaram todas as minhas dúvidas.
    Grato

  • Felipe Sousa

    E aí Sérgio.
    Cara, eu preciso inserir regras de firewall no Android, usando iptables, todas as vezes que ele for religado.
    Uma das regras é: iptables -A INPUT -s 10.3.0.1 -d 192.168.137.102 -j ACCEPT

    É possível inserir essas regras modificando o init.rc seguindo o seu exemplo ?
     service meu_servico /system/bin/meu_servico
    user meu_servico
    group meu_servico
    oneshot

    Como fazer isso ?

    Obrigado.

    • Olá Felipe,

      Sim, é possível. Cria um script, coloca os comandos do iptables dentro deste script, e substitui “meu_servico” pelo nome do seu script.

      Um abraço.

  • Felipe Sousa

    Sérgio, criei um script chamado iptablefw.sh e dentro dele coloquei apenas os comandos iptables.
    Salvei o script dentro da pasta /system/bin e modifiquei o arquivo init.rc.
    O Android, de alguma forma, restaurou o arquivo init.rc original e não executou o serviço que eu criei. 
    Fiz alguma coisa errada ?
    Até mais

    • Olá Felipe,

      Muito estranho. Será que você alterou mesmo o arquivo? Alguns dispositivos montam o rootfs como apenas leitura, e então você precisa remontar como read-write antes de fazer qualquer alteração. Nunca peguei um device com Android que tivesse este compartamento de recuperar um init.rc alterado.

      Um abraço.

      • Diogo Leonardo Costa

        O Galaxy Ace apresenta exatamente este comportamento. init.rc alterado e com alteração conferida porém no reinicio do sistema o arquivo init.rc é restaurado.

  • josearaujo3

    Boa noite Sérgio, fiz uma besteira em meu gps or-g5000dtv, Orange e como estou a procura de firmware para instalá-lo estou vasculhando a internet para tentar resolver o problema ele vem de fábrica com o win ce  e na tentativa de trocar o menu de funçoes dele instalei o backup de um gps mio, corrompendo seu windows ou simplismente mudando o caminho de inicialização do nand flas, para o sdmmc, vendo seu tutorial fiquei intrigado com a possibilidade de poder substituir o win ce dele pelo android, pois gosto mais porem continuar com as funçoes de gps e tv digital nativos dele se possivel mas não necessario aproveitar o bloothooth e o transmissor fm dele. Seria possível essa instalação ou a minha unica opção e tentar achar o firmware dele. Agradeço se voce souber me ajudar ou souber onde eu consigo essa informação. josearaujo3

    • Olá Jose,

      Não conheço este device. Você vai precisar pesquisar mais para verificar se ele suporta Android.

      Um abraço.

  • Diego

    Primeiramente gostaria de te parabenizar pelo excelente blog e este artigo extremamente interessante.
     
    Olha. acho até que você poderia tirar uma dúvida minh, se não for alugar muito.
     
    Tenho um tablete com Android 2.3 e ele perde a calibração de sua tela (resistiva) sempre que reiniciado. Gostaria de saber em que arquivo são salvas estas configurações para que eu possa criar um script de correção deste erro.
    Poderia me ajudar?
     
    Att;

    • Olá Diego,

      Não creio que exista um padrão para armazenar esta configuração (pelo menos, não que eu conheça). E como não tenho este dispositivo fica dificil ajudá-lo. O melhor é você procurar forums especializados em Android.

      Um abraço.

  • Andrade Ti

    Sérgio, boa tarde!
     
    Mesmo fazendo a montagem do rootfs como read e write, toda vez que altero o init.rc para incluir um novo serviço, conforme sua orientação acima, e salvo, quando o Android inicia ele reconstrói o arquivo init.rc. Sabe porque? Como devo fazer?
     
    Obrigado e parabéns pelo artigo!
    Leandro.

    • Olá Andrade,

      Pode ser que a sua distro esta montando a imagem do rootfs em RAM, então você perde as alterações no boot. Você esta testando em qual dispositivo? Me manda a saída do comando “mount”.

      Um abraço.

  • Diogo Leonardo Costa

    Boa tarde Sergio,

    Estou com um Galaxy Ace

    • Consegue me mandar a saída do comando mount?

  • Leandro

    bom dia sergio eu queria saber como instalar o android dentro do CELULAR samsung-s5620 sendo que o sistema original dele é java mas tem o sistema aberto ?? 

    • Olá Leandro,

      Não conheço o hardware deste celular, mas é bem provável que ele não possua os recursos necessários de memória e CPU para rodar o Android.

      Um abraço.

  • Laercio

    Você sabe se o bootloader de primeiro estágio é padrão em qualquer sistema Andorid (indepentende o dispositivo)? Ele consegue chamar um bootloader de segundo estágio estágio no cartão SD? Ou precisaria ser editado para fazer isso e oferecer a opção de qual S.O inicializar? Conhece alguma aplicação que faça essa modificação, caso seja necessaria?Estou pesquisando sobre boot do android pelo SD (como já ocorre facilmente no PC que dá boot em live-cd ou live-usb, por exemplo) e encontrei seu interessante artigo.Grato por compartilhar a informação.

    • Olá Laercio,

      Não existe um padrão. O eco-sistema ARM é bem diferente do x86. O que dificulta a tarefa de padronizar o processo de boot. Por esse e outros motivos, cada fabricante usa o seu próprio bootloader.

      Um abraço.

  • Manoel Henrique

    Sérgio, desculpe por fugir do tema, eu sou iniciante no mundo android e na realidade so quero tirar um duvida, comprei um tablet direto da china so que ele não reconhece o chip para conectar 3G, será que se eu instalar outro androi esse recurso irá funcionar e eu poderei instalar qualquer versão de android ou tem de ser uma especifica, ou ate mesmo tem como ele reconhecer um modem externo?

    Essas são as característica do aparelho (http://micdigi.com/2011/12/range-t91-with-tegra2-processor-dual-core-and-ips-screen/)

    Meu e-mail: mhfernandes2003(Arroba)hotmail.com  

    Desde ja agradeço

    • Olá Manoel,

      Uma distribuição Android não aceita qualquer dispositivo de hardware. Apesar de usar o kernel Linux, a distro é customizada para o hardware ao qual foi preparada para rodar. Portanto, vai ser difícil você encontrar uma distro Android que suporte um modem 3G externo. Neste caso, você vai precisar customizar a distro.

      Um abraço.

  • thiago

    Bom dia Sérgio.
    Estou iniciando em android e gostaria de tirar uma dúvida…Gostaria que o android inicia-se um processo, antes de montar sua parte visual,
    carregando somente o aplicativo que eu escolhe-se.
    A possibilidade de fazer isso no init.rc.Agradeço e desculpa pelo encomodo.

    • Olá Thiago,

      Sim, você vai precisar alterar o init.rc. O processo é bem parecido com a inicialização do processo Zygote que descrevi no artigo.

  • Heuller César Gomes

    olá, estou com um problema no meu celular (galaxy y duos), ele só fica carregando a página inicial porém não liga, acho que é problema com boot, a mensagem que aparece é essa quando tento dar reboot nele: can’t mount: data rebooting…será que alguém sabe dizer o que é? obrigado

  • Emerson Rocha

    Paulo, bom dia.
    Eu admiro muito a arte de programar, porem os meus conhecimentos sao absolutamente zero sobre isso. Admiro como exemplo quem programa. Tendo ler artigos, mas nao consigo aprendere nada, nao sou fã de matemática.

    A porque das minhas palavras é de lhe dar os parabéns e, que continue sendo o crânio que você é!

    Abraço.
    Emerson Rocha.

  • Francisco

    ótimo post
    parabéns

  • Renan Dal Pont

    Sergio

    Eu instalei a virtual box no meu windows xp para nela intalar um emulador de android. Tudo feito ! Mas agora quando vou iniciar o sistema na virtual box o android trava logo no boot. Exatamente na parte “booting kernel”. O que eu faço pra funcionar corretamente Sergio

    • Olá Renan,

      Porque você não baixa o SDK do Android para Windows?

  • Adriano Martins

    Muito bom!

  • Thiago Ribeiro

    Meu cel nao reconhece mais o sdcard no modo recovery!!!

    Com o adb eu consigo ativa-lo novamente??

  • Thiago Ribeiro

    Com o sistema rodando funciona normalmente…porem n consigo ver o sdcard qdo conecto o cel no usb!!!…

    Na verdade desmarquei a opção mount sdcard no clockworkmod…sem querer…agora n consigo marca-la novamente!!!…

    Só consegui instalar novamenteuma rom porque consegui dar um hard reset no aparelho( sony ericson xperia play)…dai volto de fabrica novamente..

    Me ajude por favor …estou a meses tentando resolver isso!!

    • Olá Thiago,

      Não da para saber o que o clockworkmod fez com as configurações do Android. Pode ser que ele tenha mexido em um dos scripts init.rc.

  • Pedro Porto

    Olá amigo! Como instalar um android no SDcard e fazê-lo dar o boot neste SO do SD?

    • Olá Pedro,

      Este processo depende muito do hardware que tem em mãos.

      Abs,

      • Pedro Porto

        Um android chines, réplica do Galaxy Note com MT6573.

      • Pedro

        Tem algum tutorial para fazer dar boot? Tenho o download da imagem em meu computador e tenho o cwm recovery que me parece que tem a opção “USB”.

  • Alessandro

    Olá Sergio! Gostaria de saber como é instalado o sistema Android pela primeira vez em uma motherboard de um smartphone… fiz uma besteira no meu xperia p e ele não aceita mais nenhuma opção de boot… está completamente morto. Será que eu consigo encontrar alguma forma de reinstalar o sistema? Agradeço pela atenção! Grato, Alex

    • Olá Alessandro,

      Normalmente o fabricante usa alguma ferramenta proprietária para gravar o bootloader e o sistema na memória flash do dispositivo.

      Talvez o forum XDA-Developers possa te ajudar:
      http://forum.xda-developers.com/xperia-u/general

      Esse post me pareceu interessante:
      http://forum.xda-developers.com/showthread.php?t=1849170

      Um abraço.

      • Alessandro

        Olá Sergio! Agradeço profundamente pela sua ajuda! Eu estava justamente procurando ajuda neste fórum, mas não havia encontrado este post ainda e você adiantou todo o processo! A parte disto, tão logo eu reestabelecer meu device, voltarei aqui para aprender mais contigo! Paz Profunda, Alessandro

  • Daniel Lima

    Ola Sergio! Gostaria da sua opinião em, qual seria melhor ou mais adequado para testar aplicativos. Um celular android ou um emulador SDK ?
    Ps: aguardo resposta, desculpa o incomodo. ‘-‘

    • Olá Daniel,

      Não sou especialista em desenvolvimento de aplicações Android, mas posso expressar minha opinião.

      Use ambos. Boa parte dos testes podem ser realizados em um SDK, mas depois realize pelo menos os testes finais e de integração em um smartphone.

      • Daniel Lima

        OK!, Muito obrigado sua resposta me ajudou muito! ‘-‘

        • Daniel Lima

          Olá Sergio, Desculpe estar incomodando mas surgiu uma questão sobre; Como eu acesso o arquivo init.rc
          pois quero iniciar um processo antes que a parte visual do android abra.
          Obrigado!

          • Você precisa fazer o boot pela partição de recovery e extrair a imagem de ramdisk para alterar o init.rc.

            Você deve encontrar alguns tutoriais no XDA Developers.

          • Daniel Lima

            Ok, Muito Obrigado!

  • Paulo César Rufino Gonçalves

    Segio? Tudo bem? Estou com um problema no android, e tenho quase certeza que tem haver com o arquivo init.rc.
    Eu fiz um root no aparelho, e desde então o aparelho toda vez que ligo ele retorna a configuração padrão, ou seja, como se eu tivesse acabado de tirar da caixa.
    Achei algumas linhas de restart diferente do que eu tenho percebido, mas não tenho certeza se são elas responsaveis por fazer o aparelho resetar automaticamente. Existe essa possibilidade de isso acontecer mesmo?

    • Estranho Paulo, nunca vi isso acontecer. Provavelmente é mesmo alguma configuração nos arquivos de inicialização do Android. Talvez a forma mais fácil de corrigir seja instalar novamente a imagem de fabrica do dispositivo.

  • cristian frassoni

    ola sergio, eu tenho um galaxy s2 gt-i9100 , ele trava na inicialização , já tentei hard reset e não adianta , creio que o android esteja corrompido , se puder me ajudar .

    • Olá Cristian,

      Tente ajuda em fóruns especializados em smartphones Android.

      Um abraço.

  • Daniel Lima

    Ola Sergio, quero saber se é possivel fazer uma aplicação que quando é instalada no celular faz alterações no arquivo init.rc.
    È possivel…??

    • Daniel Lima

      E sergio, se for possivel me passar um tutorial ou algo que ensine a extrair a imagem da ramdisk do android, pois estou tendo dificuldades em extrair a imagem para fazer a alteração no android. Obrigado!!!

      • Olá Daniel,

        À princípio, não é possível. O init.rc fica no ramdisk, e mesmo se alterado com acesso root, no próximo boot o ramdisk será extraído novamente com o init.rc original.

        Para alterar o init.rc é necessário fazer diretamente no ramdisk. O problema com este processo é que é totalmente dependente do dispositivo. Cada fabricante coloca o ramdisk em uma posição do dispositivo de armazenamento.

        Dê uma olhada no XDA Developers para identificar se alguem já fez isso para o seu dispositivo.

        Um abraço!

  • marcio

    Olá Sergio! talvez não seja o local certo pra eu fazer essa pergunta mas vc como desenvolvedor acho que pode me responder. tenho um talet com android mas ele reconhece um cartão externo mas não consegue ler os arquivos q estão dentro dele só le quando pego esses arquivos e coloco na memória interna. Isso é erro do sistema?

    • Olá Marcio,

      Dificil saber. Pode ser um cartão incompatível com seu tablet. Pode ser que o cartão não esteja formatado ou esteja danificado. Pode ser que o seu tablet esteja danificado. Uma forma de analisar o comportamento do tablet no momento em que o cartão é inserido, é utilizando o logcat. Procura na Internet sobre como utilizar esta ferramenta de log.

      Um abraço.

  • Marciano C.Rocha

    Fiz a besteira de formatar o cartao sd interno do tablet e marcar a opção disco primario,agora o android mostra o sdcard sem espaço e o windows não reconhece,tem alguma solução via adb,para recuperar o sdcard.

    • Depende do tablet. Procure ajuda em um forum especializado.

  • Luciano

    Boa Noite Sergio!
    Gostaria de saber se tem como tirar uma flashnand de um tablet inoperante(no meu caso e uma Hynyx de 4gb e o microprocessador e um RockChip RK2976, ele queimou) e colocar no lugar da flashnand de um pendrive, e pra copiar os arquivos do cliente para passar para o PC dele? Já procurei na internet e não acho nada sobre isso…Eu tenho um pendrive que a flash dele usa o mesmo encapsulamento da flash desse tablet que estou citando

    • Se for o mesmo modelo de memória flash, com o mesmo encapsulamento, talvez dê certo.

      • Luciano

        eu soldei ele no lugar da flash do pendrive, conferi tudo antes de ligar e conectei mas ele não reconheceu a flash…reconheceu como se fosse um disco removível mas diz que não tem disco…Tem alguma configuração especifica nessas flash nands para serem reconhecidas como midia ou flash foi danificada junto com o processador? Pq quando eu boto a flash do pendrive ele reconhece direitinho o disco…

        • Infelizmente não sei te dizer Luciano. Pela minha concepção, se os modelos de flash são identicos, deveria funcionar.

  • Marcos

    Meu deus… Quase chorei aqui depois de ler esse material tão bem explicado, detalhado coisa linda de deus pense na emoção rsrsrsr muito obrigado por compartilhar

  • Junior

    Ola ,sergio queria tirar algumas duvidas a respeito de um Galaxy S3 I9305
    Ele aceita o Hard Reset apenas no Modo manual CSC depois de um longo tempo o android fiva com um triangulo vermelho e o Hard reset não surtiu efeito nenhum aparentemente as mensagens q aparecem em ingles estao querendo dizer que existem alguns diretorios corronpidos, ta ele TBM entra em modo download agora que vem o pior nao aceita flash de jeito nenhum so aparece assim no odin NAND Wrrite Star Fail o que e issso nada da certo vc pode me ajudar

    • Olá Junior,

      Não conheço as particularidades dos smartphones da Samsung, e infelizmente não posso ajudá-lo. Procure um fórum especializado.

      Um abraço.

  • Kleiton Madureira

    ola estou com um zenfone 5 e esta dando erro : E:failed to verify whole-file signature from /tmp/update.zip essse erro comecou apos uma atualizacao….Teria como resetar a rom ou algo assim?

    • Olá Kleiton,

      Provavelmente sim. Sugiro você procurar ajuda em um fórum especializado.

      Um abraço.

  • Maciel Castro

    Obrigado por compartilhar, hoje esta muito difícil encontrar um texto mais técnico com qualidade. Seu texto da uma luz de por onde começar a estudar o android mais a fundo.

  • Karla

    Seu texto salvou minha vida para um trabalho, obrigadaaaaa

  • Tiago Ferraz

    Amigo, meu Moto G 4G LTE XT1040 está com o bootloader corrompido. Porque eu estava no android kit kat 4.4.4 e atualizei via adb-fastboot e depois eu quis voltar para o original. Mas o o bootloader foi corrompido quando fiz o downgrade. Tem como remover o bootloader do lollipop e instalar o do kit kat 4.4.3 (original do meu Moto G) de novo ?

    • Olá Tiago,

      O processo de atualização do bootloader não está diretamente relacionado ao Android e é totalmente dependente do hardware. Sugiro consultar um forum especializado.

      Um abraço.

  • Gustavo Henrique

    Olá amigo; Primero parabéns pelo texto, muito interessante e explicativo. Fiquei com um dúvida apenas, sobre o tempo de cada fase do processo. Você saberia me dizer o tempo médio de cada parte a partir do momento que aperto o botão ligar? Obrigado.

    • Olá Gustavo,

      Os tempos são totalmente dependentes das características do hardware, e esta informação só pode ser medida empiricamente. Uma forma de medir é utilizando a ferramenta bootchart.

      http://www.bootchart.org/

      Um abraço!

  • Raphael

    Boa noite Sérgio

    Meu celular navcity corrompeu o sistema, quando eu ligo ele só acende, e fica aparecendo Navcity Android,
    E não acontece mas nada, e assim ele fica até descarregar.

    Tem jeito pra ele?

  • wiliams jose dotta

    ola como fazer para trocar o androde o meu da erro 498

  • Roger da Costa

    Assim como nos computadores, a ou o BIOS responsável pelo post e boot sucessivamente, devemos considerar que; está “ROM” embutida na CPU é equivalente há um bootloader, ou um sistema básico de entrada e saída?

    • Sim, podemos considerá-la como um bootloader, porém gravada em uma ROM dentro do chip, portanto não atualizável.

  • andre uebe

    Sergio. Muito legal teu artigo. Parabéns!

    Carreguei um bootloader defeituoso no meu Asus TF101. Estou sem OS, apenas o bootloader, que não monta o SD Card. No SD Card está, inclusive, a imagem do backup do OS. Mas como não consigo acessar, estou com o Tablet parado.

    Consigo acessá-lo via ADB. Mas não sei o que poderia fazer para consertar o bootloader. Vendo os processos de system/core/init/init.c imaginei que possa ser possível fazer o bootloader achar o SD card.

    Alguma dica? Obrigado!

  • George soares de lima

    Olá Sergio Prado…queria apenas k vs esclareça uma duvida sobre reinstalaçao de software,meu celular LG não ligar e com programas da LG não recebe a Rom via KDZ um tecnico disse k o boot responsável pelo carregamento do sistema foi corrompido de alguma forma.o que acha…tem solução?

  • Ivanilson PS

    Olá sergio parceiro muito legal seu texto bem explicativo mas queria pede sua ajudar eu tenho um moto g 1 depois da atualização ele nao ligar eu tiver pesquisado e descobrir q o bootloader dele estar corropido poderia me da uma ajudar

  • Rafael

    tenho um moto e1 xt1025 no meio da atalização desligou nao ligou mais … tenho um ligando como faço para copiar a room e root para repassar nesse que morrreu no meio do procedimento ?????????

  • Como webdev e programador java iniciante, estou colando as placas com o seu artigo… e achei maravilhoso rsrsrs estou fascinado por tudo isto, não tenho formação universitária na área (sou militar aposentado), mas tenho grande facilidade em assimilar tudo isso, e raciocínio lógico/dedutivo. Já instalei Android SDK no notebook, e se pudesse, revirava ele 24 horas por dia rsrsrs tenho 6 dispositivos Android em casa meus, nos quais já fiz procedimentos simples de root/superuser, trocar rom stock, restaurar o sub-sistema de partições (CWM ou TWRP), e estou me esforçando pra aprender tudo que diz nos artigos. Obrigado!

  • Leonardo Teodoro

    Estava procurando por um artigo que ensinasse a como criar um bootloader… acabe caindo neste artigo!
    E pesquisando mais parece que não existe esse tipo de conteúdo (pelo menos em português) na internet… poderia me indicar cursos/faculdades/universidades que ensinem à criar essas coisas mais complicadas, bootloader, recovery, kernels para android?
    To com um projeto ambicioso de criar um android para o lumia 630 dual, porém, até onde sei, o bootloader não aceita outros sistemas operacionais!
    Na verdade, nem sei por onde começar!

  • Rafael

    Perdi o boot do meu tablet ao interromper uma atualização de room. Agora ele não liga mais e nem entra em modo download. Tem algum jeito de reparar isso sem precisar levar na assistência? Já ouvi dizer que existem “box” que fazem isso, mas são caras. Tem algum outro jeito? Obrigado.

    • Olá Rafael,

      Provavelmente sim, mas infelizmente não conseguirei ajudá-lo. Sugiro entrar em contato com um fórum especializado, como o XDA-Developers:

      http://www.xda-developers.com/

      Um abraço!

  • Pipo Pipo

    Parabéns pelo artigo Sergio.
    Gostaria de saber se existe com eu dar um boot por um microsd externo(linux basico com acesso de root) num celular android.
    Obrigado.

  • Gostei muito do artigo! Parei aqui devido a curiosidade em saber o que era o tal Zygote e seus bugs tão falados no fórum XDA para ROMS personalizadas do modelo I9500 Exynos da Samsung. Agora me sinto aliviado por saber que ele é um processo =)
    Há meses, tenho um grande desejo, que é aprender a desenvolver e manter ROMS do zero, porém não tenho a mínima ideia de onde começar e o que aprender. Faz tempo que venho pesquisando no oráculo e só encontro coisas relacionadas ao ‘Android Kitchen’ e ‘Pegar ROM pronta e personalizar com o que você quer’. Poderia me dar uma luz? Obrigado!

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.