Skip to content

修改应用图标

Flutter 应用在发布前,需要为各个目标平台设置自定义的应用图标。不同平台有不同的图标尺寸要求和配置方式。本章将逐一介绍 Android、iOS、Web、鸿蒙以及 Windows、macOS、Linux 桌面端修改应用图标的方法。

图标设计要求

在开始之前,请先准备一张高分辨率的图标源文件:

项目要求
源图尺寸建议 1024 × 1024 像素及以上
格式PNG(带透明通道);Windows 端还需提供 ICO 格式,macOS 端还需提供 ICNS 格式
形状正方形,圆角由各平台自动裁剪
安全区图标内容四周建议留出 10%~15% 的边距,避免被裁切

TIP

各平台会自动对图标应用不同圆角(如 iOS 的超椭圆、Android 的自适应图标),所以源图不需要手动加圆角。

方式一:使用 flutter_launcher_icons 插件(推荐)

flutter_launcher_icons 是社区最常用的图标生成工具,可以一键为 Android、iOS、Web、Windows、macOS、Linux 六个平台生成正确尺寸的图标文件。

WARNING

flutter_launcher_icons 不支持鸿蒙平台,鸿蒙图标需手动替换(见下方鸿蒙章节)。

1. 添加依赖

pubspec.yaml 中添加:

yaml
dev_dependencies:
  flutter_launcher_icons: ^0.14.3

然后执行:

bash
flutter pub get

2. 配置图标

pubspec.yaml 中添加 flutter_launcher_icons 配置段:

yaml
flutter_launcher_icons:
  android: true                # 为 Android 生成图标
  ios: true                    # 为 iOS 生成图标
  web:
    generate: true             # 为 Web 生成图标
  windows:
    generate: true             # 为 Windows 生成图标
  macos:
    generate: true             # 为 macOS 生成图标
  linux: true                  # 为 Linux 生成图标
  image_path: "assets/icon/app_icon.png"     # 图标源文件路径

  # Android 自适应图标(推荐)
  adaptive_icon_background: "#FFFFFF"        # 背景色
  adaptive_icon_foreground: "assets/icon/app_icon_foreground.png"  # 前景图

  # 可选:分别指定各平台图标
  # image_path_android: "assets/icon/android.png"
  # image_path_ios: "assets/icon/ios.png"

WARNING

image_path 指向的文件必须存在,否则会报错。建议将图标放在 assets/icon/ 目录下。

3. 运行生成命令

bash
# 生成所有平台的图标
dart run flutter_launcher_icons

# 或者使用 Flutter 3.x 的方式
flutter pub run flutter_launcher_icons

生成完成后,各平台的图标文件会被自动替换。

4. 验证结果

bash
# Android:查看是否生成了自适应图标
ls android/app/src/main/res/mipmap-*/ic_launcher.png

# iOS:查看 Assets 中的 AppIcon
ls ios/Runner/Assets.xcassets/AppIcon.appiconset/

# Web:查看 favicon 和图标
ls web/icons/ web/favicon.png

# Windows:查看 ICO 文件
ls windows/runner/resources/app_icon.ico

# macOS:查看 AppIcon
ls macos/Runner/Assets.xcassets/AppIcon.appiconset/

