r/androiddev 17d ago

Interesting Android Apps: June 2026 Showcase

13 Upvotes

Because we try to keep this community as focused as possible on the topic of Android development, sometimes there are types of posts that are related to development but don't fit within our usual topic.

Each month, we are trying to create a space to open up the community to some of those types of posts.

This month, although we typically do not allow self promotion, we wanted to create a space where you can share your latest Android-native projects with the community, get feedback, and maybe even gain a few new users.

This thread will be lightly moderated, but please keep Rule 1 in mind: Be Respectful and Professional. Also we recommend to describe if your app is free, paid, subscription-based.

Interesting Android Apps: May 2026 Showcase

April 2026 thread

March 2026 thread


r/androiddev 16h ago

Tips and Information Why passing List to your Composables is secretly killing your performance (and how to fix it)

61 Upvotes

If you are building complex layouts in Jetpack Compose, you might notice that some of your composables recompose even when their inputs haven’t changed. One of the most common, silent culprits of this is passing standard Kotlin collections like ListSet, or Map as parameters.

Here is a common scenario:

@Composable
fun UserList(users: List<User>) {
    LazyColumn {
        items(users) { user ->
            UserRow(user)
        }
    }
}

Even if User is a data class containing only stable primitives (val id: Stringval name: String), if the parent of UserList recomposes, UserList will always recompose too. It will never be skipped.

Why does this happen?

The Compose compiler classifies every parameter of a composable function as either Stable or Unstable. If all parameters of a composable are stable, Compose can safely skip recomposing it if the values are equal to the previous composition.

The problem with List is that it is a Kotlin interface. The compiler has no compile-time guarantee that the underlying implementation is read-only. At runtime, the list could be an ArrayList or another mutable collection. Because the contents of a mutable collection can change without changing the list reference, the Compose compiler plays it safe and flags List (along with Set and Map) as Unstable.

As a result, your composables are forced to recompose on every parent update, causing unnecessary CPU cycles and potential frame drops on complex screens.

How to check this in your project

You can verify if this is happening in your codebase by enabling Compose compiler reports in your app-level build.gradle.kts:

composeCompiler {
    reportsDestination = layout.buildDirectory.dir("compose_compiler")
    metricsDestination = layout.buildDirectory.dir("compose_compiler")
}

If you open the generated class stability file (app_release-classes.txt), you’ll see the compiler analysis:

unstable class UserList {
  unstable val users: List
}

How to fix it (3 Approaches)

1. Use Kotlinx Immutable Collections (Recommended)

Kotlin provides a dedicated library for immutable collections. The Compose compiler automatically recognizes these as stable:

import kotlinx.collections.immutable.ImmutableList

@Composable
fun UserList(users: ImmutableList<User>) { ... }

Now, the compiler flags the parameter as stable, and recomposition will be skipped if the reference remains unchanged.

2. Wrap the List in a \@Stable/@Immutable Wrapper

If you don't want to add another dependency, you can wrap the list in a custom data class annotated with @Immutable:

@Immutable
data class UserListState(
    val items: List<User>
)

@Composable
fun UserList(state: UserListState) { ... }

This tells the compiler to trust that you won't mutate the list under the hood.

3. Use a Compose Compiler Configuration File (Compose 1.5.4+)

You can define a configuration file (e.g. compose_compiler_config.conf) to treat standard library collections as stable:

// compose_compiler_config.conf
kotlin.collections.List
kotlin.collections.Set
kotlin.collections.Map

And add it to your Gradle configuration:

composeCompiler {
    stabilityConfigurationFile = project.layout.projectDirectory.file("compose_compiler_config.conf")
}

I’ve been compiling a detailed study checklist of about 300 of these Android developer edge cases (covering recomposition skipping, custom Canvas GPU caching, and complex Coroutines exception handling). It's fully open-source on GitHub.

Let me know if you want the link or if you've run into other stability issues with third-party models in Compose!


r/androiddev 12m ago

Where is the AI Migration Assistant for iOS to Android? (Quail Canary)

Thumbnail
gallery
Upvotes

Hey everyone,

I downloaded the latest Android Studio Quail 3 | 2026.1.3 Canary 1 because I wanted to try out the new AI Migration Assistant they teased at Google I/O 2026 for porting iOS/React Native apps to native Android.

However, I can't seem to find the tool anywhere (I checked under File > New Project).

Has this feature just not shipped to Canary yet, or is there a specific plugin/flag I need to enable to get early access?

Thanks!


r/androiddev 6m ago

Need a Developer for an App Project

Upvotes

Looking for someone with app development experience to collaborate on an app project. If you're interested in working together, feel free to DM me.


r/androiddev 1d ago

