Assembling the digest… kotlin-digest
TRENDING

EDITION 2026·W31
27 JULY 2026
82 articles · 8 sources
Archive →

The Kotlin world, assembled weekly, for Android engineers.

6 chapters · ordered by topic score · About & Contributing
Filter

FOCUS — select topics to show only those chapters.

TRENDING
███▇▇▇▇ compose-multiplatform 87 ███▇▇▇▇ compose 85 ███████ kotlin 78 ███▇▇▇▇ jetbrains 40 ███▇███ google-io 34 ██▇▇▇▇▇ jetpack 31 ██▇▇▆▆▆ navigation 28 ██▇▇▆▆▆ kmp 27 ████▇▇▇ android-developers 26 ███████ clean-architecture 24 ██▇▇▇▇▆ material3 23 ███▇▇▇█ architecture 18 ▇████▇▇ ktor-server 12 ████▇▇▆ testing 11 ██▇▇▆▇▆ context-receivers 10 ▅▅▆▅███ coroutines 10 ████▇▇▆ gradle-plugin 10 █▇▇▇██▇ kotlin-stdlib 8 ██▇▇▆▆▅ build-logic 7 ██▇▇█▇▇ shot 7 ███▇▇▇▇ compose-multiplatform 87 ███▇▇▇▇ compose 85 ███████ kotlin 78 ███▇▇▇▇ jetbrains 40 ███▇███ google-io 34 ██▇▇▇▇▇ jetpack 31 ██▇▇▆▆▆ navigation 28 ██▇▇▆▆▆ kmp 27 ████▇▇▇ android-developers 26 ███████ clean-architecture 24 ██▇▇▇▇▆ material3 23 ███▇▇▇█ architecture 18 ▇████▇▇ ktor-server 12 ████▇▇▆ testing 11 ██▇▇▆▇▆ context-receivers 10 ▅▅▆▅███ coroutines 10 ████▇▇▆ gradle-plugin 10 █▇▇▇██▇ kotlin-stdlib 8 ██▇▇▆▆▅ build-logic 7 ██▇▇█▇▇ shot 7

EDITION 2026·W31
27 JULY 2026
82 articles · 8 sources

The Kotlin world, assembled weekly, for Android engineers.

6 chapters · ordered by topic score · About & Contributing
Cover Story · Kotlin Core
Medium Kotlin Tag 30 Jul

Delegation in Kotlin: Write Cleaner, More Reusable Code Without Inheritance

Explains Kotlin's by-keyword delegation for interfaces (auto-generated forwarding methods) and properties (lazy, observable, vetoable, map-backed, and custom getValue/setValue delegates). Connects the pattern to everyday Android usage like viewModels(), navArgs(), and mutableStateOf via remember.

▸ INTERFACE DELEGATION
class UserPrinter( private val printer: Printer ) : Printer by printer
kotlinkotlin-stdlibcomposeviewmodel
Trending · Contents
compose-multiplatform███▇▇▇▇
compose███▇▇▇▇
kotlin███████
jetbrains███▇▇▇▇
google-io███▇███
jetpack██▇▇▇▇▇
navigation██▇▇▆▆▆
kmp██▇▇▆▆▆
android-developers████▇▇▇
clean-architecture███████
material3██▇▇▇▇▆
architecture███▇▇▇█

Kotlin Core

26 stories

Compose & UI

17 stories

Android Platform

19 stories

KMP

5 stories

Architecture

4 stories

Build & Tooling

4 stories

Community

4 stories

Testing

1 stories

Backend / Server

1 stories

Networking

1 stories

Interlude
Good Code
Good Code xkcd · Randall Munroe

You can either hang out in the Android Loop or the HURD loop.

§ 01

Kotlin Core

Medium Kotlin Tag 30 Jul

Delegation in Kotlin: Write Cleaner, More Reusable Code Without Inheritance

Explains Kotlin's by-keyword delegation for interfaces (auto-generated forwarding methods) and properties (lazy, observable, vetoable, map-backed, and custom getValue/setValue delegates). Connects the pattern to everyday Android usage like viewModels(), navArgs(), and mutableStateOf via remember.

▸ INTERFACE DELEGATION
class UserPrinter( private val printer: Printer ) : Printer by printer
kotlinkotlin-stdlibcomposeviewmodel
Medium Kotlin Tag 27 Jul

Data Classes in Kotlin: Say Goodbye to Boilerplate Code

An introductory tour of Kotlin data classes explaining the auto-generated equals(), hashCode(), toString(), copy(), and componentN() functions, with Android examples spanning Retrofit response models, Room entities, and Compose/MVI UI state updated via copy().

▸ COPY UI STATE
data class LoginUiState( val isLoading: Boolean, val error: String?, val userName: String ) state = state.copy(isLoading = true)
kotlinroomcomposeretrofit
Medium Kotlin Tag 28 Jul

Sealed Classes in Kotlin: Build Safer and More Predictable Applications

