The geometry, in dp
An adaptive icon foreground and background are each a 108dp by 108dp layer. The system mask shows the inner 72dp. That visible square is 66.7 percent of the layer on each side, because 18dp is discarded on the left, right, top, and bottom. Inside the visible area, Android’s keyline guidance puts important content inside a circle 66dp across, centered on the layer. A logo that touches the edge of a 108dp canvas will lose the outer 18dp under the mask, and a launcher that uses a circle or a squircle can cut further, toward that 66dp circle.
Those numbers are about the adaptive layers you install in mipmap-anydpi-v26 as XML, plus the drawable layers they reference. They are not about a single 512 by 512 PNG. Play’s listing icon is a separate 512 by 512 asset. Legacy mipmaps (48, 72, 96, 144, 192) are another set, used when a launcher does not ask for the adaptive icon.
The App Icon Generator does not write adaptive XML, a monochrome layer, or a mipmap-anydpi-v26 folder. It draws one source image onto square canvases and downloads PNGs.
What the generator emits
You drop a PNG, JPG, WEBP, or SVG. The script draws it with canvas. The Android preset uses 48, 72, 96, 144, 192, and 512. The iOS preset uses 20, 29, 40, 58, 60, 76, 80, 87, 120, 152, 167, 180, and 1024. “Both” is the union of those lists, with duplicates removed. Every output file is a PNG named {source}-{size}x{size}.png, in a flat zip. There are no density folder names.
Padding is a percentage from 0 to 35, applied on each side, so the image is drawn inside a smaller square. Radius, from 0 to 30 percent of the side, clips the canvas to a rounded rectangle before the fill and the image are painted, which leaves the corners transparent. Fit is either contain (the whole image is visible, with background showing in the unused dimension) or cover (one dimension overflows the square and the canvas clips it). The background color is a fill behind the image. A preview is drawn at 256 pixels. That preview is not one of the downloaded sizes.
The page does not warn you when the source is smaller than 512 and will be scaled up. A 48 pixel source exported at 512 will look soft. Start from a square image at least 512 pixels on a side if you only need the Android preset, and at least 1024 if you also export the iOS 1024 file.
Order of operations that matches the tools you have
- Design the mark inside the 66dp circle, on a 108dp artboard. Put the background on its own layer if you will later build a real adaptive icon in Android Studio. Flat color behind a symbol is easier to mask than a photograph that runs to the edge.
- Export a square PNG of that full 108dp composition, including the padding you already built into the artboard. Do not crop to the circle yet. The mask is the launcher’s job. If you crop to a circle in the source, a squircle mask will show your circle inside another shape.
- Drop that PNG on the generator. Set padding to 0 if the artboard already contains the 18dp margin. Extra padding here shrinks the mark a second time. Set radius to 0. A rounded rectangle baked into the PNG fights the launcher mask.
- Use contain, not cover, unless you have checked the preview and the overflow is intentional. Cover clips whatever does not fit the square.
- Generate the Android sizes. The 48 through 192 files can fill legacy
mipmap-mdpithroughmipmap-xxxhdpiif you rename them and put them in those folders yourself. The 512 file is the one people upload as the Play icon. The page will not place them in those folders. - Build the adaptive XML in Android Studio’s Image Asset tool, or by hand, from the foreground and background sources. Then install a debug build and look at the icon on a circle mask and a squircle mask. The generator cannot show you that crop.
Check the circle and squircle crop on a device after you build the adaptive XML. This page does not include a 108dp artboard or a launcher shot. The generator log below is the six PNG names.
The generator’s log for a 1024×1024 source, Android preset, padding 0, radius 0, lists these six names. The zip was not saved to disk for this page. The names are what the log printed:
icon-source-48x48.png icon-source-72x72.png icon-source-96x96.png icon-source-144x144.png icon-source-192x192.png icon-source-512x512.png
A worked square
Take a 1024 by 1024 PNG. The symbol occupies the center 620 pixels, which is about 60 percent of the side, close to the 66/108 ratio, with a flat background to the edges. Padding 0, radius 0, contain, Android preset. The six PNGs should show the same framing at 48, 72, 96, 144, 192, and 512. The 48 pixel file will lose fine strokes. That is resampling, not the adaptive mask. If a stroke disappears at 48, it is too thin for mdpi, even if it looks sharp at 512.
Now set padding to 20. The symbol shrinks again and the background color fills a larger border. If your artboard already had the safe margin, this second inset makes the icon look small on the home screen. Reset padding before you judge the mark.
Set radius to 20 without changing anything else. The PNG corners go transparent. On a launcher that expects a full-bleed adaptive foreground, those transparent corners become a visible bite. Leave radius at 0 for adaptive sources.
When the browser is the wrong tool
Stop using the generator, and open Image Asset Studio or your design tool, when you need any of these:
- Separate foreground and background layers, or a monochrome layer for themed icons.
mipmap-anydpi-v26/ic_launcher.xmlpointing at those layers.- Play’s 512 icon with a different crop from the legacy mipmaps.
- A mask preview. The 256 pixel preview on the page is the padded, fitted bitmap. It is not a circle mask.
Where each pixel size goes after you unzip
The generator will not move files. If you are filling legacy mipmaps by hand, the usual mapping of the Android preset is: 48 into mipmap-mdpi, 72 into mipmap-hdpi, 96 into mipmap-xhdpi, 144 into mipmap-xxhdpi, 192 into mipmap-xxxhdpi, and 512 kept aside for the Play Console icon upload. Rename them to the resource name your manifest already uses, often ic_launcher.png. Dropping the zip’s original filenames into res/ without renaming will not wire them up, because the resource system keys off the file name, not the pixel size.
Those legacy files are what older launchers show. API 26 and later prefer the adaptive XML in mipmap-anydpi-v26, which this zip does not contain. Shipping only the legacy PNGs on a new project means a modern launcher masks a bitmap that was not drawn for a mask. Shipping only a 512 Play icon means the installed app still has whatever placeholder the template created. Treat the zip as raw pixels. Treat Android Studio’s Image Asset flow as the step that connects those pixels to android:icon.
The generator is a resampler with a zip download. It is useful after the safe zone is already in the pixels. It does not design the safe zone for you, and it does not check Play’s file-size limit or transparency rules. A 512 image that is mostly empty padding can still be a valid PNG and a weak listing icon.