One square image in; the folders Xcode and Gradle expect out. The tedious part of an app icon was never the resizing — it is the Contents.json that has to name every idiom, scale and point size exactly, and the Android adaptive layers whose safe circle is tighter than anyone expects. Both are generated here, and the artwork is checked against that circle before you export.
Step by step
01Drop a square source
1024 × 1024 or larger, PNG or SVG. Anything smaller means the marketing icon is an upscale, which the App Store rejects — so the size is checked and reported rather than silently accepted.
02Size the artwork for Android
iOS masks the square you give it, so it needs no inset. Android guarantees only the inner 66 of 108dp, and that is the constraint the artwork size control exists to satisfy.
03Choose the iOS catalogue shape
One 1024 PNG by default, which Xcode 15 and later expand at build time. Switch on the legacy sizes for an older project and the full matrix is written with a matching Contents.json.
04Take the zip
ios/AppIcon.appiconset and android/mipmap-* laid out the way each toolchain expects, so the folders drop straight into a project.
Worked example
Contents.json describes each icon by point size and scale, not by pixels. The file name has to be the product of the two, and nothing warns you when it is not.
Given
How a catalogue entry maps to a file
size "60x60" scale "3x" → 180px file
size "40x40" scale "2x" → 80px file
size "83.5x83.5" scale "2x" → 167px file
The 83.5pt iPad entry is the one people get wrong most:
it is a fractional point size and a 167px file.Xcode reports a missing or mis-sized icon as a warning during development and a hard rejection at submission, which is why the problem tends to surface on the day you ship. The arithmetic is simple and unforgiving, and it is the entire reason this file is generated rather than written by hand — including the 83.5pt iPad entry that produces an odd 167-pixel file.
Before you drop it into the project
Xcode 15 wants one file, not thirteen
A single 1024 × 1024 image in the asset catalogue is the documented recommendation, with Xcode generating every other size at build time. The full matrix is now only needed for older projects, and carrying it means thirteen files to keep in step instead of one.
iOS icons must be opaque
iOS composites no alpha on an app icon and rejects one that carries any, so the background is always painted here even where the artwork would not have covered it. Rounded corners are the system's job — supply a full square and let it mask.
Android's safe circle is the tight one
An adaptive icon is drawn on 108dp, masked to 72dp, and guarantees only the inner 66dp — about 61%, against the 80% a maskable web icon promises. Artwork sized for iOS will usually overflow it, which is what the check here is for.
Adaptive icons are two layers, not one image
The launcher moves the foreground and background independently to produce the parallax effect, so they cannot be flattened. The artwork becomes the foreground on transparency, and the background colour is written as an XML colour resource the layer references.
Use mipmap, not drawable
Launcher icons belong in mipmap directories because a launcher may request a density other than the device's own, and only mipmap resources survive density splitting when an APK is built per-density. Icons placed in drawable can go missing on some devices.
The Play Store icon is uploaded, not bundled
Google Play wants a 512 × 512 PNG in the console listing rather than in the APK, so it is exported alongside the mipmaps instead of inside them. It is easy to miss and blocks a release when it is.
The judgement call
The iOS half has two forms, and the project decides.
A project on Xcode 15 or later
Single size
One 1024 PNG, expanded at build time. Fewer files, nothing to keep in step.
A project on Xcode 14
Single size
Single-size catalogues were introduced in Xcode 14, so this is supported there too.
A project on Xcode 13 or older
Legacy sizes
Single-size catalogues are not understood, and the build will report the icon as missing.
A React Native or Flutter project
Legacy sizes
Their tooling and templates generally still expect the full matrix on disk.
An Android-only app
Skip iOS
Export Android alone and you get the mipmap tree, the adaptive layers, and the Play Store icon.
A web app you are wrapping
Maskable icon instead
A PWA needs manifest icons rather than an asset catalogue. The maskable icon tool covers that.
Reference
FAQ
Supply a single 1024 × 1024 PNG. Since Xcode 14, and as the documented recommendation from Xcode 15, an asset catalogue can carry one 1024 image and Xcode generates every other size at build time. Older projects need the full matrix from 20pt to 83.5pt across iPhone and iPad idioms, which this tool can also export.
Because Contents.json describes icons in points with a scale multiplier, and the file must be the product of the two — a 60pt entry at 3× needs a 180-pixel image, not a 60-pixel one. The 83.5pt iPad entry catches people out most, since it produces an odd 167-pixel file. Generating the catalogue rather than writing it by hand removes the whole class of error.
The layers are drawn on a 108dp canvas, the launcher masks to 72dp, and only the inner 66dp — about 61% — is guaranteed visible across every launcher shape. The outer band is not padding to fill: it exists so the foreground and background layers can move independently during the launcher's parallax animation.
A launcher may request an icon at a density other than the device's own, and only mipmap resources survive the density splitting that happens when an APK is built per-density. Icons placed in drawable directories can therefore be stripped and go missing on some devices, which is why every Android export here writes to mipmap.
You can supply one and it will be fitted inside the square with the background filling the remainder, but the result is rarely what you want. Both stores expect a square icon, and a mark that was drawn wide will end up small once it fits the height. Crop the source square first for a better result.
No. The Tinapps app icon generator decodes the source in your browser, redraws every size on a canvas in the page, and assembles the zip there too. Nothing is transmitted, which matters when the icon belongs to an app that has not been announced.
The source image is decoded, redrawn and zipped entirely in your browser. Nothing is uploaded at any point.
Keep going
Maskable icon
The PWA equivalent, checked under every launcher mask.
Favicon generator
The web half of the same identity, checked at 16 pixels.
Image cropper
Square up the source before bringing it here.
Screenshot beautifier
The store listing screenshots that go beside the icon.