Android & Kotlin Technical Articles

Detailed articles on Android development, Jetpack Compose internals, Kotlin coroutines, and open source library design by skydoves, Google Developer Expert and maintainer of Android libraries with 40M+ annual downloads. Read practical guides on Retrofit, Compose Preview, BottomSheet UI, coroutine compilation, and more.

Exclusive Articles
RSS

This is a collection of private or subscriber-first articles written by the Dove Letter, skydoves (Jaewoong). These articles can be released somewhere like Medium in the future, but always they will be revealed for Dove Letter members first.

Deep Dive into Kotlin Data Classes, Coroutines, Flow, and K2 Compiler

This book is designed for Kotlin developers who want to deep dive into the Kotlin fundamentals, internal mechanisms, and leverage that knowledge in their daily work right away.

KotlinCoroutines
Wednesday, January 15, 2025
How LazyColumn Works Under the Hood

LazyColumn renders only the items that are visible on screen. Unlike a regular Column that composes every child upfront, LazyColumn defers composition until the layout phase, composes items on demand as they scroll into…

ComposeKotlin
Monday, May 4, 2026
SnapshotFlowManager: How Compose Shares Observation Infrastructure Across Snapshot Flows

Compose's snapshotFlow converts snapshot state reads into a Kotlin Flow. Each call to snapshotFlow registers its own apply observer with the snapshot system, watching for state changes that should trigger new emissions.…

ComposeKotlin
Sunday, April 26, 2026
Compose Strong Skipping Mode Does Not Make Your Types Stable

Strong Skipping Mode is one of the most misunderstood features in Jetpack Compose. A common belief is that enabling it makes all types stable, eliminating the need to think about stability entirely. This is wrong.…

ComposeKotlin
Saturday, April 25, 2026
How Navigation 3 Works Under the Hood

Navigation 3 is a ground up redesign of Jetpack navigation for Compose. Unlike Navigation 2, which adapted the Fragment based navigation model to Compose through NavController and XML graph definitions, Navigation 3 is…

ComposeKotlin
Tuesday, April 14, 2026
How the Kotlin Compiler Knows You Covered Every Sealed Subclass in `when`

You write a when expression on a sealed class, cover every subclass, and the compiler lets you skip the else branch. Then a teammate adds a new subclass in another file, and every when in the project turns red with…

Kotlin
Tuesday, April 7, 2026
Kotlin KSP Internals: How Your Annotations Become Generated Code

If you use Jetpack Room, every @Dao interface turns into a full database implementation. If you use Hilt, every @Inject constructor gets wired into a dependency graph. If you use Moshi, every @JsonClass generates a JSON…

ArchitectureKotlin
Wednesday, April 1, 2026
Build Your Own Landscapist Image Plugin in Jetpack Compose

Landscapist provides a composable image loading library for Jetpack Compose and Kotlin Multiplatform. Among its image composables, LandscapistImage stands out as the recommended choice: it uses Landscapist's own…

ComposeAndroidKotlin
Saturday, March 28, 2026
How Compose's Drawing System Works Under the Hood

Every Compose app draws images. Whether you call Image(painterResource(R.drawable.photo)) to display a bitmap, render a Material icon with Icon(Icons.Default.Search), or load a vector drawable, the same underlying…

ComposeKotlin
Saturday, March 21, 2026
The Seven Group Types in Compose

Every @Composable function you write produces invisible scaffolding. The Compose compiler wraps each Kotlin construct in a "group" that tells the runtime what it can do during recomposition. A conditional branch gets…

ComposeKotlin
Tuesday, March 17, 2026
How Compose Preview Works Under the Hood

Every Android developer using Compose has written @Preview above a composable and watched it appear in the Studio design panel. But what actually happens between that annotation and the rendered pixels? The answer…

ComposeAndroidKotlin
Sunday, March 15, 2026
Five Algorithms and Data Structures Hidden Inside Jetpack Compose

Jetpack Compose is a UI toolkit on the surface, but its internals draw from decades of computer science research. The runtime uses a data structure borrowed from text editors to store composition state. The modifier…

ComposeAndroidKotlin
Wednesday, March 11, 2026
How Compose Remembers: The Positional Memoization Behind remember and State

