07 May 2026

feedAndroid Developers Blog

A look ahead: Making it easier and faster to publish safer apps

Posted by Vijaya Kaza, VP, Product, App & Ecosystem Trust


The mobile ecosystem is always evolving, bringing both new opportunities and new threats. Through these changes, Android and Google Play remain committed to ensuring that billions of users can continue to enjoy their apps with confidence and developer innovation can thrive. Earlier this year, we shared how Android and Google Play kept the ecosystem safe in 2025 by deepening our investments in AI and real-time defenses. Today, we're giving you a look at how we're making it easier and faster than ever for millions of developers to publish safer apps.

Simpler ways to build safer apps from the start

To help you catch potential issues before you hit submit, we're integrating insights and new customized guidance built with AI to your publishing journey:

  • Catch policy issues while you code with expanded Play Policy Insights in Android Studio, which now offer warnings for common issues, like missing login credentials. Later this year, when you choose to connect your Play developer account directly to Android Studio, you'll get tailored insights.
  • Choose the right SDKs with confidence by leveraging SDK Index. Later this year, we are bringing SDK insights directly into your development workflow so you can instantly see which SDKs comply with Play policies.

More powerful protection for your business and users

With new ways to stay ahead of fraud and abuse, and better tools to protect your users, we're also making it easier to secure your app's revenue and reputation.

  • Detect security threats and abuse faster with our stronger Play Integrity API, which developers rely on to make billions of checks everyday to help keep their business secure. With significantly shorter warm-up latency, you can use these real-time checks in your most speed-critical user journeys, like logins or payments, to catch unauthorized access and risky interactions.
  • Simplify how you manage user privacy with easy-to-integrate tools like the contact picker and location button to give users clearer choices. We're also updating our policies to raise the standard for user privacy.
  • Future-proofing app signing security on your behalf. We're adding support for post-quantum cryptography in Play App Signing this year, which will protect your apps and app updates from potential threats with the emergence of quantum computing.

Faster, more predictable app publishing

We know how important it is to maintain a predictable release cycle, so we're making the publishing process faster and more transparent.

  • Avoid unexpected review rejections with our expanding pre-review checks, which now identify unnecessary photo permission requests and other common violations before you submit.
  • Improve the speed and predictability of your review cycles by using the new release status API to check if your release is approved and published. We also added a new way for you to block new commits if a review is already in progress, so you don't unintentionally restart your place in the queue.
  • Publish your releases even faster when we change our review architecture later this year to enable parallel publishing and faster reviews for your test tracks. You'll be able to isolate your closed, open, and production tracks so that a review on one track no longer holds up updates on another.
  • Track your release history with the Submission history log later this year. Built at your request, this feature provides a complete record of every time you send an app or update for review and its status. This makes it easier for your team to coordinate and troubleshoot without digging through multiple menus.
  • Manage business changes securely with the account transfers feature to help you move ownership to new partners, entities, or team members (video). We've designed this highly developer-requested feature with safeguards to protect your business from fraud and account hijacking.
  • Get the right policy support when you need it. In the coming months you'll see AI-powered recommendations directly in your Play Console that help you resolve minor issues immediately. For more complex issues, you can create a ticket to connect with our policy specialists. We're also giving new developers more guided support, including new Play Academy courses, to publish their first app with confidence. Later this year, we'll expand this coaching experience for new developers.

Stronger security across the ecosystem

Finally, we're bringing developer verification to the entire Android ecosystem to add another layer of security and make it much harder for malicious actors to repeatedly spread harm. Starting in September, these protections will roll out in select countries to help users feel more confident in the apps they download and without changing most users' install experience. We will also update Android Bench to uplift the entire ecosystem's ability to build and launch safer, higher quality apps using generative AI.

What's next

Google Play is committed to helping you grow your business while keeping users safe, and we appreciate your continued feedback on the tools and programs. Thank you for partnering with us to make Android and Google Play a secure, trusted platform for everyone.

  • Android security ecosystem
  • Play Policy Insights
  • SDK compliance tools
  • Real-time fraud detection
  • Post-quantum cryptography for apps
  • Google Play parallel publishing
  • Release status API
  • Developer account transfers
  • AI-powered developer support
  • Android developer verification

07 May 2026 5:00pm GMT

04 May 2026

feedAndroid Developers Blog

Gemini and Firebase AI Logic enabled Karrot to increase sales with a translation feature built in under 2 weeks

Posted by Thomas Ezan, Sr Developer Relations Engineer and Tracy Agyemang, Product Marketing Manager

