Agenda - Android debugging

Informações gerais

Tópicos principais Introdução à depuração de software, os 5 tipos de problemas e as principais técnicas e ferramentas de depuração, introdução à depuração interativa com o LLDB e integração com o Visual Studio Code, depuração da camada nativa do Android, gerenciamento de logs no Android, logd (log daemon) e logcat, análise de core dump e tombstones, tracing da camada nativa, introdução às ferramentas de tracing (strace, ltrace, ftrace, atrace, systrace, etc), depuração interativa da camada nativa com o LLDB, depurando aplicações multithread, depuração do uso de memória na camada nativa, instrumentando o uso de memória com Malloc Debug, libmemunreachable e heapprofd, técnicas e ferramentas de depuração do framework, depurando o framework com ferramentas de linha de comando (dumpsys, bugreport, am, pm, wm, input, cmd, service, etc), analisando crashes em código Java/Kotlin, analisando erros de ANR, depurando serviços do framework e aplicações com o Android Studio, análise de performance no Android com as ferramentas systrace e Perfetto, profiling de CPU com simpleperf e Perfetto, profiling de memória com dumpsys e heapprofd, análise de consumo de energia com batterystats e Battery Historian, análise de tempo de boot com bootchart e simpleperf, links e recursos adicionais, dúvidas e comentários finais
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 estudo de técnicas e ferramentas de depuração do sistema operacional Android
Pré-requisitos Usuário de distribuições GNU/Linux, terminal de comandos (ls, cp, mv, cat, grep, find, vi, tar, etc), conhecimentos intermediários nas linguagens C, C++ e Java, arquitetura e componentes do sistema operacional Android, AOSP e sistema de build do Android
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 à depuração de software - O processo de depuração passo-a-passo, a importância de entender o problema e identificar o passos para reproduzí-lo, os 5 tipos de problemas (crash, travamento, lógica/implementação, vazamento de recurso, performance), as principais técnicas e ferramentas de depuração (conhecimento, análise de logs, tracing, depuração interativa, frameworks de depuração), ambiente de desenvolvimento.

Laboratório: Preparando o ambiente de laboratório - Neste exercício iremos preparar o ambiente de laboratório do treinamento, compilar o Android, testar o acesso ao emulador via ADB e console serial, e alterar aplicações no AOSP.

Apresentação: Introdução ao LLDB - O projeto LLVM e o LLDB, iniciando a depuração com o LLDB, linha de comandos do LLDB, controlando a execução, trabalhando com breakpoints e watchpoints, imprimindo variáveis e a pilha reversa de chamada de função (stack backtrace), integração com o Visual Studio Code, dicas e referências.

Dia 1 - tarde


Laboratório: Depurando com o LLDB - Neste exercício estudaremos a interface de linha de comandos do LLDB, aprenderemos a integrar o LLDB ao Visual Studio Code e iremos depurar algumas aplicações desenvolvidas em linguagem C.

Apresentação: Depuração da camada nativa - Introdução à camada nativa do Android, gerenciamento de logs em sistemas Linux, gerenciamento de logs no Android, logd (log daemon) e logcat, análise de core dump no Android, análise de tombstones, resolvendo símbolos com addr2line e LLDB, o script development/scripts/stack, programa debuggerd, ferramenta crasher, proteções no código (FORTIFY, -fstack-protector, AddressSanitizer, etc).

Laboratório: Analisando logs e crashes na camada nativa - Neste exercício aprenderemos a depurar a camada nativa do Android através da análise de logs e crashes de aplicações (core dump e tombstones).

Dia 2 - manhã


Apresentação: Tracing da camada nativa - Vantagens do uso de ferramentas de tracing, introdução ao strace, a ferramenta ltrace, rastreando o kernel com ftrace, instrumentando o Android com atrace e systrace, rastreando código em espaço de usuário com uprobe.

Laboratório: Rastreando a execução de código nativo - Neste exercício estudaremos como rastrear a execução de aplicações nativas no Android utilizando mecanismos de tracing.

Apresentação: Depuração interativa da camada nativa - Depurando aplicações nativas no Android com o LLDB, arquitetura de depuração remota, depurando uma aplicação em execução, carregando símbolos no LLDB, otimizações de compilação, o script lldbclient.py, depurando crashes com o LLDB, depurando aplicações multithread, integrando e depurando aplicações nativas no Android com o Visual Studio Code.

Dia 2 - tarde


Laboratório: Depuração interativa da camada nativa - Neste exercício estudaremos o processo de depuração interativa de aplicações da camada nativa do Android.

Apresentação: Depuração do uso de memória na camada nativa - Principais erros relacionados ao uso de memória (acesso inválido, buffer overflow, use after free, double free, vazamento de memória, etc), introdução ao vazamento de memória, coletando informações sobre o uso de memória (free, vmstat, top, procrank, librank, pmap, showmap, dumpsys, etc), instrumentando o uso de memória com Malloc Debug, utilizando a biblioteca de detecção de vazamento de memória libmemunreachable, identificando vazamentos de memória com heapprofd e Perfetto, implementando rotinas gancho de alocação de memória com Malloc Hooks.

Laboratório: Depurando uso de memória na camada nativa - Neste exercício estudaremos técnicas e ferramentas de depuração do uso de memória na camada nativa do Android.

Dia 3 - manhã


Apresentação: Depuração do framework - Introdução ao framework do Android, técnicas e ferramentas de depuração do framework, depurando o framework através de mensagens de log, os buffers system e events, depurando o framework com a ferramenta dumpsys, coletando informações de depuração através de bugreports, ferramentas de linha de comando úteis para depuração (am, pm, wm, input, cmd, service, etc), analisando crashes em código Java/Kotlin, analisando erros de ANR, arquitetura de depuração interativa na máquina virtual ART, depurando serviços do framework e aplicações com o Android Studio, gerando os arquivos de projeto do Android Studio com o script aidegen, introdução ao Android Studio for Platform (ASfP), menu “Developer options” e aplicação “Dev Tools”.

Laboratório: Depurando o framework do Android - Neste exercício estudaremos técnicas e ferramentas de depuração do framework do Android.

Dia 3 - tarde


Apresentação: Análise de performance - Introdução a problemas de performance, definição de tracing e profiling, técnicas e ferramentas de análise de performance, a ferramenta systrace, o menu “System Tracing”, o framework de análise de performance Perfetto, profiling de CPU, analisando a performance com a ferramenta simpleperf, profiling de CPU com o Perfetto, profiling de memória, inspecionando o uso de memória com o dumpsys, instrumentando o uso de memória com a ferramenta heapprofd, análise de consumo de energia, coletando informações sobre o consumo de bateria com o serviço batterystats, a ferramenta Battery Historian, a funcionalidade Power Profiler do Android Studio, análise de tempo de boot, bootchart, analisando o tempo de boot com o simpleperf, dicas sobre profiling de aplicações Android.

Laboratório: Tracing e análise de performance - Neste exercício estudaremos técnicas e ferramentas de tracing e análise de performance no Android.

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