Travel Beach

是时候抛弃rpm, deb打包方式,全面拥抱Snap, AppImage和 Flatpak了


在 2021-09-30 22:22 发布

AppImage: 简单、兼容、无需安装、无需权限、便携并保持基础操作系统不变!

AppImage 是一种在 Linux 系统中用于分发便携式软件,且不需要超级用户权限来安装它们的格式。它还允许 Linux 的上游开发者来分发他们的程序而不用考虑不同 Linux 发行版间的区别。 AppImage 的核心思想是一个文件即一个应用程序,每个 AppImage 都包含应用程序以及应用程序运行所需的所有文件。
编号工具名称功能介绍
1appimage-builder该工具适用于将复核 AppDir 格式的程序转化为 appimage 的独立可执行文件
2pkg2appimage该工具适用于将 deb 格式的包转化为 appimage 的独立可执行文件
3linuxdeploy该工具适用于将 Linux 系统下的程序转化为 appimage 的独立可执行文件
4linuxdeployqt该工具适用于将 Linux 系统下的 QT 程序转化为 appimage 的独立可执行文件

1. AppImage 工具介绍

像 Linux 本身一样,AppImageKit 是开源的。

  • [1] 简单

AppImage 的核心思想是: 一个应用程序 = 一个文件。每个 AppImage 都包含应用程序以及应用程序运行所需的所有文件。换句话说,除了操作系统本身的基础组件, Appimage 不需要依赖包即可运行。

  • [2] 可靠

AppImage 格式是上游应用打包的理想选择,这意味着你可以直接从开发者那里获取软件,而不需要任何中间步骤,这完全符合开发者意图。非常迅速。

  • [3] 快速

AppImage 应用可以直接下载并且运行,无需安装,并且不需要 root 权限。

2. AppImage 工具对比

对比多种软件格式的优势和劣势!

[1] 与 deb 和 rpm 对比

  • 优势

  1. AppImage 格式的应用可跨发行版运行,传统格式不可用或比较难。

  2. AppImage 格式不需要安装即可运行,可在 $HOME 分区运行,节省更分区空间。

  3. AppImage 无需 root 权限,告别输入密码时代。

  4. AppImage 包含应用依赖,可不受软件仓库制约,快速分发应用版本且不破坏系统依赖。

  5. AppImage 提供多种打包方式,即可手动打包,也可脚本打包。

  • 劣势

  1. AppImage 格式会造成库的冗余且体积偏大,戏称为“系统安装了一万个 libc”。

  2. AppImage 不受检查,如果有来源不明的人打包,可能会带来安全风险。

  3. 运行一个旧的 AppImage 软件所带的依旧是旧版本的依赖库,可能会带来风险。

[2] 与 snap 和 flatpak 对比

  • 优势

  1. AppImage 无需运行时,安装 snap 和 flatpak 软件安装其运行时。

  2. AppImage 格式不需要安装即可运行,可在 $HOME 分区运行,节省更分区空间。

  3. AppImage 无需 root 权限,告别输入密码时代。

  4. AppImage 不需要软件仓库,当然也可以有,易于传播。

  5. AppImage 对华人友好,包括官方网站和官方文档都已经有对应的中文支持。

  • 劣势

  1. 没有沙箱机制。

  2. 没有商业公司支持,导致开发了十多年才具有影响力。

  3. 对某些定制化安装的发行版不友好,比如 gentoo 、 archlinux 等。

3. AppImage 目录结构

需要注意 AppImage 所需的文件以及目录结构!

使用 AppImage 系列工具的前提就是,你所编写的程序项目或者工具依赖格式必须符合 AppDir 的目录要求,大致目录结构如下所示。

AppDir

└── AppRun

└── your_app.desktop

└── your_app.png

└── usr

├── bin

│ └── your_app

├── lib

└── share

├── applications

│ └── your_app.desktop

└── icons

└── <theme>

└── <resolution>