Karrot is a hyperlocal, community-driven peer-to-peer marketplace app that enables users to buy, sell, and trade items with other verified users. Since launching in South Korea in 2015, the platform has expanded into global markets, amassing over 43 million registered users.

After launching in North America, engineers at Karrot observed that 30% of users in the region use a non-English device language, such as Spanish. To make the app more accessible, the team wanted to bring seamless translation functionality to Karrot quickly and at scale. The developers determined that the most efficient way to implement quality translations would be through integrating an AI service directly into the app, so they selected the Firebase AI Logic and its Android SDK to access Gemini Flash Lite, which led to higher purchasing conversion among non-English users.


Integrating Gemini Firebase AI Logic

The team initially tested two on-device options: the ML Kit Translation SDK and Gemini Nano. But the team found challenges with each: ML Kit Translation didn't meet the team's quality expectations, and Gemini Nano, if it isn't already on the device, required the user to download the model data.

The team then tested Firebase AI Logic. By calling the Gemini API directly from the app, Firebase AI Logic delivered accuracy at speeds that mirrored a natural conversational cadence.

Integrating Firebase AI Logic into the app was a "remarkably straightforward experience," according to TaeGyu An, an Android Software Engineer on Karrot's Mobile Platform team. TaeGyu and the team used the platform's documentation and code samples to build a proof of concept in under three hours.

This allowed the team to spend more time refining prompts and finding optimal configuration values. "Even without extensive experience writing prompts, the official documentation's guides and tips made it easy to quickly identify the right direction for improving translation quality," said WonJoong Lee, an Android Software Engineer on Karrot's North America Product Team.

This low barrier to entry and rapid turnaround time enabled engineers to keep development costs low and go from proof of concept to production code in just two weeks-all without setting up a dedicated backend. That also freed up time to focus on UX and policy design, such as opt-in behavior and the conditions for the translation banner.

Driving sales with enhanced AI features


Since implementing translation using Gemini and Firebase AI Logic, the Karrot team observed higher purchasing conversion among non-English users, indicating that the translation feature is helping drive sales.

Of users who used a non-English device language, one in three of them who were shown the translation banner actively used the feature. The team has also observed that buyers offered translation functionality were 2.4X more likely to start a chat with a seller than those who weren't.

The flexibility and simplicity of deploying Firebase AI Logic has led the team to explore other features to simplify the workstreams of its engineers. "It's rewarding to build features that scale across diverse Android devices while helping neighbors connect and interact within their local communities," concluded TaeGyu.

Going forward, the team plans to implement Server Prompt Templates to adjust prompts after release without shipping a new version of the app. This, combined with Remote Config, should help the team iterate faster and reduce operational overhead.

Get started

Learn how to build Gemini-enabled features like AI translations and in-app personalization and more with Firebase AI Logic to deliver better experiences to your users, faster.

04 May 2026 5:00pm GMT

22 Apr 2026

feedAndroid Developers Blog

What's new in the Jetpack Compose April '26 release

Posted by Meghan Mehta, Android Developer Relations Engineer



Today, the Jetpack Compose April '26 release is stable. This release contains version 1.11 of core Compose modules (see the full BOM mapping), shared element debug tools, trackpad events, and more. We also have a few experimental APIs that we'd love you to try out and give us feedback on.

To use today's release, upgrade your Compose BOM version to:

implementation(platform("androidx.compose:compose-bom:2026.04.01"))

Changes in Compose 1.11.0

Coroutine execution in tests

We're introducing a major update to how Compose handles test timing. Following the opt-in period announced in Compose 1.10, the v2 testing APIs are now the default, and the v1 APIs have been deprecated. The key change is a shift in the default test dispatcher. While the v1 APIs relied on UnconfinedTestDispatcher, which executed coroutines immediately, the v2 APIs use the StandardTestDispatcher. This means that when a coroutine is launched in your tests, it is now queued and does not execute until the virtual clock is advanced.

This better mimics production conditions, effectively flushing out race conditions and making your test suite significantly more robust and less flaky.

To ensure your tests align with standard coroutine behavior and to avoid future compatibility issues, we strongly recommend migrating your test suite. Check out our comprehensive migration guide for API mappings and common fixes.

Shared element improvements and animation tooling


We've also added some handy visual debugging tools for shared elements and Modifier.animatedBounds. You can now see exactly what's happening under the hood-like target bounds, animation trajectories, and how many matches are found-making it much easier to spot why a transition might not be behaving as expected. To use the new tooling, simply surround your SharedTransitionLayout with the LookaheadAnimationVisualDebugging composable.

