Perguntas de Entrevista para Desenvolvedor Mobile Sênior (Android): Guia Completo

Milad Bonakdar
Autor
Domine o desenvolvimento Android avançado com perguntas de entrevista essenciais, abrangendo padrões de arquitetura, otimização de desempenho, injeção de dependência, testes, segurança e design de sistema para desenvolvedores seniores.
Introdução
Espera-se que os desenvolvedores Android seniores arquitetem aplicativos escaláveis e de fácil manutenção, garantindo alto desempenho e qualidade de código. Essa função exige profundo conhecimento das estruturas do Android, padrões arquiteturais, injeção de dependência, estratégias de teste e a capacidade de tomar decisões técnicas informadas.
Este guia abrangente aborda as principais perguntas de entrevista para desenvolvedores Android seniores, abrangendo conceitos avançados de Kotlin, padrões arquiteturais, otimização de desempenho, injeção de dependência, testes e design de sistema. Cada pergunta inclui respostas detalhadas, avaliação de raridade e níveis de dificuldade.
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.


