If your app icon looks right on your phone but cramped, off-center or clipped on someone else's, the cause is almost always the same. The artwork was designed as a finished square, and Android does not treat a launcher icon as a finished square. It treats it as oversized layers that each device cuts to its own shape.
That system is the adaptive icon. Once you know its three numbers (108, 66 and 18), cropped icons stop being a mystery. Everything below is checked against Google's adaptive icons documentation and the Android Studio guide to its Image Asset tool.
Why does my Android app icon get cropped?
Your icon gets cropped because Android masks every adaptive icon to a shape chosen by the device maker, and that shape differs between devices. Each icon layer is 108 by 108 dp, but only the inner 66 by 66 dp is guaranteed to be visible. Artwork that reaches beyond that inner area gets cut off on some devices.
Google's docs describe it directly: an adaptive icon can show as a circle on one manufacturer's device and as a squircle (a shape between a square and a circle) on another. Each manufacturer supplies a mask, and the system renders every adaptive icon on that device through it. You do not get to pick the mask.
So an icon that fills its canvas edge to edge can look perfect as an exported image and still lose its corners, or the ends of a wordmark, once a circular mask is applied. Nothing is broken. The outer part of the layer was never promised to be visible.
My original short post on this named specific shapes for specific phone brands. I have dropped that here, because Google's documentation only says the shape varies by manufacturer. Design for the safe zone and the brand of phone stops mattering.
How big is the adaptive icon safe zone?
The adaptive icon safe zone is the center 66 by 66 dp of a 108 by 108 dp layer. Google's guidance is that a logo should be at least 48 by 48 dp and must not exceed 66 by 66 dp. The outer 18 dp on each of the four sides is reserved for masking and for motion effects.
Both the foreground and the background layer use the same 108 dp canvas. The reserved 18 dp border is also what launchers use for visual effects such as parallax or pulsing, and the docs note that these effects can vary from one launcher to another. That is why small details near the edge can drift out of view while the launcher animates the icon, even when they are visible at rest.
If you supply bitmaps instead of vectors, the dp values convert to pixels per density bucket like this:
| Density | Scale | Layer size | Safe zone |
|---|---|---|---|
| mdpi | 1x | 108 x 108 px | 66 x 66 px |
| hdpi | 1.5x | 162 x 162 px | 99 x 99 px |
| xhdpi | 2x | 216 x 216 px | 132 x 132 px |
| xxhdpi | 3x | 324 x 324 px | 198 x 198 px |
| xxxhdpi | 4x | 432 x 432 px | 264 x 264 px |
Google prefers vectors for both layers, which makes the table unnecessary. One vector drawable with a 108 by 108 viewport covers every density.
What an adaptive icon looks like in XML
The icon itself is a small XML file that points at the layers. Save it as res/mipmap-anydpi-v26/ic_launcher.xml:
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon>
A vector foreground that respects the safe zone keeps all of its artwork between 21 and 87 on both axes, because (108 minus 66) divided by 2 is 21:
<!-- res/drawable/ic_launcher_foreground.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Safe zone: x 21 to 87, y 21 to 87. Nothing important outside it. -->
<path
android:fillColor="#FFFFFF"
android:pathData="M54,24 L84,54 L54,84 L24,54 Z" />
</vector>
The manifest then references the icon:
<application
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
... >
</application>
A few notes on those files. The docs describe android:roundIcon as optional. The background can be a solid color or an image. Both layers should have clean edges, with no masks or shadows drawn around the outline, because the system applies those itself.
The v26 in the folder name is there because adaptive icons apply from API level 26 (Android 8.0). Devices on Android 7.1 (API level 25) and lower use legacy icons, which do not support adaptive shapes. If your minSdk is 26 or higher, those devices are not in your audience.
Do you need a monochrome layer for themed icons?
A monochrome layer is optional, but worth adding. Since Android 13 (API level 33), users can turn on themed icons, and the system tints the monochrome layer using colors from their wallpaper and theme. Starting with Android 16 QPR 2, Android automatically themes icons for apps that do not provide their own layer.
Two conditions apply to the opt-in version: the user has to enable themed icons in system settings, and the launcher has to support the feature. If either is missing, the home screen shows your normal icon.
Google's own sample reuses the foreground drawable as the monochrome layer, and Android Studio's Image Asset tool defaults to the same thing. That works when the foreground is a simple single-color glyph. If your foreground relies on several colors to be readable, a single tint flattens it into a blob, so draw a dedicated one-color version. With automatic theming arriving in Android 16 QPR 2, supplying your own layer is how you keep control of what users see.
The mistakes that get icons cropped
These are the ones I see most often:
- Filling the canvas. The logo is exported at the full 108 dp (432 px at xxxhdpi) with no bleed. It looks great as a raw image and loses its edges under a circular mask.
- Baking the background into the foreground. A foreground that already contains its colored plate cannot be masked and animated as two layers. Keep the plate in the background layer and the logo in the foreground.
- Putting detail in the outer ring. Thin strokes, taglines and small badges near the edge sit in the 18 dp that is reserved for masking and motion.
- Adding your own shadow or rounded corners. The docs ask for clean edges with no masks or background shadows around the outline.
- Treating the launcher icon and the store icon as one file. The Play Store listing uses a separate 512 by 512 px image. The exact requirements are in my guide to Google Play image asset specs, and what makes that image earn installs is covered in app icon design for ASO.
How do you preview an adaptive icon before shipping?
Use Image Asset Studio in Android Studio. In the Project window, right-click the res folder and choose New, then Image Asset. The tool builds the foreground, background and monochrome layers and previews the result as a circle, a squircle, a rounded square and a square, plus a full bleed preview of the layers.
The Image Asset Studio guide lists the controls that matter. Trim removes transparent space around your source image. Resize is a slider that scales the artwork inside the layer, and it is the fix for most cropped icons: pull it down until the logo sits comfortably inside every preview shape. The Options tab lets you generate the legacy icon, the round icon and the 512 by 512 px Google Play Store icon in the same pass, and the output lands in the res/mipmap- density folders.
After that, check real hardware. Install the build on a device or emulator and look at the icon on the home screen and in the app drawer. On Android 13 or higher, turn on themed icons and confirm the monochrome version is still recognizable. It takes two minutes, so I keep it on my pre-launch checklist next to the other checks I run before publishing.
Where IOn Emit fits
The launcher icon is a build-side asset, so the fix above happens in Android Studio. The store listing is the other place your graphics appear, and that is where IOn Emit works. It is a Windows desktop app for publishing to Google Play, with a listing editor that handles visual assets by drag-and-drop, a live Play Store preview as you type, and a Screenshot Studio with device frames. The publishing suite is free.
Adaptive icon checklist
- Foreground and background are separate layers, each 108 by 108 dp.
- All essential artwork sits inside the center 66 by 66 dp, and the logo is at least 48 by 48 dp.
- Nothing important is in the outer 18 dp, and no shadows, masks or rounded corners are baked in.
ic_launcher.xmlis inres/mipmap-anydpi-v26/andandroid:iconin the manifest points to it.- A monochrome layer is present and readable as a single tint.
- The Image Asset Studio previews look right as a circle, squircle, rounded square and square.
- You checked the icon on a device or emulator, including with themed icons turned on.
- The 512 by 512 px Play Store icon is exported separately for the listing.
This post is part of our app publishing guides for indie Android developers.