Agenda - Android embarcado

Informações gerais

Tópicos principais Introdução ao sistema operacional Android, código-fonte do Android e o AOSP, sistema de build (Soong, Kati, Ninja, Bazel), arquitetura do sistema operacional (hardware, bootloader, kernel, rootfs), sistemas de arquivos e partições, produtos e variantes de build, camada nativa, ferramentas de linha de comando e daemons, sistema de inicialização do Android, Android.mk e Android.bp, HAL (Hardware Abstraction Layer), máquina virtual e framework, serviços do framework, estendendo o framework, APIs e aplicações
Duração 3 dias - 24 horas - 50% de teoria e 50% de prática
Instrutor Sergio Prado
Público-alvo Estudantes, engenheiros e desenvolvedores interessados no funcionamento interno do Android e no processo de porte e adaptação do Android para um sistema embarcado
Pré-requisitos Conhecimentos básicos de sistemas GNU/Linux, linha de comandos do shell e ferramenta de controle de versão Git. Apesar de não ser essencial, conhecimentos mínimos em Linux embarcado e nas linguagens C, C++ e Java são recomendados
Material de estudo O material de estudo é composto pelos slides, o livro de atividades e exercícios, os guias de referência e documentos de estudo adicionais. Todo o material é fornecido de forma eletrônica no início do treinamento
Kit de desenvolvimento Este treinamento não requer nenhum kit de desenvolvimento ou hardware adicional. Para a execução dos exercícios, é utilizado por padrão o emulador do Android. Se necessário, e conforme a necessidade da empresa contratante, o treinamento pode ser portado para qualquer plataforma de hardware com suporte ao Android

Agenda detalhada

Dia 1 - manhã


Apresentação: Introdução ao sistema operacional Android - Histórico do Android, principais características, licenças de software, processo de certificação, versões alternativas, componentes básicos do sistema operacional.

Apresentação: Código-fonte do Android - Android Open Source Project (AOSP), ferramenta repo e repositórios git, principais diretórios do código-fonte, navegando no código-fonte, AndroidXRef, Android Code Search.

Laboratório: Código-fonte do Android - Neste exercício aprenderemos a baixar o código-fonte oficial do Android (AOSP) e estudaremos a organização e o conteúdo dos principais diretórios do projeto.

Apresentação: Sistema de build do Android - Sistema de compilação do Android, makefiles (Android.mk) e Blueprint files (Android.bp), as ferramentas Soong, Ninja e Kati, migração para Bazel, produto e variante de build, comando lunch, compilando o Android, imagens geradas, outros comandos de compilação, emuladores Goldfish e Cuttlefish.

Laboratório: Sistema de build do Android - Neste exercício estudaremos o ambiente de compilação do Android, realizando os testes em uma imagem de emulador gerada para a arquitetura x86.

Dia 1 - tarde


Apresentação: Arquitetura do sistema operacional - Características e requisitos de hardware para utilizar o Android, bootloader e fastboot, alterações no kernel Linux para o Android (binder, ashmem, wakelocks, etc), GKI (Generic Kernel Image), organização do sistema de arquivos do Android, partições e pontos de montagem (ramdisk, system, system_ext, data, vendor, odm, product, etc), principais diretórios do sistema de arquivos, segurança no Android, atualização remota, ADB.

Laboratório: Ambiente de execução do Android - Neste exercício estudaremos sobre o ambiente de execução do Android e a imagem gerada para o emulador, testaremos o ADB, a comunicação com a porta serial e toda a infraestrutura para a execução dos exercícios do treinamento.

Apresentação: Produtos - Conceito de produtos, criação de um novo produto, customizando o produto, adicionando aplicações e arquivos, overlay de recursos, definindo propriedades, makefile da placa.

Laboratório: Criação e customização de produtos - Neste exercício aprenderemos a criar e customizar produtos no código-fonte do Android.

Dia 2 - manhã


Apresentação: Camada nativa do Android - Bibliotecas e aplicações da camada nativa, biblioteca C e Bionic, toolbox, toybox e busybox, shell, daemons (ueventd, vold, rild, netd, installd, etc), logcat, utilitários da linha de comandos.

Laboratório: Ferramentas da camada nativa - Neste exercício iremos analisar, manipular e estender os componentes da camada nativa do Android.

Apresentação: Sistema de inicialização do Android - Visão geral do processo de boot, a inicialização do Android, o processo init e o arquivo de configuração init.rc, ações e triggers de boot, serviços e daemons executados na inicialização, gerenciamento das propriedades do sistema, Android Runtime e a máquina virtual (Dalvik/ART), Zygote, System Server.

Laboratório: Inicialização do Android - Neste exercício iremos estudar os conceitos de serviços e propriedades, analisando e customizando o processo de boot do Android.

Dia 2 - tarde


Apresentação: Módulos de compilação - Módulos do sistema de build do Android (bibliotecas, aplicações, etc), criando makefiles (Android.mk), criando arquivos de Blueprint (Android.bp), compilando e instalando módulos.

Laboratório: Compilação de módulos - Neste exercício aprenderemos a implementar os arquivos de compilação de módulos do sistema de build do Android (Android.mk e Android.bp).

Apresentação: Hardware Abstraction Layer - Abstraindo o acesso a hardware no Android, arquitetura da HAL (Hardware Abstraction Layer), associação entre as HALs e os serviços do sistema, HAL como biblioteca compartilhada (até Android 7), Project Treble, HAL como serviço (a partir do Android 8), HIDL e AIDL, VTS, VNDK, VINTF Object, implementação de uma HAL de porta serial em C++.

Laboratório: Implementação de uma HAL - Neste exercício iremos estudar a implementação de uma HAL de porta serial no Android.

Dia 3 - manhã


Apresentação: Framework do Android - Componentes do framework Android, system services, serviços e processos (surfaceflinger, drmserver, mediaserver, cameraserver, etc), System Server, binder e comunicação com os serviços, comandos e utilitários do framework Android, modificando o framework.

Laboratório: Manipulando o framework - Neste exercício estudaremos algumas ferramentas de linha de comando capazes de monitorar e manipular os serviços do framework Android.

Apresentação: Estendendo o framework - Razões para estender o framework Android, implementando um serviço do framework em Java, definindo a interface de um serviço em AIDL, conceitos de JNI, acessando a HAL via JNI, criando uma API (classe Manager) para acessar o serviço.

Laboratório: Implementação de serviços do framework - Neste exercício estudaremos sobre a implementação de serviços do framework através do desenvolvimento de um serviço e de uma API de porta serial.

Dia 3 - tarde


Apresentação: Aplicações Android - Características básicas de uma aplicação Android, componentes de uma aplicação (activities, services, broadcast receivers e content providers), arquivo de manifesto, intents e comunicação entre componentes, processos e threads de uma aplicação Android, ciclo de vida das aplicações, gerenciamento de memória, segurança e permissões, NDK, desenvolvendo uma aplicação dedicada (kiosk mode), aplicação Launcher, lock task mode.

Laboratório: Desenvolvimento de aplicações Android - Neste exercício desenvolveremos uma aplicação Android para se comunicar com a porta serial do emulador utilizando a API e o serviço desenvolvidos na atividade anterior. Aprenderemos também a transformar a aplicação em um Launcher, rodar em tela cheia e de forma dedicada, utilizando o recurso “lock task mode” do Android.

Apresentação: Recursos adicionais - Links e recursos adicionais, recomendações de livros, dúvidas e comentários finais, encerramento.