Você está na página 1de 7

Introduo ao funcionamento interno do Android

http://w w w .sergioprado.org/2011/08/15/introducao-ao-funcionamento-interno-do-android/ November 7, 2011

O Android est na moda. E no estamos falando de nenhum novo robozinho da Sony ou da Honda. Estamos falando do sistema operacional do Google (ou da Google, como preferirem), desenvolvido especialmente para dispositivos mveis. Como um sistema aberto (apesar de no ter necessariamente todo cdigo-fonte disponvel), todos querem embarcar o Android em seus dispositivos e se aproveitar de toda a infraestrutura de aplicaes e servios disponveis no mercado. Uma caracterstica que ajuda na escolha deste sistema operacional que ele usa o kernel do Linux. Mas o que isso significa? O Android uma distribuio Linux? Como ele funciona internamente? isso que veremos nesta srie de artigos sobre a arquitetura interna do Android. HISTRICO Em 2005, uma empresa chamada Android Inc., que desenvolvia um sistema operacional mvel de mesmo nome, foi comprada pelo Google. Com a popularizao do uso de smartphones trazida pelo iPhone da Apple, o Google sentiu que poderia expandir seu negcio de venda de anncios tambm em dispositivos mveis. Em 2007, para cuidar do projeto Android, o Google criou a Open Handset Alliance, um consrcio de empresas de tecnologia envolvidas no mercado de dispositivos mveis (HTC, Sony, Intel, Motorola, Sansumg, etc). No fim deste mesmo ano, liberada a primeira verso do Android, juntamente com o SDK para o desenvolvimento de aplicaes. ARQUITETURA BSICA O Android um sistema operacional baseado no kernel do Linux. Apesar de ter sido desenvolvido inicialmente para smartphones, hoje usado em diversas outras aplicaes como tablets e at relgios. Apesar de ser baseado no kernel do Linux, existe pouca coisa em comum com distribuies Linux convencionais (embarcadas ou no). grosso modo, o Android uma mquina virtual Java rodando sobre o kernel do Linux, dando suporte para o desenvolvimento de aplicaes Java atravs de um conjunto de bibliotecas e servios. Sua arquitetura tem basicamente 4 camadas:

Linux kernel: o Android usa o kernel do Linux com alguns patchs, que adicionam algumas funcionalidades atravs de mdulos do kernel. Veremos mais adiante quais so estas funcionalidades. Bibliotecas e servios: aqui esto as bibliotecas bsicas do sistema como a Bionic, a OpenGL/ES para trabalhar com grficos, e a SQLite para trabalhar com banco de dados. Aqui tambm esto os servios providos para as camadas superiores, incluindo a mquina virtual Java (Dalvik). A maior parte destas bibliotecas e servios esto desenvolvidos em C e C++. Framework: esta camada desenvolvida quase toda em Java, e faz a interface com as aplicaes Android. Ela prov um conjunto de bibliotecas para acessar os diversos recursos do dispositivo como interface grfica, telefonia, localizador (GPS), banco de dados persistente, armazenamento no carto SD, etc. Aplicaes: aqui que ficam as aplicaes (desenvolvidas em Java) para o Android. E um dos grandes segredos do sucesso da plataforma, j que possui mais de 250.000 aplicaes no Android Market, e continua crescendo cada dia que passa. Para uma descrio mais completa da arquitetura do Android, d uma olhada no guia de desenvolvimento Android disponibilizado pelo Google. Parece simples, no? Nem tanto assim. Se olharmos para a arquitetura interna do Android, veremos o nvel de complexidade deste sistema operacional:

Realmente muita coisa acontece quando rodamos uma simples aplicao. Vamos ento tentar

