Why Android App Icons Are Finally Adapting
Most developers treated dark mode as a UI afterthought until late 2024. The icon was assumed to be brand identity, fixed, unchanging, set in stone. That assumption cost time and visual consistency. A white or light-colored icon on a dark launcher background looks washed out. Users notice. Accessibility scores drop. The system itself starts fighting your asset choices. I spent three months fixing a single app's icon behavior across six launcher themes before realizing the problem wasn't in my design files. It was in how I was declaring them to the system. Android has supported adaptive icons since API 26, but the tinting behavior and dark-mode-aware rendering got more nuanced with each release. The current best practices are scattered across outdated blog posts and a few official Codelabs that haven't been refreshed since 2023.
The Dark Mode Revolution A Futurefocused Guide To Android App Icons
Here is how it actually works, not the abstract version. An adaptive icon is split into two layers: the foreground drawable and the background drawable. Both sit inside an `
Asset Structure That Actually Works
Your main icon file goes in `res/mipmap-anydpi-v26/`. The typical setup involves two XML files: `ic_launcher.xml` and `ic_launcher_round.xml`. Both reference the same foreground and background drawables but apply different shape masks. Here is the structure: ic_launcher.xml — declares the adaptive icon with foreground and background references. The foreground should use a vector drawable with a transparent background. Never embed a colored rectangle inside your foreground vector. The background should be a solid color or gradient defined in its own XML drawable. The foreground color matters more than the shape. If your icon uses brand colors, those colors should be declared as themeable attributes rather than hardcoded hex values. Use `?attr/colorPrimary` or define a custom attribute in your theme. This way, when the system switches to dark mode, the foreground tints automatically instead of staying locked to a light-mode color.
Get the Full Details

I ran into a case where a health app's icon used a green cross on a white circle. In dark mode, the white circle became invisible against the dark launcher background, leaving only a faint green cross. The workaround was changing the foreground vector to use a filled shape with a semibold stroke instead of relying on transparency. The cross remained recognizable, and the fill color adapted to the theme via the attribute binding.
What The System Does Automatically
Android 13 introduced `IconPack` support, which allows the system to swap launcher icons based on the user's installed icon pack. This means your app's icon can be replaced entirely by a third-party pack without any code changes. For developers, the implication is that your baseline icon needs to work in the default state because you cannot control what the user installs. The system also auto-generates monochrome icons for Android 13 and later. If you provide a separate `ic_launcher_monochrome.xml` in your mipmap directory, the system uses it for the toolbar and notification icons. This monochrome variant should use a single-color vector with alpha transparency. White or light colors will break visibility on dark surfaces. Black or dark colors will disappear on light surfaces. The solution is using a neutral mid-tone or letting the system apply the theme color through `android:tint`.
Edge Cases That Will Waste Your Time
OEM launchers do not behave consistently. Samsung's One UI applies its own tinting layer on top of the system behavior. Xiaomi's MIUI/HyperOS has a separate dark icon setting that can override your asset choices entirely. Some launchers ignore the night resource qualifiers altogether and render dark mode icons by inverting colors, which produces ugly results on anything other than pure black-and-white iconography. There is no universal fix for OEM inconsistencies. The practical approach is testing on at least three different devices: a Pixel running stock Android, a Samsung device, and a Xiaomi device. I recommend using Android Studio's Built Design Tool to preview your icons in both light and dark themes, but do not trust it blindly. The preview renderer does not simulate OEM launcher behavior. Another issue that comes up frequently is the splash screen icon. The splash screen draws from the same adaptive icon resource by default. If your icon has a light background that works fine on the home screen but clashes with the splash screen's expected dark background, you need to explicitly set `android:icon` in your splash screen theme to point to a separate drawable. Otherwise, the splash screen will flash a mismatched icon for a fraction of a second before your app launches.

Future Considerations
The direction Android is moving is toward fully dynamic theming. Material You already extracts colors from the user's wallpaper and applies them system-wide. Icon packs that respect these extracted colors are becoming the standard on newer devices. Planning your icon assets with this in mind means using attribute-referenced colors from the start rather than hardcoded values, and keeping your foreground vectors simple enough to adapt without losing recognizability. The performance impact of adaptive icons is negligible on modern devices, but old devices below API 26 still require legacy launcher icon fallbacks. You need to provide PNG versions in the `mipmap-*` directories for backward compatibility. These legacy icons do not participate in dark mode tinting at all. They are rendered exactly as designed. This is why maintaining a consistent design language between your adaptive and legacy assets matters more than it sounds.