在 Android Chrome 里点开右上角三个点的菜单,选 "添加到主屏幕",结果桌面上只出现一个用首字母拼出来的占位图标——你精心设计的 favicon 被浏览器完全无视。这篇文章要解决的就是这个场景:如何让 favicon 在 Android Chrome 的桌面安装流程里正确显示。

用户安装站点时,Android Chrome 不会去读标准的 <link rel='icon'> 标签,它读的是站点对应的 web app manifest。如果 manifest 缺失、格式错误,或者缺少正确的图标条目,Android 主屏幕上的快捷方式就会回退成一张网页截图,或者一个通用的字母图形。

前置条件

动手之前你需要准备三样东西:

分步配置:Android Chrome 桌面安装的 Favicon

1. 从源文件导出两个尺寸的图标

Android Chrome 在安装对话框里优先使用 192×192 图标,在快捷方式添加后短暂出现的 splash 屏里使用 512×512 图标。两个尺寸都导出为 PNG。W3C manifest 规范把这两个尺寸定义为 purpose: 'any' 图标必须包含的 sizes 值。完整 schema 见 W3C Web App Manifest: icons member。

2. 为自适应启动器做一个 maskable 变体

Android 启动器会根据设备不同,把正方形图标裁剪成圆形、squircle 或圆角矩形。普通的 512×512 PNG 会被切掉边角。做一个 maskable 版本:完整图案放在画布中央 80% 的安全区内,外围 20% 留作透明边距,让启动器自由裁剪而不会丢细节。

文件保存为 icon-maskable-512.png。想深入了解安全区的计算,可以参考我们的 maskable icon 指南。

3. 写 manifest.json

把下面内容放到站点根目录,路径自行调整:

{
  "name": "Your App Name",
  "short_name": "Short",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/icon-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icon-maskable-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    },
    {
      "src": "/icon-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "any"
    }
  ]
}

purpose 字段是 favicon 在 Android 桌面安装流程里看起来清晰还是被切得乱七八糟的关键。manifest 规范中,'any' 表示标准图标,'maskable' 表示专为应对启动器裁剪设计的图标。

4. 在每个页面链接 manifest

用户可能用来安装的每个页面,其 HTML head 中都必须有 <link> 标签,否则 Android Chrome 找不到 manifest。加上这一行:

<link rel='manifest' href='/manifest.json'>

放在 favicon 声明旁边,不要放进 body 里。浏览器在解析关闭 head 之后会忽略后续的 link 标签。

5. 设置 theme-color,让顶部栏颜色保持一致

既然已经在改 head,就顺便加上 theme-color,从主屏幕打开站点时 Chrome 顶部会染上对应颜色:

<meta name='theme-color' content='#000000'>

6. 跑一遍真实安装流程

在 Android Chrome 真机上打开站点,点右上角三个点的菜单,选 "添加到主屏幕"。对话框预览里应该显示你的 192×192 图标,而不是字母或截图。确认添加后回到桌面——图标应当填满形状,且没有裁掉重要细节。

如果显示的图标不对,继续看下一节。

Android 上常见的坑

验证成果

用 在线 favicon 检测工具 确认 manifest 能解析、PNG 能通过 HTTPS 正常加载。Mzu favicondl 可以从一个源文件导出 192×192 和 512×512 两份 PNG,并生成对应的 maskable 版本,省掉一次 Figma 操作。然后至少在一台 Pixel 和一台 Samsung 设备上跑一遍完整安装流程——两家的启动器形状差异明显,这正是 maskable 版本不能省的原因。

想让 favicon 在 Android 桌面安装流程里正确显示,关键就是一份配置正确的 manifest.json:包含 192×192 条目、512×512 maskable 条目,并在每个页面放上 <link rel='manifest'> 标签。不做 maskable 版本,图标会被裁;不做 manifest,Android 直接给你的页面截图。这三件事做到位,用户主屏幕上的快捷方式看起来才像该有的样子。