entender melhor tudo isso? O KERNEL Vimos que o Android usa uma verso modificada do kernel do Linux. Dentre as principais modificaes, temos: binder: sabemos que em todo sistema operacional com suporte memria virtual, os processos rodam em diferentes regies de memria. Isso significa que nenhum processo tem acesso regio de memria de outro processo. E por isso precisamos de um mecanismo de comunicao entre processos. Mas quem esta acostumado com o padro System V IPC usado em sistemas Linux tradicionais para comunicao entre processos (message queues, semforos e shared memory) vai precisar "voltar escola". O Android usa o Binder para a comunicao entre processos. Ele implementa um modulo no kernel em "drivers/misc/binder.c" para esta tarefa. Toda comunicao entre processos no Android passa pelo binder. Para o desenvolvedor de aplicaes Android, o processo transparente, j que abstrado pelas bibliotecas do sistema. ashmem: um novo mecanismo de compartilhamento de memria, onde dois processos podem se comunicar atravs desta regio compartilhada de memria. mais leve e simples de usar, e tem melhor suporte a dispositivos com pouca memria, j que tem a capacidade de descartar regies de memria compartilhada de maneira segura em caso de pouca memria disponvel. Sua implementao encontra-se em "mm/ashmem.c". logger: o Android possui um sistema global de logs, implementado atravs de um mdulo do kernel. Ele cria 4 arquivos de dispositivo em "/dev/log", cada um representando um buffer diferente:
# ls -l /dev/log crw-rw--w- root crw-rw--w- root crw-rw--w- root crw-rw--w- root log log log log 10, 10, 10, 10, 54 55 56 57 1970-01-01 1970-01-01 1970-01-01 1970-01-01 00:00 00:00 00:00 00:00 system radio events main

Para as aplicaes acessarem o sistema de log, basta abrir e ler ou escrever num destes arquivos de dispositivo. A implementao deste mdulo no kernel encontra-se em "drivers/misc/logger.c". wakelocks: se um dispositivo Android ficar um tempo sem ser usado, entrar em modo de baixo consumo para garantir economia de bateria. O mdulo de wakelock permite que as aplicaes desabilitem o mecanismo de baixo consumo. Por exemplo, se voc precisar executar um processo em background que no pode ser interrompido para entrar em modo de baixo consumo, este mdulo possibilita a desativao temporria deste recurso at que seu processo finalize a execuo. Sua implementao encontra-se em "kernel/power/wakelock.c". oom handling: implementado em "drivers/misc/lowmemorykiller.c", controla o uso de memria do sistema e mata processos se verificar que a memria disponvel esta abaixo de um valor mnimo aceitvel. timed GPIO: possibilita acionar sadas de I/O de forma temporizada. Est implementado em "drives/misc/timed_gpio.c". O SISTEMA DE ARQUIVOS Esta a rvore de diretrios de um sistema de arquivos para o Android:
$ sudo tree -d -L 2 . . |-- acct | `-- uid |-- cache

|-| |-|-|-| | | | | | | | | | | | | | | |-|-| | | |-|-|-|-`--

cache `-- lost+found config d -> /sys/kernel/debug data |-- anr |-- app |-- app-private |-- backup |-- bootchart |-- dalvik-cache |-- data |-- dontpanic |-- local |-- lost+found |-- misc |-- property |-- secure |-- system `-- tombstones dev mnt |-- asec |-- sdcard `-- secure part-3 proc sbin sys system |-- app |-- bin |-- etc |-- fonts |-- framework |-- lib |-- media |-- ti-dsp |-- usr `-- xbin