Beginner walkthrough of Kotlin sealed classes and sealed interfaces, showing how to model restricted state hierarchies (Loading/Success/Error) for exhaustive when-expressions instead of enums or raw strings. Covers real Android patterns for ViewModel UI state, API results, navigation destinations, and Compose rendering in MVVM/MVI style.

▸ EXHAUSTIVE WHEN STATE
sealed class LoginState { object Loading : LoginState() object Success : LoginState() data class Error(val message: String) : LoginState() } fun handleState(state: LoginState) = when (state) { is LoginState.Loading -> println("Loading...") is LoginState.Success -> println("Login Successful") is LoginState.Error -> println(state.message) }
sealed-classeskotlinmvvmcompose
Medium Kotlin Tag 30 Jul

Kotlin 2.4.0: New Features That Confuse Patrick (Again)

Walks through headline Kotlin 2.4.0 changes: experimental collection literals using bracket syntax, context parameters graduating to stable with explicit-argument disambiguation, new isSorted()-family stdlib checks, and kotlin.uuid.Uuid reaching stable for cross-platform IDs. Framed as comedic dialogue but covers real compiler flags and APIs.

▸ COLLECTION LITERALS
val shapes: MutableList<String> = ["triangle", "square", "circle"] println(shapes) // [triangle, square, circle]
kotlincontext-receiverskotlin-stdlibkmp
Kotlin Blog 28 Jul

KotlinLLM is Going Open Source

JetBrains open-sourced KotlinLLM, an IntelliJ plugin letting Kotlin/JVM code call asLlm/mockLlm 'Smart macros' whose generated bodies persist as ordinary, reviewable Kotlin source rather than hitting an LLM every call. Evaluated on Spring Petclinic and a GitHub issue-triage prototype (~89% recall), it aims to make runtime LLM delegation explicit and testable.

▸ SMART MACRO CALL
val issuesApiUrl: String = asLlm(repoInput, hint = "GitHub API URL: get all issues, including closed") val issues: List<Issue> = asLlm(response, hint = "Return all beginner-friendly issues for this repository")
kotlinjetbrains
Medium Android Tag 1 Aug

Understanding Coroutines in Android

Walks through how suspend functions compile into continuation-passing state machines, using decompiled bytecode to show why coroutines are cheaper than OS threads. Covers CoroutineScope, Job vs SupervisorJob, launch vs async/await exception timing, and the four standard Dispatchers.

▸ SUPERVISORJOB SCOPE
val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
coroutineskotlinandroid-developers
Medium Kotlin Tag 29 Jul

From Object to Any — Why Kotlin Replaced Java’s Base Class

Explains why Kotlin uses Any instead of java.lang.Object as its root type: platform-agnostic design for JVM/JS/Native, dropping JVM-only methods like wait()/notify(), a non-nullable default (Any? for nullable), and compiler mapping of Any to Object in JVM bytecode for zero-overhead Java interop.

kotlinkotlin-stdlibkmp
Medium Kotlin Tag 28 Jul

I Built an AI-Powered Banglish Keyboard That Converts Text Instantly — Here’s How

Independent Kotlin/Python project pairing an Android app with a Windows tray tool that converts Banglish (Bengali written in Roman script) to Bengali or English via Groq's free llama-3.3-70b-versatile API. The Android client is plain Kotlin calling the REST endpoint directly through OkHttp.

kotlinandroid-developersokhttp
Medium Kotlin Tag 28 Jul

Hello Kotliners,

A Kotlin Academy newsletter issue explaining why GlobalScope causes memory leaks and poor testability compared to structured scopes like viewModelScope, covering ConcurrentHashMap and its unsynchronized extension functions like getOrPut, and clarifying that Compose modifiers act as ordered decorators, not parameters.

coroutinescomposekotlin-stdlib
Medium Kotlin Tag 31 Jul

Visibility Modifiers in Kotlin: Mastering Access Control

Walks through Kotlin's four visibility modifiers—public, private, protected, and internal—using a bank-account example, then maps each onto real Android patterns like repositories, singletons, and private constructors paired with companion-object factories.

▸ PRIVATE CONSTRUCTOR FACTORY
class User private constructor() { companion object { fun create() = User() } }
kotlinclean-architecture
Medium Kotlin Tag 28 Jul

How We Built an MCP Server in Kotlin — Keeping Stdio Clean for JSON-RPC

A walkthrough of building an MCP server in Kotlin using the stdio transport, warning that any stray println or logging framework output corrupts JSON-RPC framing; the fix captures System.out before Logback initializes and redirects normal output to stderr.

▸ CAPTURE STDOUT FIRST
val mcpOutput = System.out System.setOut(System.err) val transport = StdioServerTransport( input = System.`in`.asSource().buffered(), output = mcpOutput.asSink().buffered() )
kotlincoroutineskotlin-backend
Medium Kotlin Tag 28 Jul

The Ultimate Guide to Kotlin Coroutine Builders for Android Developers