# Linux:查看 PNG 图标
ls linux/*.png

方式二:手动替换各平台图标

如果需要精细控制,可以手动替换各平台的图标文件。

Android

Android 需要为不同分辨率提供不同尺寸的图标,并支持自适应图标(Adaptive Icon)。

图标尺寸

密度限定符文件夹尺寸(px)
mdpimipmap-mdpi48 × 48
hdpimipmap-hdpi72 × 72
xhdpimipmap-xhdpi96 × 96
xxhdpimipmap-xxhdpi144 × 144
xxxhdpimipmap-xxxhdpi192 × 192

普通图标

将对应尺寸的图标文件放入 android/app/src/main/res/ 下的各个 mipmap-* 文件夹,文件名为 ic_launcher.png

android/app/src/main/res/
├── mipmap-mdpi/ic_launcher.png
├── mipmap-hdpi/ic_launcher.png
├── mipmap-xhdpi/ic_launcher.png
├── mipmap-xxhdpi/ic_launcher.png
└── mipmap-xxxhdpi/ic_launcher.png

自适应图标(Android 8.0+)

自适应图标由 前景层背景层 组成,支持不同形状的遮罩裁剪。

文件结构:

android/app/src/main/res/
├── mipmap-anydpi-v26/
│   └── ic_launcher.xml        ← 自适应图标配置
├── mipmap-xxxhdpi/
│   ├── ic_launcher.png        ← 兼容旧版的后备图标
│   ├── ic_launcher_foreground.png  ← 前景图(432×432)
│   └── ic_launcher_background.png ← 背景图(432×432)
└── ...(其他密度文件夹同理)

ic_launcher.xml 的内容:

xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  <background android:drawable="@mipmap/ic_launcher_background"/>
  <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

自适应图标尺寸

前景和背景图尺寸均为 432 × 432 像素,安全区为中间 312 × 312 像素(约 72%)。超出安全区的内容可能被系统裁切。

修改应用名称(Android)

编辑 android/app/src/main/AndroidManifest.xml

xml
<application
    android:label="我的应用">   <!-- 修改这里 -->

iOS

iOS 通过 Asset Catalog 管理图标,所有尺寸统一放在一个 .appiconset 文件夹中。

图标尺寸

用途尺寸(px)文件名示例
iPhone 通知20 × 20 @2x / @3xIcon-40.png / Icon-60.png
iPhone Spotlight29 × 29 @2x / @3xIcon-58.png / Icon-87.png
iPhone App60 × 60 @2x / @3xIcon-120.png / Icon-180.png
iPad 通知20 × 20 @1x / @2xIcon-20.png / Icon-40.png
iPad Spotlight29 × 29 @1x / @2xIcon-29.png / Icon-58.png
iPad App76 × 76 @1x / @2xIcon-76.png / Icon-152.png
App Store1024 × 1024Icon-1024.png

替换步骤

  1. 打开 ios/Runner/Assets.xcassets/AppIcon.appiconset/ 目录

  2. 将对应尺寸的图标文件放入该目录

  3. 更新 Contents.json 配置文件(通常只需替换图片文件,无需修改 JSON):

json
{
  "images" : [
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "Icon-40.png",
      "scale" : "2x"
    },
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "Icon-60.png",
      "scale" : "3x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "Icon-58.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "Icon-180.png",
      "scale" : "3x"
    },
    {
      "size" : "1024x1024",
      "idiom" : "universal-platform",
      "filename" : "Icon-1024.png",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

WARNING

iOS 图标不要包含透明通道,否则会被 App Store 审核拒绝。请确保图标背景是不透明的。

修改应用名称(iOS)

编辑 ios/Runner/Info.plist

xml
<key>CFBundleName</key>
<string>我的应用</string>     <!-- 修改这里 -->
<key>CFBundleDisplayName</key>
<string>我的应用</string>     <!-- 显示名称 -->

HarmonyOS

WARNING

flutter_launcher_icons 不支持鸿蒙平台,鸿蒙图标只能通过手动替换方式配置。

鸿蒙平台的图标配置在 harmony/ 目录下。

替换步骤

  1. 进入鸿蒙资源目录:
harmony/entry/src/main/resources/
├── base/
│   └── media/
│       └── app_icon.png      ← 替换此文件
└── ...
  1. 将图标文件替换为自定义图标,建议尺寸 216 × 216 像素

  2. 如需针对不同设备密度提供图标,可以在对应的资源限定目录下放置不同尺寸的图标:

harmony/entry/src/main/resources/
├── base/media/app_icon.png          ← 默认
├── sdpi/media/app_icon.png          ← 小密度
├── mdpi/media/app_icon.png          ← 中密度
├── ldpi/media/app_icon.png          ← 大密度
├── xldpi/media/app_icon.png         ← 超大密度
└── xxldpi/media/app_icon.png        ← 超超大密度

修改应用名称(HarmonyOS)

编辑 harmony/entry/src/main/resources/base/element/string.json

json
{
  "string": [
    {
      "name": "EntryAbility_label",
      "value": "我的应用"
    }
  ]
}

Web

Web 平台的图标配置在 web/ 目录下。

需要替换的文件

文件用途推荐尺寸
web/favicon.png浏览器标签页图标32 × 32
web/icons/Icon-192.pngAndroid Chrome 添加到主屏幕192 × 192
web/icons/Icon-512.pngAndroid Chrome 启动画面512 × 512
web/icons/Icon-maskable-192.pngMaskable 图标(安全区适配)192 × 192
web/icons/Icon-maskable-512.pngMaskable 图标(安全区适配)512 × 512

修改 manifest.json

编辑 web/manifest.json,更新图标配置和应用名称:

json
{
  "name": "我的应用",
  "short_name": "我的应用",
  "icons": [
    {
      "src": "icons/Icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "icons/Icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    },
    {
      "src": "icons/Icon-maskable-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "maskable"
    },
    {
      "src": "icons/Icon-maskable-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ]
}

修改 index.html 中的 meta 标签

编辑 web/index.html,更新 <head> 中的图标引用:

html
<link rel="icon" type="image/png" href="favicon.png"/>
<link rel="apple-touch-icon" href="icons/Icon-192.png"/>

Maskable 图标

Maskable 图标用于支持不同形状的应用图标(如 Android 的圆形、圆角方形等)。设计时请将重要内容放在中心 80% 的安全区内,边缘可能被裁切。

Windows

Windows 平台的应用图标使用 ICO 格式,包含多种尺寸。

图标文件位置

windows/runner/resources/
└── app_icon.ico      ← 替换此文件

制作 ICO 文件

ICO 文件需要包含多种尺寸,推荐包含以下规格:

尺寸(px)用途
16 × 16标题栏小图标
32 × 32任务栏图标
48 × 48大图标模式
256 × 256超大图标 / 应用详情

可以使用以下方式制作 ICO 文件:

方式 A:使用 ImageMagick(命令行)

bash
# 从 PNG 生成包含多尺寸的 ICO
magick convert app_icon.png -define icon:auto-resize=256,48,32,16 app_icon.ico

方式 B:使用在线工具

访问 ConvertICOICO Convert,上传 256 × 256 以上的 PNG 图片,选择需要的尺寸后下载。

方式 C:使用 GIMP

  1. 打开 PNG 图片,导出为 .ico 格式
  2. 在导出对话框中勾选需要的尺寸(16、32、48、256)

替换步骤

  1. 将生成的 app_icon.ico 文件复制到 windows/runner/resources/ 目录,覆盖原文件
  2. 确保 ICO 文件名仍为 app_icon.ico

修改应用名称(Windows)

编辑 windows/runner/Runner.rc

text
1 VERSIONINFO
...
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904e4"
    BEGIN
      VALUE "CompanyName", "你的公司" "\0"
      VALUE "FileDescription", "我的应用" "\0"      ← 应用描述
      VALUE "ProductName", "我的应用" "\0"           ← 应用名称
      VALUE "ProductVersion", "1.0.0" "\0"
    END
  END
END

macOS

macOS 平台的应用图标使用 ICNS 格式,通过 Asset Catalog 管理。

图标文件位置

macos/Runner/Assets.xcassets/
└── AppIcon.appiconset/
    ├── app_icon_16.png          ← 16×16 @1x
    ├── app_icon_16_2x.png       ← 16×16 @2x(32px)
    ├── app_icon_32.png          ← 32×32 @1x
    ├── app_icon_32_2x.png       ← 32×32 @2x(64px)
    ├── app_icon_64.png          ← 32×32 @2x / 64×64 @1x
    ├── app_icon_128.png         ← 128×128 @1x
    ├── app_icon_128_2x.png      ← 128×128 @2x(256px)
    ├── app_icon_256.png         ← 256×256 @1x
    ├── app_icon_256_2x.png      ← 256×256 @2x(512px)
    ├── app_icon_512.png         ← 512×512 @1x
    ├── app_icon_512_2x.png      ← 512×512 @2x(1024px)
    └── Contents.json            ← 图标配置文件

图标尺寸

逻辑尺寸@1x(px)@2x(px)文件
16 × 161632app_icon_16.png / app_icon_16_2x.png
32 × 323264app_icon_32.png / app_icon_32_2x.png
128 × 128128256app_icon_128.png / app_icon_128_2x.png
256 × 256256512app_icon_256.png / app_icon_256_2x.png
512 × 5125121024app_icon_512.png / app_icon_512_2x.png

替换步骤

  1. 准备一张 1024 × 1024 的 PNG 源图
  2. 使用工具将源图裁切为上述各尺寸的 PNG 文件
  3. 将裁切后的文件放入 macos/Runner/Assets.xcassets/AppIcon.appiconset/ 目录

使用 iconutil 制作(macOS 原生方式):

bash
# 1. 创建 iconset 目录
mkdir AppIcon.iconset

# 2. 从源图生成各尺寸(需 macOS 环境)
sips -z 16 16     app_icon.png --out AppIcon.iconset/icon_16x16.png
sips -z 32 32     app_icon.png --out AppIcon.iconset/icon_16x16@2x.png
sips -z 32 32     app_icon.png --out AppIcon.iconset/icon_32x32.png
sips -z 64 64     app_icon.png --out AppIcon.iconset/icon_32x32@2x.png
sips -z 128 128   app_icon.png --out AppIcon.iconset/icon_128x128.png
sips -z 256 256   app_icon.png --out AppIcon.iconset/icon_128x128@2x.png
sips -z 256 256   app_icon.png --out AppIcon.iconset/icon_256x256.png
sips -z 512 512   app_icon.png --out AppIcon.iconset/icon_256x256@2x.png
sips -z 512 512   app_icon.png --out AppIcon.iconset/icon_512x512.png
sips -z 1024 1024 app_icon.png --out AppIcon.iconset/icon_512x512@2x.png

# 3. 生成 ICNS 文件
iconutil -c icns AppIcon.iconset -o AppIcon.icns

TIP

flutter_launcher_icons 会自动处理 macOS 的图标生成,推荐优先使用插件方式。手动替换时需注意文件名必须与 Contents.json 中的 filename 字段一致。

修改应用名称(macOS)

编辑 macos/Runner/Configs/AppInfo.xcconfig

PRODUCT_NAME = 我的应用          ← 应用名称
PRODUCT_BUNDLE_IDENTIFIER = com.example.myApp

Linux

Linux 平台的应用图标使用 PNG 格式,遵循 FreeDesktop.org 图标主题规范

图标文件位置

linux/flutter/
└── generated_pluginregistrar.cc   # 不涉及图标

# 图标实际位于项目配置中
# 默认图标在 CMakeLists.txt 中指定

Flutter Linux 项目的图标配置在 linux/ 目录下,主要通过以下文件管理:

linux/
├── CMakeLists.txt            ← 构建配置
└── my_app.png                ← 应用图标(需手动添加)

图标尺寸

尺寸(px)用途安装路径
16 × 16小图标icons/hicolor/16x16/apps/
32 × 32中等图标icons/hicolor/32x32/apps/
48 × 48常用尺寸icons/hicolor/48x48/apps/
64 × 64大图标icons/hicolor/64x64/apps/
128 × 128超大图标icons/hicolor/128x128/apps/
256 × 256最大图标icons/hicolor/256x256/apps/
512 × 512高分辨率icons/hicolor/512x512/apps/

替换步骤

方式 A:使用 flutter_launcher_icons 插件(推荐)

插件会自动处理 Linux 图标的生成和 CMakeLists.txt 配置。

方式 B:手动配置

  1. 准备一张 512 × 512 的 PNG 图标

  2. 将图标放入 linux/ 目录:

bash
cp app_icon.png linux/my_app.png
  1. 编辑 linux/CMakeLists.txt,添加图标安装配置:
cmake
# 在文件末尾的 install() 部分添加
install(FILES "my_app.png"
        DESTINATION "${INSTALL_DATADIR}/icons/hicolor/256x256/apps"
        RENAME "com.example.my_app.png")
  1. 编译安装后,系统会在 /usr/share/icons/hicolor/256x256/apps/ 中找到图标

WARNING

Linux 应用图标文件名通常使用应用的 反向域名 命名(如 com.example.my_app.png),而不是简单的 my_app.png

Desktop Entry 配置

Linux 桌面通过 .desktop 文件识别应用,图标路径在该文件中指定。编辑 linux/my_app.desktop

ini
[Desktop Entry]
Name=我的应用                       ← 应用名称
Comment=我的 Flutter 应用           ← 应用描述
Icon=com.example.my_app            ← 图标名称(不带扩展名)
Exec=my_app
Type=Application
Categories=Utility;

Icon 字段可以是:

  • 图标主题名称(推荐):如 com.example.my_app,系统会在图标主题目录中查找
  • 绝对路径:如 /opt/my_app/icon.png,直接指向图标文件

修改应用名称汇总

各平台修改应用显示名称的位置:

平台文件路径关键字段
Androidandroid/app/src/main/AndroidManifest.xmlandroid:label
iOSios/Runner/Info.plistCFBundleDisplayName
Webweb/manifest.json + web/index.htmlname / short_name / <title>
HarmonyOSharmony/.../element/string.jsonEntryAbility_label
Windowswindows/runner/Runner.rcProductName
macOSmacos/Runner/Configs/AppInfo.xcconfigPRODUCT_NAME
Linuxlinux/my_app.desktopName

常见问题

图标替换后没有生效?

  • Android:运行 flutter clean 后重新构建,确保旧的构建缓存被清除
  • iOS:在 Xcode 中 Product → Clean Build Folder(⇧⌘K),然后重新运行
  • Web:清除浏览器缓存(Ctrl+Shift+R 强制刷新)
  • Windows:删除 build/windows/ 目录后重新构建
  • macOS:删除 build/macos/ 目录后重新构建
  • Linux:删除 build/linux/ 目录后重新构建,并确认 .desktop 文件中的 Icon 路径正确

iOS 图标有黑边?

iOS 图标不允许透明通道。请将图标的透明区域填充为白色或其他背景色:

bash
# 使用 ImageMagick 填充透明区域为白色
magick convert icon.png -background white -flatten icon_opaque.png

Android 自适应图标被裁切太多?

自适应图标的安全区是中间 72% 的区域。请将图标的主要内容缩小到中心区域,四周留出足够边距。

flutter_launcher_icons 生成后 iOS 图标缺失?

检查 pubspec.yaml 中的 image_path 是否正确,确保源图尺寸至少为 1024 × 1024 像素。然后删除 ios/Runner/Assets.xcassets/AppIcon.appiconset/ 目录下的旧文件,重新运行生成命令。

Windows 图标模糊?

ICO 文件中必须包含 256 × 256 尺寸。如果只包含小尺寸图标,Windows 在大图标视图下会放大显示导致模糊。建议 ICO 文件至少包含 16、32、48、256 四种尺寸。

macOS 图标显示为默认图标?

确保 AppIcon.appiconset/ 中的 Contents.json 文件里 filename 字段与实际文件名一致。如果使用 Xcode,可以在 Assets.xcassets 中直接拖入图标并检查是否有警告。

Linux 图标不显示?

  1. 检查 .desktop 文件中 Icon 字段的值是否正确
  2. 如果使用图标主题名称,确认图标已安装到 /usr/share/icons/hicolor/ 对应尺寸目录下
  3. 如果使用绝对路径,确认路径指向实际存在的文件
  4. 更新图标缓存:sudo gtk-update-icon-cache -f /usr/share/icons/hicolor/

推荐工作流

1. 准备 1024×1024 源图 → assets/icon/app_icon.png
2. 配置 pubspec.yaml → 添加 flutter_launcher_icons 配置
3. 运行生成命令 → dart run flutter_launcher_icons
4. 检查各平台输出 → 确认图标文件已更新
5. 清理重新构建 → flutter clean && flutter run
6. 真机验证 → 在各平台设备上确认图标效果

TIP

建议在项目初期就配置好 flutter_launcher_icons,这样后续只需修改源图并重新运行生成命令即可更新所有平台的图标,保持一致性。

基于 Flutter 官方文档整理