Senior Mobile Developer Interview
Android, iOS/SwiftUI, cross-platform tradeoffs, performance, and mobile system design — basic to senior-level, with diagrams and animations wherever code alone won't explain it.
- Android Architecture & Jetpack
- Basic
MVC vs MVP vs MVVM vs MVI on Android — which and why
Every architecture pattern promises testable, decoupled UI code — interviewers use this question to check whether you understand the tradeoffs behind the acronyms, not just the acronyms themselves.
View question - Intermediate
What does Clean Architecture look like in a real Android app?
Concentric-circle diagrams are easy to draw; the interview question is whether you can point to the actual files, interfaces, and dependency direction that make the architecture real.
View question - Intermediate
How does ViewModel survive configuration changes, and what actually happens during process death?
The question separates candidates who've only seen rotation survive from those who understand that process death destroys the ViewModel entirely and relies on a completely different mechanism to recover.
View question - Basic
Jetpack Compose vs the View system — what tradeoffs does a senior engineer need to articulate?
Everyone agrees Compose is the future — the interview signal is whether you can name the concrete build-time, interop, and performance tradeoffs instead of repeating a marketing slide.
View question - Advanced
What actually triggers a Jetpack Compose recomposition, and how do you avoid the unnecessary ones?
Recomposition isn't re-rendering the whole tree — it's Compose deciding, function by function, whether your inputs are still the same, and stability is what it checks.
View question - Intermediate
Explain state hoisting and unidirectional data flow in Compose
Compose has no two-way data binding: state flows down as parameters, events flow up as lambdas, and hoisting moves state to where both sides meet.
View question - Intermediate
remember vs rememberSaveable vs derivedStateOf — when do you reach for each?
All three cache a value across recomposition, but they solve different problems — surviving a rotation, surviving a process death, or avoiding wasted work.
View question - Intermediate
Hilt vs Koin vs manual DI on Android — how do you choose for a real app?
Dependency injection ranges from plain constructor calls to compile-time codegen — Hilt, Koin, and manual DI trade off build speed, runtime safety, and how much magic you accept.
View question - Intermediate
Why and how would you split a growing Android app into multiple Gradle modules?
A monolithic :app module compiles as one blob and lets every screen reach into every other screen — modularization is how large Android teams buy back build speed and clear boundaries.
View question - Basic
Navigation Compose vs a single-Activity/multi-Fragment setup — what changed?
Fragments, the nav graph XML, and Safe Args solved 'one Activity, many screens' for a decade — Navigation Compose replaces the graph, the args, and the Fragment lifecycle itself with functions and typed routes.
View question - Basic
Explain the Repository pattern and "single source of truth" on Android
A Repository hides where data comes from; single source of truth decides which copy of that data the UI is actually allowed to trust — together they're why offline-first apps don't fall apart.
View question - Intermediate
Coroutines + Flow vs LiveData — when do you actually reach for each in 2025?
LiveData isn't dead, but it's no longer where new Android state management starts — here's the actual decision rule for greenfield Compose work versus legacy View-based screens.
View question - Advanced
What happens to SavedStateHandle and your UI state during process death?
Process death silently wipes your ViewModel — SavedStateHandle is the narrow bridge that survives it, and its limits separate a senior answer from a shrug.
View question - Intermediate
How do you model UI state with sealed classes/interfaces instead of a pile of booleans?
A pile of booleans lets your UI reach impossible states — sealed classes let the compiler decide which ones can exist at all.
View question - Advanced
What makes a Composable 'skippable' and 'stable', and why does it matter for performance?
Not every recomposition actually re-runs your Composable — stability and skippability decide whether Compose reuses the last frame or pays to rebuild it.
View question - Intermediate
How do you structure feature flags in a large, modularized Android app?
Wiring every feature module to Firebase Remote Config couples your whole app to one vendor — a small flag API module is what keeps it swappable.
View question - iOS & SwiftUI Fundamentals
- Basic
UIKit vs SwiftUI — when would a senior iOS engineer still reach for UIKit in 2025?
SwiftUI is the default for new screens, but production apps still lean on UIKit for dense scrolling lists, precise text control, and legacy interop — knowing exactly when signals real production mileage.
View question - Advanced
How does a SwiftUI View's body get re-evaluated, and what does that mean for state design?
SwiftUI doesn't update a screen — it re-asks the same question, diffs the answer, and writes only the delta; understanding that cycle is the difference between fighting the framework and designing state that flows with it.
View question - Intermediate
@State vs @Binding vs @ObservedObject vs @StateObject vs @EnvironmentObject — what's the actual difference?
Five property wrappers that all say 'this view depends on some state,' but differ in who owns the storage, when it's created, and how far a change propagates — mixing them up is a very common SwiftUI interview stumble.
View question - Intermediate
Combine framework basics — what is a Publisher/Subscriber, and where does it still matter next to async/await?
Combine models values arriving over time as a composable pipeline of operators — and even with async/await handling most one-shot work, it still backs @Published, form validation, and merging multiple live sources.
View question - Basic
What does MVVM look like in a real SwiftUI app?
MVVM in SwiftUI isn't a ceremony of interfaces — it's a thin, testable ViewModel holding @Published state, a View that only renders it, and a Model that knows nothing about either.
View question - Intermediate
Why does SwiftUI favor structs over classes, and when do you still need a class?
SwiftUI views are cheap, disposable value types by design — understanding why unlocks how diffing, state, and identity actually work under the hood.
View question - Basic
Optionals and safe unwrapping in Swift — what does a senior engineer actually avoid?
Every senior iOS interview probes optionals — not which of the four unwrapping tools you know, but which one signals safety and which one gambles.
View question - Advanced
ARC and retain cycles — walk through the weak-strong dance in a closure
Retain cycles are the classic ARC interview trap — the weak-strong dance separates candidates who've read about memory management from those who've actually debugged it.
View question - Intermediate
GCD vs Swift Concurrency (async/await, actors) — when do you reach for which?
GCD hasn't disappeared and async/await didn't replace it entirely — a senior engineer knows which concurrency model fits a given queue, race condition, or legacy API.
View question - Intermediate
Core Data vs SwiftData for persistence — how do you choose in a new app?
Core Data has a decade of battle-scars; SwiftData has a fraction of the code — choosing between them for a new app is a real architectural decision.
View question - Intermediate
How does navigation work in modern SwiftUI (NavigationStack) vs the old NavigationView?
NavigationView pushed screens through hidden per-link state that broke deep linking and programmatic navigation; NavigationStack replaced it with an explicit, observable path you own.
View question - Intermediate
Walk through the iOS app lifecycle — AppDelegate/SceneDelegate vs the SwiftUI App protocol
iOS moved from one AppDelegate owning the whole app, to per-window SceneDelegates, to SwiftUI's three-case scenePhase — each step trading granularity for simplicity.
View question - Advanced
What is protocol-oriented programming in Swift, and why does Apple push it over classical inheritance?
Protocols plus extensions give Swift shared behavior without inheritance's fragile base classes, single-axis reuse, and forced reference semantics — at the cost of a few sharp static-dispatch edges.
View question - Advanced
What actually causes a SwiftUI list to redraw more than expected, and how do you fix it?
Unstable Identifiable keys, an over-publishing ObservableObject, and unstable work inside body each widen redraw scope in different ways — and each has a distinct, specific fix.
View question - Cross-Platform Tradeoffs
- Advanced
How does React Native's architecture actually work — bridge vs the new JSI/Fabric/TurboModules?
React Native looks like one JS thread talking to native views, but the real story is a messaging system that changed shape entirely — from an async JSON bridge to a synchronous C++ interface.
View question - Advanced
How does Flutter render UI without a bridge, and what does the widget tree actually compile to?
Flutter needs no bridge because there is nothing on the other side to bridge to — it draws every pixel itself, through three trees you rarely see named all together.
View question - Intermediate
What is Kotlin Multiplatform Mobile (KMM), and what would you actually share between iOS and Android with it?
KMM is not a UI framework in disguise — it compiles one Kotlin source set to real native code on both platforms, and the honest answer is how narrow its sharing boundary is meant to be.
View question - Intermediate
You're starting a new app — walk through the decision framework for native vs React Native vs Flutter vs KMM
The strongest answer never opens with a favorite framework — it opens with the four axes that actually decide the tradeoff, then walks a real case through them.
View question - Intermediate
How do native, React Native, and Flutter actually compare on real-world performance?
Synthetic benchmarks measure the wrong thing — production performance comes down to startup time, scroll jank, and memory pressure under real workloads.
View question - Intermediate
What code-sharing strategies exist across iOS and Android beyond 'pick one cross-platform framework'?
React Native and Flutter aren't the only way to avoid writing everything twice — teams share a Kotlin, Rust, or C++ core underneath fully native UIs all the time.
View question - Advanced
How do you write a native module bridge in React Native, and what are the performance implications?
TurboModules replaced async, JSON-serialized bridge calls with direct JSI bindings — faster, but only if you still respect thread boundaries.
View question - Intermediate
How do you handle platform-specific UI/UX differences in a cross-platform app without it feeling wrong on both platforms?
Pixel-identical screens on iOS and Android isn't the goal — respecting each platform's own navigation and interaction conventions while keeping your brand consistent is.
View question - Performance & Memory
- Intermediate
What actually causes an ANR on Android, and how do you prevent one?
An ANR isn't a crash — it's the system timing out because your main thread stopped responding, and fixing it starts with finding which timeout fired.
View question - Intermediate
What are the most common memory leaks in Android apps, and how do you spot them?
Most Android leaks are ordinary strong references — a static field, a listener, a lambda — that quietly outlive the Activity they point back to.
View question - Basic
Walk through your toolbox for profiling a slow Android or iOS app
Different symptoms — jank, a leak, a slow launch — point to different tools, and picking the right one first saves a day of guessing.
View question - Advanced
Cold start vs warm start vs hot start — how do you actually reduce app startup time?
The three start types skip different amounts of work, so before optimizing anything you need to know which one you actually measured.
View question - Intermediate
How do image-loading libraries like Glide/Coil manage memory vs disk caching, and how would you configure one for a feed-heavy app?
Glide and Coil both juggle a bounded in-memory LRU, an on-disk cache, and aggressive downsampling — get any of the three wrong and an infinite-scroll feed turns into an OutOfMemoryError.
View question - Advanced
What makes a RecyclerView or Compose LazyColumn fast (or slow)?
Both widgets promise smooth infinite scrolling by never fully materializing an offscreen item — but that promise breaks the moment you skip stable keys, granular diffing, or per-item recomposition scoping.
View question - Intermediate
How do you optimize background work for battery — Doze mode, WorkManager constraints, JobScheduler?
Android throttles background work aggressively once a device is idle, so the real skill isn't fighting Doze — it's declaring constraints precise enough that the system schedules your work for free.
View question - Basic
What levers do you have to reduce APK/IPA size?
Smaller binaries install more reliably on constrained networks and low-end devices, and the same three moves — shrink code, split by device, defer assets — show up on both Android and iOS under different names.
View question - Basic
What is overdraw, and how do you find and fix it?
The same pixel gets painted three, four, five times a frame — invisible in a screenshot, brutal on a mid-range phone's GPU.
View question - Intermediate
How do you keep heavy work off the main thread on Android — and what happens when you don't?
The main thread has one job — draw the next frame in time — and every blocking call you put on it is a debt that comes due as a dropped frame or an ANR.
View question - Advanced
How do you profile memory on iOS — what does Instruments actually show you about a retain cycle?
Two objects holding strong references to each other never hit zero — Instruments makes that invisible leak visible as a graph, not a guess.
View question - Intermediate
What is 'jank', and how do you reason about a 16ms (or 8ms) frame budget?
A dropped frame isn't a crash and won't show up in a stack trace — it's a budget you either meet or visibly miss, sixty (or ninety, or a hundred twenty) times a second.
View question - Networking & Offline
- Intermediate
REST vs GraphQL for a mobile client — what actually changes for you as a mobile engineer?
It's not a syntax debate — REST and GraphQL push completely different tradeoffs onto caching, offline support, and how many round trips your screen needs.
View question - Advanced
What does 'offline-first' actually mean architecturally?
Offline-first isn't a retry button bolted onto a networking layer — it's making the local database the source of truth and treating the network as just another writer.
View question - Advanced
How do you resolve sync conflicts — last-write-wins vs CRDTs vs manual merge?
Two devices edit the same record offline — the interesting engineering starts the moment they both come back online and disagree.
View question - Intermediate
What caching strategy do you use for API responses on mobile — HTTP caching, ETags, cache-aside?
The right answer layers three different caches — HTTP-level, conditional requests, and an app-level cache-aside — because each one solves a different problem.
View question - Basic
What do OkHttp interceptors actually let you do, and what does a real interceptor chain look like?
Interceptors are the one seam where you can see and rewrite every request and response OkHttp handles — auth headers, logging, retries, and caching all live here.
View question - Intermediate
How do you schedule reliable background sync — WorkManager on Android vs BGTaskScheduler on iOS?
Background execution on mobile is a negotiation with the OS, not a guarantee — here's how each platform's scheduler decides when your sync actually runs.
View question - Intermediate
Walk through push notification delivery end to end — FCM/APNs, the OS, and your app
Your server never talks to the device — it talks to Google or Apple's relay, which holds a socket your app doesn't even need to be running for.
View question - Advanced
How do you handle flaky networks — retries, exponential backoff, and circuit breakers on a mobile client?
A retry loop without jitter or a ceiling doesn't recover from a flaky network — it turns one bad connection into a self-inflicted denial of service.
View question - Intermediate
What pagination strategy do you use for a mobile list backed by a huge dataset?
Offset pagination looks simplest in a demo and quietly breaks the moment real data starts changing underneath your infinite scroll.
View question - Advanced
How does certificate pinning actually work, and what breaks when you get it wrong?
Pinning trades one kind of risk — a rogue CA impersonating your API — for another: rotate the server's certificate without a plan, and you can brick every installed copy of your app.
View question - Testing, CI/CD & Release
- Intermediate
How do you unit test a ViewModel that depends on coroutines and a repository?
A senior Android answer wires a fake repository and a controlled test dispatcher instead of real Retrofit calls, then asserts on StateFlow with Turbine.
View question - Intermediate
Espresso/Compose Testing vs XCUITest — how do you approach UI testing on each platform?
Android leans on Espresso's idling resources and Compose's semantics tree; iOS leans on XCTest's accessibility identifiers — both fight the same flakiness with different tools.
View question - Basic
Mocks vs fakes vs stubs in mobile testing — when do you actually reach for each?
Stubs answer 'what did it return,' mocks answer 'was it called,' and fakes are the only one of the three with real, working state.
View question - Intermediate
What does a real mobile CI/CD pipeline look like — Fastlane, GitHub Actions, Bitrise?
A signed build only ships after static analysis, unit tests, instrumented UI tests, and a beta ring — and even the store release itself rolls out in stages, not one switch.
View question - Intermediate
How do feature flags and staged rollouts actually work together to de-risk a release?
Two independent dials, not one: a staged rollout limits who gets risky code, a feature flag limits who sees risky behavior.
View question - Basic
Walk through the Play Store release process — tracks, staged rollout, App signing
Four tracks, a signing model split into two keys, and a rollout percentage that can be halted but never quietly undone.
View question - Basic
What are the most common App Store rejection reasons, and how do you avoid them?
Crashes, mismatched metadata, IAP loopholes, thin WebView wrappers and privacy labels cover almost every rejection Apple hands out.
View question - Intermediate
How do you set up crash reporting and monitoring for a production mobile app — Crashlytics, Sentry?
Fatal and non-fatal errors, symbolicated stack traces, and a crash-free rate wired in as the guardrail that gates a staged rollout.
View question - Intermediate
How do you design an A/B test for a mobile feature, and what pitfalls do mobile release cycles add?
Mobile A/B tests look like web experiments until app store review, staged rollouts, and version fragmentation quietly poison your sample and your metrics.
View question - Basic
What is snapshot testing for UI, and where does it actually pay off on mobile?
Snapshot tests come in two very different flavors, structural and pixel-based, and both are easy to overuse into a rubber stamp nobody reads.
View question - Intermediate
How does testing Compose UI differ from testing the old XML View system?
Espresso queries a view hierarchy by resource id and waits on the main thread; Compose queries a semantics tree by role and text, and mostly synchronizes itself.
View question - Basic
TestFlight vs Play Console internal testing — how do you run a real beta program?
Both stores give you a near-instant internal tier and a wider reviewed tier; a real beta program is the promotion pipeline between them, not the track names.
View question - Security
- Intermediate
Android Keystore vs iOS Keychain — how do you actually store a secret securely on-device?
Storing a secret on-device isn't one API call — it's a decision about hardware-backed keys, biometric binding, and what happens if the device is rooted.
View question - Advanced
How do you implement certificate pinning, and how do you handle pin rotation without bricking your app?
Pinning stops a technically-valid-but-untrusted certificate from fooling your app — but get rotation wrong and you brick every install that hasn't updated.
View question - Intermediate
What can obfuscation (R8/ProGuard) actually protect against, and what can't it?
R8 renames your classes to a, b, c — it does not encrypt your strings, stop Frida, or make a hardcoded API key safe to ship.
View question - Intermediate
Walk through the OWASP Mobile Top 10 — which ones matter most for a typical consumer app?
The list isn't ranked by severity — the senior move is mapping its ten categories onto your own app's actual data and attacker.
View question - Intermediate
How do you implement biometric authentication (Face ID/fingerprint) correctly and safely?
Face ID and fingerprint prompts feel like a yes/no gate, but the secure implementation is really about releasing a hardware-backed key — get that distinction wrong and the 'security' feature becomes trivially bypassable.
View question - Advanced
What can go wrong with deep links / intent handling, and how do you secure them?
A deep link is an entry point any app on the device can try to trigger — treat the data it carries with the same suspicion as untrusted network input, not as something only your own UI produced.
View question - Intermediate
How do you handle data encryption at rest and in transit on a mobile app?
Full-disk encryption and HTTPS are the floor, not the ceiling — the interview question is really about key management: where keys live, who can unlock them, and what happens when a certificate rotates.
View question - Basic
What sensitive data commonly leaks into logs and crash reports, and how do you prevent it?
The bug that leaks a password isn't usually the login screen — it's the debug log line, the HTTP interceptor, and the crash reporter breadcrumb that nobody remembered to turn off before shipping.
View question - Mobile System Design
- Advanced
Design an offline-first note-taking app (think: a mobile Notion/Evernote)
Walk through an architecture where the local database is the source of truth and the network is just another writer — sync, don't block.
View question - Advanced
Design an image-loading library from scratch (think: Glide/Coil/SDWebImage)
Sketch the request pipeline — memory cache, disk cache, network, decode, and lifecycle-aware cancellation — that every image loader in production actually runs.
View question - Advanced
Design a chat application's mobile client — message delivery guarantees, WebSockets, offline queueing
Reason through sent/delivered/read semantics, reconnect strategy, and message ordering the way a real WhatsApp/Slack mobile client has to.
View question - Advanced
Design a deep-linking system for a large app with many feature modules
Route a URI to the right screen across dozens of independently owned modules without a central switch statement that everyone has to touch.
View question - Advanced
Design a feature-flag / remote-config system for a mobile app with millions of users
Walk through the client SDK, CDN-backed delivery, deterministic bucketing, and the kill-switch path that can never wait on an app-store release.
View question - Advanced
Design a background-sync engine that reliably ships local writes to the server
An offline-first outbox, a background worker with exponential backoff, and the conflict-resolution ladder from last-write-wins to CRDTs.
View question - Advanced
Design the module dependency graph for a large multi-module app with 20+ feature teams
App, core, and feature layering, an API/impl split that keeps features from coupling to each other, and the CI rule that keeps the graph honest.
View question - Advanced
Design a mobile video-streaming client — buffering strategy, adaptive bitrate, offline downloads
The ABR decision loop that blends throughput and buffer occupancy, the player's state machine, and the separate path a download manager needs for offline playback.
View question - Advanced
Design a location-tracking feature that respects both battery life and user privacy
A senior-level walkthrough of tiered location strategies — significant-change updates, geofencing, and bounded high-accuracy bursts — that ship without draining batteries or triggering App Store privacy rejections.
View question - Advanced
Design a mobile payment flow — tokenization, PCI scope, and failure handling
A senior walkthrough of how a mobile client can accept card payments without ever touching a raw card number — tokenized SDK fields, 3-D Secure, idempotent retries, and reconciliation.
View question - Advanced
Design the mobile client for a real-time collaborative app (like Google Docs)
A senior deep-dive into CRDT-based mobile sync — local-first editing, offline queues, state-vector reconciliation, and why this problem looks nothing like a normal REST client.
View question - Advanced
Design an analytics/telemetry SDK that mobile apps embed
A senior blueprint for a batching, durable-queue telemetry SDK — public API, threading model, retry logic, and the privacy controls that keep it out of consent trouble.
View question - Behavioral & Leadership
- Intermediate
How do you mentor junior mobile engineers on your team?
Great mobile mentors don't hand out fixes in code review — they build judgment, one well-scoped stretch assignment at a time.
View question - Advanced
How do you decide between paying down technical debt and shipping a feature?
Senior engineers don't win this argument with opinions — they win it by pricing the debt in the same currency the business already speaks: velocity, incidents, and time.
View question - Advanced
Describe a time you had to make an architecture decision with incomplete information
The senior move isn't eliminating uncertainty before you decide — it's classifying the decision, timeboxing the research, and building in a cheap way to reverse it if you're wrong.
View question - Intermediate
How do you handle a disagreement with a PM about scope vs quality?
The senior play turns 'quality vs scope' from a values argument into a shared list of what's negotiable, what isn't, and what the data says each option actually costs.
View question - Advanced
How do you approach a major platform migration, like moving a large app to Jetpack Compose?
A senior-level playbook for staging a multi-quarter platform rewrite so the product keeps shipping while old and new UI paradigms coexist safely.
View question - Intermediate
How do you evaluate a third-party SDK before adopting it into your app?
A practical due-diligence framework for judging whether a third-party SDK is worth the code size, privacy exposure, and vendor risk it brings with it.
View question - Advanced
How do you balance platform parity (iOS/Android feature consistency) against platform-specific excellence?
A framework for deciding when iOS and Android should behave identically and when leaning into each platform's own conventions serves users better.
View question - Advanced
Describe how you'd lead the incident response for a critical crash affecting a large percentage of users in production
A senior engineer's incident-command playbook for the first hour of a crash spike: stop the bleeding, diagnose in parallel, and communicate the whole way.
View question