Android应用不同版本启动图标适配:Adaptive Icon在Pre-Oreo设备显示默认图标
解决Android自适应图标在Pre-Oreo设备显示默认图标的问题
这个问题的核心原因很明确:Adaptive Icon(自适应图标)是Android 8.0(API 26)才引入的特性,Pre-Oreo(API 25及以下)的系统根本不认识<adaptive-icon>标签的XML文件,所以当你把自适应图标XML放在普通资源目录里时,旧系统加载失败就会 fallback 到默认图标。下面是具体的解决步骤:
1. 调整资源目录结构,区分版本
你需要为不同API版本的设备提供对应的图标资源:
- 为Pre-Oreo设备:在
mipmap-mdpi、mipmap-hdpi、mipmap-xhdpi等常规分辨率目录中,放置传统的PNG格式图标(就是你之前用的非自适应正方形图标)。 - 为Oreo+设备:创建
mipmap-anydpi-v26目录(这个目录里的资源只有API 26及以上系统才会加载),在里面放置你的自适应图标XML文件。
2. 配置自适应图标XML(仅在v26目录)
在mipmap-anydpi-v26/ic_launcher.xml中,编写标准的自适应图标结构,示例如下:
<?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 图标背景,可以是颜色或Drawable --> <background android:drawable="@color/icon_background" /> <!-- 图标前景,就是你的logo内容 --> <foreground android:drawable="@drawable/ic_logo_foreground" /> </adaptive-icon>
如果需要圆形图标(对应清单里的roundIcon),可以在同一个v26目录下创建ic_launcher_round.xml,结构和上面一致,只是可以调整前景的适配圆形区域的样式。
3. 修正清单文件的图标配置
保持清单里的android:icon指向通用的@mipmap/ic_launcher,系统会自动根据版本加载对应资源:
<application android:icon="@mipmap/ic_launcher" <!-- roundIcon是API 26+才支持的,旧系统会自动忽略 --> android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" ...> ... </application>
这里注意:不要把android:icon直接指向自适应图标XML,否则旧系统找不到可用的PNG图标就会显示默认图标。
偷懒小技巧:用Android Studio自动生成
如果你不想手动配置目录和文件,可以用Android Studio的Image Asset Wizard一键生成:
- 右键点击
res目录 → New → Image Asset - 选择
Launcher Icons (Adaptive and Legacy)类型 - 按照向导设置前景、背景、图标名称等,完成后Studio会自动生成所有需要的资源(包括各分辨率的PNG和v26的自适应XML),同时自动更新清单文件的配置。
常见错误排查
- 检查常规
mipmap-*dpi目录里是否有对应的PNG图标,文件名要和ic_launcher一致 - 确认自适应图标XML只放在
mipmap-anydpi-v26目录,不要放在普通mipmap目录里 - 如果你用了
roundIcon,确保v26目录里有对应的ic_launcher_round.xml,或者常规目录里有对应的圆形PNG(不过旧系统不关心roundIcon)
内容的提问来源于stack exchange,提问作者Kapil Jindal




