- JetpackCompose.app Dispatch
- Posts
- JetpackCompose.app's Dispatch Issue #16
JetpackCompose.app's Dispatch Issue #16
đ In todayâs Dispatch: đď¸ Google Playâs 47 % app-purge drama, đ ď¸ Amazonâs shiny new KMP âApp Platformâ, đď¸ ADB slow-mo frame-timing captures, đ¨ the theme bug that steals your Columnâs color, 𤣠"Soft Earnings" and đ @Preview-free code-coverage magic.
Your mobile release âtaxâ costs more than you realize.
Join mobile leaders from Skyscanner and SoFi on May 22 to measure exactly what youâre losingâand learn the real ROI of improving your mobile release process.
GM Friends. This is JetpackCompose.appâs Dispatch, sliding into your inbox with the grace of a Compose recomposition that actually skips unnecessary work.
This is Issue # 16 and is jam-packed with practical tips, juicy industry tidbits, and a healthy dose of nerdy enthusiasm. Letâs dig in!
đľđťââď¸ Insider Insight
Letâs be honest: debugging animation jank is right up there with âherding catsâ and âexplaining state hoisting to your managerâ on the frustration scale. But hereâs a tool that flies under the radar for even seasoned Android devs: ADBâs --bugreport option for video recordings. Simply run the following:
adb shell screenrecord --bugreport /sdcard/recording.mp4Youâll get a video recording of your app with frame-timing overlays baked inâlike frame numbers, timestamps, and dropped frame indicators. Itâs like having a personal slow-mo referee for your appâs UI performance!
Why does this matter?
Diagnose Animation Hiccups: See exactly where frames are being dropped or delayed during those tricky transitions or complex Compose animations that you are now able to build with the wonderful APIs it offers.
Share with Team: Got a performance bug that only happens on your coworkerâs 5-year-old Samsung? Now you can record, annotate, and send evidence for all to see (and fix!).
When to Use: Anytime you optimize animations, debug âjank,â or want to impress your PM with a CSI-style breakdown of why that modal takes 500ms too long to appear.

Despite our best efforts, sometimes issues slip through the cracks. That's why having an amazing observability tool in your corner is important to keep your app humming. Bitdrift gives you on-demand observability that's custom-built for mobile teams: no log limits, no overage fees, and no waiting on your next app release. Learn More
When this code is run, the Column doesnât render the background color that was applied to it. Why is that?
@Composable
fun MainScreen(
modifier: Modifier = Modifier,
nightModeEnabled: Boolean = false
) {
val screenModifier = modifier
.background(color = AppColors.background)
.fillMaxSize()
AppTheme(darkMode = nightModeEnabled) {
Column(modifier = screenModifier) {
// Your content here
}
}
}
đ Dev Delight

The next time you want to convince the hiring manager to skip some rounds, send them this screenshot đ

đđťââď¸ How do I?
Todayâs question: How do I exclude Composable Previews from Code Coverage Reports
Raise your hand if youâve ever looked at your code coverage report and thought, âHow do I have 800 lines of untested code in my UI module?â Only to realizeâyep, itâs all those @Preview functions littering your Compose files. đ
The solution depends on the framework you are using to calculate the code coverage.
If you are using Kover:
You can configure Kover to ignore anything under a specific annotation, e.g. @Preview. It looks along the lines of â
configure<KoverReportExtension> {
filters {
excludes {
...
annotatedBy(
"androidx.compose.ui.tooling.preview.Preview"
)
}
}
} Easy peasy đ¤
If you are using Jacoco:
Unfortunately, Jacoco canât directly filter by arbitrary annotation. However, hereâs a secret 𤍠- it will ignore anything annotated with âGeneratedâ.
This is shaky grounds if Iâm being honest since this is not an API contract and just an implementation detail, however, that hasnât stopped manny teams from creating custom annotations that end with the suffix âGeneratedâ and then adding it to their previews. As an example, annotating your previews with this custom annotation will be skipped by Jacoco from the code coverage reports.
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class ExcludeFromCodeCoverageReportThen simply annotate your previews:
@Preview
@ExcludeFromCodeCoverageReport
fun MyComponentPreview() { ... }Pro move: Write a small script or use a Kotlin compiler plugin to auto-insert the exclusion annotation on all your preview functions. Some teams have hundreds (if not thousands) such annotationsâautomation will save your sanity.

đ¤ Interesting tid-bits
The Great Google Play Purge: 47% Fewer Apps, 100% More Drama
Ever opened the Play Store lately and thought, âHuh, didnât there used to be more⌠stuff?â Youâre not hallucinating (at least not about this): Google Play has shed a jaw-dropping 47% of its apps since early 2024. Thatâs a drop from 3.4 million to about 1.8 million apps worldwide!
Whatâs behind this mass extinction event? Googleâs been on a crusade to oust low-quality, spammy, and downright useless apps. The new policies arenât just targeting broken apps anymoreâtheyâre also eliminating so-called âstaticâ apps (think single-wallpaper wonders, glorified PDFs, or those apps that do, well⌠nothing).
But thereâs more: stricter verification requirements, expanded human reviews (no more sneaking in a âHello Worldâ bitcoin miner at 3am), and a heavy investment in AI-driven threat detection. In 2024 alone, Google claims it blocked 2.36 million policy-violating apps and banned over 158,000 developer accounts. Yikes.
Why should you care?
Visibility boost: With less junk, high-quality apps (like yours, obviously) have a better chance to shine.
Publishing pains: The flip side is that even legitimate apps are running into more hoopsâextra verifications, tougher quality checks, and the occasional Kafkaesque review cycle.
Not an industry-wide trend: Appleâs App Store actually saw a slight increase in total apps during the same period, so this is uniquely Androidâs growing pain.
My take:
This is (mostly) a good thing for users and serious devs. But letâs be realâthe process has been bumpy, especially for indie and small-team developers. Expect the rough edges to smooth out as Google iterates and developer tooling catches up. Iâm going to be at Google I/O next week and I plan to surface this directly to the fine folks at Google and get their perspective on things. Stay tuned for the next issue which is going to give you a behind the scenes look at Google I/O 2025!

