Migrate Xml Views To Jetpack Compose
Android (Google)OfficialCreated by Google LLCDistributed by Android (Google)
- Skill
- Workflow
- Software development
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a systematic methodology for converting Android XML Views into declarative Jetpack Compose components. It emphasizes maintaining visual parity and functional integrity through a rigorous process that includes project analysis, dependency setup, theming alignment, and validation. The workflow is designed for incremental adoption, ensuring that legacy XML and new Compose code can coexist through interoperability APIs while preparing the codebase for a full transition to Compose.
What it does
- Analyzes existing XML layouts and project infrastructure for migration readiness.
- Guides the setup of Compose dependencies and compiler configurations.
- Facilitates the migration of XML themes to Material 3 Compose theming.
- Provides a structured approach to replacing XML View usages with Compose components.
- Ensures visual parity through automated screenshot testing and Compose Previews.
- Manages the safe removal of legacy XML files and associated resources.
When to use it
- When modernizing an Android application's UI layer from XML to Jetpack Compose.
- When you need to perform an incremental migration of specific UI components.
- When you need to ensure visual consistency between legacy XML and new Compose code.
- When integrating new Compose features into an existing View-based Android project.
Advantages
- Reduces risk by following a validated, step-by-step migration methodology.
- Maintains project stability through interoperability best practices.
- Ensures visual fidelity using baseline screenshot comparisons.
- Promotes clean code by systematically removing redundant legacy XML resources.
Usage examples
- “Help me migrate my login_screen.xml to Jetpack Compose.”
- The agent will initiate the 10-step workflow, starting with an analysis of the login_screen.xml structure and project dependencies to create a migration plan.
- “How do I handle theming when moving from XML to Compose?”
- The agent will guide you through mapping XML color attributes and styles to Material 3 semantic roles within a Compose MaterialTheme.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/android/migrate-xml-views-to-jetpack-compose/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip migrate-xml-views-to-jetpack-compose.zip -d .agents/skills
Documentation by Google LLC
This skill guides through the process of migrating an existing Android XML View to Jetpack Compose. It performs a stable, safe and visually consistent transition by following a structured, 10-step methodology. This skill migrates UI (XML to Jetpack Compose) only.
Objective
To systematically convert a single legacy XML layout into modern, declarative Jetpack Compose UI while maintaining pixel-perfect visual parity and functional integrity.
Summary of the 10-step migration process
Identify the optimal XML candidate for migration
Analyze the project and layout
Create a plan
Capture the XML View UI
Set up Compose dependencies and compiler
Set up Compose theming
Migrate the XML layout to Compose
Validate the migration
Replace usages
XML code removal
Detailed steps
Step 1: Identify the optimal XML candidate for migration
If the user has explicitly specified a target XML layout, proceed to Step 2. Otherwise, analyze the codebase to identify the best candidate for migration by following the logic in references/identify-optimal-xml-candidate.md.
Step 2: Analyze the project and layout
Analyze the identified XML View's structure, hierarchy, and implementation details. Use references/analysis-of-the-project-and-layout.md to guide your technical audit of the layout and surrounding project context.
Step 3: Create a plan
Using the outputs and analysis done in the Step 1 and 2, generate a step-by-step plan for the migration. If you support user interaction, present to the user and ask for approval before proceeding. If user interaction is not supported, proceed to Step 4 following the generated plan.
Step 4: Capture the XML View UI
IF you support user interaction, ask the user to upload a screenshot of the XML View UI or provide an absolute path to a file. Use this image as a visual reference for the layout migration in Step 7. ELSE IF you are able to run an Android emulator, locate an existing screenshot test for the XML candidate. If none exists, create one using the existing project testing framework. If no framework exists, use UI Automator or Espresso to create a screenshot test with minimum required setup. Run the test and take a baseline screenshot of the XML UI. ELSE proceed to Step 5.
Step 5: Set up Compose dependencies and compiler
Check build.gradle or libs.versions.toml for Compose dependencies and
compiler setup. If missing, use
Setup Compose Dependencies and Compiler.
Run a sync to ensure dependencies resolve without errors.
Step 6: Set up Compose theming
If the project already has Compose theming set up, proceed to Step 7. If Compose theming is missing, initialize it. For Material-based projects, follow Material 3 migration guidelines. For custom design systems, apply expert judgment to migrate XML theming and match existing styles. Constraints: Do not migrate the entire theme. Implement only the minimum theming required for the specific XML candidate. Maintain original XML themes for interoperability. Maintain existing project code conventions, patterns, names and values.
Step 7: Migrate the XML View to Compose
Convert the XML candidate to Jetpack Compose code, referencing references/xml-layout-migration.md and the image from Step 4. You must include a Compose Preview for the newly created composable to facilitate visual verification.
Step 8: Replace usages
Replace the usages of the migrated XML layout to use the new Compose component.
To add Compose in Views, use Compose in Views.
To add Views in Compose, use Views in Compose.
Step 9: Validate the migration
Compare the baseline screenshot image from Step 4 with the rendered Compose Preview of the new composable. Ignore string content; focus on layout and styling. Iterate on the Compose code until visual parity is achieved. Once verified, write a Compose UI test for the new composable.
Step 10: XML code removal
Delete the migrated XML file and its associated legacy tests. Caution: Only remove code and resources that are not referenced by other parts of the project.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md5.3 KiB
- references/analysis-of-the-project-and-layout.md3.1 KiB
- references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md8.1 KiB
- references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md12.0 KiB
- references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md12.2 KiB
- references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md7.3 KiB
- references/identify-optimal-xml-candidate.md1.6 KiB
- references/xml-layout-migration.md3.5 KiB
references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md
When you introduce Compose in an existing app, you need to migrate your Material
XML themes to use MaterialTheme for Compose components. This means your app's
theming will have two sources of truth: the View-based theme and the Compose
theme. Any changes to your styling need to be made in multiple places. Once
your app is fully migrated to Compose, remove your XML theming.
You can use the Material Theme Builder tool for migrating colors.
When you start the migration from XML to Compose, migrate the theming to Material 3 Compose theming.
Glossary
| Term | Definition |
|---|---|
MaterialTheme | The composable function that provides theming (colors, typography, shapes) to Compose UI components. |
Shapes | A Compose object used to define custom component shapes for a MaterialTheme. |
Typography | A Compose object used to define custom text styles (font families, sizes, weights) for a MaterialTheme. |
ColorScheme | A Compose object used to define custom color schemes for MaterialTheme. |
| XML Theme | The Android theming system defined in XML files, used by the View system. |
Limitations
Before migrating, be aware of the following limitations:
This guide focuses on migrating to Material 3 only. For migrating from alternative design systems, see Material 2 or Custom design systems in Compose.
The ultimate goal is a complete migration to Compose, which allows for the removal of XML theming. This guide explains how to migrate, but it doesn't explain how to finally remove XML theming.
Step 1: Evaluate the design system
Identify which design system is used in the XML View project. Analyze the migration path and necessary steps to migrate the existing design system to Material 3 in Compose.
Step 2: Identify theme source files
In XML you write ?attr/colorPrimary. In Compose, you access theme values
with MaterialTheme.*:
Identify and locate all XML resources and files necessary for theming: light and dark color schemes and qualifiers, themes, shapes, dimensions, typography, styles and other relevant files.
Resources such as strings can be reused as is and don't need to be migrated.
Step 3: Migrate colors
Key principle: XML uses named hex colors.
Material 3 uses semantic roles (e.g., primary, onPrimary, surface).
Stop naming colors by their hex; name them by their role.
Examples:
| XML color name | Material 3 role |
|---|---|
colorPrimary | primary |
colorPrimaryDark / colorPrimaryVariant | primaryContainer or secondary |
colorAccent | secondary or tertiary |
colorOnPrimary | onPrimary |
android:colorBackground | background |
colorSurface | surface |
colorOnSurface | onSurface |
colorError | error |
colorOnError | onError |
colorOutline | outline |
colorSurfaceVariant | surfaceVariant |
colorOnSurfaceVariant | onSurfaceVariant |
Migrate the dark and light color schemes from XML to their equivalents in Material 3 Compose.
[!NOTE] Note: Material 3 naming differs from Material 2 color naming.
Step 4: Migrate custom shapes and typography
If your app uses custom shapes:
In your Compose code, define a
Shapesobject to replicate your XML shape definitions.Provide this
Shapesobject to yourMaterialTheme.For more details, see shapes.
If your app uses custom typography:
In your Compose code, define a
Typographyobject in your Compose code to replicate your XML text styles and font definitions.Provide this
Typographyobject to yourMaterialTheme.For more details, see typography.
| Compose role | XML name |
|---|---|
displayLarge | TextAppearance.Material3.DisplayLarge |
displayMedium | TextAppearance.Material3.DisplayMedium |
displaySmall | TextAppearance.Material3.DisplaySmall |
headlineLarge | TextAppearance.Material3.HeadlineLarge |
headlineMedium | TextAppearance.Material3.HeadlineMedium |
headlineSmall | TextAppearance.Material3.HeadlineSmall |
titleLarge | TextAppearance.Material3.TitleLarge |
titleMedium | TextAppearance.Material3.TitleMedium |
titleSmall | TextAppearance.Material3.TitleSmall |
bodyLarge | TextAppearance.Material3.BodyLarge |
bodyMedium | TextAppearance.Material3.BodyMedium |
bodySmall | TextAppearance.Material3.BodySmall |
labelLarge | TextAppearance.Material3.LabelLarge |
labelMedium | TextAppearance.Material3.LabelMedium |
labelSmall | TextAppearance.Material3.LabelSmall |
Step 5: Migrate styles (styles.xml)
XML styles (styles.xml) system defines styles and appearance of:
Widgets, components, themes for windows and dialogs
Typography
Themes and overlays
Shapes
XML Views and components combine multiple attributes to create a style. They set their styles from styles.xml in two different ways:
Setting "style="@style/..." directly and explicitly in the XML View
Setting the style indirectly and implicitly for a component as part of a larger Theme (theme.xml)
Styles have no direct equivalent in Compose - instead styles are passed as: parameters or modifiers to composables, using the new, experimental Styles API defined in the AppTheme, or by creating layered, reusable composable variations with the defined style.
Provide separate @Composable functions named according to the style and the base component, to signify the difference in styling and use cases for those components.
Pattern: If an XML element uses a custom style (e.g.,
style="@style/MyPrimaryButton"), don't try to replicate the style inline. Instead, suggest creating a specific composable.Example:
XML:
<Button style="@style/MyPrimaryButton" ... />Compose:
MyPrimaryButton(onClick = { ... })
Common Attribute Groups: If a style sets common modifiers (like padding + height), extract them into a readable extension property or a shared Modifier variable.
Common examples
| XML | Compose |
|---|---|
Theme.Material3.* | MaterialTheme(colorScheme, typography, shapes) { } |
TextAppearance.Material3.BodyMedium | TextStyle(...) defined in Typography(bodyMedium = ...) |
ShapeAppearance.*.SmallComponent | Shapes(small = RoundedCornerShape(X.dp)) |
Widget.Material3.Button | Button(colors = ButtonDefaults.buttonColors(...)) |
Widget.Material3.CardView | Card(shape=..., elevation=..., colors=...) |
Widget.*.TextInputLayout.OutlinedBox | OutlinedTextField(colors = OutlinedTextFieldDefaults.colors(...)) |
Widget.*.Chip.Filter | FilterChip(colors = FilterChipDefaults.filterChipColors(...)) |
Widget.*.Toolbar.Primary | TopAppBar(colors = TopAppBarDefaults.topAppBarColors(...)) |
Widget.*.FloatingActionButton | FloatingActionButton(containerColor = ...) |
backgroundTint | containerColor in ComponentDefaults.ComponentColors() |
android:textColor | contentColor in ComponentDefaults.ComponentColors() |
cornerRadius | shape = RoundedCornerShape(X.dp) |
android:elevation | elevation = ComponentDefaults.elevation(defaultElevation = X.dp) |
android:padding | contentPadding = PaddingValues(...) or Modifier.padding() |
android:minHeight | Modifier.heightIn(min = X.dp) |
strokeColor + strokeWidth | border = BorderStroke(width, color) |
android:textSize | fontSize = X.sp in TextStyle |
Step 6: Validate the theme migration
Always use the existing theme values from the original XML theme as the source of truth for the new Material Theme in Compose. Never invent new theme values during migration, to maintain brand consistency and avoid visual regressions.
Verify all new Compose theme values match the existing XML values. Don't hardcode any migrated values.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Google LLC
- Publisher
- Android (Google) (Official)
- Distributed by
- Android (Google)
- Source
- android/skills · jetpack-compose/migration/migrate-xml-views-to-jetpack-compose · commit bf68e2d
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.txt)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Google LLC or Android (Google).
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download migrate-xml-views-to-jetpack-compose.zip