A guide to Kotlin's coroutine builders (launch, async, runBlocking, withContext, coroutineScope, supervisorScope), covering their return types, start modes (including CoroutineStart.LAZY), and the key difference that launch throws exceptions eagerly while async defers them until await().

▸ ASYNC EXCEPTION TIMING
val deferred = scope.async { throw IllegalStateException("boom") } // nothing thrown yet... deferred.await() // exception surfaces here
coroutineskotlin
Medium Kotlin Tag 29 Jul 🔒 Member-only

Part 1 — Kotlin Language Fundamentals

▸ VAL VS VAR
val items = mutableListOf(1, 2) items.add(3) println(items) // [1, 2, 3] // items = mutableListOf() -> won't compile val frozen: List<Int> = listOf(1, 2) // no add() on the interface
kotlinkotlin-stdlib
Medium Kotlin Tag 29 Jul

Enum Classes in Kotlin: A Complete Guide with Real-World Examples

Beginner guide to Kotlin enum classes covering constructor properties, per-constant method overrides, built-in name/ordinal, the entries iteration API, and valueOf() string parsing. Closes with guidance on choosing enums for fixed constant sets versus sealed classes when states carry different data.

▸ ENUM PER-CONSTANT OVERRIDE
enum class Operation { ADD { override fun apply(a: Int, b: Int) = a + b }, SUBTRACT { override fun apply(a: Int, b: Int) = a - b }; abstract fun apply(a: Int, b: Int): Int } println(Operation.ADD.apply(10, 5)) // 15
kotlinsealed-classes
Medium Kotlin Tag 27 Jul

Nullable & Non-Nullable Variable

A short beginner explainer, written in Burmese, on Kotlin's null safety system: nullable type syntax with the question-mark suffix, the compile-time distinction between String and String?, and using the safe call operator to access members of nullable variables.

▸ SAFE CALL OPERATOR
var name: String? = "CodeWall Technologies" name = null var number: Int? = null println(name?.length)
kotlin
Medium Kotlin Tag 28 Jul

Kotlin Inlining Masterclass: inline, noinline, & crossinline Demystified

Walks through Kotlin's inline, noinline, and crossinline modifiers with bytecode-level before/after comparisons, showing how inlining avoids lambda allocations, enables non-local returns, and pairs with reified type parameters to bypass JVM type erasure.

▸ REIFIED TYPE CHECK
inline fun <reified T> isType(value: Any): Boolean { return value is T } fun main() { println(isType<String>("hello")) println(isType<Int>("hello")) }
kotlin
Medium Kotlin Tag 31 Jul

Chaos Wall — I turned chaos theory into a live wallpaper

An open-source Kotlin live wallpaper that renders a real-time double-pendulum chaos simulation using Hamiltonian dynamics and Runge-Kutta integration instead of looping video effects. Free on Play Store with source on GitHub, no network access or tracking.

kotlin
Medium Kotlin Tag 30 Jul

Object Declarations, Companion Objects & Singleton in Kotlin: A Complete Guide

Explains why Kotlin has no static keyword and how object declarations, companion objects, and the singleton pattern replace it, with Android examples such as a shared Retrofit client, a session manager, factory methods, and companion objects implementing interfaces.

▸ FACTORY COMPANION OBJECT
class User private constructor(val name: String) { companion object : Factory<User> { override fun create() = User("Guest") } } val guest = User.create()
kotlin
Medium Kotlin Tag 31 Jul

Kotlin Coroutines: Part 4 — Asynchronous Streams with Kotlin Flows

Part 4 of a Kotlin Coroutines series introduces Flow as a cold asynchronous stream, contrasting a suspend function's single return with continuous emission via emit, collect, and operators like filter and map. Also distinguishes hot flows: SharedFlow and StateFlow.

▸ COLD FLOW BUILDER
fun ordersFlow(): Flow<Order> = flow { while (true) { val order = takeNextOrder() emit(order) delay(1000) } }
coroutinesflows
Android Developers Blog 27 Jul

How R8 made Kotlin Coroutines on Android 2x faster

Starting with AGP 9.2.0, R8 rewrites kotlinx.atomicfu's Atomic*FieldUpdater calls into Unsafe-based operations, cutting the reflection overhead that made compareAndSet ~2.7x slower than java.util.concurrent.atomic, yielding up to 2x faster coroutine launch and cancellation on Android.

▸ ATOMICFU BENCHMARK
val atomicReference = java.util.concurrent.atomic.AtomicReference(false) val atomicRef = kotlinx.atomicfu.atomic<Boolean>(false) atomicReference.compareAndSet(true, false) // 50.7 ns atomicRef.compareAndSet(true, false) // 135 ns pre-fix
coroutinesr8-proguardandroid-api
Medium Kotlin Tag 28 Jul

Kotlin Coroutines: coroutineScope vs supervisorScope — Simply Explained