đž Code Corner
Amazonâs âApp Platformâ: A New Contender for Multiplatform Architecture (and Why You Should Care)
Itâs not every day that Amazon open-sources a new application framework, especially one targeting Kotlin Multiplatform. Enter App Platformâa lightweight, opinionated framework for state and memory management across Android, iOS, JVM, and (soon) Web. Letâs break down what makes it worth a look, especially if youâre architecting for scale or dreaming of true code reuse.
Key Features
Strict Separation of Concerns: App Platform enforces a clean split between APIs and implementations. This not only keeps your boundaries crisp (no more âleaky abstractionsâ horror stories) but can also reduce build times. The framework even validates your module structure at build time!
Integrated Dependency Injection: By default, it uses
kotlin-inject-anvil(but you can swap it out). You get the flexibility of Dagger/Anvil, but itâs not hard-wiredâuse what fits your stack. Fun fact: This project is being led by Ralf Wondratschek who happens to be the creator of Anvil.Scopes as First-Class Citizens: App Platform makes âscopeâ a fundamental concept. You get clear, lifecycle-aware boundaries for featuresâthink âscreen,â âsession,â or âapplicationâ scopes, each with their own DI, coroutine scopes, and teardown hooks.
Presenter Pattern, Powered by Molecule: Business and navigation logic is written using Compose (via Molecule), making reactive state management more natural than wrangling flows and callbacks.
UI Layer Decoupling: The UI is âpluggable.â Want Compose on Android, SwiftUI on iOS, or a mix of both? The renderer pattern isolates UI, so you can swap or test easily.
Testing First: Tons of helpers and fakes for unit/device testing. Bonus: thanks to Compose Multiplatform, you can even test renderers in isolation on iOS and desktop.
Gradle Plugin Magic: The setup DSL configures the Compose compiler, KSP, DI integrations, and even Android namespaces/artifact IDs for you. Less yak-shaving, more coding.
Overall, I think this is pretty interesting to see given that itâs targeting Kotlin Multiplatform and itâs always nice to have a big player backing an emerging framework. Still early days but I think itâs a big vote of confidence from them and will help codebases scale better.

Why doesnât the Column get the correct background?
Answer
Well, itâs because it accesses the theme before you set it, so it gets the default colors instead of the ones you want. Be very careful with storing modifiers in variables and applying them later, it's very easy to mistakenly use them multiple times and/or cause bugs that arenât obvious.
Hereâs what you can do instead:
@Composable
fun MainScreen(
modifier: Modifier = Modifier,
nightModeEnabled: Boolean = false
) {
AppTheme(darkMode = nightModeEnabled) {
Column(
modifier = modifier
// Here, the background color is accessed
// only in the scope of the AppTheme
.background(color = AppColors.background)
.fillMaxSize()
) {
// Your content here
}
}
}
đ Make your voice heard
Have opinions about Android Development/Jetpack Compose and want to share it directly with the folks working on it?
Well, you are in luck because the Android team is running a User Research Study focusing on Android Studio Tooling and they want to hear from you. They are especially interested in feedback about UI development and animations in Compose.
Itâll be a 75 min session and they are offering up-to $300 in gift code for your time.
This isnât an ad - I just thought that this audience is packed with seasoned leaders so Iâll surface this for everyone to be aware of. You can sign up here.

đŚ How you can help?
If you enjoy reading this newsletter and would like to keep Dispatch free, here are two quick ways to help:
đđť Chip in via Github Sponsors. If your company offers an education budget, contributing a âcoffeeâ to keep this newsletter going will certainly qualify. Youâll get an instant receipt for reimbursement, and Iâll keep Dispatch running âď¸
đđťSpread the word. Tweet, Bluesky, toot, Slack, or carrierâpigeon this issue to someone who loves Android. Each new subscriber pushes Dispatch closer to sustainability.
đ Let me hear it!
Whatâd you think of this email? Tap your choice below and lemme hear it đ
đđđđđ AMAZING-LOVED IT!
đđđ PRETTY GOOD!
đ MEH - NOT GREAT
On that note, hereâs hoping that your bugs are minor and your compilations are error free.
![]() | Tech Lead Manager @ Airbnb | Google Developer Expert for Android Vinay Gaba is a Google Developer Expert for Android and serves as a Tech Lead Manager at Airbnb, where he spearheads the UI Tooling team. His team's mission is to enhance developer productivity through cutting-edge tools leveraging LLMs and Generative AI. Vinay has deep expertise in Android, UI Infrastructure, Developer Tooling, Design Systems and Figma Plugins. Prior to Airbnb, he worked at Snapchat, Spotify, and Deloitte. Vinay holds a Master's degree in Computer Science from Columbia University. |







Reply