# android-app-development

Published articles for android-app-development.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Setup On Device Gemma 4 Android Development on Emulator

DevFeed: [Setup On Device Gemma 4 Android Development on Emulator](<https://devfeed.tech/articles/setup-on-device-gemma-4-android-development-on-emulator-29460.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/setup-on-device-gemma-4-android-development-on-emulator-738876f03733?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-09-11T14:27:55Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [gemma4](<https://devfeed.tech/topics/gemma4.md>), [Android](<https://devfeed.tech/topics/android.md>), [Emulator](<https://devfeed.tech/topics/emulator.md>), [android-development](<https://devfeed.tech/topics/android-development.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [artificial-intelligence](<https://devfeed.tech/tags/artificial-intelligence.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [gemma](<https://devfeed.tech/tags/gemma.md>), [gemma-4](<https://devfeed.tech/tags/gemma-4.md>), [google](<https://devfeed.tech/tags/google.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [on-device](<https://devfeed.tech/tags/on-device.md>)

### AI overview

A tutorial explaining how to set up and run the Gemma 4 large language model locally on an Android Emulator, including downloading and testing the Google AI Edge Gallery sample app. It notes that emulator storage and memory may affect model use.

### Source excerpt

Create Android Project with Downloadable Android On Device Gemma 4 Model Continue reading on Mobile App Development Publication "

## Android A2UI (AI to UI) Made Simple

DevFeed: [Android A2UI (AI to UI) Made Simple](<https://devfeed.tech/articles/android-a2ui-ai-to-ui-made-simple-29455.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/android-a2ui-ai-to-ui-made-simple-f25011ca1d8d?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-09-09T07:23:57Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Android](<https://devfeed.tech/topics/android.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [Protocol (disambiguation)](<https://devfeed.tech/topics/protocol.md>), [Google](<https://devfeed.tech/topics/google.md>)

Tags: [a2ui](<https://devfeed.tech/tags/a2ui.md>), [ai](<https://devfeed.tech/tags/ai.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [api](<https://devfeed.tech/tags/api.md>), [artificial-intelligence](<https://devfeed.tech/tags/artificial-intelligence.md>), [deprecated](<https://devfeed.tech/tags/deprecated.md>), [google](<https://devfeed.tech/tags/google.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [software-development](<https://devfeed.tech/tags/software-development.md>), [user-interfaces](<https://devfeed.tech/tags/user-interfaces.md>)

### AI overview

This tutorial introduces A2UI, a protocol for rendering AI responses as user interfaces, and discusses trying it on Android with Jetpack Compose. It notes that an older Jetpack A2UI library is deprecated and that newer development is ongoing.

### Source excerpt

Converting AI Prompt Output Into User Interface in Jetpack Compose Continue reading on Mobile App Development Publication "

## A Multi-Module Android Template with Kotlin Convention Plugins, Lint Rules, and Design System Tokens

DevFeed: [A Multi-Module Android Template with Kotlin Convention Plugins, Lint Rules, and Design System Tokens](<https://devfeed.tech/articles/forget-the-setup-tax-a-production-ready-multi-module-android-template-22945.md>)

Original publisher: [Read original article](<https://proandroiddev.com/forget-the-setup-tax-a-production-ready-multi-module-android-template-f4c879c97205?source=rss----c72404660798---4>)

Author: Shamil Gulmetov

Published: 2026-09-09T01:34:18Z

Content type: tutorial

Language: en

Sources: [ProAndroidDev - Medium](<https://devfeed.tech/sources/proandroiddev-medium.md>)

Topics: [Template](<https://devfeed.tech/topics/template.md>), [Android](<https://devfeed.tech/topics/android.md>), [Architecture & Design](<https://devfeed.tech/topics/architecture-design.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>), [Automation](<https://devfeed.tech/topics/automation.md>), [Refactoring](<https://devfeed.tech/topics/refactoring.md>), [now-in-android](<https://devfeed.tech/topics/now-in-android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-architecture](<https://devfeed.tech/tags/android-architecture.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [automation](<https://devfeed.tech/tags/automation.md>), [best-practices](<https://devfeed.tech/tags/best-practices.md>), [build](<https://devfeed.tech/tags/build.md>), [compose](<https://devfeed.tech/tags/compose.md>), [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [now-in-android](<https://devfeed.tech/tags/now-in-android.md>), [refactoring](<https://devfeed.tech/tags/refactoring.md>)

### AI overview

This tutorial presents an Android Architecture Template based on patterns from Google's Now in Android repository. It describes a multi-module structure with Gradle Version Catalogs, Kotlin Convention Plugins, Jetpack Compose design tokens and dark-theme support, dependency injection, custom Lint rules, and a terminal-based renaming tool.

### Source excerpt

How to streamline your development workflow with pre-configured Kotlin Convention Plugins, custom Lint rules, and unified design system tokens. Creating a new Android application from scratch in modern engineering is rarely as simple as clicking File -> New -> New Project in Android Studio. Before writing a single line of business logic, developers face hours -- or even days -- of repetitive infrastructure setup: Configuring a scalable multi-module architecture. Setting up Gradle Version Catalogs and writing custom Kotlin Convention Plugins to eliminate build script duplication. Standardizing design tokens and dark theme support in Jetpack Compose. Wiring up Hilt Dependency Injection for Coroutine Dispatchers, network, and Application Scopes. Enforcing architectural boundaries and team coding standards using custom static analysis (Lint) rules. Google's official Now in Android (NiA) repository is the recognized gold standard for modern Android engineering. However, because NiA is a full-featured showcase app with domain logic (news feeds, authors, bookmarks, offline sync), using it as a starter kit is cumbersome: developers must strip out existing features while risking breaking build pipelines. This Android Architecture Template bridges that gap: a clean, production-ready starter kit that extracts NiA's best architectural patterns into an isolated foundation. To make it enterprise-ready with zero room for error, it includes a standalone automation tool. Instead of manual refactoring, run a single terminal command to rename and brand the entire architecture in seconds. Acknowledgments & Credits Core architectural decisions, build-logic convention plugins, and static analysis infrastructure in this template are directly inspired by Google's official Now in Android (NiA) repository. Rather than reinventing the wheel, this template focuses on developer ergonomics--making Google's best practices instantly usable out of the box. 1. Modular Project Architecture The repository

## Android 17 AppFunction Walkthrough First Experience

DevFeed: [Android 17 AppFunction Walkthrough First Experience](<https://devfeed.tech/articles/android-17-appfunction-walkthrough-first-experience-29454.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/android-17-appfunction-walkthrough-first-experience-d27b261b84d1?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-09-07T12:51:23Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [App](<https://devfeed.tech/topics/app.md>), [Development](<https://devfeed.tech/topics/development.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [Emulator](<https://devfeed.tech/topics/emulator.md>), [Android Gradle Plugin](<https://devfeed.tech/topics/android-gradle-plugin.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-gradle-plugin](<https://devfeed.tech/tags/android-gradle-plugin.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [artificial-intelligence](<https://devfeed.tech/tags/artificial-intelligence.md>), [development](<https://devfeed.tech/tags/development.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [software-development](<https://devfeed.tech/tags/software-development.md>)

### AI overview

A first-hand walkthrough of Android 17 AppFunction, which lets Gemini discover an app's functionality. The article covers the required Android Studio version, Android 17 emulator, Android SDK API 37.0 target, and Android Gradle Plugin requirements.

### Source excerpt

Enabling Gemini to Find Your App Functionalities Continue reading on Mobile App Development Publication "

## Animating between numbers in Jetpack Compose

DevFeed: [Animating between numbers in Jetpack Compose](<https://devfeed.tech/articles/animating-between-numbers-in-jetpack-compose-25182.md>)

Original publisher: [Read original article](<https://joebirch.co/android/animating-between-numbers-in-jetpack-compose/>)

Author: hitherejoe

Published: 2026-09-02T12:37:43Z

Content type: tutorial

Language: en

Sources: [Joe Birch](<https://devfeed.tech/sources/joe-birch.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [API](<https://devfeed.tech/topics/api.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-apps](<https://devfeed.tech/tags/android-apps.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [animation](<https://devfeed.tech/tags/animation.md>), [api](<https://devfeed.tech/tags/api.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [apps](<https://devfeed.tech/tags/apps.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [jetpackcompose](<https://devfeed.tech/tags/jetpackcompose.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how to animate changing numerical portfolio values in Jetpack Compose. It uses animateFloatAsState with a target value and a tween animation configured with a 500ms duration and FastOutSlowInEasing.

### Source excerpt

When it comes to displaying portfolio data inside of Sleevd, users can change the selected filters which will adjust the portfolio values based on that selection. Alongside the main graph, we show the total portfolio value along with some small statistics for collection counts. When the user moves between the filter options, the values of... Continue reading ->

## Bring your KMP library to NuGet

DevFeed: [Bring your KMP library to NuGet](<https://devfeed.tech/articles/bring-your-kmp-library-to-nuget-25915.md>)

Original publisher: [Read original article](<https://proandroiddev.com/bring-your-kmp-library-to-nuget-02e1131a4707?source=rss-43bae76e8f81------2>)

Author: Isuru Rajapakse

Published: 2026-07-19T13:17:14Z

Content type: tutorial

Language: en

Sources: [Stories by Isuru Rajapakse on Medium](<https://devfeed.tech/sources/stories-by-isuru-rajapakse-on-medium.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [NuGet](<https://devfeed.tech/topics/nuget.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [C#](<https://devfeed.tech/topics/csharp.md>), [.NET](<https://devfeed.tech/topics/net.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Library](<https://devfeed.tech/topics/library.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>), [kmp](<https://devfeed.tech/tags/kmp.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [library](<https://devfeed.tech/tags/library.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [net](<https://devfeed.tech/tags/net.md>), [nuget](<https://devfeed.tech/tags/nuget.md>), [nuget-package](<https://devfeed.tech/tags/nuget-package.md>)

### AI overview

The article introduces kotlin-native-nuget, a Gradle plugin that packages Kotlin/Native libraries as NuGet packages with generated idiomatic C# bindings. It explains the motivation, configuration, publishing workflow, and supported mappings for Kotlin features such as classes, enums, data classes, coroutines, generics, interfaces, and exceptions.

### Source excerpt

with kotlin-native-nuget plugin, you can bring your Kotlin to C# idiomaticallyhttps://medium.com/media/0f185efc67390bbf440bfc33f5675f42/href A little while ago, I gave a talk where I tried to take a library written in Kotlin and hand it to a .NET developer as a NuGet package. By hand. It is 30 minutes of me walking into every brick wall you can imagine - the C ABI, marshalling strings, keeping objects alive across the boundary, making any of it look like C# a human would actually want to use. Introducing kotlin-native-nuget 🪟kotlin-native-nuget plugin auto-binds your kotlin api into C# I turned all of that into a plugin, so you don't have to hit a single one of those walls. You write Kotlin, and out the other side comes a NuGet package with a proper, idiomatic C# API: classes, enums, data classes, coroutines, Flow, generics, interfaces, the works. No FFI boilerplate, no hand-written [DllImport], no "here's a C header, good luck". Your friends over in .NET just `dotnet add package` it and use it like it was C# all along. It's called kotlin-native-nuget, and it's a Gradle plugin. Here's the pitch: GitHub - xxfast/kotlin-native-nuget: A plugin that packages a Kotlin/Native library as a NuGet package with generated C# bindings, and consumes C# NuGet packages from Kotlin The pitch 🛗plugins { kotlin("multiplatform") id("io.github.xxfast.kotlin.native.nuget") version "<version>" } kotlin { mingwX64 { binaries { sharedLib { baseName = "mycatlib" } } } macosArm64 { binaries { sharedLib { baseName = "mycatlib" } } } } nuget { publish { packageId = "MyCatLib" version = "1.0.0" authors = "yourname" description = "My Kotlin/Native library" rootPackage = "com.example.cats" } } That's it. Add the plugin, point it at your native targets, and run the publish task. Out pops a .nupkg. Why though? 🤔 It's a fair question. I got it a lot (even on that talk) Kotlin Multiplatform already reaches an absurd number of places: the JVM, Android, iOS, JS, Wasm, and native desktop. But there's th

## Practical Kotlin Multiplatform: Setting up the Kotlin Multiplatform Networking Module with Ktor

DevFeed: [Practical Kotlin Multiplatform: Setting up the Kotlin Multiplatform Networking Module with Ktor](<https://devfeed.tech/articles/practical-kotlin-multiplatform-setting-up-the-kotlin-multiplatform-networking-module-with-ktor-25190.md>)

Original publisher: [Read original article](<https://joebirch.co/android/practical-kotlin-multiplatform-setting-up-the-kotlin-multiplatform-networking-module-with-ktor/>)

Author: hitherejoe

Published: 2026-07-10T16:16:31Z

Content type: tutorial

Language: en

Sources: [Joe Birch](<https://devfeed.tech/sources/joe-birch.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>), [networking](<https://devfeed.tech/topics/networking.md>), [REST API](<https://devfeed.tech/topics/rest-api.md>), [Authentication](<https://devfeed.tech/topics/authentication.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Android](<https://devfeed.tech/topics/android.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [authentication](<https://devfeed.tech/tags/authentication.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [ios](<https://devfeed.tech/tags/ios.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [library](<https://devfeed.tech/tags/library.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [module](<https://devfeed.tech/tags/module.md>), [networking](<https://devfeed.tech/tags/networking.md>), [rest-api](<https://devfeed.tech/tags/rest-api.md>)

### AI overview

A tutorial series installment that sets up a Kotlin Multiplatform networking module with Ktor for shared Android and iOS code. It describes building a portable Firebase Authentication and Firestore REST API layer without relying on platform-specific SDKs.

### Source excerpt

This post is part one of a series adapted from Practical KMP, my book on building production Kotlin Multiplatform apps for Android and iOS. Part 1: Creating the Kotlin Multiplatform Module In this part of the book, we'll build the complete authentication remote store, defining a repository that handles every operation our app needs for... Continue reading ->

## Inside SubcomposeLayout: Jetpack Compose's Most Misunderstood API

DevFeed: [Inside SubcomposeLayout: Jetpack Compose's Most Misunderstood API](<https://devfeed.tech/articles/inside-subcomposelayout-jetpack-compose-s-most-misunderstood-api-25730.md>)

Original publisher: [Read original article](<https://blog.shreyaspatil.dev/inside-subcomposelayout-jetpack-composes-most-misunderstood-api/>)

Author: Shreyas Patil

Published: 2026-07-10T12:05:00Z

Content type: article

Language: en

Sources: [Shreyas Patil's Blog](<https://devfeed.tech/sources/shreyas-patil-s-blog.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [compose](<https://devfeed.tech/tags/compose.md>), [declarative](<https://devfeed.tech/tags/declarative.md>), [deep-dive](<https://devfeed.tech/tags/deep-dive.md>), [internals](<https://devfeed.tech/tags/internals.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [learn](<https://devfeed.tech/tags/learn.md>), [performance](<https://devfeed.tech/tags/performance.md>), [performance-optimization](<https://devfeed.tech/tags/performance-optimization.md>), [ui](<https://devfeed.tech/tags/ui.md>), [uiux](<https://devfeed.tech/tags/uiux.md>)

### AI overview

A deep dive into Jetpack Compose's SubcomposeLayout, explaining how it performs composition during measurement or placement, stalls the normal layout pipeline, and can create performance costs. The article also outlines when standard custom layouts or SubcomposeLayout are appropriate.

### Source excerpt

A deep dive into the internals of SubcomposeLayout in Jetpack Compose. Learn how subcomposition actually works, why it breaks the phase rules, and the real node-thrashing cost it carries.

## Google IO 26: Gemini, Big Rocks, Opportunities for Android

DevFeed: [Google IO 26: Gemini, Big Rocks, Opportunities for Android](<https://devfeed.tech/articles/google-io-26-gemini-big-rocks-opportunities-for-android-29457.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/google-io-26-gemini-big-rocks-opportunities-for-android-2d71e00c9bfb?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-07-05T09:06:38Z

Content type: article

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Google](<https://devfeed.tech/topics/google.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [AI Models](<https://devfeed.tech/topics/ai-models.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [AI tools for developers](<https://devfeed.tech/topics/ai-tools-for-developers.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-models](<https://devfeed.tech/tags/ai-models.md>), [ai-tools-for-developers](<https://devfeed.tech/tags/ai-tools-for-developers.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [google](<https://devfeed.tech/tags/google.md>), [google-io](<https://devfeed.tech/tags/google-io.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>)

### AI overview

This article reviews Google I/O 26 with a focus on Gemini models, developer tools, the Android ecosystem, Android 17, and opportunities involving UI, performance, and AI.

### Source excerpt

In the AI Age, Google continue to thrive in its mobile ecosystem Continue reading on Mobile App Development Publication "

## Building the Crossplay Board

DevFeed: [Building the Crossplay Board](<https://devfeed.tech/articles/building-the-crossplay-board-39148.md>)

Original publisher: [Read original article](<https://open.nytimes.com/building-the-crossplay-board-6de68c8574f9?source=rss----51e1d1745b32---4>)

Author: The NYT Open Team

Published: 2026-06-08T16:46:30Z

Content type: tutorial

Language: en

Sources: [New York Times](<https://devfeed.tech/sources/new-york-times.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Development](<https://devfeed.tech/topics/development.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [ui](<https://devfeed.tech/topics/ui.md>), [screen](<https://devfeed.tech/topics/screen.md>), [real-time](<https://devfeed.tech/topics/real-time.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [draggable](<https://devfeed.tech/tags/draggable.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [multiplayer](<https://devfeed.tech/tags/multiplayer.md>), [real-time](<https://devfeed.tech/tags/real-time.md>), [screen](<https://devfeed.tech/tags/screen.md>)

### AI overview

The New York Times Games team describes building the Android game board for Crossplay, a multiplayer word game with a 15x15 grid, draggable tiles, real-time animation, and asynchronous matches. The team used a hybrid architecture: an Android GridLayout with 225 tile Views integrated into surrounding Jetpack Compose UI.

### Source excerpt

How We Made a 15X15 Game Surface Feel at Home on AndriodIllustration by Lehel Kovács By Shafik Quoraishee What Is Crossplay? The New York Times Games team has been building daily puzzles for quite a while: Wordle, Spelling Bee, Connections, The Mini. These are solo games. The player opens them, solves them, and then closes them. This leads to a simple, satisfying experience which delights millions of players a day. Crossplay is an altogether different endeavor. It's the first multiplayer game from NYT Games, and it brings a friend (or a stranger) into the experience with them. So two players, one board, in real time. In Crossplay, players take turns placing letter tiles on a 15x15 grid to form interlocking words, but built for mobile with a focus on speed, fairness, and the back-and-forth tension that compels the player to play one more round. The matches are asynchronous by default. The player makes their move, the opponent gets notified and responds when they're ready. But the board animates as if the players are both sitting at the same table. When we set out to build it, we knew the board would be the hardest part. While the networking, the opponent matching, and the game logic were all challenging work, the board itself which is part of the core game loop was the most difficult piece because of the number of interactions required to make it function correctly, in concert. Since every cell is a potential drop target and every tile is draggable, the board needs to respond instantly to touch *and* animate their opponent's moves *as they happen*. This all must occur on a screen that is a few inches wide. In this post we discuss what it took to get that right on Android. Starting with the Grid One of our first questions was architectural. How should 225 tiles be laid out? Jetpack Compose is the obvious modern choice. But Crossplay's development started before our team had fully migrated to Compose, and the game board had specific requirements that made a pure-Compos

## Migrating to AGP 9.2.1: Kotlin build errors I hit and how I fixed them

DevFeed: [Migrating to AGP 9.2.1: Kotlin build errors I hit and how I fixed them](<https://devfeed.tech/articles/migrating-to-agp-9-2-1-kotlin-build-errors-i-hit-and-how-i-fixed-them-25977.md>)

Original publisher: [Read original article](<https://navczydev.medium.com/migrating-to-agp-9-2-1-kotlin-build-errors-i-hit-and-how-i-fixed-them-1565bb36b96f?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-05-27T01:03:56Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [developer tooling](<https://devfeed.tech/topics/developer-tooling.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-gradle-plugin](<https://devfeed.tech/tags/android-gradle-plugin.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [dagger-hilt](<https://devfeed.tech/tags/dagger-hilt.md>), [errors](<https://devfeed.tech/tags/errors.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ksp](<https://devfeed.tech/tags/ksp.md>), [migration](<https://devfeed.tech/tags/migration.md>)

### AI overview

A tutorial documenting a small Android project migration to AGP 9.2.1. It explains build errors caused by AGP 9's built-in Kotlin support and shows fixes involving removal of the old Kotlin Android plugin, migration from KAPT to KSP for Hilt, and replacement of the legacy kotlinOptions DSL.

### Source excerpt

Image generate using perplexity I recently upgraded an Android project to AGP 9.2.1 and ran into a chain of build errors. In my case, the project was a very small app, so there might be more issues if the project setup is complicated. Each one pointed to a different part of the new Kotlin/Gradle setup, and fixing them one by one made the migration much clearer. Why this happened AGP 9 introduces built-in Kotlin support that changes the old plugin setup (org.jetbrains.kotlin.android). 🛑 kapt, and kotlinOptions no longer work the same way. Error 1: Cannot add extension with name kotlinCannot add extension with name 'kotlin', as there is an extension already registered with that name. The fix was to remove the Kotlin Android plugin from the module and any root-level declarations that still applied it. AGP 9 already provides Kotlin support, so applying the old plugin causes a duplicate kotlin extension.Fixplugins { id("com.android.application") // remove: id("org.jetbrains.kotlin.android") }Error 2: org.jetbrains.kotlin.kapt is not compatible with built-in Kotlin support After removing the Kotlin Android plugin, the next failure came from kapt The 'org.jetbrains.kotlin.kapt' plugin is not compatible with built-in Kotlin support. Android's migration guide recommends moving to KSP, or using com.android.legacy-kapt only as a temporary fallback.Fix After removing kapt, we need to update the affected libraries. In my case, only Hilt was affected, so I updated it with the KSP plugins { //.... // Remove KAPT kotlin("kapt") // Add KSP id("com.google.devtools.ksp") } // dependencies dependencies { // kapt(libs.hilt.compiler) ksp(libs.dagger.hilt.compiler) // ... }Error 3: Unresolved reference: kotlinOptions Once kapt was out of the way, the build hit another issue 🤯 Unresolved reference 'kotlinOptions' That's because AGP 9 built-in Kotlin uses the new Kotlin compiler options DSL instead of the old android.kotlinOptions {} block. The Android migration doc says to move those setti

## Android 17: 15 Important Changes to Keep Your App Working

DevFeed: [Android 17: 15 Important Changes to Keep Your App Working](<https://devfeed.tech/articles/android-17-15-important-changes-to-keep-your-app-working-29453.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/android-17-15-important-changes-to-keep-your-app-working-99a93ae85f54?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-05-24T14:13:07Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Development](<https://devfeed.tech/topics/development.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [coding](<https://devfeed.tech/tags/coding.md>), [development](<https://devfeed.tech/tags/development.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [performance](<https://devfeed.tech/tags/performance.md>), [software-development](<https://devfeed.tech/tags/software-development.md>)

### AI overview

This article outlines 15 changes developers should consider when preparing Android apps for Android 17, with emphasis on maintaining compatibility, performance, security, and Play Store compliance.

### Source excerpt

Prepare Your App for a More Secure, High Performance, and Android XR Ready Future. Continue reading on Mobile App Development Publication "

## A Practical Guide to Paging 3 in Jetpack Compose

DevFeed: [A Practical Guide to Paging 3 in Jetpack Compose](<https://devfeed.tech/articles/a-practical-guide-to-paging-3-in-jetpack-compose-29452.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/a-practical-guide-to-paging-3-in-jetpack-compose-e88f56c5b2df?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-04-07T08:16:16Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>), [API](<https://devfeed.tech/topics/api.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [mobile-app-development](<https://devfeed.tech/topics/mobile-app-development.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [api](<https://devfeed.tech/tags/api.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

A practical tutorial on using Paging 3 with Jetpack Compose to paginate server data from a GraphQL API in an Android application. It covers the limitations of loading very large lists at once and introduces built-in handling for loading states, retries, scroll-triggered fetching, and empty states.

### Source excerpt

How To Elegantly Page Your Server Data on Your Android App Continue reading on Mobile App Development Publication "

## GraphQL Tutorial: Why Pagination?

DevFeed: [GraphQL Tutorial: Why Pagination?](<https://devfeed.tech/articles/graphql-tutorial-why-pagination-29458.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/graphql-tutorial-why-pagination-f0e6958d6f76?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-04-04T11:38:42Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [GraphQL](<https://devfeed.tech/topics/graphql.md>), [Tutorial](<https://devfeed.tech/topics/tutorial.md>), [API](<https://devfeed.tech/topics/api.md>), [Back end](<https://devfeed.tech/topics/backend.md>)

Tags: [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [api](<https://devfeed.tech/tags/api.md>), [backend](<https://devfeed.tech/tags/backend.md>), [coding](<https://devfeed.tech/tags/coding.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [ios-app-development](<https://devfeed.tech/tags/ios-app-development.md>), [programming](<https://devfeed.tech/tags/programming.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A tutorial explaining why APIs use pagination to divide large datasets into manageable chunks. It introduces offset-based and cursor-based pagination and describes how pagination can improve response speed, memory use, and user experience.

### Source excerpt

How Not to Crash Your App with a Giant Pizza Order Continue reading on Mobile App Development Publication "

## Integrating the biometric-compose Library with Android Compose Applications

DevFeed: [Integrating the biometric-compose Library with Android Compose Applications](<https://devfeed.tech/articles/biometric-auth-in-compose-made-easy-the-new-library-you-need-25980.md>)

Original publisher: [Read original article](<https://proandroiddev.com/biometric-auth-in-compose-made-easy-the-new-library-you-need-29814270506d?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-04-02T02:28:19Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Authentication](<https://devfeed.tech/topics/authentication.md>), [Android](<https://devfeed.tech/topics/android.md>), [Library](<https://devfeed.tech/topics/library.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [article](<https://devfeed.tech/tags/article.md>), [auth](<https://devfeed.tech/tags/auth.md>), [authentication](<https://devfeed.tech/tags/authentication.md>), [biometric-authentication](<https://devfeed.tech/tags/biometric-authentication.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [library](<https://devfeed.tech/tags/library.md>)

### AI overview

This tutorial explains how to integrate the biometric-compose library into Android applications built with Jetpack Compose. It covers rememberAuthenticationLauncher, authentication callbacks, result handling, prompt configuration and customization, and authentication fallbacks.

### Source excerpt

Image generated using Perplexity In this article, we will learn how to integrate a new library biometric-compose into Android applications for Biometric integration. A new biometric-compose library simplifies the integration of biometrics into Compose-based applications. ImplementationDependencies implementation("androidx.biometric:biometric:1.4.0-alpha06") implementation("androidx.biometric:biometric-compose:1.4.0-alpha06")rememberAuthenticationLauncherrememberAuthenticationLauncher A composable function to streamline biometric authentication requests and callbacks directly in composables. It returns AuthenticationResultLauncher that we can use to initiate the authentication process. We need to pass a callback of type AuthenticationResultCallback . It will be called when an AuthenticationResult is available. A successful or error result will be delivered to AuthenticationResultCallback.onAuthResult , and failures will be delivered to AuthenticationResultCallback.onAuthAttemptFailed, which is set by a callback. The 👆callback will be executed on the main thread.fun AuthenticationResult.processAuthResult(){ when (this) { is AuthenticationResult.Success -> Log.d(TAG, "AuthenticationResult Success, \nAuth type: $authType, \nCrypto object: $crypto") is AuthenticationResult.Error -> Log.d(TAG,"AuthenticationResult Error, \nError code: $errorCode, \nErr string: $errString") is AuthenticationResult.CustomFallbackSelected -> { Log.d(TAG,"AuthenticationResult CustomFallbackSelected ${fallback.text}") } } }AuthenticationResultTypeAuthenticationResultTypeDemo AuthenticationResultTypeAuthenticationError (Error code)AuthenticationError (Error code)Demo AuthenticationError (Error code)🧑💻 Code: rememberAuthenticationLauncherval launcher = rememberAuthenticationLauncher( resultCallback = object : AuthenticationResultCallback { override fun onAuthResult(result: AuthenticationResult) { Log.d(TAG, "onAuthResult: $result") processAuthResult() } override fun onAuthAttemptFailed() { supe

## Headless Screenshot Testing in Thumbtack's Android Apps

DevFeed: [Headless Screenshot Testing in Thumbtack's Android Apps](<https://devfeed.tech/articles/headless-screenshot-testing-in-thumbtack-s-android-apps-24725.md>)

Original publisher: [Read original article](<https://medium.com/thumbtack-engineering/headless-screenshot-testing-in-thumbtacks-android-apps-c6254f229a97?source=rss----1199c607a13f---4>)

Author: Brian Terczynski

Published: 2026-03-31T22:47:00Z

Content type: tutorial

Language: en

Sources: [Thumbtack Engineering - Medium](<https://devfeed.tech/sources/thumbtack-engineering-medium.md>)

Topics: [screenshot-testing](<https://devfeed.tech/topics/screenshot-testing.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Android](<https://devfeed.tech/topics/android.md>), [Emulator](<https://devfeed.tech/topics/emulator.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>), [Jenkins](<https://devfeed.tech/topics/jenkins.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [jenkins](<https://devfeed.tech/tags/jenkins.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [robolectric](<https://devfeed.tech/tags/robolectric.md>), [roborazzi](<https://devfeed.tech/tags/roborazzi.md>), [screenshot-testing](<https://devfeed.tech/tags/screenshot-testing.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

Thumbtack explains how it chose Roborazzi to run high-fidelity screenshot tests for its Android apps without an emulator. The article describes how emulator-based testing was slow and difficult to use for Jenkins verification, especially with more than 1,500 tests.

### Source excerpt

How we chose Roborazzi for fast, easy, and high-fidelity screenshot tests of our Android apps, without needing to run them on an emulator. As mentioned in our earlier blog post, screenshot tests are a fundamental part of our testing pyramid at Thumbtack. They validate that our UI code renders correctly. They catch UI regressions as our code evolves. They make it easy to share incremental progress with designers. In code reviews, they provide a great way for reviewers to "see" what the UI code is doing. Finally, they are very easy to write! But they were not always easy to run. Because they tested Android UI code, they had to run in a "real" Android environment so that the drawing operations would work. This meant running them on an Android device or emulator. To ensure consistent renderings, developers would have to run their tests on the same device used by our CI job. In the past, this meant having to run a script that would connect to our cloud device testing provider to generate the reference image, which would then be downloaded for inclusion in the local Git branch. Such a process would take minutes to run (not including build time). This got easier when we switched to Firebase Test Lab (FTL), because their emulators were the same as the emulators provided in the Android SDK used on developers' machines. Developers could then simply run their tests on a local emulator which sped up execution time significantly. But it still meant the emulator profile needed to match that of the device on FTL; in particular, the screen size and pixel density. Another problem was, because these were run on an emulator, they could not run with our CR verification job on Jenkins because their execution time was too slow (especially since we have over 1,500 of these tests!). This therefore meant that we had to run our screenshot tests separately, and they could not be used to gate code pushes because they were just too slow to run. So what would often happen was developers would me

## The Future of Android Apps with AppFunctions

DevFeed: [The Future of Android Apps with AppFunctions](<https://devfeed.tech/articles/the-future-of-android-apps-with-appfunctions-25755.md>)

Original publisher: [Read original article](<https://blog.shreyaspatil.dev/the-future-of-android-apps-with-appfunctions/>)

Author: Shreyas Patil

Published: 2026-03-30T04:30:00Z

Content type: article

Language: en

Sources: [Shreyas Patil's Blog](<https://devfeed.tech/sources/shreyas-patil-s-blog.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [AI Agent](<https://devfeed.tech/topics/ai-agent.md>), [Jetpack](<https://devfeed.tech/topics/jetpack.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>)

Tags: [agentic-ai](<https://devfeed.tech/tags/agentic-ai.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-agent](<https://devfeed.tech/tags/ai-agent.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [aidl](<https://devfeed.tech/tags/aidl.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-apps](<https://devfeed.tech/tags/android-apps.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [sdk](<https://devfeed.tech/tags/sdk.md>)

### AI overview

This article explains Android AppFunctions, which let apps expose self-describing data and functionality that AI agents and assistants can discover and execute using natural language. It discusses their optional nature, current device availability, Gemini access, and integration through the Android 16 SDK or Jetpack library.

### Source excerpt

Explore the potential of Android AppFunctions for AI agents. Learn how apps can share functionality with intelligent assistants using self-describing functions.

## Meet FlexBox: The Powerful New Layout System for Compose

DevFeed: [Meet FlexBox: The Powerful New Layout System for Compose](<https://devfeed.tech/articles/meet-flexbox-the-powerful-new-layout-system-for-compose-25986.md>)

Original publisher: [Read original article](<https://proandroiddev.com/meet-flexbox-the-powerful-new-layout-system-for-compose-446b1f65cc62?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-27T18:22:23Z

Content type: article

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [CSS](<https://devfeed.tech/topics/css.md>)

Tags: [3](<https://devfeed.tech/tags/3.md>), [adaptive](<https://devfeed.tech/tags/adaptive.md>), [alignment](<https://devfeed.tech/tags/alignment.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [api](<https://devfeed.tech/tags/api.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [container](<https://devfeed.tech/tags/container.md>), [css](<https://devfeed.tech/tags/css.md>), [flexbox](<https://devfeed.tech/tags/flexbox.md>), [introduction](<https://devfeed.tech/tags/introduction.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [layout](<https://devfeed.tech/tags/layout.md>), [space](<https://devfeed.tech/tags/space.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial introduces FlexBox, a new Jetpack Compose layout system inspired by CSS Flexbox. It explains how FlexBox arranges children dynamically and covers FlexBoxConfig parameters for direction, wrapping, alignment, spacing, and item distribution, along with Modifier.flex controls and code samples.

### Source excerpt

Header image Jetpack Compose continues to evolve, and with the introduction of the new FlexBox layout, we finally have a powerful, flexible way to design adaptive UIs -- inspired by the CSS Flexbox model. https://developer.android.com/develop/ui/compose/layouts/adaptive/flexbox If you've ever used Row, Column, or FlowRowYou'll feel right at home. FlexBox acts as a superset, combining their capabilities while providing granular control over alignment, wrapping, and item distribution. Until now, we had to choose between rigid layouts (Row/Column) or more dynamic ones (FlowRow/FlowColumn). FlexBox merges the best of both worlds -- flexibility and simplicity. What Is FlexBox? Composable brings the concept of flexible layouts from the web into Jetpack Compose. Arranges its children dynamically, allowing them to grow, shrink, or wrap based on available space and configuration. Preview FlexBoxFlexBox API🏗 Building blocks and their roles.FlexBoxThe main composable responsible for arranging children.FlexBox( config = { direction(FlexDirection.Row) wrap(FlexWrap.Wrap) justifyContent(FlexJustifyContent.SpaceBetween) alignItems(FlexAlignItems.Center) gap(8.dp) }, modifier = Modifier .border(1.dp, Color.Black) ) { Text( "Item 1", Modifier .flex { grow(1f) } .background(color = randomColor()) .border(1.dp, Color.Black) ) Text( "Item 2", Modifier .flex { basis(80.dp) } .background(color = randomColor())) }Screenshot FlexBox SampleFlexBoxConfigConfigures the container's layout behavior -- direction, wrapping, justification, alignment, and spacing. Key parameters: direction: Controls the main axis (Row, Column). wrap: Determines if items flow onto new lines. Here we have 3 options: Wrap, NoWrap, WrapReverse justifyContent: Distributes space along the main axis(start, end, etc). alignItems: Defines how items align on the cross-axis(start, end, etc). alignContent: Controls how multiple lines are distributed along the cross-axis. This applies only when the wrap is FlexWrap.Wrap or FlexWr

## Monitoring Android Vitals with the Play Developer Reporting API

DevFeed: [Monitoring Android Vitals with the Play Developer Reporting API](<https://devfeed.tech/articles/monitoring-android-vitals-with-the-play-developer-reporting-api-25945.md>)

Original publisher: [Read original article](<https://medium.com/google-developer-experts/monitoring-android-vitals-with-the-play-developer-reporting-api-85edabb772a9?source=rss-cbfc736ddcd3------2>)

Author: Julien Salvi

Published: 2026-03-19T12:41:51Z

Content type: tutorial

Language: en

Sources: [Stories by Julien Salvi on Medium](<https://devfeed.tech/sources/stories-by-julien-salvi-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [API](<https://devfeed.tech/topics/api.md>), [Google Play](<https://devfeed.tech/topics/google-play.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [CI/CD Pipeline](<https://devfeed.tech/topics/ci-cd-pipeline.md>), [Google Cloud Platform (GCP)](<https://devfeed.tech/topics/google-cloud.md>), [Slack](<https://devfeed.tech/topics/slack.md>)

Tags: [aircall](<https://devfeed.tech/tags/aircall.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [anr](<https://devfeed.tech/tags/anr.md>), [api](<https://devfeed.tech/tags/api.md>), [ci-cd-pipeline](<https://devfeed.tech/tags/ci-cd-pipeline.md>), [crash](<https://devfeed.tech/tags/crash.md>), [google-play-developer](<https://devfeed.tech/tags/google-play-developer.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [reporting](<https://devfeed.tech/tags/reporting.md>), [slack](<https://devfeed.tech/tags/slack.md>)

### AI overview

This tutorial explains how Aircall uses the Google Play Developer Reporting API in a Gradle task to retrieve Android Vitals, including ANR and crash metrics, and deliver daily health reporting to Slack. It covers metric-set queries, timeline aggregations, service-account authentication, data modeling, and health thresholds.

### Source excerpt

At Aircall, we built an automated reporting tool that fetches our Android Vitals metrics thanks to the Play Developer Reporting API and delivers a daily health dashboard straight to Slack. All of this powered by a simple Gradle task. Discovering the API The Google Play Developer Reporting API gives programmatic access to the same quality metrics you see in the Google Play Console. It covers the core Android Vitals: ANR rate, crash rate, slow start rate, and stuck background wakelocks, the signals Google uses to determine whether your app meets the bad behavior thresholds. The API is organized around metric sets that you query with a timeline specification. Each metric set returns daily, 7-day, and 28-day user-weighted aggregates, giving you the full picture from short-term regressions to long-term trends. The key advantage over scraping the Console UI is that you can automate the entire flow and integrate it into your existing CI/CD pipeline. You will find the complete API reference in the official documentation. Build with Play VitalsSetting up the dependency We chose to implement this as a Gradle task inside our build-logic module. This keeps the reporting logic close to the project without polluting the app code. First, let's add the dependency: # libs.versions.toml googleApiReporting = "v1beta1-rev20230803-2.0.0" buildLogic-plugin-google-play-developer-reporting = { module = "com.google.apis:google-api-services-playdeveloperreporting", version.ref = "googleApiReporting" } Which can then be added to the build.gradle.kts of your build-logic module: dependencies { // API to get Google Play store vitals metrics implementation(libs.buildLogic.plugin.google.play.developer.reporting) }Authenticating with a Service Account To access the API, you need a Google Cloud Service Account with the Play Developer Reporting scope. We pass the credentials as an environment variable to keep secrets out of the repository. The Reporting client initializes the API with these credentia

## Beyond Positions: Kotlin's New Name-Based Destructuring

DevFeed: [Beyond Positions: Kotlin's New Name-Based Destructuring](<https://devfeed.tech/articles/beyond-positions-kotlin-s-new-name-based-destructuring-25979.md>)

Original publisher: [Read original article](<https://proandroiddev.com/beyond-positions-kotlins-new-name-based-destructuring-eee347d1bb5c?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-18T01:24:50Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [properties](<https://devfeed.tech/topics/properties.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [data-class](<https://devfeed.tech/tags/data-class.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-2](<https://devfeed.tech/tags/kotlin-2.md>), [kotlin-native](<https://devfeed.tech/tags/kotlin-native.md>), [properties](<https://devfeed.tech/tags/properties.md>)

### AI overview

This tutorial explains Kotlin 2.3.20's experimental name-based destructuring declarations, which match variables to properties instead of relying on componentN() position. It also covers the compiler option and supported modes.

### Source excerpt

Image generated using Perplexity Name-based destructuring declarations were introduced in Kotlin 2.3.20 and match variables to properties rather than relying on position-based componentN(). Previously, destructive declarations used position-based destruction: data class User(var firstName: String, var lastName: String) val user = User("Alice", "Husseini") // componentN() val(firstName,lastName) = user println(firstName) println(lastName)Drawback of the componentN() based approach Destructuring relies on the order of componentN() functions, lastName receives the value of firstName, and firstName receives the value of lastName 👇 data class User(var firstName: String, var lastName: String) val user = User("Alice", "Husseini") // componentN() val(lastName,firstName) = user println(firstName) -> Husseini println(lastName) -> AliceName-based destructuring ✨ It's an Experimental feature. We can control how the compiler interprets destructuring declarations with the -Xname-based-destructuring compiler option. kotlin { // .. compilerOptions { freeCompilerArgs.add("-Xname-based-destructuring=only-syntax") } }Each variable refers to a property by name.val user = User("Alice", "Husseini") // Name-based destructuring (val firstName = firstName, val lastName = lastName) = userModeshttps://kotlinlang.org/docs/whatsnew2320.html#languageMode -- Name-Mismatch⚠ Warning ⚠Name-Mismatch warningMode -- Complete Position-based destructuring using square brackets []: data class User(var firstName: String, var lastName: String) val user = User("Alice", "Husseini") // componentN() val [firstName,lastName] = userReferences What's new in Kotlin 2.3.20 | Kotlin Stay in touch https://www.linkedin.com/in/navczydev/ JavaScript is not available. navczydev - Overview navczydev.bsky.social Beyond Positions: Kotlin's New Name-Based Destructuring was originally published in ProAndroidDev on Medium, where people are continuing the conversation by highlighting and responding to this story.

## Jetpack Compose Material 3 unifies theme data in LocalMaterialTheme

DevFeed: [Jetpack Compose Material 3 unifies theme data in LocalMaterialTheme](<https://devfeed.tech/articles/localmaterialtheme-from-prop-hell-to-theme-nirvana-material3-25984.md>)

Original publisher: [Read original article](<https://proandroiddev.com/localmaterialtheme-from-prop-hell-to-theme-nirvana-material3-38b3c01ab7d4?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-12T19:38:30Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>)

Tags: [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [design-systems](<https://devfeed.tech/tags/design-systems.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [material3](<https://devfeed.tech/tags/material3.md>)

### AI overview

Jetpack Compose Material 3 1.5.0-alpha15 changes MaterialTheme to use one LocalMaterialTheme CompositionLocal for color, typography, shapes, and motion. The article explains how this can simplify theme management and allow custom modifier nodes to read theme data outside composable scopes.

### Source excerpt

Image generated using Perplexity Jetpack Compose Material 3 1.5.0-alpha15 introduces a subtle but powerful refactor MaterialTheme now uses a single LocalMaterialTheme CompositionLocal instead of separate locals for color, typography, shapes, and motion. While this simplifies internal theme management, its real value emerges when building custom design systems and theme-aware Modifier libraries. The Refactor: Cleaner Under the Hood Previously, MaterialTheme relied on multiple CompositionLocals: Source:https://android-review.googlesource.com/c/platform/frameworks/support/+/3949000/16/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt Now: Everything flows through one unified source: Source:https://android-review.googlesource.com/c/platform/frameworks/support/+/3949000/16/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.ktThis reduces allocations and simplifies the theme provider.⭐ Where It Shines: Design Systems & Custom Modifiers ⭐ The game-changer is CompositionLocalConsumerModifierNode support. Custom Modifiers that handle drawing/layout outside @Composable scopes can now read theme data directly:object BrandGradientOverlayElement : ModifierNodeElement<BrandGradientOverlayNode>() { override fun create(): BrandGradientOverlayNode = BrandGradientOverlayNode() override fun update(node: BrandGradientOverlayNode) { // No-Op } override fun InspectorInfo.inspectableProperties() { name = "brandGradientOverlay" } override fun equals(other: Any?): Boolean = (this === other) override fun hashCode(): Int = javaClass.hashCode() } class BrandGradientOverlayNode : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode { override fun ContentDrawScope.draw() { // Read color scheme to access colors val colorScheme = currentValueOf(MaterialTheme.LocalMaterialTheme).colorScheme val gradient = Brush.linearGradient( listOf( colorScheme.primary, colorScheme.secondary) ) drawContent() d

## DroidCon: Debugging App Performance at Scale

DevFeed: [DroidCon: Debugging App Performance at Scale](<https://devfeed.tech/articles/droidcon-debugging-app-performance-at-scale-25715.md>)

Original publisher: [Read original article](<https://blog.shreyaspatil.dev/droidcon-debugging-app-performance-at-scale/>)

Author: Shreyas Patil

Published: 2026-01-19T04:58:14Z

Content type: article

Language: en

Sources: [Shreyas Patil's Blog](<https://devfeed.tech/sources/shreyas-patil-s-blog.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [debug](<https://devfeed.tech/topics/debug.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [2025](<https://devfeed.tech/tags/2025.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [app-performance](<https://devfeed.tech/tags/app-performance.md>), [community](<https://devfeed.tech/tags/community.md>), [conference](<https://devfeed.tech/tags/conference.md>), [droidcon](<https://devfeed.tech/tags/droidcon.md>), [droidconindia](<https://devfeed.tech/tags/droidconindia.md>), [performance](<https://devfeed.tech/tags/performance.md>), [profiling](<https://devfeed.tech/tags/profiling.md>), [public-speaking](<https://devfeed.tech/tags/public-speaking.md>), [recap](<https://devfeed.tech/tags/recap.md>), [talk](<https://devfeed.tech/tags/talk.md>), [tech-talk](<https://devfeed.tech/tags/tech-talk.md>)

### AI overview

A recap of the author's DroidCon India 2025 session on debugging Android app performance at scale. The article links to the session recording and slides and discusses the event, audience response, and developer community.

### Source excerpt

Recap of my DroidCon India 2025 talk on debugging Android app performance at scale. Watch the session and learn about performance profiling tools.

## Android Security: mobsfscan

DevFeed: [Android Security: mobsfscan](<https://devfeed.tech/articles/android-security-mobsfscan-27032.md>)

Original publisher: [Read original article](<https://blog.stackademic.com/android-security-mobsfscan-7cd9f52e19a0?source=rss-be40b368c57e------2>)

Author: Matthew Dolan

Published: 2026-01-16T17:51:35Z

Content type: tutorial

Language: en

Sources: [Stories by Matthew Dolan on Medium](<https://devfeed.tech/sources/stories-by-matthew-dolan-on-medium.md>)

Topics: [Android Security](<https://devfeed.tech/topics/android-security.md>), [Mobile Security](<https://devfeed.tech/topics/mobile-security.md>), [Security](<https://devfeed.tech/topics/security.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>), [CI/CD](<https://devfeed.tech/topics/cicd.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Docker Image](<https://devfeed.tech/topics/docker-image.md>)

Tags: [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-security](<https://devfeed.tech/tags/android-security.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [build-secure-apps](<https://devfeed.tech/tags/build-secure-apps.md>), [ci-cd](<https://devfeed.tech/tags/ci-cd.md>), [docker-image](<https://devfeed.tech/tags/docker-image.md>), [github](<https://devfeed.tech/tags/github.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [mobile-security](<https://devfeed.tech/tags/mobile-security.md>), [security](<https://devfeed.tech/tags/security.md>)

### AI overview

A tutorial on using the free, open-source mobsfscan tool to detect insecure code patterns in mobile applications. It focuses on running mobsfscan with GitHub Actions and uploading SARIF results to GitHub's Security tab.

### Source excerpt

Not a medium member? "Read for free" Continue reading on Stackademic "

## Inside Jetpack ViewModel: Internal Mechanisms and Multiplatform Design

DevFeed: [Inside Jetpack ViewModel: Internal Mechanisms and Multiplatform Design](<https://devfeed.tech/articles/inside-jetpack-viewmodel-internal-mechanisms-and-multiplatform-design-25922.md>)

Original publisher: [Read original article](<https://proandroiddev.com/inside-jetpack-viewmodel-internal-mechanisms-and-multiplatform-design-2625671eaef8?source=rss-9bb203a4ab2e------2>)

Author: Jaewoong Eum

Published: 2025-12-07T02:29:08Z

Content type: tutorial

Language: en

Sources: [Stories by Jaewoong Eum on Medium](<https://devfeed.tech/sources/stories-by-jaewoong-eum-on-medium.md>)

Topics: [Jetpack](<https://devfeed.tech/topics/jetpack.md>), [Android](<https://devfeed.tech/topics/android.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [caching](<https://devfeed.tech/tags/caching.md>), [change](<https://devfeed.tech/tags/change.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [interface](<https://devfeed.tech/tags/interface.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [key-value-store](<https://devfeed.tech/tags/key-value-store.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [lifecycle](<https://devfeed.tech/tags/lifecycle.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>)

### AI overview

A technical tutorial explaining Jetpack ViewModel's internal mechanisms, including retention across configuration changes, ViewModelStore key-value caching, ViewModelProvider creation, factory-based instantiation, resource cleanup, and coroutine integration.

### Source excerpt

Unsplash@davidvig Jetpack's ViewModel has become an essential component of modern Android development, providing a lifecycle-aware container for UI-related data that survives configuration changes. While the API appears simple on the surface, the internal machinery reveals design decisions around lifecycle management, multiplatform abstraction, resource cleanup, and thread-safe caching. Understanding how ViewModel works under the hood helps you make better architectural decisions and avoid subtle bugs. In this article, you'll dive deep into how Jetpack ViewModel works internally, exploring how the ViewModelStore retains instances across configuration changes, how ViewModelProvider orchestrates creation and caching, how the factory pattern enables flexible instantiation, how CreationExtras enables stateless factories, how resource cleanup is managed through the Closeable pattern, and how viewModelScope integrates coroutines with the ViewModel lifecycle. The fundamental problem: Surviving configuration changes Configuration changes present a fundamental challenge for Android development. When a user rotates their device, changes language settings, or triggers any configuration change, the system destroys and recreates the Activity. Any data stored in the Activity is lost: https://medium.com/media/82ee86f042e31a1ede3f551f919b4429/href The naive approach is to use onSaveInstanceState(): https://medium.com/media/74f2c1da669e831b1488b3f297d55997/href This works for small, serializable data. But what about large datasets, network connections, or objects that can't be serialized? What about ongoing operations like network requests? The Bundle approach fails for these cases, both because of size limitations and because serialization/deserialization is expensive. ViewModel solves this by providing a lifecycle-aware container that survives configuration changes through a retained object pattern, not serialization. The ViewModelStore: The retention mechanism At the heart of Vie

[Next page](<https://devfeed.tech/tags/android-app-development.md?cursor=WyIyMDI1LTEyLTA3VDAyOjI5OjA4KzAwOjAwIiwgIjE1ZjkxZTAyLWVlOTEtNDJhOC1hYjExLTk3ZmIyMmQ4OWEyOCJd>)