Bem diferente de um sistema Linux convencional, no verdade? Os dois principais diretrios so o "data", que armazena os dados das aplicaes, e o "system", com as bibliotecas (system/lib), servios (system/bin e system/xbin) e aplicaes Java (system/app). E por falar em bibliotecas do sistema, nada de glibc ou uClibc. O Android implementou uma biblioteca chamada Bionic para usar como biblioteca do sistema. Porque? Me parece que o Google tem algum problema com licenas GPL, e eles tiraram do user space todo e qualquer software com licena GPL. A Bionic usa a licensa BSD, e suporta as arquiteturas x86 e ARM. Agora, se algum do Google esta lendo este artigo, por favor me respondam, porque vocs no usaram o Busybox??? Bom, tenho quase certeza de que tambm tem a ver com a licensa GPL do Busybox. De qualquer forma, o Android usa o Toolbox, uma implementao no mesmo esquema do Busybox, que tambm traz um conjunto (mais limitado) de comandos e ferramentas teis para gerenciar um sistema Android. Repare nos executveis que fazem um link para o toolbox na listagem abaixo:
$ ls -l /system/bin lrwxrwxrwx system -rwxr-xr-x system -rwxr-xr-x system -rwxr-xr-x system lrwxrwxrwx system lrwxrwxrwx system -rw-r--r-- system lrwxrwxrwx system system system system system system system system system 2011-08-13 04:24 reboot -> toolbox 9648 2011-08-13 04:24 audioloop 100916 2011-08-13 04:24 iptables 9748 2011-08-13 04:24 sdcard 2011-08-13 04:24 ps -> toolbox 2011-08-13 04:24 top -> toolbox 5372 2011-08-13 04:24 testwrap 2011-08-13 04:24 mount -> toolbox

-rwxr-xr-x -rwxr-xr-x lrwxrwxrwx lrwxrwxrwx lrwxrwxrwx -rwxr-xr-x drwxr-xr-x lrwxrwxrwx ...

system system system system system system system system

system system system system system system system system

5548 2011-08-13 04:24 18112 2011-08-13 04:24 2011-08-13 04:24 2011-08-13 04:24 2011-08-13 04:24 10792 2011-08-13 04:24 2011-08-13 04:24 2011-08-13 04:24

dvz debuggerd ln -> toolbox ifconfig -> toolbox renice -> toolbox showlease sgx start -> toolbox

O Android ainda usa por padro o SQLite como gerenciador de banco de dados para as aplicaes e o OpenGl/ES como biblioteca grfica, dentre outras bibliotecas disponveis. OS SERVIOS BSICOS Se listarmos os processos rodando em um dispositivo com Android, a sada ser mais ou menos essa:
# ps USER PID root 1 root 2 root 3 root 4 root 5 root 6 root 10 root 13 root 229 root 231 root 233 root 246 root 250 root 253 root 261 root 262 root 292 root 308 root 310 root 319 root 320 root 322 root 323 root 324 root 474 root 546 root 547 root 553 root 557 root 589 root 609 root 887 system 889 root 890 root 891 root 892 root 893 root 894 media 895 bluetooth 896 root 897 keystore 898 system 899 root 901 root 948 root 962 system 978 PPID 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 894 VSIZE RSS 504 416 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 488 172 736 332 808 248 3864 584 3836 556 668 256 1272 540 61364 26520 26872 5132 1256 564 816 308 1744 424 736 328 3352 156 0 0 0 0 166280 70284 WCHAN c00c1b9c c0072c34 c00656f0 c008a23c c006fc14 c006fc14 c0078bc8 c006fc14 c009ef8c c009f7bc c006fc14 c006fc14 c0240bc4 c0269074 c006fc14 c0207a40 c006fc14 c006fc14 c006fc14 c008a434 c009a628 c006fc14 c006fc14 c006fc14 c021a7f0 c006fc14 c006fc14 c006fc14 c02e760c c02d7f9c c00c1b9c c00633f0 c02e69e8 ffffffff ffffffff c031bfb8 c0076e64 c00c1b9c ffffffff c00c1b9c c0373d78 c031bfb8 c00633f0 ffffffff c006fc14 c006fc14 ffffffff PC 0000877c 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000877c afd0c63c afd0b81c afd0becc afd0becc afd0c1ec afd0becc afd0b964 afd0b81c afd0c82c afd0b57c afd0c1ec afd0c63c 00008294 00000000 00000000 afd0b81c NAME /init kthreadd ksoftirqd/0 watchdog/0 events/0 khelper async/mgr suspend sync_supers bdi-default kblockd/0 ksuspend_usbd khubd kseriod twl4030-irqchip twl4030-irq kmmcd musb_hdrc rpciod/0 khungtaskd kswapd0 aio/0 nfsiod crypto/0 mtdblockd kondemand/0 kconservative/0 usbhid_resumer binder_deferred mmcqd /sbin/ueventd /system/bin/sh /system/bin/servicemanager /system/bin/vold /system/bin/netd /system/bin/debuggerd /system/bin/rild zygote /system/bin/mediaserver /system/bin/dbus-daemon /system/bin/installd /system/bin/keystore /system/bin/sh /sbin/adbd pvr_timer/0 pvr_workqueue system_server

