尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

移动应用图标与应用名定制全攻略:从静态替换到动态生成

发布时间:2026/9/24 21:07:36

资讯中心
01
ARTICLE

移动应用图标与应用名定制全攻略:从静态替换到动态生成

移动应用图标与应用名定制全攻略:从静态替换到动态生成
做了这么多年移动端我越来越觉得“图标”和“应用名”是一个应用最容易被人忽视、却又最能体现细节的地方。用户打开手机第一眼看到的不是你的首页不是你精心写的某个动画而是桌面上那个小方块和下面那行字。可恰恰是这块“门面”在定制的时候坑最多明明换了张图部分手机上还是旧图标Android 和 iOS 的尺寸要求完全对不上想根据运营活动自动换名字结果发现系统根本不给你这个机会。今天我就从“最基础的静态替换”一直聊到“运行时动态生成图标”把移动应用图标与应用名定制这条路完整走一遍。这篇文章适合三类人看一是刚接触 Android/iOS 开发想搞懂桌面图标到底是怎么“显示出来”的新手二是已经在做应用但被国产 ROM 图标裁剪、缓存不刷新等问题折磨过的初中级开发者三是做 ROM 定制、企业级批量换肤或应用商店上架前批量修改图标/名称的工程团队。我会尽量把原理讲清楚再给可以直接抄走的方案少走弯路。1. 定制的第一课搞清楚图标和应用名到底存在哪里1.1 桌面点击的背后Launcher、PackageManager 与资源ID要定制图标第一步不是打开 PS 画图而是先理解桌面上那个图标是什么。手机桌面在 Android 里叫 Launcher它其实也是一个普通应用只是权限比较高。Launcher 在启动时会扫描系统里所有已安装应用通过 PackageManager 拿到每个应用的 ApplicationInfo然后再读取里面的 icon 和 label 字段。真正关键的是SystemUI 和 Launcher 拿到的 icon 并不是一个简单的文件路径而是一个资源 ID。你在 AndroidManifest.xml 里写android:iconmipmap/ic_launcher这个mipmap/ic_launcher会被编译成一段十六进制的资源 ID系统通过这个 ID 去解析resources.arsc资源索引表最后从对应的资源文件里加载 Bitmap 或 Drawable。也就是说你改图标本质上是在改“资源 ID → 文件”的映射关系而不是简单地把某张图片复制到手机某个目录。理解了这一点很多问题就豁然开朗了。为什么有时候替换了图片但桌面还显示旧图标因为 Launcher 缓存的是解析后的 Bitmap系统不会在每次绘制前去重新解析资源文件除非它主动刷新缓存或重启。为什么有的应用按了“清除图标缓存”或“重新应用主题”就好了本质上是强制 Launcher 丢弃旧 Bitmap、重新走一遍资源查找流程。1.2 应用名也不是“写死”的它本质上是一个字符串资源应用名的底层逻辑和图标一模一样。你在AndroidManifest.xml里看到的android:label我的应用可以是一个直接写得死的字符串也可以是指向strings.xml中某个字符串资源的引用比如android:labelstring/app_name。当我们说“定制应用名”最标准的方式是修改这个字符串资源因为这样做还能顺带支持多语言系统会根据当前语言环境自动选择不同values-xx/strings.xml里对应的文案。需要特别注意桌面显示的“应用名”有时候并不一定来自应用主Application的 label而是来自当前 Activity 的 label。如果你在 Manifest 里给某个启动 Activity 单独设置了android:label那部分系统场景下比如最近任务、应用信息页显示的就是这个 Activity 的 label而不是应用名。遇到“改了 app_name 但桌面还是旧名字”的情况第一反应应该是去查启动 Activity 里是否有单独的 label先把这一层排查干净。1.3 为什么“改个图标”在很多手机上看起来没生效这个问题几乎每天都有开发者问。我总结下来主要原因有三个。第一桌面 Launcher 有图标缓存。大部分手机在应用更新、卸载重装后会刷新但也有不少 ROM 在 “换图标” 这个场景下不会立刻刷新尤其是当你使用主题商店里的第三方主题时主题会覆盖应用默认图标你应用里改得再认真桌面显示的仍是主题绘制的那一套。第二Android 8.0 之后系统对 Adaptive Icon自适应图标有强制要求。如果你只是简单地在mipmap目录里放了一张 512x512 的正方形 PNG而 Manifest 里没有匹配正确的adaptive-icon配置很多设备会自动把它按圆形、圆角矩形或“泪滴形”裁剪导致边缘被切掉、视觉上变小。这不是手机出问题了而是你对系统图标规范理解不够。第三有些 ROM 会扫描第三方应用的activity-alias或快捷方式入口。如果你的入口不止一个比如有多个activity-alias都设了 icon桌面显示的可能不是你预期的那一个。排查时用adb shell dumpsys package 包名直接看ApplicationInfo和ActivityInfo的输出结果很快就能定位。2. 基础篇图标尺寸、Image Asset 与多语言应用名配置2.1 Android 图标尺寸体系为什么非要分那么多目录很多新手第一次看 Android 工程里的mipmap-mdpi、mipmap-hdpi会觉得很烦不就是一张图吗为什么要准备五六张这就要说到 Android 的“密度无关像素”设计。设备屏幕的物理像素密度不同同一张图在低端机和旗舰机上显示的物理尺寸必须不同才能保证视觉大小一致。mdpi是基准密度1dp 1pxhdpi是 1.5 倍xhdpi是 2 倍xxhdpi是 3 倍xxxhdpi是 4 倍。以最常见的 48dp 桌面图标规格来算各目录下的实际像素尺寸是这样的密度目录密度比图标像素尺寸mdpi1x48x48hdpi1.5x72x72xhdpi2x96x96xxhdpi3x144x144xxxhdpi4x192x192所以你在 Android Studio 里右键New Image Asset生成图标时它默认就是按这套规范给你出一整套目录。切莫图省事只放一张 192x192 的ic_launcher.png在mipmap-xxxhdpi然后让系统自适应缩放那样在低密度设备上容易出现锯齿和模糊放到高密度设备上倒还好但装到电视、手表这种特殊屏幕上显示效果常常惨不忍睹。规范的意义就是让每台设备加载到“设计尺寸正好等于实际渲染尺寸”的资源不做多余缩放。2.2 Android Studio 一键替换图标的正确姿势如果你用的是标准工程最稳妥的方式是用 Android Studio 的 Image Asset 向导。右键res目录选New Image Asset这时你会看到三种图标类型Launcher Icons (Adaptive and Legacy)、Action Bar and Tab Icons、Notification Icons。日常定制桌面图标选第一个就行。在这个向导里你既可以直接把一张源图丢到 Foreground 层也可以选择一个背景色。需要注意“Resize”滑块的数值它控制的是前景图在安全区里的缩放比例。默认情况下系统对 Adaptive Icon 的裁剪比较狠如果你把前景图案拉得太满最终显示时边缘会被 cut 掉一般建议把重要内容控制在源图中心的 60% 左右。生成完毕后检查一下工程里是否同时出现了mipmap-anydpi-v26/ic_launcher.xml和mipmap-anydpi-v26/ic_launcher_round.xml这两个 XML 是 Adaptive Icon 的入口里面会引用背景和前景 Drawable。如果项目对包体体积敏感可以在生成后把mipmap里的 PNG 全部转成 WebP。Android 8.0 之后系统原生支持 WebP相同画质下体积能减少 30% 左右而且 Image Asset 生成时会自动帮你处理圆角和遮罩不用每次都用 PS 导图。转 WebP 的时候要保留透明度否则拉伸后边缘会出现难看的白色描边。2.3 应用名的资源化配置与多环境命名应用名的定制最基础的玩法是改strings.xmlresources string nameapp_name我的应用/string /resources然后 Manifest 里引用它application android:iconmipmap/ic_launcher android:roundIconmipmap/ic_launcher_round android:labelstring/app_name这样做的好处是以后多渠道、多语言、多场景切换都只是改字符串资源的事。比如国内渠道叫“极速清理”海外渠道叫“Clean Master”你就可以在gradle里针对不同buildType或flavor动态覆盖app_nameandroid { defaultConfig { resValue string, app_name, 极速清理 } productFlavors { googlePlay { resValue string, app_name, Clean Master } huawei { resValue string, app_name, 极速清理-华为版 } } }这种方式比直接改strings.xml更灵活因为它是在构建期注入的不会污染源码仓库。我要提醒一句如果项目里其他资源比如app_name被复用到了“关于我们”页面也被引用改掉应用名会把所有引用的地方一起改掉。所以给“应用名”单独建一个字符串比如叫app_display_name和内部使用的app_name区分开可以减少很多隐藏 bug。多语言定制更简单在不同的values-xx/strings.xml里定义同名的app_name即可。但要注意某些 ROM 的应用信息页和桌面显示的是缓存的旧名字刚改完看不到效果等系统重新读取一次资源就可以。3. 进阶篇Adaptive Icon、主题图标与动态应用名3.1 自适应图标Adaptive Icon与安全区是怎么一回事Android 8.0 引入了 Adaptive Icon把桌面图标拆成背景层和前景层两层然后由系统用统一的遮罩去裁剪。这样做的好处是解决碎片化问题以前每家手机厂商自己画圆形、圆角矩形、方形应用图标在不同手机上被裁得七扭八歪。现在你只要提供一张背景和一张透明底的前景剩下的交给系统 mask 处理。默认模板里你会看到res/mipmap-anydpi-v26/ic_launcher.xmladaptive-icon xmlns:androidhttp://schemas.android.com/apk/res/android background android:drawabledrawable/ic_launcher_background / foreground android:drawabledrawable/ic_launcher_foreground / monochrome android:drawabledrawable/ic_launcher_monochrome / /adaptive-icon其中monochrome是 Android 13 新增的用来给主题图标Themed Icon提供单色图层。这里最关键的概念是安全区图标整体画布是 108dp x 108dp但能被完整看到、不被遮罩裁剪的只有中间直径 66dp 的圆形区域。换句话说背景占据整块画布可以铺满但前景中重要的图案必须落在中心 66dp 以内否则小米的圆形遮罩会把你辛苦设计的“角标”直接切掉一半。这就像拍证件照人必须站在取景框中间露太多肩膀反而会被裁掉。实操层面我一般会用一张 1024x1024 的源图把主要图形控制在中心 640x640 范围然后在 Android Studio 的 Image Asset 里把缩放拉到 80% 左右。这样既能保证视觉张力又不至于被各种 ROM 的 mask 切得不成样子。3.2 动态图标Material You 主题色与 Android 13 的 Themed Icon说到“动态图标”很多人的第一反应是“图标能自己变色吗”。还真能。Android 12 开始Google 提出了 Material You 动态取色系统会从壁纸中提取主色调把系统应用和第三方应用的图标统一成一个色系。你的应用如果想融入这种动态主题就必须提供单色图层也就是上面提到的monochrome。画这个单色图层有个通用规范不要带任何彩色信息用白色填充并保留 alpha 透明度即可最终系统会对它做 tint 处理。至于是变成绿色还是蓝色完全取决于系统从壁纸取色的结果应用自己控制不了。如果你的图标本身是纯 logo 或简约线条风这个功能体验很好但如果你要展示的是一张实拍照片或复杂插画monochrome 层可能会显得很单薄这时候宁可不要设置monochrome让系统继续使用前景层。还有一类“动态图标”是指图标根据用户操作实时变化比如天气类应用把桌面图标做成“当前温度”和“当前天气状态”。这种实现方式和上文的 Themed Icon 不是一回事它靠的是后台更新桌面快捷方式的图标这点我会在第四节展开。建议你在立项时先想清楚你要的是“跟随系统取色”这种由系统驱动的动态还是“应用主动刷新图标”这种由数据驱动的动态。两者技术路径完全不同。3.3 应用名的动态化多环境、多场景、随时换名“动态应用名”是很多应用运营同学的执念活动期间把名字改成“双11大促”节日改成“新年快乐”。但这里要先泼一盆冷水Android 系统层面并不支持一个已安装应用随意修改自己的主应用名。桌面显示的 label 大部分时候是安装时从资源索引读出来的静态字符串你不能在 Java/Kotlin 代码里调一个 API 把它改掉就完事。那有没有绕过的办法有。第一种如果你只是想在 debug/release 包之间看到不同名字用上文的resValue或者manifestPlaceholder即可。第二种如果确实要根据后台配置切换那就需要换组件方式在 Manifest 里声明多个activity-alias每个 alias 有不同的 label然后通过PackageManager.setComponentEnabledSetting()动态启用某一个 alias、停用其他。这个操作会触发桌面图标刷新但过程比较粗暴部分厂商 ROM 有延迟而且国内很多手机对组件切换有限制。更实际、效果更好的方案是直接“另起炉灶”在桌面上创建一个带自定义名称的快捷方式。比如你的主应用叫“天气助手”你可以在桌面上放一个名为“今日天气 · 晴 25℃”的快捷方式点击它打开应用对应页面。对用户来说桌面展示的就是一个不断变化的“应用名”但实际底子是快捷方式。这个方案兼容性最好也是大多数工具类 App 的自定义图标/名称功能的真正实现路径。不过要注意很多手机在“从桌面快捷方式启动应用”时最近任务页显示的仍然是你应用的主 label 而不是快捷方式的名称所以它改变不了所有系统入口的名称只能覆盖桌面入口。4. 高级篇运行时绘制图标、快捷方式与免源码替换4.1 在代码里“画”出一个图标Bitmap、Canvas 与 Icon 类如果你做的是皮肤类、工具类或个性化启动器类应用迟早会碰到“运行时动态生成图标”的需求。典型场景是用户上传一张头像或选一张照片应用把它作为桌面临时图标。这时候静态资源已经不够用了得用代码绘制。核心思路是把任意 Drawable 或 View 渲染成 Bitmap再用Icon.createWithBitmap()包一层最后把它塞给快捷方式或通知栏。下面是一个 Kotlin 示例把自定义 View 渲染成 Bitmap然后生成一个 Iconfun viewToIcon(view: View, size: Int): Icon { val bitmap Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888) val canvas Canvas(bitmap) view.layout(0, 0, size, size) view.draw(canvas) // 如果需要在圆角遮罩内显示可以在这里用 BitmapShader 再画一层 return Icon.createWithBitmap(bitmap) }然后在创建快捷方式时使用它val shortcut ShortcutInfoCompat.Builder(context, shortcut_id) .setIntent(Intent(context, MainActivity::class.java).apply { action Intent.ACTION_VIEW }) .setShortLabel(今日状态) .setIcon(viewToIcon(customView, 192)) .build() ShortcutManagerCompat.requestPinShortcut(context, shortcut, null)这里有个容易踩的坑Bitmap 的尺寸如果过小放到桌面上会糊过大又会消耗内存。一般桌面图标按 48dp 计算所以在创建 Bitmap 时建议直接按dp * density算而不是写死 192px。另外很多 ROM 对快捷方式图标也做圆形裁剪你可以提前在 Bitmap 上画一层圆角遮罩让图标在绝大多数机型上保持一致观感避免被不同遮罩切成不同形状。4.2 快捷方式、短标签与“一应用多入口”的高级玩法除了动态图标快捷方式还能帮我们实现一种“伪装成多个应用”的效果。比如一个工具类应用可以在桌面同时放出“汇率换算”“单位转换”“日期计算”三个快捷方式每一项都有自己的图标和名字。对用户来说桌面看起来像装了三个独立的小工具但其实底层是同一个 APK。实现这一步需要用到ShortcutManagerCompat。动态快捷方式的添加分两种一种是在应用内创建后请求固定到桌面需要用户点击确认这是requestPinShortcut另一种是无需固定到桌面在长按应用图标时弹出的“快捷入口列表”中展示这是setDynamicShortcuts。我建议两种都用上长按菜单里放 3 到 5 个最常用的功能桌面固定由用户主动触发。这里要提醒一下不同 Android 版本的快捷方式 API 差异较大。Android 8.0 到 12 是ShortcutManagerAndroid 13 加入PinShortcutRequestReceiver的返回回调国内 ROM 对快捷方式的固定权限管理又各不相同。兼容性最稳的方案是引入 Jetpack 的androidx.core.content.pm.ShortcutManagerCompat它在底层帮你处理了一堆厂商差异。4.3 免源码、免重新编译的图标与应用名替换思路还有一类需求很常见尤其是企业定制 ROM、双开工具、海外商店包的场景“我不想重新编译整个工程能不能直接改一个已经编译好的 APK”说白了就是要改 APK 里的资源文件和 Manifest。思路依然是围绕资源 ID 做文章。用一个能解析 APK 的工具解包后替换res/mipmap-*目录下的图标文件同时改AndroidManifest.xml里android:label对应的字符串值再重新打包、签名。因为 Android 在安装时并不校验图片文件本身是否“合法”它只关注资源 ID 和文件内容是否能被正确解码所以这种替换是可行的。但有几个前置条件必须说清楚只建议对你自己开发的应用或已经获得授权的应用做资源替换不要拿去动别人的商业 APK这涉及版权和合规问题。重新打包后签名一定变化。如果原应用是系统内置应用或者用户之前安装过旧签名版本新包会安装失败或出现签名不一致问题。企业分发场景下要保证所有包都用统一的 release 签名。图标文件和字符串资源的格式必须严格匹配PNG 的色深、尺寸、透明度通道都不能乱否则轻则图标不显示重则安装后启动崩溃。如果你没有源码只是改 label不一定要解包整个 APK。用aapt2 dump badging查看当前 label 和 icon 的资源 ID再用资源编译器重新生成新的resources.arsc和对应资源文件然后合并进去这样能减少对 APK 整体结构的影响。这种方案看起来“黑科技”其实就是编译工具链的常规操作适合批量定制、自动化流水线场景。如果要大规模批量做建议把“图标设计 → 资源生成 → APK 重打包 → 自动化签名 → 多机型验证”全部脚本化而不是手动用 GUI 去点。5. 实战排错图标不更新、被裁剪与机型适配的坑5.1 图标换不掉、缓存不更新到底怎么办“我改了图标编译安装为什么桌面上还是显示旧图标”这是我被问过最多的问题。前面说过根源是 Launcher 缓存。常规操作顺序如下先卸载应用再重新安装。注意不要用 Android Studio 的 “Apply Changes” 或增量安装某些机型对增量资源更新支持很差建议直接adb uninstall后adb install。还不行就重启一次桌面。不同 ROM 方法不一样有的可以长按桌面空白处进入桌面设置找到“图标”或“主题”刷新有的只能重启系统 UI使用adb shell pkill -f com.android.launcher这个方法对部分机型会直接黑屏重启桌面属正常现象。再不行就到“设置-应用管理-你的应用-清除数据/清除缓存”但这会影响应用本地数据不是首选。对开发机最粗暴有效的方式是adb reboot。不要嫌慢有些 ROM 的图标缓存就是存在/data/system/package_cache/下的 XML 文件里重启后系统会重新扫描解析资源。这套流程不光对手机有效放在 PC 上是同一套逻辑Windows 上改图标没生效时清理图标缓存、重启资源管理器解决的也是同类问题。理解了缓存的本质遇到类似“C 盘某个工具软件图标删不掉、改不了”的桌面端问题也能举一反三。5.2 各种机型图标被“裁剪变形”的真相同一个 APK在小米上是圆角矩形在三星上是圆角方块在原生 Android 上是圆形在华为上又是另一种形状。这不一定是你图标设计的问题而是各厂商对 Adaptive Icon 的 mask 定义不同。厂商可以自己在系统里定义maskable-icon的遮罩资源把桌面图标裁成品牌专属形状。应用开发者能做的只有一件事让你的前景图案足够居中、足够小保证在“裁剪最狠”的遮罩下仍然完整可读。实际操作时我一般会在原生圆形、小米圆角矩形、三星圆形这三种 mask 下分别截图检查因为它们是测试样本里最典型的。如果你发现图标在某个机型上“变小了”多半是因为系统在裁剪后为了适配视觉比例又把整体缩放了一遍。这是正常行为不需要强行把背景图撑满。如果你的图标没有使用 Adaptive Icon而是一张传统的正方形 PNG部分系统会直接按图片原始尺寸等比缩放后套入 mask结果就是边缘被切、四周留白不对称。所以再次强调新项目尽早全面切换到 Adaptive Icon不要用旧方案硬扛。5.3 几个值得永远记住的底层原则踩过这么多坑我总结出三条原则基本上可以覆盖 90% 的图标/应用名定制问题。原则一图标不是一张“图”而是一个“资源映射”。明白“Manifest → 资源 ID → 具体文件”这条链路你就知道去哪改、为什么改了没生效、怎么强制刷新。一切显示层的问题都可以沿着这条链路去查。原则二桌面图标不完全等于应用图标。桌面图标可能是快捷方式、可能是主题覆盖、可能是自适应遮罩处理后的产物。如果你要控制“最终用户看到的东西”就要在最高层桌面这一级想办法而不能只满足于res目录里的文件正确。原则三国产 ROM 的深度定制是最大变量。同一套 res、同一个 APK在不同品牌、不同系统版本、不同主题下最终渲染的图标可能完全不同。做自定义之前先列一个“测试机型矩阵”包含原生 Android 模拟器、主流国产ROM各一台每次改完图标和名称都跑一遍很多诡异问题在发布前就能拦下来。最后再分享一点我个人的工程习惯。图标和应用名的定制非常建议在一开始就把它当成一项“配置工程”而不是“PS 工程”来做把尺寸、安全区、各目录资源、多语言文案都整理成一张表能脚本生成的绝不手拖上 CI 后每次构建都自动检查是否缺少某个密度的图标、是否漏配 roundIcon、monochrome 层是否存在。这活儿看着小但一旦项目多、机型杂、发布节奏快配置一旦乱了排错的成本远远超过一开始花十分钟做规范的成本。做技术嘛最怕的不是问题难而是问题小却反复咬人。提前把这条链路摸透后面再遇到图标和名字的定制需求你基本可以闭着眼睡觉了。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。