The Complete Guide to Working in an Engineering Team
When I started my first job as an Android engineer, I thought the hard part was writing code. I knew Kotlin, I understood Activities and...
In-depth articles on Jetpack Compose, Coroutines, architecture patterns, and modern Android development.
Stay updated with curated new releases, API changes, docs, and what's happening in the Android ecosystem β every week.
Coding challenges, system design tips, and practice questions to help you ace your next Android engineering interview.
No signups, no tracking, no subscriptions, no paywalls. All content is free forever and the source code is fully open.
Zero analytics, zero cookies, zero data collection. Learn without being watched β your privacy is respected here.
Deep dives, interview guides, and exclusive content that other platforms charge for β yours forever, no strings attached.
When I started my first job as an Android engineer, I thought the hard part was writing code. I knew Kotlin, I understood Activities and...
I still remember the first time I wrote suspend fun and felt like something magical was happening. The function could pause, go do something else,...
In my previous post, I walked through different ways to write ViewModels β single field states, UI state classes, combine pipelines, and the Compose way...
When coroutines first landed in Kotlin, I treated them like a nicer version of RxJava β just swap Observable for Flow and subscribeOn for withContext,...
The first time I seriously measured our appβs cold start time, I was embarrassed. 3.2 seconds. I had assumed it was βfast enoughβ because it...
Early in my Android career, my error handling strategy was simple: wrap everything in try-catch, log it, and move on. The app βworkedβ β until...
I used to think Compose performance was about avoiding unnecessary recompositions. Slap @Stable on your data classes, use derivedStateOf where needed, pass lambdas carefully β...
Iβve worked on Android projects where dependency injection was an afterthought β classes creating their own dependencies, singletons scattered everywhere, and test suites that required...
I once spent two days tracking down a memory leak in production that caused our app to crash on devices with 2GB RAM. The OOM...
Iβve worked on Android codebases that ranged from a single module with 200 files dumped into a handful of packages, all the way to 40+...
The worst performance issue I ever shipped was a RecyclerView with 8 different view types, nested horizontal RecyclerViews, and a DiffUtil implementation that compared items...
Over the years, Iβve reviewed a lot of Kotlin codebases β internal libraries, SDK modules, shared data layers β and the pattern I keep seeing...
Last year I spent three days debugging what I thought was a slow API. The backend team insisted their p95 was under 80ms. Our Android...
Over the past few years, Iβve worked on several Android codebases β some greenfield, some legacy migrations, some scaling from a handful of screens to...
I noticed it on a Friday afternoon. Our release build β fully signed, minified, everything production-ready β felt sluggish on cold start. The splash screen...
When I joined a project last year, the first thing I noticed was how long builds took. A clean build on the CI server ran...
A few months ago, we shipped a feature that loaded a userβs transaction history alongside their profile on a single screen. Everything looked fine in...
Early in my career, code reviews were about catching typos and enforcing bracket placement. The review comments were things like βadd a blank line hereβ...
A few months ago, I was debugging a news feed app that kept crashing on mid-range devices. The crash logs all pointed to OutOfMemoryError in...
Last year I got pulled into a production incident at 11 PM. Users were reporting that checkout was silently failing β theyβd tap βPlace Order,β...
A while back, I was working on a screen that displayed a list of transactions β maybe a couple thousand rows. The UI was visibly...
A year ago, I inherited a codebase with over 400 tests. Sounds impressive until you actually run them. Half the suite was flaky β tests...
A few months ago, QA filed a ticket: βThe home screen feels slow.β No numbers, no reproduction steps, no specific device. Just βfeels slow.β I...
A few years ago, I remember managing almost everything with Threads, AsyncTask, and Handlers for background tasks and UI updates. It was quite messy, specifically...
When Android 16 shipped the resizability requirements last year, I figured most teams would get a comfortable grace period before enforcement got serious. We did....
Iβve spent more hours fighting Navigation 2 than Iβd like to admit. Type-safe arguments with Safe Args that still needed string-based route patterns. A NavGraph...
I started writing Android code in 2017, somewhere in the middle of this story. My first project used Activities for everything β business logic in...
I once spent a full afternoon debugging an ANR that only happened on low-end devices during cold starts. The stack trace pointed to SharedPreferences.getString() β...
I spent an embarrassing amount of time trying to build a frosted glass toolbar in Compose before I accepted that Android just doesnβt make this...
A few months ago I was building a feature that needed tap detection on irregularly-shaped UI elements β country outlines on a map, product images...
A few months back I was debugging a production issue where users kept losing their filter selections after switching to another app and coming back....
Last year I migrated a mid-sized Android project from KAPT to KSP. Clean debug builds dropped from around 4 minutes to just under 2 minutes....
Every Android team Iβve worked on has had a complicated relationship with dependency injection. We know we need it β the alternative is manual service...
My DI journey on Android has been a progression of increasingly frustrated compromises. First it was manual constructor injection β workable for small projects, completely...
A couple of years ago, I was working on a screen that had about 12 different input sources β user inputs, repository observations, feature flags,...
The first time I tried testing a StateFlow in a ViewModel, I launched a coroutine, collected emissions into a list, and asserted on the list....
A few months ago, I was writing a test for a ViewModel that managed a loading screen. The logic was simple β set loading to...
The first time I really looked at how Compose tracks state changes, I expected to find something like LiveDataβs observer pattern β register a listener,...
I used to think micro-optimizations were a waste of time. Profile first, optimize the hot path, donβt prematurely optimize β thatβs the standard advice, and...
Iβve been suggesting asSequence() in code reviews for years. It was one of those automatic comments β see a filter followed by a map on...
Iβve been injecting Dispatchers.IO and Dispatchers.Main into my classes for years. Itβs one of the first things you learn when someone tells you to write...
I spent an entire afternoon debugging why my search screen was dropping results. The ViewModel looked correct β a combine of search query and filter...
I once shipped a bug where users saw the same error snackbar every time they rotated their phone. The flow was simple: user taps a...
A few months back, I was reviewing a pull request where every repository function was wrapped in try-catch(e: Exception) with a generic error message. The...
A few months ago, I found a bug in production that took me embarrassingly long to track down. Users were seeing a blank screen β...
A while back, I hit a bug in the Compose Foundation library causing a layout issue. The usual flicker-on-recomposition kind of thing that makes you...
When I set up a new Compose project a few months ago, I did what every Android tutorial tells you to do β I added...
Navigation in Compose has been my single biggest source of frustration in the Jetpack ecosystem. Not because the API is bad β NavHost and NavController...
In the early days of my career, I had no idea about testing. Iβd write code, manually check if it worked, ship it, and then...
Before building a product, we need to set some requirements, architecture designs, security concerns β all of that. These play an important role in organizing,...
A while back I was reviewing a pull request on a fairly mature Android project, and I noticed the same structural problems repeating across different...
Scope functions were the first Kotlin feature that made me feel like I was fighting the language instead of using it. Not because theyβre complex...
Early in my career, I shipped an app that stored API keys in BuildConfig fields and user tokens in plain SharedPreferences. I thought BuildConfig was...
I used to over-complicate animations. In the View system, animation meant choosing between ObjectAnimator, ValueAnimator, ViewPropertyAnimator, TransitionManager, MotionLayout, or raw Canvas.drawFrame loops. Each API had...
A few months back, I shipped a feature that looked perfect in debug builds but dropped frames like crazy in release. The profiler showed recompositions...
I once joined a project where the codebase had a class called DataManager. Sounds reasonable, right? Except it was 2,400 lines long, handled API calls,...
A couple of years ago, I was reviewing a pull request from a teammate who had just migrated from Java. The code worked fine β...
A while back, I was working on a production app that had about twelve ContentProviders registered in the manifest β most of them just for...
Deep links are one of those features that sound simple β βtap a URL, open the appβ β until you actually implement them. There are...
Generics were one of those features I thought I understood until I had to actually use them beyond List<String>. I was building a caching layer...
Compose layouts tripped me up more than anything else when I first moved from the View system. In XML, layout behavior is defined by the...
About two years ago, I got a bug report that our app was crashing with OutOfMemoryError after extended use. Not immediately β users had to...
Iβve worked on projects that used MVC, MVP, MVVM, and MVI. Every time we picked an architecture, someone on the team was convinced it was...
I used to write a lot of wrapper classes. A LoggingRepository that wraps a RealRepository, forwarding every method call and adding a log statement before...
Last year I needed a radial progress indicator that didnβt exist in Material Design. The specs called for a segmented arc with rounded caps, gradient...
I once spent two days tracking down a crash that should have been obvious. A coroutine in a ViewModel was fetching data from two endpoints...
The first time I used LaunchedEffect in a real project, I misunderstood the key parameter and created an infinite loop that crashed the app. The...
When I moved from RxJava to Kotlin Flow, the first thing I noticed was how much simpler the mental model was. RxJava had Observable, Flowable,...
The first time I needed to sync data reliably in the background β not just βfire and forgetβ but actually guaranteed delivery β I went...
The first time I really understood caching was when I profiled an app that was making the same API call every time the user switched...
The moment I βgotβ Kotlin extension functions was when I stopped thinking of them as adding methods to classes and started thinking of them as...
Our app at work hit a point where clean builds took over four minutes. Adding a new feature meant reading through thousands of lines to...
In the previous posts, I covered what Clean Architecture is and the principles behind it. Now letβs get concrete. The most common question I get...
A few years into my Android career, I noticed a pattern. Every codebase that was painful to work on violated the same handful of principles....
When I started my first production Android project, the codebase was one module with Activities that did everything β network calls, database queries, JSON parsing,...
Before the Navigation component, handling navigation in Android was a choose-your-own-adventure of FragmentTransactions, intent flags, and manual back stack management. I once spent an entire...
The first time sealed classes clicked for me was during a code review. A colleague had modeled a payment flow using an enum with four...
I still remember the days of writing raw SQLite queries in Android. Cursor objects, manual column index tracking, forgetting to close the database helper β...
Early in my Android career, I wrote ViewModels that created their own repository instances, repositories that created their own Retrofit services, and services that created...
A few years ago, I remember managing almost everything with raw Thread objects. Need to fetch data from the network? new Thread(() -> { ......
When I started Android development, I treated Gradle like a black box. Iβd paste dependencies into build.gradle, hit sync, and pray. When something broke β...
Before Kotlin, I spent a non-trivial chunk of my debugging time chasing NullPointerException crashes. Not because I was careless β Java just didnβt give you...
One of the first production bugs I ever shipped was a lifecycle bug. The app was a simple news reader β nothing fancy. But users...
Everything you need to know before starting your Android interview preparation β what to expect, how companies evaluate, and a roadmap to succeed.
Kotlin basics and type system questions come up in almost every Android interview.
Functions are a core part of Kotlin interviews. Scope functions, higher-order functions, and inline functions are asked frequently because they show how well you understand Kotlin's functional side.
Collections and functional operations come up in almost every Kotlin interview.
Generics come up in almost every Kotlin interview round.
Lifecycle is the most commonly asked topic in Android interviews. Every company will ask at least 2-3 lifecycle questions.
Services, Broadcast Receivers, and Content Providers are three of the four core Android components.
Intents, intent filters, and launch modes are core concepts that define how Android components communicate and how the system manages tasks and back...
Views, RecyclerView and UI rendering are core topics in Android interviews. This post covers the most important questions.
Every real Android app needs to persist data. These questions cover the right tool for each storage need and the common pitfalls.
Networking questions cover HTTP concepts, OkHttp internals, and caching strategies.
Threading and background work are important topics in Android.
Kotlin Coroutines is a simplified version of managing asynchronous tasks or operations in Android.
Advanced coroutine questions test whether you actually understand what happens under the hood β CPS transformation, state machines, cancellation cooperation, and concurrency primitives.
Flow is one of the most heavily tested topics in Kotlin interviews.
Hot flows are one of the most asked topics in Android interviews.
Compose fundamentals come up in almost every Android interview now.
State management is the core of how Compose works. Almost every Compose interview will test whether you understand how state drives recomposition and...
Recomposition is the core mechanism that makes Compose reactive.
Side effects and lifecycle are fundamental to real-world Compose development.
Layout and drawing questions test whether you actually understand how Compose renders UI under the hood.
Navigation and theming questions test whether you understand how to structure a real Compose application.
Animation questions come up regularly in Compose interviews because they test whether you understand not just the APIs, but how Compose's declarative...
Testing and accessibility questions appear in senior-level Compose interviews because they reveal whether you've actually shipped production Compose...
This covers how memory works on Android, why frames drop, and how to find and fix performance problems.
Covers the Android permission model, push notification system, and security fundamentals for protecting user data.
Build system questions cover Gradle internals, dependency management, and CI/CD pipelines for Android projects.
Understanding how Kotlin compiles to bytecode is a common advanced interview topic.
These topics separate senior Kotlin developers from intermediate ones.
Android internals and process management come up frequently in senior-level interviews.
These topics come up in interviews when companies want to know if you build apps that work for everyone, not just the default case.
Deep links and App Links are commonly asked in Android interviews because they test your understanding of the intent system, manifest configuration,...
These topics come up in interviews when the role involves features like maps, fitness tracking, camera-based scanning, or Bluetooth connectivity.
Architecture pattern questions come up in every senior Android interview.
Clean Architecture and SOLID come up in almost every architecture round.
DI questions show up in every Android architecture interview.
Modularization questions are common in senior and lead Android interviews.
Design pattern questions show up in almost every architecture round.
Testing questions come up in architecture rounds because writing testable code forces good architecture.
Error handling questions test whether you think beyond the happy path.
State management is where architecture rounds get hard.
Arrays and strings are the foundation of almost every DSA interview.
Linked list problems are a staple in DSA interviews because they test pointer manipulation, edge case handling, and in-place operations.
Stacks and queues are among the most frequently tested data structures in coding interviews.
Trees are one of the most asked topics in coding interviews.
Tries show up in string-heavy problems like autocomplete, spell check, and word search.
Graph problems are among the most common in coding interviews.
Shortest path algorithms and advanced graph techniques like MST and Union-Find show up frequently in coding rounds at top companies.
Sorting and binary search are foundational topics in coding interviews.
DP is one of the most tested topics in FAANG interviews. If a problem has overlapping subproblems and optimal substructure, it's likely a DP problem.
Advanced DP problems show up in harder FAANG rounds and distinguish strong candidates.
Recursion is the foundation for trees, graphs, and DP. Backtracking extends recursion to explore all possibilities and prune invalid paths.
Bit manipulation shows up in interviews as a way to test your understanding of how numbers work at the binary level.
System-oriented DSA questions bridge the gap between algorithms and real-world systems.
Heaps power efficient selection and scheduling problems. Interval problems test your ability to think about overlapping ranges.
Mobile system design interviews focus on client-side architecture, not backend scaling.
Designing an image loading library like Coil or Glide is one of the most common mobile system design questions.
Chat applications are a favorite in mobile system design interviews because they combine real-time communication, offline support, local persistence,...
Feed-based screens are one of the most common system design questions in mobile interviews.
Offline-first is a core mobile system design topic. Users expect apps to work in subways, elevators, and areas with flaky connectivity.
Video streaming is a common system design question because it touches many mobile-specific concerns β adaptive bitrate, buffering, background...
Ride-sharing apps are a favorite in mobile system design interviews because they combine real-time location, maps, background services, and...
E-commerce app design comes up frequently because it covers the full spectrum of mobile challenges β catalog browsing with heavy image loading,...
File sync apps are a staple in system design interviews because they test how you handle background processing, conflict resolution, and large data...
SDK design questions test a different angle of system design β you are building a library that other developers integrate into their apps, not an...
Designing a networking library like Retrofit or OkHttp tests your understanding of HTTP internals, request pipelines, caching, and concurrency.
Designing a file downloader library tests your understanding of HTTP range requests, background processing, disk I/O, and concurrent task management.
Designing a location sharing or maps app tests your understanding of real-time communication, battery-efficient location strategies, map rendering, and privacy.
Designing a music streaming app like Spotify tests your understanding of audio playback, background services, media sessions, offline caching, and playback queue management.
Most Android interview pipelines include a practical coding test β either a take-home project or a live coding session.
The weather or news reader app is the most common coding test assignment.
The list-detail pattern is a staple coding test assignment.
Some coding tests ask you to build a custom UI component from scratch β a circular progress indicator, a rating bar, a custom chart, or a...
Some companies hand you an existing codebase and ask you to review it, identify problems, and refactor.
The StackOverflow users or GitHub repos app tests API integration, pagination, search, and clean architecture in a realistic coding challenge.
The to-do or notes app is the purest test of Android fundamentals β Room, state management, clean architecture, and UI polish without relying on any external API.
The machine coding round is a timed, hands-on coding session where you build or modify a feature live, typically in 1-2 hours.
Every company has a behavioral round. It tests how you communicate, handle conflict, and work with others.
Senior-level interviews dig into how you lead without a title, own outcomes end-to-end, and make sound technical decisions when there's no clear...
Many companies ask about how you work within Agile teams.
These questions come up in almost every final round.
Master Kotlin from fundamentals to advanced patterns β null safety, generics, DSLs, inline functions, and idiomatic Kotlin for production Android code.
Master structured concurrency, suspend functions, Flow operators, StateFlow, Channels, and exception handling for production Android apps.
Build modern Android UIs from scratch β declarative thinking, state management, side effects, custom layouts, animations, performance, and testing.
Design scalable, testable Android apps β MVVM, MVI, Clean Architecture, Repository pattern, Use Cases, and modularization strategies.
Secure your Android apps β encryption, KeyStore, ProGuard/R8, network security, biometrics, secure storage, and privacy best practices.
Optimize every layer β startup time, memory management, rendering performance, Compose optimization, battery efficiency, APK size, network tuning, threading, micro-optimizations, and profiling with Android Studio tools.
Master Gradle for Android β build scripts, plugins, variant management, build optimization, version catalogs, and custom tasks.
Write tests that catch bugs β unit testing, Compose UI testing, integration tests, TDD patterns, test architecture, and mocking strategies.
Master DI in Android β Hilt, Dagger, Koin, manual DI, scoping, multi-module architecture, and testing patterns.
Design scalable Android apps β offline-first architecture, caching strategies, pagination, data sync, modularization, and real-world system design patterns.