Android Core Felipe Silveira felipesilveira.com.br Aula 2 Inicialização Inicialização Boot ROM Boot Loader Kernel Init Zygote System Server Boot ROM Boot ROM A. O código de ROM de inicialização irá detectar a partição de inicialização que contém o bootloader. B. Uma vez que a partição de inicialização (que contém o boot) é identificada, o boot ROM irá carregar na memória RAM o código do bootloader (inteiro ou suas primeiras instruções, dependendo da arquitetura) e é feito um "salto de execução" (jump) para a posição de memória onde se encontra o bootloader. Bootloader O bootloader é um programa especial, separado do kernel do Linux, que é usado para inicializar a memória e carregar o kernel para a RAM. É análogo a softwares como o GRUB. init.s - Inicializa pilhas, coloca zero nos segmentos BSS e invoca o método _main() em main.c main.c - Inicializa hardware (relógios, placa, teclado, console) Bootloader Bootloader A. O primeiro estágio do carregador de inicialização irá detectar e configurar a memória RAM externa. B. Uma vez que a RAM externa esteja disponível e o sistema pronto a executar algo mais complexo o bootloader irá carregar o "main bootloader" e colocá-lo na memória RAM externa. Bootloader C. O segundo estágio do carregador de inicialização é o primeiro grande programa que será executado. Este estágio do bootloader pode conter código para criar sistemas de arquivos, memória adicional, suporte de rede e outras coisas. Em um telefone celular, também pode ser responsável por carregar o código para o "CPU modem" e pela criação de proteções de memória de baixo nível e opções de segurança. Bootloader D. O próximo passo é encontrar a localização do kernel na mídia de inicialização (Boot media) e colocá-lo na memória RAM. Ele também irá colocar alguns parâmetros de inicialização na memória para serem lidos pelo kernel. E. Por fim, o bootloader irá executar um salto para o kernel do Linux e o kernel assume a responsabilidade do sistema. Kernel Kernel A. Uma vez que as unidades de memory management e caches foram inicializados, o sistema será capaz de usar memória virtual e lançar processos no user space. B. O kernel irá procurar no sistema de arquivos raiz pelo código do processo init (que se encontra em em system/core/init) e lançá-lo como um processo no user space. Init Mecan­ismo de ini­cial­iza­ção dos proces­sos bási­cos do sistema. A imple­men­tação do init encontra-se nos fontes do Android em “system/core/init/init.c”. Tratamento do arquivo de con­fig­u­ração init.rc Init No init.rc está con­fig­u­rada grande parte do restante da ini­cial­iza­ção do sis­tema, incluindo a exe­cução dos serviços bási­cos do Android, den­tre eles: con­sole: ini­cia o shell ash. ser­vice­m­an­ager: ini­cia o binder (respon­sável pela comu­ni­cação entre os processos). vold: vol­ume dae­mon — con­trola a mon­tagem de vol­ umes de mídia no sis­tema de arquivos. Init adbd: android debug­ger bridge dae­mon — servi­dor para comu­ni­cação com o cliente adb. media: ini­cia os servi­dores mul­ti­me­dia (áudio, vídeo, etc). boot­sound: toca um som no boot, lendo um arquivo em /system/media/audio/ui/boot.mp3. installd: servi­dor de insta­lação de pacotes/aplicações (*. apk). Init O init.rc é escrito na linguagem "Android Init Language", que é formada pelas estruturas: Action: Actions representam sequências de comandos, que são iniciados com a ocorrência de um trigger. A sintaxe é: on <trigger> <command> <command> <command> Init Service: Services são programas inicializados pelo init e que podem ou não ser reiniciados quando , por algum motivo, são finalizados. Sintaxe: service <name> <pathname> [ <argument> ]* <option> <option> Init Options e Commands: Os options e commands são usados na declaração de Services e Actions, respectivamente. Init Init A. O processo init no Android irá procurar um arquivo chamado init.rc. Ele é um script que descreve os serviços do sistema, o sistema de arquivos e outros parâmetros que precisam ser configurados. B. O processo init irá então analisar o script de inicialização e iniciar os processos de serviço do sistema. Zygote O zygote é o pai de todos os proces­sos Java. Tudo que roda em Java é cri­ado por este processo, que instan­cia uma máquina vir­tual Dalvik para exe­cu­tar um processo ou serviço Java. Ele esta imple­men­tado em C++, e seu código-fonte encontra-se em frameworks/base/cmds/app_process/app_main.cpp. Zygote O Zygote é responsável basicamente por duas operações: 1) Prover uma infraestru­tura para a exe­cução de apli­ cações Java. 2) Ini­ciar o Sys­tem Server, que geren­cia a base dos serviços do sis­tema opera­cional Android. Zygote System Server O system server é o primeiro componente Java a rodar no sistema. Ele vai iniciar todos os serviços Android, como o Telephony Manager e o bluetooth. Localizado em frameworks/base/services/java/com/android/server/Syste mServer.java. System Server System Server Serviços inicializados pelo system server: ●Power Man­ager ●Activ­ity Manager ●Tele­phony Registry ●Pack­age Manager ●Con­text Manager ●Sys­tem Con­text Providers ●Bat­tery Service ●Alarm Man­ager ●Sen­sor Service ●Win­dow Manager ●Blue­tooth Service ●Mount Ser­vice ●... System Server Ao final da execução do system server, o Activ­ity Man­ ager ini­cia alguns proces­sos bási­cos, den­tre eles o com. android.launcher, que é a apli­cação respon­sável pela inter­face grá­fica padrão do Android. Após a execução do System Service, a inicialização é considerada finalizada e e broadcast ACTION_BOOT_COMPLETED é lançado.