- 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.mp4
Youā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 ExcludeFromCodeCoverageReport
Then 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