前言
使用Ubuntu时,很多软件并不包含在apt包管理工具中,或者apt提供的版本太老,因此我们时常需要下载已编译好的软件。为了避免依赖问题,这些软件有时会打包成AppImage,下载下来后直接双击打开就能运行,任务栏可以看到正确的软件图标。但如果要把这个软件像apt安装的软件一样添加到应用程序列表里,还需要一些额外操作获取软件图标。
具体步骤
以Mesh Lab这个程序为例,从官网下载的是一个.AppImage文件,可以看到这个文件的图标是默认的小齿轮。但给这个文件赋予执行权限chmod 755 MeshLab.AppImage
并双击执行后,能看到任务栏里有正确的程序图标。
我们首先从程序包中提取图标。在命令行中输入./MeshLab.AppImage --appimage-extract
可以提取出应用的所有文件,其中可能有个xxx.png的图标文件,同时可能还有个文件夹叫usr,打开后还有share/icons等文件夹,继续深入文件夹可以看到包含各个分辨率的图标的文件夹,每个分辨率下的文件名应该是相同的,例如我这里是usr/share/icons/hicolor/512x512/apps/meshlab.png
,记住这个名字。
接着,我们要确认这个程序是所有人都可使用,还是仅当前用户需要。如果要让所有用户使用,通常我们会把AppImage放在根目录的/opt/
文件夹下,然后把各分辨率图标复制到/usr/share/icons/
里。如果仅有一个图标,可以考虑根据它的分辨率把它丢到对应的icons/hicolor/分辨率/apps/
文件夹下,也可以把这张图放在/opt
里,之后使用绝对路径。如果仅当前用户使用,则把这个AppImage放在自己的home目录下,放哪都无所谓,我是创建了一个~/Applications/
文件夹专门存放所有的预编译应用。同样我们要把应用图标放到正确的位置,这里是放在自己home目录的~/.local/share/icons/
。
我们还需要获取程序运行时窗口的名字。直接双击AppImage运行这个程序,打开一个命令行并输入xprop | grep WM_CLASS
,鼠标会变成一个十字,在程序窗口中点一下,命令行中会显示窗口的名字,例如Mesh Lab这里是WM_CLASS(STRING) = "AppRun.wrapped", "MeshLab_64bit_fp"
,记下后一个名字,这里是MeshLab_64bit_fp
。
准备工作都做好后,创建一个文件起名叫meshlab.desktop
,文件名叫什么无所谓,自己能认得就行。如果想要对所有用户生效,把这个文件放在/usr/share/applications/
里,如果只需要对当前用户生效则放在~/.local/share/applications/
。用记事本打开,写入如下内容:
[Desktop Entry]
Type=Application
Name=MeshLab
Exec=/opt/MeshLab.AppImage %F
Icon=meshlab
Terminal=false
StartupWMClass=MeshLab_64bit_fp
这些条目中,Type
、Name
、Exec
是必须要有的,Type
一般就是Application,Name
是在应用菜单和任务栏里会看到的名字,Exec
是程序运行的路径和参数,这里的%F
指传递文件名参数,可能类似于把文件拖动到图标上这个操作,具体要填什么参数取决于应用的需求。Icon
和StartupWMClass
也是非常推荐填写的字段。如果之前把各分辨率的图标复制到了.../share/icons
里,Icon
字段填写图标的文件名,不含后缀。如果使用单一图标,Icon
填写图标的绝对路径,例如/opt/meshlab.png
。StartupWMClass
不填写时默认为等于Name
字段,如果该字段跟程序实际打开的窗口名称不匹配,打开程序将会在任务栏创建一个新的图标,而不是在原有图标位置打开,所以这里填写我们之前用xprop | grep WM_CLASS
获取的窗口名称。
还有其他一些字段会提供一些额外信息,Terminal
告诉系统打开这个程序时是否要打开终端,如果不填默认为false,Comment
是应用简介, Categories
可以让程序出现在某些应用分类下,MimeType
说明了支持的文件类型,在打开对应文件时系统会显示这个程序作为可选项。如果是要开发一个正规的程序,这个字段都是很有用的应用信息,但我们就是创建一个图标而已,填不填都无所谓。
最后我们还需要刷新一下图标缓存和列表,用户级别的刷新是update-desktop-database ~/.local/share/applications
和gtk-update-icon-cache ~/.local/share/icons/hicolor
,系统级别的是sudo update-desktop-database /usr/share/applications
和sudo gtk-update-icon-cache /usr/share/icons/hicolor
。
参考信息
感谢ChatGPT老师提供了大多数信息。