└── your_app.png

  • [1] AppRun 文件

    • 必须要有

    • 启动主负载应用程序

    • 其中 AppRun 文件是程序的启动入口点文件,需要有可执行权限。

    • 在 AppImageKit 项目中提供了一个 AppRun.c 的实现,但我们可以使用语言,比如 shell 的实现,也可以仅使用与主要可执行文件的符号链接。

  • [2] your_app.desktop 文件

    • 必须要有

    • 类似于 Windows 系统的快捷方式,即双击即可运行。

    • 我们这里的 [your_app].desktop 文件将显示在桌面上,可使用链接的方式存在。

    • 编写的格式可以参考 Recognized desktop entry keys 这个网站,最简单的方法就是找一个改吧改吧。

[Desktop Entry]

Name=Hypnos

Exec=hypnos %F

Icon=hypnos

Type=Application

Categories=Audio;AudioVideo;

Comment=Music Player and Library

MimeType=inode/directory;audio/flac;

Name[en]=Hypnos

Terminal= false

StartupNotify= true

NoDisplay= false

  • [3] your_app.png 文件

    • 非必须

    • 提供程序软件包的桌面显示图案。

  • [4] Version 文件

    • 非必须

    • 用于显示程序软件包所对应的版本信息。

4. appimagetool 命令使用

介绍 AppImage 工具的使用格式和常用命令参数。

  • [1] 打包命令使用

appimagetool 命令用于把现有的 AppDir 目录生成一个 AppImage 程序。

Usage:

appimagetool [OPTION...] SOURCE [DESTINATION] - Generate, extract, and inspect AppImages

Help Options:

-h, -- helpShow helpoptions

Application Options:

-l, --list List files inSOURCE AppImage

-u, --updateinformation Embed update information STRING; ifzsyncmake is installed, generate zsync file

-g, --guess Guess update information based on Travis CI or GitLab environment variables

--bintray-user Bintray user name

--bintray-repo Bintray repository

--version Show version number

-v, --verbose Produce verbose output

-s, --sign Sign with gpg[2]

--comp Squashfs compression

-n, --no-appstream Do not check AppStream metadata

--exclude-file Uses given file as exclude file formksquashfs, inaddition to .appimageignore.

--runtime-file Runtime file to use

--sign-key Key ID to use forgpg[2] signatures

--sign-args Extra arguments to use when signing with gpg

  • [2] 打包文件使用

如果我们运行一个由 AppImageKit 工具构建的程序,那么其会附加以下参数,对应不同的参数会提供一些额外的特性和功能。

# usage

./appimagetool-x86_64.AppImage some.AppDir

编号参数解释说明
1--appimage-help显示帮助选项
2--appimage-offset显示文件系统镜像开始的偏移量
3--appimage-extract从文件系统镜像中提取内容
4--appimage-mount挂载嵌入式文件系统镜像并打印挂载地址
5--appimage-signature显示 AppImage 中的数字签名
6--appimage-updateinformation显示 AppImage 中的更新信息
7--appimage-version显示 AppImageKit 的版本

5. pkg2appimage 工具使用

pkg2appimage 工具适用于将 deb 格式的包变成 appimage 的独立可执行文件!

如果已经有了对应的二进制文件,不管是 zip 归档文件、 .deb 格式的文件还是 ppa 源上的文件,我们只需要编写一个 .yml 格式的描述文件,然后使用 pkg2appimage 工具来运行它,就会帮助我们转换生成一个 AppImage 的独立文件,是不是非常简单呢 yml 描述文件告诉 pkg2appimage 从哪里获得所需要的内容,以及如何将它们转换为 AppImage 。

# 执行方式

$ bash -ex ./pkg2appimage recipes/XXX.yml

如果你只是看到了简答,那么你就太年轻了,你不知道这个 yml 格式的配置文件到底有多糟心。真的,看了官方文档中的配置文件介绍,以及对于官方仓库的示例软件对于 yml ,心里有些懵逼。不过,等多看几次之后,就会发现还是不难写的,只是需要我们再出现错误的时候,能够及时调整配置文件,就可以正常打出我们需要的独立文件。

下面我们就一起看下, yml 文件的编写内