LookaheadAnimationVisualDebugging(
    overlayColor = Color(0x4AE91E63),
    isEnabled = true,
    multipleMatchesColor = Color.Green,
    isShowKeylabelEnabled = false,
    unmatchedElementColor = Color.Red,
) {
    SharedTransitionLayout {
        CompositionLocalProvider(
            LocalSharedTransitionScope provides this,
        ) {
            // your content
        }
    }
}

Trackpad events

We've revamped Compose support for trackpads, like built-in laptop trackpads, attachable trackpads for tablets, or external/virtual trackpads. Basic trackpad events will now generally be considered PointerType.Mouse events, aligning mouse and trackpad behavior to better match user expectations. Previously, these trackpad events were interpreted as fake touchscreen fingers of PointerType.Touch, which led to confusing user experiences. For example, clicking and dragging with a trackpad would scroll instead of selecting. By changing the pointer type these events have in the latest release of Compose, clicking and dragging with a trackpad will no longer scroll.

We also added support for more complicated trackpad gestures as recognized by the platform since API 34, including two finger swipes and pinches. These gestures are automatically recognized by components like Modifier.scrollable and Modifier.transformable to have better behavior with trackpads.

These changes improve behavior for trackpads across built-in components, with redundant touch slop removed, a more intuitive drag-and-drop starting gesture, double-click and triple-click selection in text fields, and desktop-styled context menus in text fields.

To test trackpad behavior, there are new testing APIs with performTrackpadInput, which allow validating the behavior of your apps when being used with a trackpad. If you have custom gesture detectors, validate behavior across input types, including touchscreens, mice, trackpads, and styluses, and ensure support for mouse scroll wheels and trackpad gestures.

Before After
Before
After

Composition host defaults (Compose runtime)

We introduced HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey, and ViewTreeHostDefaultKey to supply host-level services directly through compose-runtime. This removes the need for libraries to depend on compose-ui for lookups, better supporting Kotlin Multiplatform. To link these values to the composition tree, library authors can use compositionLocalWithHostDefaultOf to create a CompositionLocal that resolves defaults from the host.

Preview wrappers

Android Studio custom previews is a new feature that allows you to define exactly how the contents of a Compose preview are displayed.

By implementing the PreviewWrapperProvider interface and applying the new @PreviewWrapper annotation, you can easily inject custom logic, such as applying a specific Theme. The annotation can be applied to a function annotated with @Composable and @Preview or @MultiPreview, offering a generic, easy-to-use solution that works across preview features and significantly reduces repetitive code.


class ThemeWrapper: PreviewWrapper {


@Composable


override fun Wrap(content: @Composable (() -> Unit)) {


JetsnackTheme {


content()


}


}


}



@PreviewWrapperProvider(ThemeWrapper::class)


@Preview


@Composable


private fun ButtonPreview() {


// JetsnackTheme in effect


Button(onClick = {}) {


Text(text = "Demo")


}


}

Deprecations and removals

Upcoming APIs

In the upcoming Compose 1.12.0 release, the compileSdk will be upgraded to compileSdk 37, with AGP 9 and all apps and libraries that depend on Compose inheriting this requirement. We recommend keeping up to date with the latest released versions, as Compose aims to promptly adopt new compileSdks to provide access to the latest Android features. Be sure to check out the documentation here for more information on which version of AGP is supported for different API levels.

In Compose 1.11.0, the following APIs are introduced as @Experimental, and we look forward to hearing your feedback as you explore them in your apps. Note that @Experimental APIs are provided for early evaluation and feedback and may undergo significant changes or removal in future releases.

Styles (Experimental)

We are introducing a new experimental foundation API for styling. The Style API is a new paradigm for customizing visual elements of components, which has traditionally been performed with modifiers. It is designed to unlock deeper, easier customization by exposing a standard set of styleable properties with simple state-based styling and animated transitions. With this new API, we're already seeing promising performance benefits. We plan to adopt Styles in Material components once the Style API stabilizes.

A basic example of overriding a pressed state style background:

@Composable
fun LoginButton(modifier: Modifier = Modifier) {
    Button(
        onClick = {
            // Login logic
        },
        modifier = modifier,
        style = {
            background(
                Brush.linearGradient(
                    listOf(lightPurple, lightBlue)
                )
            )
            width(75.dp)
            height(50.dp)
            textAlign(TextAlign.Center)
            externalPadding(16.dp)

            pressed {
                background(
                    Brush.linearGradient(
                        listOf(Color.Magenta, Color.Red)
                    )
                )
            }
        }
    ){
        Text(
            text = "Login",
        )
    }
}




