Android 8.0 Oreo(API 级别 26)引入了自适应启动器图标,它由两层组成:前景和背景。材料设计指南规定,在 Android O 及更高版本中,背景层必须是不透明的,您可以在以下引用的底部看到。因此,如果您的应用的targetSdkVersion为 26 或更高版本,Android 8.0 或更高版本的自适应启动器图标必须至少具有不透明的背景颜色。
https://material.io/guidelines/style/icons.html#icons-icons-for-android
适用于 Android 的图标
Android O 及更高版本
Android O 图标在设备的主屏幕和所有应用屏幕上代表您的应用。以下指南描述了图标如何获得独特的视觉处理、动画和行为。
...
层规格
图标由两层组成:前景和背景。每一层都可以独立于另一层进行动画处理和接收处理。
前景(滚动视差)
- 108 x 108 dp
- 72dp 蒙版部分
- 推荐透明度(可选)
背景(微妙的视差)
- 108 X 108 分布
- 72dp 蒙版部分
- 必须是不透明的
7.1 或更低版本的解决方法
尽管 8.0 或更高版本的启动器图标必须具有不透明的背景颜色,但如果您可以从应用中省略圆形启动器图标,则其他 7.1 或更低版本的旧启动器图标可以恢复为透明背景颜色。
- 首先,创建启动器图标(自适应和旧版)。它将创建自适应启动器图标和旧版启动器图标。起初,它们都有不透明的背景颜色。
- 之后,创建启动器图标(仅限旧版)。这将仅覆盖现有的旧版启动器图标,如下面的第二个屏幕截图所示。如果设置
shape
为none
,它们将具有透明的背景颜色。
res/mipmap/ic_laucher_round
在项目窗口中删除文件夹。
- 打开 AndroidManifest.xml 并
android:roundIcon="@mipmap/ic_launcher_round"
从application
元素中删除属性。

在上面的左侧窗格中,以下 XML 文件定义了适用于 Android 8.0 或更高版本的自适应启动器图标。
- mipmap-anydpi-v26/ic_launcher.xml
- mipmap-anydpi-v26/ic_launcher_round.xml
如右侧窗格所示,它们引用了以下可绘制 XML 文件。
- 可绘制/ic_launcher_background.xml
- 可绘制-v24/ic_launcher_foreground.xml

更新#1:
在 Android 8.0 或更高版本中,启动器图标的背景颜色可以是透明的,如 Android 8.1 (Nexus 5X) 截图所示。示例应用程序“NoAdaptive”没有任何资源用于文件夹中的自适应启动器图标mipmap-anydpi-v26
,而另一个应用程序“Adaptive”具有该资源。

更新#2:
虽然在 Android 8.0 或更高版本中启动器图标的背景颜色可以是透明的,但这取决于用户的启动器应用程序。一些启动器应用程序会将您的旧图标转换为不透明的自适应图标。
在 Nexus 5X 设备 (Android 8.1)
根据其包名称,默认启动器应用程序是Google Now Launchercom.google.android.launcher
。背景颜色可以是透明的,如更新 #1 的屏幕截图所示。
在 Nexus 5 模拟器 (Android 8.1)
根据其包名称,默认启动器应用程序是Pixel Launchercom.google.android.apps.nexuslauncher
。“最近”屏幕中的背景颜色可以是透明的,如下面的屏幕截图所示:
- 主屏幕不透明
- 在最近的屏幕中透明
- 在所有应用程序屏幕中不透明

某些启动器应用程序中的不透明白色背景
这些GMS应用程序是闭源的:
com.google.android.launcher
谷歌即时启动器
com.google.android.apps.nexuslauncher
像素启动器
相比之下,AOSP 应用程序是开源的。Android 中的大多数启动器应用程序都基于以下启动器应用程序的源代码:
com.android.launcher
com.android.launcher2
com.android.launcher3
Launcher3源代码
在 Launcher3 的 git 分支oreo-release中,LauncherIcons.java具有wrapToAdaptiveIconDrawable
将旧版启动器图标包装在自适应启动器图标中的方法。
/**
* If the platform is running O but the app is not providing AdaptiveIconDrawable, then
* shrink the legacy icon and set it as foreground. Use color drawable as background to
* create AdaptiveIconDrawable.
*/
static Drawable wrapToAdaptiveIconDrawable(Context context, Drawable drawable, float scale) {
if (!(FeatureFlags.LEGACY_ICON_TREATMENT && Utilities.isAtLeastO())) {
return drawable;
}
try {
if (!(drawable instanceof AdaptiveIconDrawable)) {
AdaptiveIconDrawable iconWrapper = (AdaptiveIconDrawable)
context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate();
FixedScaleDrawable fsd = ((FixedScaleDrawable) iconWrapper.getForeground());
fsd.setDrawable(drawable);
fsd.setScale(scale);
return (Drawable) iconWrapper;
}
} catch (Exception e) {
return drawable;
}
return drawable;
}
该标志FeatureFlags.LEGACY_ICON_TREATMENT
在FeatureFlags.java中定义:
// When enabled, icons not supporting {@link AdaptiveIconDrawable} will be wrapped in this class.
public static final boolean LEGACY_ICON_TREATMENT = true;
因此,旧版启动器图标的背景颜色取决于此标志,并且在某些启动器应用程序(例如Pixel Launcher )中它可能是不透明的。
背景颜色
如果该标志设置为true
,则会使用 来创建一个新的自适应启动器图标R.drawable.adaptive_icon_drawable_wrapper
,并且现有的旧图标将成为其前景层。背景层是一个drawable:,@color/legacy_icon_background
根据资源XML文件:
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/legacy_icon_background"/>
<foreground>
<com.android.launcher3.graphics.FixedScaleDrawable />
</foreground>
</adaptive-icon>
颜色legacy_icon_background
在colors.xml中定义
<color name="legacy_icon_background">#FFFFFF</color>
因此,背景颜色变为白色。