If you’ve spent any time with declarative UI, you know the frustration of a ‘mystery gap’ in your layout or a component that refuses to center itself despite your best efforts. In the old XML days, we had a fairly straightforward view hierarchy. But with Jetpack Compose, the UI is a function of state, which makes traditional debugging a bit more complex. That’s why I rely heavily on the Layout Inspector.

In this jetpack compose layout inspector tutorial, I’ll show you how to move beyond trial-and-error styling. I’ve found that visualizing the composition tree is the only way to truly understand how Compose handles modifiers and constraints in real-time.

Prerequisites

Step 1: Launching the Layout Inspector

The Layout Inspector isn’t active by default; you need to trigger it while your app is running. To get started, run your app on your device or emulator as usual.

Go to Tools > Layout Inspector from the main menu. Android Studio will automatically detect the running process of your app. If you have multiple processes, select the one corresponding to your app’s package name.

As shown in the image below, you’ll see your device screen mirrored in the IDE, with a clickable hierarchy tree on the left. This is where the magic happens.

Android Studio Layout Inspector interface showing the device mirror and component tree
Android Studio Layout Inspector interface showing the device mirror and component tree

Step 2: Analyzing the Component Tree

Once the inspector is live, you can click on any element in the mirrored device view. This highlights the corresponding Composable in the Component Tree panel. I use this specifically to find ‘invisible’ wrappers—like a Box or Column that has unexpected padding which is pushing my content away.

When you select a component, look at the Attributes panel. Here, you can see the exact values of the modifiers currently applied, including the calculated size and position in pixels. This is far more efficient than adding Modifier.background(Color.Red) to everything just to see where the boundaries are.

Step 3: Using 3D Mode to Debug Z-Axis Issues

One of my favorite features is the 3D view. Sometimes, a component is technically there, but it’s being overlapped by another layer. By clicking the 3D icon in the Layout Inspector toolbar, you can rotate your UI in a 3D space.

This allows you to see the ‘stack’ of your Composables. If a button isn’t clickable, I often switch to 3D mode to see if an invisible Surface or a transparent Box is sitting on top of it, blocking touch events.

Jetpack Compose Layout Inspector in 3D mode showing the UI layers
Jetpack Compose Layout Inspector in 3D mode showing the UI layers

Step 4: Tracking Recompositions

Performance is where most Compose apps fail. If your UI feels laggy, you likely have an unstable state causing excessive recompositions. To debug this, enable Recomposition Counts in the Layout Inspector settings.

You will now see two columns next to your components: Recomposition Count and Skip Count.

If you see a number climbing rapidly while you’re not interacting with that specific element, you’ve found a performance leak. To solve this, I usually look into using remember or switching to derivedStateOf. For a deeper dive into this, check out my guide on how to profile android app performance to see how the Layout Inspector fits into the broader profiling ecosystem.

Pro Tips for Power Users

Troubleshooting Common Issues

Layout Inspector not connecting?

This is the most common headache. First, ensure your device is running API 29+. If it still fails, try restarting the ADB server: adb kill-server followed by adb start-server. Also, ensure your app is compiled in debug mode; the inspector won’t work with release builds for security reasons.

UI not mirroring?

Check if you have ‘Developer Options’ enabled and that ‘USB Debugging’ is specifically allowed for the computer you are using. Sometimes a simple cable swap solves the mirroring lag.

What’s Next?

Now that you can visualize your UI, the next step is optimizing it. Understanding the layout is only half the battle; the other half is ensuring your state management is lean. I recommend exploring how to use StateFlow and ViewModel to minimize the recompositions you just learned to track.