Check out the documentation and file any bugs here.

MediaQuery (Experimental)

The new mediaQuery API provides a declarative and performant way to adapt your UI to its environment. It abstracts complex information retrieval into simple conditions within a UiMediaScope, ensuring recomposition only happens when needed.

With support for a wide range of environmental signals-from device capabilities like keyboard types and pointer precision, to contextual states like window size and posture-you can build deeply responsive experiences. Performance is baked in with derivedMediaQuery to handle high-frequency updates, while the ability to override scopes makes testing and previews seamless across hardware configurations.

Previously, to get access to certain device properties - like if a device was in tabletop mode - you'd need to write a lot of boilerplate to do so:

@Composable
fun isTabletopPosture(
    context: Context = LocalContext.current
): Boolean {
    val windowLayoutInfo by
        WindowInfoTracker
            .getOrCreate(context)
            .windowLayoutInfo(context)
            .collectAsStateWithLifecycle(null)

    return windowLayoutInfo.displayFeatures.any { displayFeature ->
        displayFeature is FoldingFeature &&
            displayFeature.state == FoldingFeature.State.HALF_OPENED &&
            displayFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
    }
}

@Composable
fun VideoPlayer() {
    if(isTabletopPosture()) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

Now, with UIMediaQuery, you can add the mediaQuery syntax to query device properties, such as if a device is in tabletop mode:

@OptIn(ExperimentalMediaQueryApi::class)
@Composable
fun VideoPlayer() {
    if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

Check out the documentation and file any bugs here.

Grid (Experimental)

Grid is a powerful new API for building complex, two-dimensional layouts in Jetpack Compose. While Row and Column are great for linear designs, Grid gives you the structural control needed for screen-level architecture and intricate components without the overhead of a scrollable list.

Grid allows you to define your layout using tracks, gaps, and cells, offering familiar sizing options like Dp, percentages, intrinsic content sizes, and flexible "Fr" units.


@OptIn(ExperimentalGridApi::class)


@Composable


fun GridExample() {


Grid(


config = {


repeat(4) { column(0.25f) }


repeat(2) { row(0.5f) }


gap(16.dp)


}


) {


Card1(modifier = Modifier.gridItem(rowSpan = 2)


Card2(modifier = Modifier.gridItem(colmnSpan = 3)


Card3(modifier = Modifier.gridItem(columnSpan = 2)


Card4()


}


}


You can place items automatically or explicitly span them across multiple rows and columns for precision. Best of all, it's highly adaptive-you can dynamically reconfigure your grid tracks and spans to respond to device states like tabletop mode or orientation changes, ensuring your UI looks great across form factors.


Check out the documentation and file any bugs here.

FlexBox (Experimental)

FlexBox is a layout container designed for high performance, adaptive UIs. It manages item sizing and space distribution based on available container dimensions. It handles complex tasks like wrapping (wrap) and multi-axis alignment of items (justifyContent, alignItems, alignContent). It allows items to grow (grow) or shrink (shrink) to fill the container.

@OptIn(ExperimentalFlexBoxApi::class)
fun FlexBoxWrapping(){
    FlexBox(
        config = {
            wrap(FlexWrap.Wrap)
            gap(8.dp)
        }
    ) {
        RedRoundedBox()
        BlueRoundedBox()
        GreenRoundedBox(modifier = Modifier.width(350.dp).flex { grow(1.0f) })
        OrangeRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.7f) })
        PinkRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.3f) })
    }
}





Check out the documentation and file any bugs here.

New SlotTable implementation (Experimental)

We've introduced a new implementation of the SlotTable, which is disabled by default in this release. SlotTable is the internal data structure that the Compose runtime uses to track the state of your composition hierarchy, track invalidations/recompositions, store remembered values, and track all metadata of the composition at runtime. This new implementation is designed to improve performance, primarily around random edits.

To try the new SlotTable, enable ComposeRuntimeFlags.isLinkBufferComposerEnabled.

Start coding today!

With so many exciting new APIs in Jetpack Compose, and many more coming up, it's never been a better time to migrate to Jetpack Compose. As always, we value your feedback and feature requests (especially on @Experimental features that are still baking) - please file them here. Happy composing!

22 Apr 2026 11:00pm GMT