Adaptive icons: generate densities, then check the safe zone

One master PNG is not a launcher. OEM masks are circles, squircles, and squircles that lie. Generate densities here; prove the crop on a device before you screenshot the Play listing.

What the generator is for

The App Icon Generator takes a source image and emits density-sized PNGs you can drop into mipmap-*. That saves an export marathon. It does not apply Adaptive Icon layers, it does not know your ic_launcher_foreground inset, and it does not render Pixel / Samsung / Xiaomi masks.

This replaces the “export twenty PNGs by hand” framing in the May adaptive-icons post with a safer order of operations. If you skip the safe-zone check, Play screenshots and the launcher will disagree and design will “fix” the listing asset instead of the foreground layer.

Safe zone, in practice

Keep important marks inside the inner ~66% of the foreground layer (the circle that survives a round mask). Full-bleed logos get their corners cut. Wordmarks at the edges disappear. A source that looks fine in a square preview will fail on a default Pixel launcher.

Background layers can be full-bleed color or a simple texture. Do not put the logo on the background and a second copy on the foreground — OEM masks will double-crop. One logo, centered, inset.

Worked example

Source: a 1024×1024 wordmark that touches all four edges. Generate mdpi–xxxhdpi. Install on a device (or emulator with a circle mask). The first and last letters clip. Fix: shrink the artwork on a transparent canvas, regenerate, or move to a proper foreground/background Adaptive Icon in the project. Screenshot the clipped launcher icon in the ticket so design does not “fix” it by uploading the same 1024 file to Play.

Play Store listing assets are a different crop again (high-res icon, 512×512). Do not assume the launcher PNG is the store icon. Feature graphic is another crop. Treat three files: launcher adaptive, Play high-res, feature graphic.

Densities the generator emits are bitmap stand-ins. Adaptive Icon XML (ic_launcher.xml pointing at foreground/background drawables) is still the modern default. Dropping only mipmap-xxhdpi/ic_launcher.png without the XML is a legacy path; some launchers still show it, others prefer the adaptive resource. After you like the safe zone, run Image Asset Studio or write the XML in the project.

Order of operations we use

  1. Design the foreground on a 108 dp grid with a 66% safe circle (or the Vector equivalent).
  2. Export a 1024 PNG already inset. Do not export full-bleed and hope.
  3. Run the generator for a density set if you still ship raster mipmaps, or skip it and use vectors.
  4. Install on Pixel (circle), one OEM with a squircle, and the emulator’s themed-icon path if you ship API 33+ monochrome.
  5. Only then upload Play’s 512 icon — from the same inset master, not from a screenshot of the launcher.

The generator is step 3 for raster-only projects. It is optional if you already have Adaptive Icon XML.

What the canvas actually does

It scales the source to each density’s pixel size. It does not pad. If your source is already clipped, every density is clipped. It does not write mipmap-anydpi-v26 XML. It does not produce a themed/monochrome layer. Those limits are on the tool page; this article is the check you run after export.

When to leave the browser

Android Studio Image Asset Studio, Adaptive Icon previews, and a physical launcher. If you ship a themed icon on API 33+, test that path too — our generator does not produce monochrome layers. Pair with the publishing checklist when the next file is the store listing, not the launcher.