
为什么 mipmap-anydpi-v26 里的 XML 图标不显示?
根本原因不是路径写错,而是 Android 8.0+ 要求自适应图标必须同时提供 foreground 和 background 两层,且必须用 adaptive-icon 根节点封装。只放一个 bitmap 或直接套用旧版 layer-list 结构,系统会静默忽略整个文件。
- 检查 XML 是否以
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"></adaptive-icon>开头 -
foreground必须是<image></image>或<layer-list></layer-list>,不能是纯色<shape></shape>(部分 OEM 厂商解析失败) -
background同理,但允许用<color android:color="@color/xxx"></color>,推荐用#FFFFFF等硬编码值,避免主题未加载时取色为空 - 所有子元素必须声明
android:drawable或android:src,不能只靠android:background
res/mipmap-anydpi-v26/ic_launcher.xml 的最小可用结构
这不是“教程模板”,而是能过 Android Studio 编译 + 在 Pixel 上真机显示的最简配置。省略任何一层、漏掉命名空间或写错大小,都会导致图标回退到 mipmap-xxxhdpi 下的 PNG。
<?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@color/ic_launcher_background"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/> </adaptive-icon>
-
@color/ic_launcher_background必须在colors.xml中定义,不能是 theme 属性引用 -
@drawable/ic_launcher_foreground推荐用vector(XML Vector),若用 PNG 需确保尺寸 ≥ 108×108 dp,否则裁剪后留白 - 不要给
adaptive-icon加android:width或android:height—— 系统强制按 108×108 dp 渲染
为什么换了 XML 图标,桌面还是显示旧 PNG?
不是缓存问题,是 manifest 里没切到新资源。Android 会优先读取 android:icon 指向的资源,而很多项目仍指向 @mipmap/ic_launcher 这个传统别名。
- 确认
AndroidManifest.xml中<application></application>的android:icon值是@mipmap/ic_launcher(没错,还是这个名字) - 但这个
ic_launcher必须是res/mipmap-anydpi-v26/ic_launcher.xml,而不是res/mipmap-xxxhdpi/ic_launcher.png - 如果项目用了 productFlavors,检查是否在 flavor 目录下覆盖了
mipmap,导致 v26 资源被跳过 - 运行
./gradlew clean后再 install,否则 AAPT 可能复用旧 R.java 中的资源 ID
适配折叠屏和圆角屏时,adaptive-icon 的实际限制
系统对自适应图标的裁剪逻辑是黑盒,官方文档没说清楚哪些 shape 会被截掉。实测发现:即使你用 clip-path 在 vector 里画了个圆,系统仍可能按方形 mask 再套一层椭圆裁剪。
- 安全区域是中心 72×72 dp(占 108×108 的 44%),所有关键图形必须落在这个框内
- 不要依赖
android:gravity="center"对齐 —— 它在不同 OEM 的 Launcher 上行为不一致 - 测试时至少覆盖三台设备:Pixel(原生)、Samsung One UI(加厚外边框)、华为 EMUI(强圆角),仅模拟器不够
- 没有
roundIcon专用字段了,adaptive-icon同时承担方形和圆形两种 mask
真正麻烦的是第三方 Launcher,比如 Nova 或 Action Launcher,它们根本不读 mipmap-anydpi-v26,只认 PNG。所以 foreground layer 里别放文字或细线——那些在降级 fallback 时会糊成一片。