Contrasts coroutineScope, where one child's failure cancels all its siblings, with supervisorScope, where failures stay isolated, using batch-upload versus dashboard-widget examples. Notes both only enforce structured concurrency locally and won't fix leaks if launched from GlobalScope or an unbound scope.

▸ SUPERVISOR SCOPE ISOLATION
suspend fun loadDashboard() = supervisorScope { launch { loadWeatherWidget() } launch { loadNewsWidget() } // throws launch { loadStockWidget() } } // weather and stock widgets still complete
coroutines
Medium Kotlin Tag 29 Jul

Kotlin Coroutines Are Cooperative, Not Preemptive (And Why It Matters)

Explains that Kotlin coroutines are cooperative rather than preemptive: without a suspension point like yield() or delay(), a busy loop can monopolize a dispatcher's worker thread and starve other coroutines. Highlights why explicit suspension is required to avoid CPU starvation and stalled cancellation.

▸ EXPLICIT YIELD POINT
launch { while (true) { doSomeWork() yield() } }
coroutines
Medium Kotlin Tag 1 Aug

Kotlin Coroutine Context: A Complete Beginner-to-Advanced Guide

Explains Kotlin's CoroutineContext: how Job, Dispatcher, CoroutineName, and CoroutineExceptionHandler combine via the + operator, how child coroutines inherit and override parent context, and how withContext temporarily swaps dispatchers. A practical reference for reasoning about coroutine execution and cancellation.

▸ COMBINE COROUTINE CONTEXT
launch( Dispatchers.IO + CoroutineName("API") + handler ) { // work }
coroutines
Interlude
Code Quality
Code Quality xkcd · Randall Munroe

I honestly didn't think you could even USE emoji in variable names. Or that there were so many different crying ones.

§ 02

Compose & UI

Android Developers Blog 28 Jul

Celebrating 5 years of Jetpack Compose

Google marks five years since Jetpack Compose 1.0, now used in over 68% of the top 1,000 Android apps, tracing its evolution from basic layouts to Compose for TV, Wear OS, Glance, and adaptive APIs like FlexBox and Grid. Confirms a Compose-first direction as the Views toolkit enters maintenance mode.

composejetpackandroid-developersmaterial3
Proandroiddev 27 Jul

How Many Trees Does Your Framework Need?

Fourth part of a series comparing Android Views, Jetpack Compose and Flutter by how many trees each uses to track configuration, identity and behavior: Views use one object for all three, Compose splits a slot-table bookkeeping structure from the LayoutNode tree, and Flutter separates Widgets, Elements and RenderObjects into three. Clarifies why Compose sits inside a single classic Android View for the final render pass.

composearchitecturekmp
Proandroiddev 27 Jul

Understanding retain: A New Way to Retain State in Jetpack Compose

Explains Compose Runtime's new retain API, which keeps plain Kotlin objects alive across configuration changes without extending ViewModel or any Android lifecycle class. Compares it against remember, rememberSaveable and ViewModel, arguing it suits reusable, framework-independent, multiplatform-friendly state holders but doesn't replace ViewModel features like viewModelScope, SavedStateHandle or Hilt integration.

▸ NEW RETAIN API
class CounterHolder { var count by mutableStateOf(0) } @Composable fun Counter() { val holder = retain { CounterHolder() } Button(onClick = { holder.count++ }) { Text("Count: ${holder.count}") } }
composeviewmodelkmp
Medium Kotlin Tag 31 Jul 🔒 Member-only

Android Developers: Stop Making These 10 Mistakes in 2026

▸ ANTI PATTERN SIDE EFFECT
@Composable fun ProfileScreen(viewModel: ProfileViewModel) { viewModel.loadProfile() // may run again on recomposition val state by viewModel.uiState.collectAsStateWithLifecycle() ProfileContent(state) }
composearchitecturecoroutines
Medium Kotlin Tag 30 Jul

The Jetpack Compose Mistakes I Made in My First Big Migration

Recounts pitfalls from a first production Jetpack Compose migration: picking screens whose data layer stayed tangled with legacy Fragments and ViewModels, plus imperative setContent calls that bypassed recomposition. Fixes shown include one observable ViewModel state collected via collectAsStateWithLifecycle and hoisting lambdas to cut unnecessary recomposition.

▸ LIFECYCLE-AWARE STATE
composeView.setContent { val user by viewModel.user.collectAsStateWithLifecycle() UserProfileScreen(user = user) }
composearchitectureviewmodelmvvm
Medium Android Tag 2 Aug

I rebuilt my flashlight app five years later

Indie developer account of rebuilding a flashlight app from scratch in Jetpack Compose with Material 3 and targetSdk 36 after losing the original source. Covers a rhythm-recording strobe editor, seizure-safety warnings, widget/tile shortcuts, and 16-language localization.

composematerial3
Proandroiddev 31 Jul

Beyond Semantics: How to Test Internal Compose State with snapshotFlow

Shows how to use Compose's snapshotFlow to bridge internal Compose State (like scroll offsets or Pager position) into a Kotlin Flow for reliable UI testing, replacing flaky Thread.sleep()/polling with composeTestRule.waitUntil observing state that the Semantics Tree can't reach.

▸ SNAPSHOTFLOW BRIDGE
LaunchedEffect(listState) { snapshotFlow { listState.firstVisibleItemIndex } .distinctUntilChanged() .filter { it > 5 } .collect { index -> println("User is at index: $index") } }
composetestingflows
Medium Kotlin Tag 31 Jul

Polishing the UI: Shared Element Transitions and Custom Shimmers

Walks through two Jetpack Compose animation techniques: a reusable shimmer Modifier built on an infinite gradient transition for loading skeletons, and SharedTransitionLayout-based hero image transitions between a list and detail screen keyed by URL.

▸ SHARED ELEMENT IMAGE
AsyncImage( model = imageUrl, modifier = Modifier .fillMaxWidth() .height(200.dp) .sharedElement( rememberSharedContentState(key = "image/${article.url}"), animatedVisibilityScope = animatedContentScope, ), contentScale = ContentScale.Crop, )
composeanimation
Medium Kotlin Tag 28 Jul

State Management in Jetpack Compose: A Practical Guide

Walks through Compose state fundamentals: mutableStateOf, remember, and hoisting stateful composables into stateless, reusable ones. Covers a ViewModel + StateFlow pattern for screen state, SharedFlow for one-time navigation events, and why collectAsStateWithLifecycle() beats collectAsState().

▸ HOIST STATE UP
@Composable fun SearchBar( query: String, onQueryChange: (String) -> Unit ) { OutlinedTextField( value = query, onValueChange = onQueryChange, label = { Text("Search") } ) }
composeviewmodelmvvm
Lib Compose Multiplatform 1 Aug

v1.12.10-alpha01+dev4589: Details

The 1.12.0-beta03 release fixes several iOS crashes (cancelling text input, a disposed accessibility element, an iOS 14 frame-rate crash), a desktop VerifyError build failure, and Web/WASM accessibility-sizing and scroll regressions, and updates Compose Hot Reload. The rest are nightly dev builds.

▸ Also this week · 10 more builds
compose-multiplatform
Medium Android Tag 28 Jul

Live Gift Animation Formats, Part 3: What Makes ByteDance’s PAG So Powerful?

Third part of a series comparing live-gift animation formats, covering ByteDance's open-source PAG (Portable Animated Graphic). Explains its three mixable encoding modes (vector, bitmap sequence, video sequence) and shows PAGFile/PAGPlayer/PAGView integration on Android, iOS, and Web, plus a RecyclerView memory-leak gotcha.

▸ PLAY PAG ANIMATION
val pagView = findViewById<PAGView>(R.id.pag_view) val pagFile = PAGFile.Load(assets, "gifts/rocket.pag") pagView.composition = pagFile pagView.setRepeatCount(1) // 0 = loop forever pagView.play()
animationios-interop
Interlude
Bad Code
Bad Code xkcd · Randall Munroe

"Oh my God, why did you scotch-tape a bunch of hammers together?" "It's ok! Nothing depends on this wall being destroyed efficiently."

§ 03

Android Platform

Medium Kotlin Tag 2 Aug

Building Home Screen Widgets in Android with Jetpack Glance (and Keeping Them Up to Date)

Walks through building Android home screen widgets with Jetpack Glance, a Compose-style API that compiles to RemoteViews. Covers GlanceModifier's curated subset, the GlanceAppWidget/GlanceAppWidgetReceiver pair, data loading in provideGlance, and manifest registration.

▸ GLANCE WIDGET SETUP
class QuickNotesWidget : GlanceAppWidget() { override suspend fun provideGlance(context: Context, id: GlanceId) { val latestNote = NoteRepository.getLatestNote(context) provideContent { GlanceTheme { WidgetContent(latestNote) } } } }
jetpackcomposeandroid-api
Medium Kotlin Tag 28 Jul

How to build an Android launcher from scratch (with Kotlin & Jetpack Compose)

Builds a functional Android home-screen launcher in Kotlin and Compose: the HOME/DEFAULT intent filter that qualifies an app as a launcher, a transparent windowShowWallpaper theme, Android 11+ package-visibility queries, and rendering the installed-app grid via PackageManager. Uses Kotlin 2.4.10, AGP 9.2.1 and a Gradle version catalog.

android-apicomposegradleversion-catalog
Medium Android Tag 28 Jul

Improve your Android accessibility with toggleables

Shows how to group a custom Switch-style View (icon, title, subtitle, SwitchCompat) into one Talkback-focusable unit instead of separate stops. Covers disabling child importantForAccessibility, overriding onInitializeAccessibilityNodeInfo/Event to report as a Switch, and exposing state via setStateDescription.

▸ ANNOUNCE AS SWITCH
override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo?) { super.onInitializeAccessibilityNodeInfo(info) info?.className = android.widget.Switch::class.java.name }
android-apikotlin
Medium Kotlin Tag 1 Aug

What is JNI and Why Does Android Need It?

Explains why Android needs JNI: it bridges Kotlin/Java running on ART to native C/C++ libraries like the Bluetooth stack, camera, and SQLite, and gives finer memory control for performance-critical code. Walks through Android Studio's Native C++ template, external fun, System.loadLibrary, and the generated JNIEXPORT function.

▸ DECLARE EXTERNAL JNI FUN
external fun stringFromJNI(): String companion object { init { System.loadLibrary("jni") } }
android-apikotlin
Proandroiddev 27 Jul

The Complete Guide to Getting Started with Android XR Development

A roadmap for Android developers starting Android XR: distinguishes immersive (headsets, wired glasses) from augmented (audio/display glasses) experiences, and recommends Jetpack XR SDK plus Kotlin, Compose and existing Android skills as the fastest entry path over Unity, OpenXR or WebXR. Also flags Jetpack Compose Glimmer, a Compose toolkit built for glanceable display-glasses UI.

android-apiadaptive-uijetpack
Medium Kotlin Tag 28 Jul

Android Data Synchronization: Beyond Room & WorkManager

Goes beyond basic Room-plus-WorkManager advice to cover synchronization engine design: handling concurrent sync triggers with single-flight locking, offline-first writes, partial-failure retries, process death recovery, conflict resolution, soft deletes, pagination/delta sync, and idempotent uploads.

roomworkmanagerarchitecturecoroutines
Medium Kotlin Tag 30 Jul

Android App Links: From https://xyz.com/word/hello to Your Android App

Walks through wiring Android App Links end to end: declaring intent filters, generating assetlinks.json with the Play App Signing SHA-256 fingerprint, hosting it correctly under Nginx without an SPA fallback swallowing it, and verifying deep links in a Kotlin Multiplatform app.

android-apikmp
Medium Kotlin Tag 30 Jul

12/28: How an Activity Becomes an Actual Window on Screen

Traces how Android's ViewRootImpl registers a window with WindowManagerService through a Binder call, using a per-Activity token to authorize the window. Explains why invalid or dead tokens cause BadTokenException and "Activity has leaked window" crashes, tying window lifecycle to Activity lifecycle.

android-apiandroid-developers
Medium Kotlin Tag 31 Jul

Android 16'ya Geçiş: targetSdkVersion 36 Öncesi Bilmemiz Gerekenler

Explains that Google Play will require apps to target Android 16 (API level 36) for new submissions and updates starting August 31, 2026. Written in Turkish, it outlines what developers should check before raising targetSdkVersion.

android-apiandroid-developers
Proandroiddev 27 Jul

Dissecting Expanded Dark Theme

Investigates Android 16's Expanded Dark Theme by comparing a light-only app's auto-generated dark mode against a hand-built Material 3 dark theme across fourteen UI patterns. Finds auto-dark preserves WCAG contrast ratios on plain text but underperforms by 1.8-2.5x on saturated colors and mid-tone grays, tracing the gap to HWUI's lightness-inversion formula in the renderer source.

android-apimaterial3
Medium Kotlin Tag 1 Aug

Offline Sync Conflicts on Android: Keep Pending Edits Safe and Choose a Policy You Can Explain

Third part of a Room offline-first series tackling sync conflicts: adds a monotonic version field to entities and a ConflictResolver deciding whether a pull should overwrite local rows, never clobbering pending outbox edits. Includes unit tests and a server-wins policy with 409 handling.

▸ CONFLICT RESOLVER
fun shouldAcceptRemote( localVersion: Long, remoteVersion: Long, hasPendingLocalChanges: Boolean, ): Boolean { if (hasPendingLocalChanges) return false return remoteVersion >= localVersion }
roomworkmanagerarchitecture
Medium Kotlin Tag 30 Jul

Room Database in Android: From Your First Entity to Production-Ready Offline Storage

A step-by-step Kotlin guide to Android's Room library: Entity/DAO/Database setup with KSP, Flow-based observation versus suspend calls, relations and indexes, and production habits like committed schema exports and safe migrations that avoid wiping user data on upgrade.

▸ ROOM ENTITY DAO
@Entity(tableName = "notes") data class NoteEntity( @PrimaryKey val id: String, val title: String, val updatedAt: Long, ) @Dao interface NoteDao { @Query("SELECT * FROM notes ORDER BY updatedAt DESC") fun observeAll(): Flow<List<NoteEntity>> @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun upsert(note: NoteEntity) }
roomflowstesting
Medium Android Tag 28 Jul

How I Updated a Legacy Android App to Support 16 KB Page Size

Describes diagnosing and fixing Google Play's 16 KB memory page size compatibility warning in a pure-Java legacy app, tracing incompatible native .so files to bundled third-party SDKs like Realm and updating build tooling and dependencies to resolve it.

android-apigradle
Medium Kotlin Tag 27 Jul

11/28: The Compositor You’ve Never Seen Is Drawing Your App

Traces how a rendered Android frame actually reaches the screen: an app's Surface hands buffers to a BufferQueue, and the system process SurfaceFlinger consumes and composites every visible surface's latest buffer into one final image via Binder. Clarifies why status bars and wallpapers appear layered around app content the app never drew.

android-api
Medium Kotlin Tag 27 Jul

Mobile DevTools: Android üçün cibinizdə network debugger

Announces Mobile DevTools, a new Google Play app billed as a pocket network debugger for Android developers. Post is written in Azerbaijani; the scraped page content is mostly Medium's own JS/routing boilerplate with no technical detail on the debugger itself.

android-api
Proandroiddev 31 Jul

UPI Payment Flow on Android: From URI Construction to Result Verification

Explains building a UPI (India's payment network) flow on Android in Kotlin: constructing the payment URI with Uri.Builder, launching the external UPI app via the modern Activity Result API instead of deprecated onActivityResult, and defensively parsing and validating the key-value response string for success, failure, or cancellation.

▸ BUILD UPI URI
fun buildUpiUri( payeeVpa: String, payeeName: String, amount: String, transactionRef: String, note: String ): Uri { return Uri.Builder() .scheme("upi") .authority("pay") .appendQueryParameter("pa", payeeVpa) .appendQueryParameter("pn", payeeName) .appendQueryParameter("am", amount) .build() }
android-api
Medium Kotlin Tag 31 Jul

Hardening Android Apps: Secure Request Signing with EC Keys

Details the :security module of a modular Android news app that signs every authenticated request with a hardware-backed secp256r1 EC key from AndroidKeyStore, attaching signature, timestamp, and public-key headers via an OkHttp AuthInterceptor. Also covers why AndroidKeyStore can't be unit-tested directly under Robolectric and how a SecurityManager interface seam works around it.

▸ SIGN WITH EC KEY
override fun signData(data: String): String { return try { val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE).apply { load(null) } val privateKey = keyStore.getKey(KEY_ALIAS, null) as PrivateKey val signature = Signature.getInstance("SHA256withECDSA") signature.initSign(privateKey) signature.update(data.toByteArray()) Base64.encodeToString(signature.sign(), Base64.NO_WRAP) } catch (e: Exception) { "" } }
android-apiokhttp
§ 04

KMP

Medium Kotlin Tag 1 Aug

splitcash — Kotlin Multiplatform Expense Tracker

Developer overview of splitcash, a Kotlin Multiplatform expense-tracking app sharing UI via Compose Multiplatform, a Ktor/sqldelight backend, and shared DTOs, deep-link parsing, validation, and a sync-delta protocol between client and server modules.

kmpcompose-multiplatformktor-serverkotlin
Kotlin Blog 31 Jul

Know Kotlin? Ship It Everywhere and Win at Shipaton 2026

JetBrains announces its Ship Kotlin Everywhere award at RevenueCat's Shipaton 2026 hackathon (Aug 1-Sep 30), offering a $30,000 prize pool for apps built with Kotlin Multiplatform and Compose Multiplatform across Android, iOS, desktop, and web, plus free IntelliJ IDEA Ultimate and Junie access.

kmpcompose-multiplatformkotlin
Medium Kotlin Tag 27 Jul

Yet Another Way to KMP: One Pattern, Three Seams

A KMP architecture case study porting an 8,000-line 2013 Java game to Kotlin Multiplatform with Compose Multiplatform UI, showing how thin commonMain interfaces (graphics, hardware sensors) and a shared @Composable overlay stop platform-specific logic like steering sensitivity from drifting between Android and iOS.

▸ SHARED SENSOR SEAM
interface HardwareSensors { // Device pitch in m/s^2; 0 = flat, positive = tilted forward val devicePitch: Float }
kmpcompose-multiplatformios-interop
Medium Kotlin Tag 27 Jul

Introducing Ferret: A Network Inspector Built for Kotlin Multiplatform

Introduces Ferret, a Ktor plugin that captures HTTP and WebSocket traffic from a shared Kotlin Multiplatform networking layer into an on-device inspector for Android and iOS, replacing single-platform tools like Chucker or Flipper without proxies or certificates.

▸ INSTALL FERRET PLUGIN
val client = HttpClient(OkHttp) { install(Ferret) { context = applicationContext // Android only } }
kmpktorios-interop
§ 05

Architecture

Proandroiddev 31 Jul

Android Architecture Is Quietly Moving Beyond ViewModel as a State Holder

Argues Android architecture is moving UI state (text fields, dialog visibility, scroll position) out of ViewModel into remember/rememberSaveable, while navigation arguments move into Navigation 3's NavKey, leaving ViewModel as a business-logic state holder that produces UI state from repositories.

▸ NAVKEY STATE OWNERSHIP
data class UserDetail(val userId: Long) : NavKey var query by rememberSerializable { mutableStateOf("") }
viewmodelarchitecturecomposenavigation
Proandroiddev 1 Aug

Android Modularization That Holds Up: 5 Lessons for Large Codebases

Argues module count is a poor proxy for real modularization, proposing to design Gradle module boundaries around change boundaries rather than folder layers. Covers dependency-direction rules, narrow feature-boundary contracts, convention plugins, and automated checks for keeping large Android codebases maintainable.

architecturegradleclean-architecture
Medium Kotlin Tag 1 Aug

Must-Have Skills for Android Development: A Senior Developer’s Practical Guide

Broad career-style checklist of skills a senior Android engineer should have: Kotlin fluency, Compose/unidirectional UI architecture, lifecycle fundamentals, MVVM/MVI state management, offline-first networking, coroutines, testing strategy, and debugging/observability practices.

architecturemvvmtesting
Medium Kotlin Tag 27 Jul

50 Android Interview Questions for Junior Developers (0–2 Years)

A list of interview questions for junior Android developers spanning Kotlin basics, Activity/Fragment lifecycles, MVVM architecture, Retrofit networking, Room storage, coroutines, and dependency injection, framed around what interviewers probe for beyond memorized definitions.

mvvmcoroutinesroomretrofit
§ 06

Build & Tooling

Medium Kotlin Tag 29 Jul

R8 Just Made Kotlin Coroutines on Android 2x Faster and You Didn’t Have to Touch a Single Line

Explains how R8 in AGP 9.2 rewrites kotlinx.atomicfu's AtomicReferenceFieldUpdater calls to raw Unsafe field access, removing reflective overhead that dominated coroutine launch and cancel costs behind Modifier.clickable and LaunchedEffect—roughly doubling coroutine throughput without any code changes.

▸ ATOMICFU BENCHMARK
class AtomicBenchmark { private val jucRef = java.util.concurrent.atomic.AtomicReference(false) private val atomicFuRef = kotlinx.atomicfu.atomic(false) fun benchmarkJuc() = jucRef.compareAndSet(true, false) fun benchmarkAtomicFu() = atomicFuRef.compareAndSet(true, false) }
r8-proguardcoroutinescomposegradle
Lib Ksp 31 Jul

2.3.11: Rename coroutines core-jvm alias to coreJvm per review

KSP 2.3.11 renames the coroutines core-jvm version catalog alias to coreJvm so it is no longer a prefix of another alias, removing the asProvider disambiguation workaround needed at every use site.

kspversion-catalogcoroutinesgradle
Medium Kotlin Tag 1 Aug

How to Add Independent Git Third-Party Libraries in Modern Android Studio with JitPack

Shows how to pull a Git-hosted third-party Compose UI library into an Android project via JitPack, including adding the repository to settings.gradle.kts and declaring the dependency through the Gradle version catalog.

▸ ADD JITPACK REPO
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven { url = uri("https://jitpack.io") } } }
gradleversion-catalog
§ 07

Community

Jetbrains Blog 29 Jul

Qodana 2026.2: More Security, Better Coverage, Less Configuration

JetBrains' Qodana 2026.2 adds pull-request-level code coverage highlighting for changed lines, auto-detects Jacoco/Kover and other coverage report locations without extra config, and expands SAST with multi-file taint analysis, custom OpenGrep rules, and a new SABER benchmark runner for scoring findings against public vulnerability datasets.

jetbrainstestinggradle
Android Developers Blog 29 Jul

Delivering safer, age-appropriate experiences on Google Play

Google announces global expansion of the Play Age Signals API, letting parents share a child's age range via Family Link so Android apps can tailor content and features per age group instead of applying one-size-fits-all rules. Rolls out to Australia and Canada by mid-August, globally later in 2026.

android-developersandroid-api
Medium Android Tag 1 Aug

The Hidden Security Risks of Third-Party Libraries

Overview of Android supply-chain risk that distinguishes dev-only libraries (Mockito) from shipped ones (OkHttp, Glide), citing a pre-2.7.5 OkHttp TLS chain-pollution bug that allowed SSL-pinning bypass, plus unmaintained-dependency and license-compliance concerns for LGPL-style code.

android-developersokhttp
§ 08

Testing

Medium Android Tag 28 Jul

Why Android Emulators Get Slow So Fast

Explains why Android emulators bog down machines: each instance is a full virtual device with its own system image, memory, and storage, and ARM-to-x86 instruction translation adds overhead. Gives a rule of thumb for choosing emulator vs. physical device vs. remote device farm when testing.

testing
§ 09

Backend / Server

Kotlin Blog 29 Jul

Secure Your APIs: OAuth2 and JWT for Beginners

JetBrains-published tutorial explaining OAuth2 delegated authorization and JWT structure (header/payload/signature), then applying them to secure a Kotlin/Spring Boot REST API acting as a resource server that validates bearer tokens. A companion Ktor-based tutorial is planned.

spring-kotlinkotlin-backend
§ 10

Networking

No articles match your current filters.

Try broadening your selection or reset all filters.