Perguntas de entrevista Android sênior: Kotlin, Compose e arquitetura

Milad Bonakdar
Autor
Prepare-se para entrevistas Android sênior com perguntas práticas sobre corrotinas Kotlin, estado no Jetpack Compose, arquitetura, desempenho, testes, dados offline-first e segurança.
Introdução
Em uma entrevista Android sênior, prepare-se para explicar trade-offs de arquitetura, concorrência segura em relação ao ciclo de vida, propriedade de estado no Compose, fluxo de dados offline-first, diagnóstico de desempenho, estratégia de testes e segurança. Uma boa resposta não diz apenas qual API usar, mas por que ela atende à restrição do produto e como você investigaria problemas em produção.
Use este guia como uma checklist prática. Priorize corrotinas Kotlin e Flow, ViewModel e gerenciamento de estado, repositórios com Room, decisões entre Compose e UI legada, tempo de inicialização, memória e exemplos que você consegue explicar a partir dos seus próprios apps.
Como usar estas perguntas
- Pratique cada resposta como uma decisão curta: contexto, trade-off, implementação e modo de falha.
- Conecte escolhas técnicas ao impacto para o usuário, como inicialização mais rápida, leituras offline confiáveis, armazenamento seguro de tokens ou menos bugs de lifecycle.
- Prepare uma história real de projeto para arquitetura, desempenho, testes e segurança.
Kotlin Avançado e Recursos da Linguagem (5 Perguntas)
1. Explique as Coroutines do Kotlin e suas vantagens sobre as threads.
Resposta: Coroutines são primitivas de concorrência leves que permitem escrever código assíncrono de maneira sequencial.
- Vantagens sobre Threads:
- Leves: É possível criar milhares de coroutines sem problemas de desempenho
- Concorrência Estruturada: O relacionamento pai-filho garante uma limpeza adequada
- Suporte ao Cancelamento: Propagação de cancelamento integrada
- Tratamento de Exceções: Tratamento de exceções estruturado
- Componentes Principais:
- CoroutineScope: Define o ciclo de vida
- Dispatchers: Controla o contexto de execução (Main, IO, Default)
- suspend functions: Podem ser pausadas e retomadas
Raridade: Muito Comum Dificuldade: Difícil
2. O que são Sealed Classes e quando você deve usá-las?
Resposta: Sealed classes representam hierarquias de classes restritas onde todas as subclasses são conhecidas em tempo de compilação.
- Benefícios:
- Expressões
whenexaustivas - Gerenciamento de estado com segurança de tipo
- Melhor que enums para dados complexos
- Expressões
- Casos de Uso: Representação de estados, resultados, eventos de navegação
Raridade: Comum Dificuldade: Média
3. Explique o Kotlin Flow e como ele difere do LiveData.
Resposta: Flow é o stream assíncrono frio do Kotlin que emite valores sequencialmente.
- Flow vs LiveData:
- Flow: Stream frio, suporta operadores, não tem reconhecimento do ciclo de vida, mais flexível
- LiveData: Stream quente, tem reconhecimento do ciclo de vida, específico do Android, mais simples para a UI
- Tipos de Flow:
- Flow: Stream frio (inicia na coleta)
- StateFlow: Stream quente com estado atual
- SharedFlow: Stream quente para eventos
Raridade: Muito Comum Dificuldade: Difícil
4. O que são Inline Functions e quando você deve usá-las?
Resposta: Inline functions copiam o corpo da função para o local da chamada, evitando a sobrecarga da chamada da função.
- Benefícios:
- Elimina a sobrecarga de alocação de lambda
- Permite retornos não locais de lambdas
- Melhor desempenho para funções de ordem superior
- Casos de Uso: Funções de ordem superior com parâmetros lambda
- Compromisso: Aumenta o tamanho do código
Raridade: Média Dificuldade: Difícil
5. Explique a Delegação no Kotlin.
Resposta: A delegação permite que um objeto delegue algumas de suas responsabilidades a outro objeto.
- Delegação de Classe: palavra-chave
by - Delegação de Propriedade: Lazy, observable, delegates
- Benefícios: Reutilização de código, composição em vez de herança
Raridade: Média Dificuldade: Média
Padrões de Arquitetura (6 Perguntas)
6. Explique a arquitetura MVVM e seus benefícios.
Resposta: MVVM (Model-View-ViewModel) separa a lógica da UI da lógica de negócios.
- Model: Camada de dados (repositórios, fontes de dados)
- View: Camada de UI (Activities, Fragments, Composables)
- ViewModel: Lógica de apresentação, sobrevive a mudanças de configuração
- Benefícios: Testável, separação de preocupações, reconhecimento do ciclo de vida
Raridade: Muito Comum Dificuldade: Média
7. O que é Clean Architecture e como você a implementa no Android?
Resposta: Clean Architecture separa o código em camadas com dependências claras.
- Presentation: UI, ViewModels
- Domain: Use Cases, Business Logic, Entities
- Data: Repositories, Data Sources (API, Database)
- Dependency Rule: Camadas internas não conhecem as camadas externas
Raridade: Comum Dificuldade: Difícil
8. Explique a Injeção de Dependência e Dagger/Hilt.
Resposta: A Injeção de Dependência fornece dependências para as classes em vez de criá-las internamente.
- Benefícios: Testabilidade, baixo acoplamento, reutilização
- Dagger: Framework de DI em tempo de compilação
- Hilt: Dagger simplificado para Android
Raridade: Muito Comum Dificuldade: Difícil
9. O que é o padrão Repository e por que usá-lo?
Resposta: O padrão Repository abstrai as fontes de dados, fornecendo uma API limpa para acesso aos dados.
- Benefícios:
- Única fonte de verdade
- Lógica de dados centralizada
- Fácil de trocar as fontes de dados
- Testável
- Implementação: Coordena entre várias fontes de dados
Raridade: Muito Comum Dificuldade: Média
10. Explique a arquitetura Single Activity.
Resposta: A arquitetura Single Activity usa uma Activity com vários Fragments, gerenciados pelo Navigation Component.
- Benefícios:
- Navegação simplificada
- ViewModels compartilhados entre fragments
- Melhores animações
- Deep linking mais fácil
- Navigation Component: Lida com transações de fragment, pilha de retorno, argumentos
Raridade: Comum Dificuldade: Média
11. O que é a arquitetura MVI (Model-View-Intent)?
Resposta: MVI é uma arquitetura de fluxo de dados unidirecional inspirada no Redux.
- Componentes:
- Model: Representa o estado da UI
- View: Renderiza o estado, emite intents
- Intent: Ações/eventos do usuário
- Benefícios: Estado previsível, depuração mais fácil, depuração com viagem no tempo
Raridade: Média Dificuldade: Difícil
Desempenho e Otimização (5 Perguntas)
12. Como você otimiza o desempenho do RecyclerView?
Resposta: Várias estratégias melhoram o desempenho de rolagem do RecyclerView:
- ViewHolder Pattern: Reutiliza views (integrado)
- DiffUtil: Atualizações de lista eficientes
- Stable IDs: Substitua
getItemId()esetHasStableIds(true) - Prefetching: Aumente a distância de prefetch
- Image Loading: Use bibliotecas como Glide/Coil com dimensionamento adequado
- Avoid Heavy Operations: Não execute cálculos dispendiosos em
onBindViewHolder - Nested RecyclerViews: Defina
setRecycledViewPool()esetHasFixedSize(true)
Raridade: Muito Comum Dificuldade: Média
13. Como você detecta e corrige vazamentos de memória no Android?
Resposta: Os vazamentos de memória ocorrem quando os objetos são mantidos na memória por mais tempo do que o necessário.
- Causas Comuns:
- Vazamentos de contexto (referências de Activity/Fragment)
- Referências estáticas
- Classes internas anônimas
- Listeners não removidos
- Coroutines não canceladas
- Ferramentas de Detecção:
- Biblioteca LeakCanary
- Android Studio Memory Profiler
- Heap dumps
Raridade: Muito Comum Dificuldade: Média
14. Como você otimiza o tempo de inicialização do aplicativo?
Resposta: Uma inicialização mais rápida melhora a experiência do usuário:
- Inicialização Lazy: Inicialize objetos somente quando necessário
- Evite Trabalho Pesado em Application.onCreate():
- Mova para uma thread em segundo plano
- Adie a inicialização não crítica
- Content Providers: Minimize ou carregue de forma lazy
- Reduza as Dependências: Menos bibliotecas = inicialização mais rápida
- App Startup Library: Inicialização estruturada
- Baseline Profiles: Dicas de compilação ahead-of-time
Raridade: Comum Dificuldade: Média
15. Como você lida com o carregamento e o cache de bitmaps de forma eficiente?
Resposta: O tratamento eficiente de imagens é crucial para o desempenho:
- Bibliotecas: Glide, Coil (lidam com o cache automaticamente)
- Otimização Manual:
- Downsampling (carregar imagens menores)
- Cache de memória (LruCache)
- Cache de disco
- Bitmap pooling
Raridade: Comum Dificuldade: Difícil
16. O que é ANR e como você o impede?
Resposta: ANR (Application Not Responding) ocorre quando a thread principal é bloqueada por muito tempo.
- Causas:
- Computação pesada na thread principal
- Chamadas de rede na thread principal
- Operações de banco de dados na thread principal
- Deadlocks
- Prevenção:
- Mova o trabalho pesado para threads em segundo plano
- Use coroutines com dispatchers adequados
- Evite blocos synchronized na thread principal
- Use WorkManager para tarefas em segundo plano
Raridade: Comum Dificuldade: Fácil
Testes (3 Perguntas)
17. Como você escreve testes unitários para ViewModels?
Resposta: Os ViewModels devem ser testados isoladamente com dependências mockadas.


