Android Core Aula 2: Inicialização de um sistema Android

27
Android Core Felipe Silveira felipesilveira.com.br Aula 2

description

Segunda aula do curso "Android Core" ministrada no INATEL em 2013. Aprenda mais sobre cada fase de inicialização de um sistema android: Boot ROM, Bootloader, Kernel, Init.rc, Zygote, System Server e o fluxo de chamadas de cada um destes componentes.

Transcript of Android Core Aula 2: Inicialização de um sistema Android

Android Core

Felipe Silveirafelipesilveira.com.br Aula 2

Inicialização

Inicialização

Boot ROM

Boot Loader

Kernel

Init

Zygote

System Server

Boot ROM

Boot ROMA. 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.

BootloaderO 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

BootloaderA. 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.

BootloaderC. 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.

BootloaderD. 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

KernelA. 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.

InitMecan­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

InitNo 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.

Initadbd: 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).

InitO 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>

InitService: 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>

InitOptions e Commands: Os options e commands são usados na declaração de Services e Actions, respectivamente.

Init

InitA. 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.

ZygoteO 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.

ZygoteO 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 ServerO 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 ServerServiç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 ServerAo 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.