Every Compose developer has written remember { mutableStateOf(0) }. The value survives recomposition without any explicit storage reference. No ViewModel, no map, no key. Compose knows where the value belongs based on…

ComposeKotlin
Sunday, March 8, 2026
From Gap Buffer to Linked List: How Compose Rewrote Its SlotTable for Faster Recomposition

Jetpack Compose stores your entire composition tree in a data structure called the SlotTable. Every composable call, every remembered value, every key is recorded as groups and slots in this table. For years, the…

ComposeKotlin
Sunday, March 1, 2026
The Machinery Behind the Magic: How Kotlin Turns suspend into State Machines

Kotlin Coroutines have become the standard for asynchronous programming on the JVM, offering developers a way to write sequential, readable code that can pause and resume without blocking threads. Most developers…

CoroutinesKotlin
Tuesday, February 24, 2026
What Is a Snapshot? Understanding Compose's Isolated State World

Jetpack Compose manages UI state through a system called Snapshots, a concept borrowed from database theory that enables isolated, concurrent access to shared mutable state. When you write var count by…

ComposeKotlin
Sunday, February 22, 2026
The Snapshot System: How Compose Tracks and Batches State Changes

Jetpack Compose revolutionized Android UI development with its declarative approach, but what makes it truly powerful is the sophisticated machinery underneath. At the heart of Compose's reactivity lies the Snapshot…

ComposeKotlin
Sunday, February 22, 2026
Compose Stability Analyzer 0.7.0: Recomposition Cascade and Live Heatmap

Jetpack Compose's stability system determines whether a composable function can be skipped during recomposition. When all parameters are stable, Compose can compare them and skip the function entirely if nothing…

ComposeKotlin
Friday, February 13, 2026
WorkManager Internals: How Guaranteed Background Work Actually Works, and Why Service Can't

Android's WorkManager has become the recommended solution for persistent, deferrable background work. Unlike transient background operations that live and die with your app process, WorkManager guarantees that enqueued…

CoroutinesArchitectureKotlin
Thursday, February 12, 2026
DerivedState: Hash-Based Invalidation Without Tracking Dependencies

Compose's derivedStateOf provides a way to create computed state that only triggers recomposition when the computed result actually changes. When you write val fullName by remember { derivedStateOf { "${firstName.value}…

ComposeKotlin
Tuesday, February 10, 2026
Compose Identity Mechanisms: How key() Transforms Into Movable Groups

Jetpack Compose manages UI state through a sophisticated identity system that determines when composables should be reused versus recreated. When you wrap content in key(userId) { UserCard(user) }, you're providing…

ComposeKotlin
Thursday, February 5, 2026
Shared Internals: Kotlin's New Proposal for Cross-Module Visibility

Kotlin's internal visibility modifier provides a useful mechanism for hiding implementation details within a module while exposing a clean public API. But as codebases grow and libraries modularize, a tension emerges:…

ArchitectureKotlin
Saturday, January 31, 2026
ViewModel: How Configuration Change Survival Actually Works

Android's ViewModel is one of the most widely used architecture components, yet its core survival mechanism remains a mystery to most developers. You annotate a class, call viewModels() in your Activity, and your state…

AndroidKotlin
Wednesday, January 28, 2026
Runtime Saveable: How Compose Preserves State Across Process Death

Jetpack Compose introduced a declarative paradigm for Android UI, but declarative doesn't mean stateless. User interactions create state like scroll positions, text field contents, and expanded sections that must…

ComposeKotlin
Monday, January 26, 2026
Introducing the Experimental Styles API in Jetpack Compose

Jetpack Compose's Modifier system has been the primary way to apply visual properties to composables. You chain modifiers like background(), padding(), and border() to build up the appearance and behavior of UI…

ComposeAndroidKotlin
Wednesday, January 21, 2026
CancellationException in Coroutines

Kotlin Coroutines introduced structured concurrency as a fundamental principle, ensuring that coroutines are properly scoped and cancelled when their parent scope completes. At the heart of this mechanism lies…

CoroutinesKotlin
Sunday, January 18, 2026
Exploring the Internal Mechanisms of Landscapist Core

Landscapist Core is a standalone image loading engine built from scratch for Kotlin Multiplatform. Unlike Landscapist's wrappers around Coil, Glide, and Fresco, Landscapist Core handles fetching, caching, decoding, and…