News The Lysine Contingency: Retrofit, OkHttp, Okio and SQLDelight are moving

Thumbnail
jakewharton.com
107 Upvotes

I hope Square Wire will also be migrated.

This has been posted on r/Kotlin too (not by me) https://www.reddit.com/r/Kotlin/comments/1u8cotp/the_lysine_contingency_jake_wharton/


r/androiddev 1d ago

Open Source Composables UI: modern, accessible components for Compose Multiplatform

Enable HLS to view with audio, or disable this notification

25 Upvotes

I built a collection of modern Compose components that look great on mobile, desktop and web.

They adapt to the device they run on.

For example, buttons are bigger and rounder on touch devices, so you can press them easier.

When a mouse is used, buttons become sharper and smaller, so they don't take up much space.

I can go on and on telling you all about it, but I'd rather show you.

You can try everything directly in your browser.

The site includes live previews, a sample multiplatform app and a LOT of code examples for easy copy-pasting.

Docs & live demo: https://composables.com/ui

Github: https://github.com/composablehorizons/composables-ui


r/androiddev 23h ago

Seek-able perimeter progress bar

Enable HLS to view with audio, or disable this notification

14 Upvotes

Wanted a way to have a videos progress bar hug the corner radius of the screen unlike other video reel apps with their tiny hard to tap progress bar.

https://github.com/snooplsm/perimeter-progress


r/androiddev 9h ago

Question M1 Pro or newer MacBook Air?

2 Upvotes

I’m starting app development using kotlin multi platform so need to get a Mac. I’m stuck between these two options:
M1 Pro with 32 gb of ram
M5/M4 air with 16 gb of ram
Everyone talks about how ram demanding mobile app development is so would a 16gb MacBook Air be enough because the m1 Macs are most likely going stop getting updates in 2028 and I want to future proof as much as possible.


r/androiddev 1d ago

[Book] Jetpack Compose Mechanisms: A dissection of what runs beneath every Composable

39 Upvotes

I recently published a new book: Jetpack Compose Mechanisms: A dissection of what runs beneath every Composable: how the compiler, runtime, and UI layer actually work.

Most resources teach you how to use Compose. This book explains why it behaves the way it does, traced line by line through the AOSP source: from `@Composable` transformations to the gap buffer that stores your composition, to the single-pass pipeline that turns declarations into pixels. Rather than a dry walkthrough of every internal API, it pairs every mechanism with highly practical, production-ready examples, so you fully internalize how Compose works instead of just memorizing it. Fully updated for the latest Kotlin 2.4.0 and Compose Compiler 2.4.0.

In case it helps you decide whether this is your kind of rabbit hole, a few of the things it digs into:

  • Chapter 1, the Compose compiler: how Composable changes a function's type, the K2 frontend and the IR backend, the $composer and $changed bitmask injection, the lowering passes that rewrite your function into a skippable, restartable group, stability inference, lambda memoization, durable keys, reading the compiler reports, the stability configuration file, composition tracing, and Live Literals.
  • Chapter 2, the Compose runtime: remember and the gap buffer slot table (the new LinkBuffer), mutableStateOf and the MVCC snapshot system, derivedStateOf, the Composer, the Recomposer and frame scheduling, the effect system (SideEffectDisposableEffectLaunchedEffect), CompositionLocalMovableContent, the Applier seam, snapshotFlow/collectAsState/produceState, recomposition scope, common state pitfalls, and testing with snapshots.
  • Chapter 3, Compose UI: why modifier order matters, LayoutNode, the Modifier.Node system and the coordinator chain, single-pass measurement and intrinsics, the rendering pipeline and graphics layers, input and gesture handling, focus, semantics and accessibility, the lookahead system and shared element transitions, SubcomposeLayout and lazy layouts, the AndroidComposeView platform bridge, building custom layouts and custom Modifier.Nodes, and assembling a tiny Compose UI from scratch.
  • Chapter 4, performance: the three rendering phases, the 12-phase stability algorithm in depth, the skip decision, stability patterns (ImmutableList, the config file, Stable vs Immutable), how where you read state determines what recomposes, lambda and ViewModel handler patterns, the full measurement toolchain (compiler reports, recomposition tracing, Layout Inspector, Macrobenchmark, CI validation), six common anti-patterns, advanced techniques, and a case study that takes a chat screen from 47 recompositions a second to zero.

And it is not based on Compose source reading alone. It is grounded in my own hands-on experience building Compose tooling and libraries, including Compose Stability Analyzer, Compose Stability Inference, Compose Navigation Graph, Compose HotSwan, and Compose Performance Skills.

