Aula 2 - Felipe Silveira

Transcrição

Aula 2 - Felipe Silveira
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.