CoroutinesArchitectureKotlin
Sunday, January 18, 2026
The Three Phases: Composition, Layout, and Drawing

Jetpack Compose transforms declarative UI code into pixels on screen through a pipeline of three distinct phases: Composition, Layout, and Drawing. When you change a state variable, Compose doesn't redraw everything, it…

ComposeKotlin
Sunday, January 11, 2026
Building complex layouts with Layout() and understanding measure/placement

Building complex user interfaces in Jetpack Compose often requires going beyond the standard Box, Row, and Column layouts. While these composables handle most common scenarios beautifully, there are times when you need…

ComposeKotlin
Tuesday, January 6, 2026
Recompose Scopes: How Compose Knows What to Update

Jetpack Compose's declarative UI paradigm promises simplicity: you describe your UI as a function of state, and the framework handles updates automatically. But behind this elegant abstraction lies a sophisticated…

ComposeKotlin
Tuesday, January 6, 2026
How Coil works under the hood: LRU caching, performance trade-off, bitmap sampling

Image loading is one of the most critical yet complex aspects of Android development. While libraries like Glide and Picasso have served developers for years, Coil emerged as a modern, Kotlin-first solution built from…

CoroutinesPerformanceKotlin
Monday, November 24, 2025
How Compose Compiler infers stability and decide their types?

Jetpack Compose uses a smart recomposition system to optimize UI updates. At the heart of this optimization is stability inference - the compiler's ability to determine whether a type's values can change over time.…

ComposeKotlin
Monday, November 24, 2025
What is Remote Compose, and how can you leverage it to build server-driven UI

Building dynamic user interfaces has long been a fundamental challenge in Android development. The traditional approach requires recompiling and redeploying the entire application whenever the UI needs to change—a…

ComposeKotlin
Monday, November 24, 2025
Compose Compiler Stability Inference System

A comprehensive study of how the Compose compiler determines type stability for recomposition optimization. Table of Contents Compose Compiler Stability Inference System Table of Contents Chapter 1: Foundations 1.1…

ComposeAndroidKotlin
Friday, October 3, 2025
An Exploration of the Internal Mechanism of Crossfade Composable

In Jetpack Compose, Crossfade provides a simple and declarative way to animate the transition between two different UI states. When the targetState passed to it changes, it smoothly fades out the old content while…

ComposeArchitectureKotlin
Sunday, September 28, 2025
derivedStateOf Internals: The Cost of Observation / Why derivedStateOf is expensive?

The derivedStateOf API in Jetpack Compose provides a convenient mechanism for creating memoized state that automatically updates when its underlying dependencies change. While essential for performance optimization in…

ComposeArchitectureKotlin
Sunday, September 28, 2025
A Proposed Evolution for Kotlin's Error Handling

The Kotlin language has long been praised for its pragmatic approach to solving common programming challenges, particularly with its robust null-safety system. However, the domain of recoverable, predictable errors has…

Kotlin
Sunday, September 28, 2025
Google recently has official launched compose-runtime-annotation library

Google has recently launched the official runtime-annotation library, which serves a similar purpose to the community-built compose-stable-marker library. The idea behind compose stable markers originated from the…

ComposeKotlin
Sunday, August 31, 2025
A Study: Building a Simple Dependency Injection Container in Kotlin for Android

Dependency Injection (DI) is a core software design pattern that promotes loose coupling and enhances the testability and scalability of applications. While powerful libraries like Hilt and Koin are the standard for…

AndroidKotlin
Sunday, August 31, 2025
A Study of API Guidelines for Building Better Jetpack Compose Components

The Jetpack Compose ecosystem has grown exponentially in recent years, and it is now widely adopted for building production-level UIs in Android applications. We can now say that Jetpack Compose is the future of Android…

ComposeAndroidKotlin
Sunday, August 24, 2025
A Study: How Retrofit, written in Java, interpolates Kotlin's Coroutines to enable `suspend` functions

In the modern Android development ecosystem, the synergy between Kotlin and Java is quite still important since many of very traditional projects are written in Java. A prime example of this great interoperability is…

CoroutinesNetworkKotlin
Sunday, August 24, 2025

Like what you see?

Subscribe to Dove Letter to get weekly insights about Android and Kotlin development, plus access to exclusive content and discussions.