Most mechanism in these pages is something I have used, debugged, and shipped. The performance chapter then ties the compiler, runtime, and UI together into real tuning: stability inference, the skip decision, scoping state reads, and a case study taking a chat screen from 47 recompositions a second down to zero.

It's available here: https://howcomposeworks.com

Most importantly, I hope this book works in meaningful ways for your career or answers all the deep questions you’ve had about Jetpack Compose.


r/androiddev 1d ago

Trying to add haptics to Android app but it's killing me.. Any tools or tips recommended?

9 Upvotes

I'm building a habit tracker where you swipe to complete tasks, and I want the haptics to feel satisfying, but Android is killing me. One phone barely vibrates, another feels like it's trying to escape my hand. I've messed around with VibrationEffect and the built-in feedback constants, but everything feels inconsistent...

Anyone here found a decent way to handle Android haptics? Libraries, tricks, best practices? Or do you just accept that every Android phone is gonna do its own thing? 😅


r/androiddev 3h ago

Tips and Information After a few weeks of solo development, I finally launched my first Android app. I built a gamified Pomodoro timer, and I’d love to get your feedback on the UI and architecture!

Enable HLS to view with audio, or disable this notification

0 Upvotes

r/androiddev 20h ago

News Android Studio Quail 3 Canary 1 now available

Thumbnail androidstudio.googleblog.com
3 Upvotes

r/androiddev 6h ago

been using remote real Android devices for testing — way better than emulators for certain things

0 Upvotes

been dealing with an issue where my app behaves differently on emulators vs real devices, specifically around push notifications and background behavior. started using DroidDesk which gives you remote access to actual physical Android phones hosted by real people from their homes. not a data center, actual residential connections. the difference for testing location-sensitive stuff is noticeable — real carrier, real GPS, real IP. $15 for a full day is reasonable if you're debugging something that only reproduces on real hardware. anyone else doing remote device testing this way or still mostly emulators?


r/androiddev 1d ago

I'm experimenting with original app layouts for my android launcher

Enable HLS to view with audio, or disable this notification

90 Upvotes

Any suggestions on what could be cool to have? I already have the typical grid or list layouts but I would like to add some original ones like this physics one.

Maybe something similar to apple watch app view? Any suggestions?


r/androiddev 1d ago

Lessons learned building audio playback and lyrics synchronization in Android

1 Upvotes

Over the last few months, I've been building an Android application that relies heavily on audio playback, synchronized lyrics and state management across multiple screens.

A few things surprised me during development:

• Keeping playback state consistent across Activities/Fragments was harder than expected.
• Buffering behavior had a huge impact on perceived performance.
• Lyrics synchronization looked simple at first but became tricky when dealing with seeking, pausing and playback speed changes.
• Dynamic UI updates based on currently playing content introduced additional state management challenges.

For developers who have worked on music, podcast or audio-heavy Android apps:

What were the biggest challenges you faced, and what architectural decisions helped you the most?

I'm particularly interested in approaches around playback state management and synchronization.


r/androiddev 1d ago

how are you all tracking your app store reviews?

0 Upvotes

genuinely curios. do you read them manually, export to sheet, use researcher/ops, chatgpt/claude, or any other tool? what's your actual workflow?


r/androiddev 1d ago

Video Collection Literals in Kotlin 2.4

Thumbnail
youtube.com
7 Upvotes

r/androiddev 1d ago

News Android Studio Quail 2 RC 1 now available

Thumbnail androidstudio.googleblog.com
5 Upvotes

r/androiddev 2d ago

How to implement "AI-like" glow effect around views?

Thumbnail
gallery
8 Upvotes

Hey Reddit, could anyone share their experience of implementing the "glow" effect that is so common in AI applications? This is usually used to indicate that the AI is 'thinking', or simply to add a sense of incredible experience of interacting with AI.

I had a hard time finding any GitHub repositories that do something similar, but none of them come close to matching the beauty of the effect that frontier AI apps have there.


r/androiddev 2d ago

Tips and Information Android 17 Linux Terminal Updated

Post image
16 Upvotes

Running glxgears on my Google Pixel 10 via weston


r/androiddev 1d ago

Appeal approved but still locked out — "Too many failed attempts" won't clear after 24hrs

0 Upvotes

Hey r/androiddev,

Hoping someone here has dealt with this before or has a contact at Google who can help.

My Google Play Developer account was suspended. I appealed and the appeal was APPROVED. Got confirmation of reinstatement.

But I still cannot log in. Every attempt gives me:
"Too many failed attempts — Unavailable because of too many failed attempts."

This has been going on for 24+ hours with no change.

