Understanding Android Activity Lifecycle
One of the first production bugs I ever shipped was a lifecycle bug. The app was a simple news reader β nothing fancy. But users...
In-depth articles on Jetpack Compose, Coroutines, architecture patterns, and modern Android development.
Step-by-step learning paths covering Kotlin, Compose, Architecture, and more β organized for steady progress.
Test your knowledge with hundreds of questions across easy, medium, and hard levels β learn by doing.
Coding challenges, system design tips, and practice questions to help you ace your next Android engineering interview.
Stay updated with curated new releases, API changes, docs, and what's happening in the Android ecosystem β every week.
No signups, no tracking, no subscriptions, no paywalls. All content is free forever and the source code is fully open.
One of the first production bugs I ever shipped was a lifecycle bug. The app was a simple news reader β nothing fancy. But users...
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...
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...
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...
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...
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...
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...
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 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 while back I was reviewing a pull request on a fairly mature Android project, and I noticed the same structural problems repeating across different...
A couple of years ago, I was reviewing a pull request from a teammate who had just migrated from Java. The code worked fine β...
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...
When I started my first production Android project, the codebase was one module with Activities that did everything β network calls, database queries, JSON parsing,...
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....
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...
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,...
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 started writing Android code in 2017, somewhere in the middle of this story. My first project used Activities for everything β business logic in...
I still remember the days of writing raw SQLite queries in Android. Cursor objects, manual column index tracking, forgetting to close the database helper β...
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() β...
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...
Deep links are one of those features that sound simple β βtap a URL, open the appβ β until you actually implement them. There are...
The first time I needed to sync data reliably in the background β not just βfire and forgetβ but actually guaranteed delivery β I went...
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...
A while back, I was working on a production app that had about twelve ContentProviders registered in the manifest β most of them just for...
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,...
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...
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,...
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β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...
When coroutines first landed in Kotlin, I treated them like a nicer version of RxJava β just swap Observable for Flow and subscribeOn for withContext,...
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...
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...
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...
Navigation in Compose has been my single biggest source of frustration in the Jetpack ecosystem. Not because the API is bad β NavHost and NavController...
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...
When I set up a new Compose project a few months ago, I did what every Android tutorial tells you to do β I added...
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 early days of my career, I had no idea about testing. Iβd write code, manually check if it worked, ship it, and then...
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 debugging a production issue where users kept losing their filter selections after switching to another app and coming back....
In my previous post, I walked through different ways to write ViewModels β single field states, UI state classes, combine pipelines, and the Compose way...
Before building a product, we need to set some requirements, architecture designs, security concerns β all of that. These play an important role in organizing,...
My DI journey on Android has been a progression of increasingly frustrated compromises. First it was manual constructor injection β workable for small projects, completely...
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...
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....
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,...
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...
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 couple of years ago, I was working on a screen that had about 12 different input sources β user inputs, repository observations, feature flags,...
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...
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...
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 tried testing a StateFlow in a ViewModel, I launched a coroutine, collected emissions into a list, and asserted on the list....
A year ago, I inherited a codebase with over 400 tests. Sounds impressive until you actually run them. Half the suite was flaky β tests...
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...
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 been suggesting asSequence() in code reviews for years. It was one of those automatic comments β see a filter followed by a map on...
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...
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...
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...
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...
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 spent three days debugging what I thought was a slow API. The backend team insisted their p95 was under 80ms. Our Android...
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 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...
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...
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 noticed it on a Friday afternoon. Our release build β fully signed, minified, everything production-ready β felt sluggish on cold start. The splash screen...
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...
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βve worked on Android projects where dependency injection was an afterthought β classes creating their own dependencies, singletons scattered everywhere, and test suites that required...
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β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+...
Over the years, Iβve reviewed a lot of Kotlin codebases β internal libraries, SDK modules, shared data layers β and the pattern I keep seeing...
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...
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,β...
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 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 Android 16 shipped the resizability requirements last year, I figured most teams would get a comfortable grace period before enforcement got serious. We did....
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...
When I moved from Java to Kotlin, the first thing that struck me wasnβt coroutines or extension functions β it was how differently I started...
Coming from Java, my mental model for control flow was rigid. switch only works on primitives and strings. if is a statement β you use...
If youβve ever written Java, you know the pain of building strings. String.format() with its numbered %s placeholders that you have to count and match...
Ranges and destructuring are two features I initially dismissed as syntactic sugar. When I first saw for (i in 1..10), I thought it was just...
If youβve ever maintained a Java codebase with complex APIs, you know the overload dance. A method like createUser starts with two parameters β name...
If youβve been writing Kotlin for any amount of time, youβve already used higher-order functions β even if you didnβt think of them that way....
Most Kotlin features Iβve adopted over the years fall into one of two buckets: things that save typing, and things that change how I express...
When I first moved from Java to Kotlin on an Android project, the thing that hit me hardest wasnβt coroutines or extension functions β it...
When I first moved from Java to Kotlin, data classes felt like the headline feature. A single line β data class Point(val x: Int, val...
Most developers first encounter enums as a way to replace magic strings and integer constants β and that alone makes them worth using. But Kotlin...
The object keyword is one of those Kotlin features that does three distinct things, and understanding which one youβre using matters more than most people...
Iβve lost count of how many times Iβve seen functions with two or three Long parameters lined up next to each other. transfer(fromId: Long, toId:...
If youβve ever stared at a function signature like (Store<AppState>, (Action) -> Unit, Action) -> Unit and needed a full minute to parse whatβs going...
Coming from Java, I was used to a world where every ArrayList handed you both read and write access. Youβd pass a List<User> to a...
Every Android codebase Iβve worked on has the same pattern hiding in plain sight β manual for loops that iterate, check conditions, build new lists,...
If youβve worked on any non-trivial Android app, youβve used maps more than you probably realize. Caching parsed JSON responses, storing feature flags, building request...
In the previous guide on higher-order functions, I mentioned that every lambda compiles to an anonymous class implementing one of the FunctionN interfaces. Thatβs a...
I remember the first time I saw SAM conversion in Kotlin. I was migrating a Java codebase and noticed that button.setOnClickListener { doSomething() } just...
You already use DSLs every day, even if you donβt think about them that way. Every Gradle build script you write is a DSL. Every...
When I first encountered the T.() -> Unit syntax in Kotlin, it didnβt click. Iβd been writing lambdas for a while β passing them to...
If youβve ever built a DSL in Kotlin β or even just used one like Jetpack Compose, Ktor routing, or Gradleβs build script β youβve...
Every Android developer uses DSLs daily without thinking about it. You open a build.gradle.kts file and write dependencies { implementation("...") }. You compose a screen...
When Google announced first-class Kotlin support for Android at Google I/O 2017, the single most important promise was β100% Java interoperability.β That promise is what...
A few years ago, I was managing background work with AsyncTask and Handler.postDelayed. Then RxJava came along and gave us composable async pipelines β subscribeOn,...
Structured concurrency is, in my opinion, the single biggest innovation Kotlin coroutines brought to Android development. Not suspend fun. Not Flow. Not even the CPS...
Every coroutine runs on a thread. Which thread is the dispatcherβs job. I spent my first year with coroutines thinking dispatchers were just a way...
The suspend keyword is the single most important keyword in Kotlin coroutines. Not launch, not async, not Flow. Those are all built on top of...
Debugging coroutines is genuinely harder than debugging regular code. I spent an embarrassing amount of time early on setting breakpoints in suspend functions only to...
Cancellation is where most coroutine bugs live. Not in launching coroutines, not in switching dispatchers β in cancellation. Iβve seen production code where a background...
withTimeout does one thing: it wraps any suspend function with a time limit. If the operation finishes before the deadline, you get the result. If...
Flow has a context preservation rule that most developers donβt think about until it breaks their code. The rule is simple: the flow { }...
Search-as-you-type, accelerometer data streaming at 100Hz, a user mashing a βSubmit Orderβ button six times in two seconds. These are all the same problem: the...
When Google officially recommended StateFlow and SharedFlow over LiveData for new Android projects, a lot of developers β myself included β treated them as drop-in...
Collecting flows in Android UI is deceptively simple to get wrong. You call flow.collect { } inside a coroutine, it works in development, you ship...
Channels are the coroutine equivalent of BlockingQueue. Where a blocking queue uses put and take that block threads, a channel uses send and receive that...
Android is full of callback-based APIs. LocationManager, SensorManager, Firebase listeners, BroadcastReceiver, ConnectivityManager β the list goes on. These APIs were designed years before coroutines existed,...
Coroutines donβt magically solve shared state problems. I learned this the hard way when a counter in a production analytics module was consistently undercounting events....
Sequential suspend calls are the default behavior in coroutines, and most of the time thatβs exactly what you want. Call getUser(), wait for the result,...
The first coroutine test I ever wrote passed on my machine and failed on CI. Then it passed on CI and failed locally. Then it...
The standard Flow operators cover most cases. map, filter, debounce, combine, flatMapLatest β they handle 90% of what youβll build in a typical Android app....
When I first started writing Compose, I treated composable functions like regular Kotlin functions that happened to return UI. Call them with the right parameters,...
Every Compose frame goes through three phases: Composition, Layout, and Drawing. I didnβt fully appreciate this until I spent a week chasing a scroll jank...
State drives everything in Compose. Without state, you have static text on screen β a layout that renders once and never changes. With state, you...
State hoisting is the most important pattern in Compose. Iβd go further β if you donβt understand state hoisting, you donβt really understand Compose. Itβs...
Row, Column, and Box cover about 90% of the layouts I build. They handle stacking, linear arrangement, and overlap well enough that most screens never...
The basic animation APIs β animate*AsState, AnimatedVisibility, updateTransition β are covered in the Compose Animation APIs Guide. Those APIs handle 80% of what youβll build,...
The first time I hit a confusing recomposition bug β a remember block returning stale data after I reordered items in a list β I...
After years of writing Espresso tests that broke every time a layout changed, flaked on CI because animations hadnβt settled, and required scrolling through ActivityScenario...
Unit tests verify components in isolation. You mock the repository, stub the database, fake the network, and test that your ViewModel emits the right state....
The first time I set up Dagger on a production project, I spent an entire afternoon debugging a MissingBinding error that turned out to be...
When you have 20+ modules in an Android project, thereβs a specific kind of pain that has nothing to do with your appβs logic. Itβs...
I spent the first two years of my Android career hunting for dependency versions across three different places. The app module had Retrofit pinned inline....
A good CI/CD pipeline catches bugs before they reach users, enforces quality gates, and automates the tedious parts of releasing. For Android, this means building,...
I once inherited a codebase that stored OAuth refresh tokens in plain SharedPreferences and API keys directly in BuildConfig fields. The original developer assumed the...
A couple of years ago, I was reviewing a banking appβs network layer and noticed something that made me pause. The app used HTTPS for...
Biometric authentication is one of those features that sounds simple until you actually build it. Fingerprint, face, iris β the BiometricPrompt API abstracts away the...
Androidβs privacy model gets stricter with every release. Scoped storage, one-time permissions, approximate location, photo picker, privacy dashboard β each version adds new restrictions that...
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.
Clean Architecture, MVVM, MVI, modularization, error handling, caching, and the principles that keep large Android codebases maintainable.
Profiling, memory management, startup optimization, rendering performance, network efficiency, and the micro-optimizations that make Android apps fast.
Unit testing, integration testing, Compose testing, coroutine testing, and the testing strategies that catch real bugs without slowing you down.
DI principles, Hilt, Metro, KSP, multi-module DI, and the patterns that keep dependency graphs clean and testable.
The Gradle build pipeline, configuration optimization, convention plugins, version catalogs, modularization, and CI/CD for Android projects.
Secure storage, network security, authentication, deep links, and the security best practices every Android developer should know.
End-to-end mobile system design β from API contract to offline support, caching strategies, data synchronization, and real-world case studies.
questions from Android, Kotlin, Compose, Coroutines, Architecture and more.
Pick a difficulty and challenge yourself.