S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S

system root app_21 radio system app_14 app_3 app_1 app_4 app_2 app_10 app_25 app_26 app_16 app_17 app_27 app_13 root system root root

978 988 1057 1066 1067 1068 1120 1180 1192 1215 1243 1263 1290 1309 1323 1336 1352 5267 5336 5348 5349

894 2 894 894 894 894 894 894 894 894 894 894 894 894 894 894 894 2 899 887 1

166280 0 78324 85216 76424 83528 76456 73848 73320 71424 72164 81444 72016 71832 71388 70796 72452 0 884 896 740

70284 0 23540 23928 27816 33064 23620 22596 22316 21416 21456 21620 21800 21144 20588 20068 21376 0 272 312 332

ffffffff c006fc14 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c00ced38 c0076e64 00000000 c00633f0

afd0b81c 00000000 afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac afd0c7ac 00000000 afd0becc afd0b57c afd0c63c

S S S S S S S S S S S S S S S S S S S R S

system_server omaplfb com.android.inputmethod.latin com.android.phone com.android.systemuiueventd com.android.launcher android.process.acore com.android.email android.process.media com.android.bluetooth com.android.deskclock com.android.mms com.android.providers.calendar com.android.quicksearchbox com.android.music com.android.protips com.cooliris.media flush-0:12 sleep ps /system/bin/sh

Trs pontos interessantes aqui: 1. O processo "init" o pai de todos os processos que rodam em user space, como o "/sbin/ueventd" e o "/system/bin/mediaserver". 2. O processo "kthreadd" o pai de todas as threads do kernel como o "ksoftirqd" e o "khelper". 3. O processo "zygote" o pai de todas as aplicaes rodando no Android, como o "android.process.media" e o "com.android.email". Tudo que roda em cima de uma mquina virtual, tem como antecessor comum o processo "zygote". A MQUINA VIRTUAL DALVIK E por falar em mquina virtual, o Android usa uma implementao da JVM chamada Dalvik. A Dalvik no consome bytecode Java, mas sim dexcode. Para isso, o Google desenvolveu uma ferramenta, chamada "dx", que converte Java bytecodes (*.class) em dexcodes (*.dex). Alm disso, desde a verso 2.2 (Froyo), o Android possui uma implementao de JIT (Just-intime), que compila dexcodes para a arquitetura-alvo em tempo de execuo, tornando a execuo dos processos consideravelmente mais rpidas, j que no precisa ficar interpretando dexcodes. Junto com a mquina virtual Dalvik, o Android usa o framework Apache Harmony, desenvolvido pela Apache Software Fundation como biblioteca padro de classes Java. AS APLICAES As aplicaes so escritas em Java. Existem bibliotecas Java disponveis para acessar todos os recursos do dispositivo. Ao executar uma aplicao, o processo "zygote" cria uma instncia da mquina virtual Dalvik para execut-la. E cada aplicao roda com um UID (user ID) diferente. D uma olhada na coluna "USER" da listagem de processos acima. Isso protege as aplicaes umas das outras, e do sistema como um todo, limitando acesso aos arquivos do sistema e aos recursos do dispositivo atravs de permisses de usurio. No prximo artigo sobre o Android, iremos estudar o processo de boot e os principais servios do sistema em mais detalhes. At l!

Um abrao, Sergio Prado VN:F [1.9.0_1079] Rating: 9.7/10 (39 votes cast) Introduo ao funcionamento interno do Android, 9.7 out of 10 based on 39 ratings Posts relacionados: 1. Entendendo o processo de boot do Android 2. Wind River apostando na plataforma Android 3. Mini2440 Instalando o Android

Você também pode gostar