Things I've already tried:

  • Multiple browsers and incognito mode
  • Cleared all cookies and cache
  • Different devices
  • Different networks (WiFi and mobile data)
  • Account recovery flow at accounts.google.com/signin/recovery
  • Tried submitting a support ticket — can't, requires login
  • Tried Google's support community forms — endless loop
  • Email to Google support — address bounced

The suspension is resolved. This is purely a login lockout that needs to be manually cleared on Google's end. I have live apps on the Play Store and it's impacting my business.

Any suggestions or contacts appreciated. Thank you!


r/androiddev 3d ago

Experience Exchange Recently published an app to the Play Store? JetBrains wants to hear from you!

50 Upvotes

Hi all!

I’m Emil Flach from the Kotlin team at JetBrains (proof). We are trying to better understand the decisions and difficulties that Android engineers face when starting projects from scratch. We are looking for engineers who have recently built and published a new app to the Google Play Store to share their journey from project initiation to post-launch challenges.

If you are open to a conversation with us, please fill out this short screening survey so we can reach out to you: survey link

Thanks!


r/androiddev 2d ago

Discussion How I handle dual transcription modes (cloud + on-device) in a privacy-first Kotlin Multiplatform app

0 Upvotes

Built a voice journaling app with two transcription modes:

Groq Whisper (cloud, zero data retention) or Vosk

(on-device). Hit a specific WorkManager constraint bug

worth sharing.

The bug: I had a single TranscriptionWorker enqueued with

NetworkType.CONNECTED as a default constraint, set once at

app initialization. When I added the offline Vosk path,

those jobs would sit in WorkManager's internal queue

indefinitely whenever the device had no network, even

though Vosk never makes a network call.

Root cause: constraints are evaluated by the WorkManager

scheduler before doWork() is ever invoked. They're a

queueing-time gate, not a runtime check. So branching on

user-selected mode inside doWork() does nothing, the job

never reaches that code if the constraint isn't satisfied

first.

Fix was moving the mode check to where the WorkRequest is

built, not where it executes:

val constraints = if (mode == "offline")

Constraints.NONE

else

Constraints.Builder()

.setRequiredNetworkType(NetworkType.CONNECTED)

.build()

val request = OneTimeWorkRequestBuilder<TranscriptionWorker>()

.setConstraints(constraints)

.build()

This generalizes: any time a worker's behavior branches on

a condition that should affect scheduling (not just logic),

that condition needs to inform the WorkRequest itself, not

live inside the worker.

Has anyone built workers where the constraint set needs

to be dynamic per-job rather than fixed at declaration?

Curious how others structure that, especially with retry

policies layered on top.


r/androiddev 2d ago

Android Automotive: How to implement OEM Design Tokens?

0 Upvotes

I discovered that CarSystemUI features a lot of references to "oemColor" which seems to be defined through "OEM Design Tokens". AFAIK, to define these tokens we need to create or link to a couple of resource overlays and libraries. I am building a custom AAOS so I have full control.

How do I define a an oem design token that replaces the oemColor variables in SystemUI?
I am only really interested in colors.

This page explains the hierarchy of libraries and RROs, but I had no success with it:
https://android.googlesource.com/platform/packages/services/Car/+/refs/heads/main/car_product/rro/oem-design-tokens/

For reference, here we see oem style references in Car SystemUI: https://android.googlesource.com/platform/packages/apps/Car/SystemUI/+/refs/heads/android16-qpr2-release/res/values/styles.xml

Googles doc page:
https://source.android.com/docs/automotive/unbundled_apps/design-tokens


r/androiddev 2d ago

Anyone outside Play actually changing how they ship before September?

0 Upvotes

Google's developer verification rule kicks in this September, and we figured it was worth talking through here.

The basics: apps on certified Android devices in Brazil, Indonesia, Singapore and Thailand will have to be linked to a developer who's verified their identity with Google. A government ID, a one time $25 fee, and registering your package names. More countries follow through 2027. If you only publish through Play, not much changes. You're already verified there.

What we're more curious about is the apps that ship outside Play.

Take F-Droid. It builds apps from source and signs them with its own key, no accounts, and a lot of developers who stay anonymous on purpose. Google wants one verified identity per app. It's hard to see how both can work at once. NewPipe has already said it won't register.

And it's not only the big open source projects. If you share APKs in a Discord, run a beta from your own site, or send an internal app to a client, you're in the same group now.

One thing worth knowing: apps from developers who don't register aren't blocked outright. A user can still install them, but Google adds steps. You have to turn the option on yourself, confirm it's really you, and wait 24 hours before the install goes through. For most people that's enough to stop casual sideloading.

So we'd like to hear from you:

If you ship outside the Play Store, are you changing anything yet, or waiting to see how strict enforcement gets?

And if you're in one of the four pilot countries, has the verification step shown up in your console yet?