Android Core
Felipe Silveirafelipesilveira.com.br Aula 1
Android?
Sistema Operacional + Plataforma de desenvolvimento + Aplicações Padrão (SMS, Maps, Calendar...)
Código aberto (AOSP - Android Open Source Project)
Desenvolvido pelo Google e posteriormente pela Open Handset Alliance
Histórico2003: Andy Rubin, Rich Miner, Nick Sears e Chris White fundam a Android, Inc
2005: Google efetua a compra da Android, Inc
2007: Open Handset Alliance announced along with Android
2008 - Android 1.0 is released
Histórico2009 - Android 1.12009 - Android 1.5 / Cupcake2009 - Android 1.6 / Donut2009 - Android 2.0/2.1 / Eclair2010 - Android 2.2 / Froyo2010 - Android 2.3 / Gingerbread2011 - Android 3.0 / Honeycomb – Tablet-optimized2011 – Android 3.1 – USB host support2011 – Android 4.0 / Ice-Cream Sandwich – merge Gingerbread and Honeycomb222012 -Android 4.1 / Jelly Bean
Compilando Android
Requisitos Mínimos
● Ubuntu 10.04 LTS
● Ambiente 64 bits
● 30 GB de disco
● Python 2.7
● GNU make 3.82
● JDK 6
● Git 1.7
CcacheFerramenta utilitária para tornar o processo de compilação mais rápido
$ export USE_CCACHE=1$ ccache -M 10G
DependênciasPara instalar as dependências, pode-se usar o seguinte comando:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc
RepoPara instalar o Repo, pode-se usar o seguinte comando:
$ sudo apt-get install curl$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo$ chmod a+x ~/bin/repo
GitPara instalar o Git, pode-se usar o seguinte comando:
$ sudo apt-get install git
Fazendo download do código
Crie um diretório vazio para armazenar seus arquivos de
trabalho. Dê-lhe o nome que quiser:
$ mkdir working_directory$ cd working_directory
Execute o repo init
$ repo init -u https://android.googlesource.com/platform/manifest
ou
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
Fazendo download do código
Execute o comando sync:
$ repo sync
ou:
$ repo sync - jN
Repositórios alternativosLinaro
Projeto com suporte a diversos SoCs ARM (system on a chip)
Rowboat
Projeto com suporte a dispositivos usando os chips TI Sitara (como a
BeagleBoard XM e a BeagleBone)
Cyanogen ModProjeto comunitário que visa a construção de ROMs para vários telefones comerciais.https://github.com/cyanogenmod
Entendendo o repositóriobionic - a biblioteca C-runtime para o Android. Note que o
Android não está usando o glibc como a maioria das
distribuições Linux. Em vez disso a biblioteca c é chamado
de bionic e é baseada principalmente em fontes de
derivados do BSD. Neste diretório, você vai encontrar os
arquivos fonte para a c-lib, matemática e outras
bibliotecas de runtime.
Entendendo o repositóriobootable - inicialização e código relacionado a
inicialização. Neste diretório se encontra o código fonte do
bootloader a a implementação do protocolo fastboot.
Entendendo o repositóriobuild - a implementação do sistema de build, incluindo
todos os makefiles. Um arquivo importante aqui é o script
envsetup.sh que vai ajudá-lo muito quando se trabalha
com a fonte da plataforma. Este arquivo será executado
posteriormente para configurar as variáveis de ambiente e
compilar módulos específicos.
Entendendo o repositóriocts - os testes de compatibilidade. O conjunto de testes
para garantir que a build está em conformidade com a
especificação do Android. Iremos falarar mais a respeito
dessas ferramentas posteriormente.
Entendendo o repositóriodalvik - o código fonte da Dalvik Virtual Machine
Entendendo o repositóriodevelopment - projetos relacionados ao desenvolvimento
de aplicações, tais como o código-fonte do SDK e NDK.
Entendendo o repositóriodevice - código específico do produto para diferentes
dispositivos. Este é o lugar para encontrar módulos de
hardware para os diferentes dispositivos Nexus ,
configurações de compilação e muito mais.
Entendendo o repositórioexternal - contém o código fonte para todos os projetos
de código aberto externos, tais como SQLite, Freetype e
webkit.
Entendendo o repositórioframeworks - esta pasta é essencial para o Android , uma
vez que contém todo o código do framework . Aqui você
vai encontrar a implementação de serviços essenciais
como o System Server, que contém o PackageManager.
Uma grande parte do mapeamento entre as APIs
aplicação java e as bibliotecas nativas também é feito
aqui.
Entendendo o repositóriohardware - código-fonte relacionado ao hardware, como
a especificação de camada de abstração de hardware
Android (HAL - Hardware Abstraction Layer). Esta pasta
também contém a camada de interface de rádio (para
comunicação com modem).
Entendendo o repositórioout - o diretório que contém os artefatos resultantes da
compilação.
Entendendo o repositóriopackages - contém o código fonte para os aplicativos
padrão, como contatos, calendário, navegador.
Entendendo o repositórioprebuilts - contém arquivos que são distribuídos em
forma binária por conveniência. Exemplos: toolchain,
emulator kernel
Entendendo o repositóriosystem - arquivos de código fonte para o núcleo do
sistema Android. Esse é o sistema Linux mínimo que é
iniciado antes do Dalvik VM e quaisquer serviços baseados
em Java são ativados. Isso inclui o código fonte para o
processo de inicialização e o script init.rc padrão que
fornecem a configuração dinâmica da plataforma
Compilando$ ccache -M 10G
$ . build/envsetup.sh
$ set_stuff_for_environment
Seleção de target$ lunch full-eng
Build name Device Notas
full emulator build completa com todas linguagens, aplicações, input methods
full_maguro maguro build completa para o Galaxy Nexus GSM/HSPA+ ("maguro")
full_panda panda build completa para a PandaBoard ("panda")
Seleção de target
Buildtype Uso
user acesso limitado; comumente usado para builds de produção
userdebug configuração parecida com user, porém com acesso root e debug
eng configuração de desenvolvimento, com algumas ferramentas de debug adicionais.
Enfim, Compilando$ make
ou
$ make -jN
Executando o emulador$ emulator
ADBO ADB (Android debug bridge) é uma ferramenta utilizada
para acessar muitos dos recursos do emulador e de um
telefone anexado ao computador via USB
$ adb devices
$ adb -help
Arquitetura Android
Arquitetura Android
Por que Linux Kernel?• Gerenciador de memória e processos estável
• Suporte para shared libraries
• Open source!
Modificações Android
Ashmem - Anonymous shared memory - Implementação Android para o gerenciador de memória compartilhada entre processos.
Modificações Android
Binder - Implementação do OpenBinder para android, contendo também a implementação da runtime AIDL.
Desenvolvido para resolver a necessidade de execução de código em processos separados (Aplicações e Serviços) sem o overhead que o IPC introduziria
Modificações Android
Low Memory Killer - Mecanismo para matar processos quando o sistema está sendo executado com pouca memória.
Modificações Android
Logging - Mecanismo de logging do android, via /dev/log
Modificações Android
Pmem - Process memory allocator - driver de alocação de memória física para os processos
Modificações Android
WakeLocks - Mecanismo de gerência de energia, otimizado para dispositivos móveis. O controle dos wakelocks é exposto à camada de aplicações através do componente PowerManager.
Modificações Android
Alarm Timers - Suporte na camada de kernel para o AlarmManager, que permite que o sistema "acorde" depois de certos eventos.
Modificações Android
RAM Console - Extensão que permite ao kernel fazer um dump de dados importante para a memória RAM do device quando ocorre um 'pânico' - o sistema é reiniciado por alguma falha.
LibrariesSurface Manager: gerencia o acesso ao display do dispositivo e camadas de gráficos 2D e 3D de múltiplas aplicações.
LibrariesMedia Framework: as bibliotecas suportam execução e gravação da maioria dos formatos de áudio e vídeo, bem como exibição de imagens, incluindo MPEG4, H.264, MP3, AAC, AMR, JPG, e PNG.
LibrariesWebkit: engine de navegador web usada na implementação do browser nativo e também na implementação dos widgets de webview.
LibrariesSGL: uma engine de gráficos 2D.
Libraries3D libraries: uma implementação baseada na especificação OpenGL ES 1.0, a qual utiliza tanto aceleração de hardware 3D e um avançado e otimizado software para renderização de modelos tridimensionais.
LibrariesFreeType: renderização de fontes em formatos bitmaps e
vetoriais.
LibrariesSQLite: um SGBD (Sistema gerenciador de banco de
dados) relacional e otimizado para ocupar pouco espaço e
ser suficiententemente rápido.
LibrariesBiblioteca de sistema C (libc): é uma implementação da biblioteca C padrão, otimizada para dispositivos que suportam a plataforma Linux (embbeded- linux). A implementação da libc em Android é conhecida como Bionic e tem características muito importantes:
Tamanho Reduzido e Velocidade
Android RuntimeAndroid possui sua própria máquina virtual Java: A Dalvik VM, mais rápida e leve, com set de instruções menor do que a JVM.
Android RuntimeExiste um passo adicional, que é a conversão dos arquivos .class em .dex, que são reconhecidos e executados pela Dalvik VM.
Android RuntimeNa inicialização do sistema, é criado um processo para a máquina virtual chamado Zygote. A partir desse processo, outras instâncias da máquina virtual são criadas com fork() quando necessário para executar outras aplicações.
Android RuntimePara completar a camada de Android Runtime, temos as core libraries, que sofreram pouca ou nenhuma modificação no projeto AOSP. São elas: Data structures, Utilities, File access, Network Access, Graphics, etc.
Application FrameworkAcima das camadas de Libraries e Runtime está a camada Application Framework. Esta é a camada responsável por prover às aplicações APIs amigáveis que permitem o acesso às funcionalidades da plataforma.
Application FrameworkActivity Manager - Gerencia o ciclo de vida de aplicações. Responsável por iniciar, parar e retomar as diversas aplicações.
Application FrameworkWindow Manager - Responsável por renderizar a UI.
Application FrameworkPackage Manager - Instala / remove aplicativos
Application FrameworkTelephony Manager - Permite a interação com os serviços de telefonia, como SMS e MMS.
Application FrameworkContent Providers - O componente responsável por compartilhar dados entre aplicações.
Application FrameworkResource Manager - Gerenciamento de recursos de aplicações - por exemplo, imagens, sons, etc
Application FrameworkView System - Fornece às aplicações os widgets (como botões, listas, etc) e gerencia seu comportamento.
Application FrameworkLocation Manager - Permite que as aplicações acessem serviços baseados em localização seja por GPS, celltower IDs, ou bancos de dados Wi-Fi locais.
Application FrameworkXMPP - Mecanismo de troca de mensagens entre aplicações.
ApplicationsA última camada da stack Android - Applications - contém as aplicações, que apresentam conteúdo ao usuárioe interage com este diretamente.
Existem algumas aplicações que já vem embutidas na plataforma, como o cliente de Email, de SMS, Calendário, Mapas, Navegador, Home Screen, Contatos e outros.
ApplicationsNessa camada comumente temos diversas customizações feitas pelas fabricantes de celular, como o MotoBlur, da Motorola, o Sense da HTC e o TouchWiz, da Samsung. Essa flexibilidade contribuiu para a adoção da plataforma por diversos fabricantes e sua decorrente popularização.