The AppImage format is a format for packaging applications in a way that allows them to run on a variety of different target systems (base operating systems, distributions) without further modification.
Using the AppImage format you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, Debian and derivatives.
Copyright (c) 2004-22 Simon Peter probono@puredarwin.org and contributors.
https://en.wikipedia.org/wiki/AppImage
AppImageKit is a concrete implementation of the AppImage format, especially the tiny runtime that becomes part of each AppImage.
Providing an AppImage for distributing application has, among others, these advantages:
--appimage-extract
parameterHere is an overview of projects that are already distributing upstream-provided, official AppImages.
If you have questions, AppImage developers are on #AppImage on irc.libera.chat.
Linus addresses some core issues of Linux on the desktop in his DebConf 14_ QA with Linus Torvalds talk. At 05:40 Linus highlights application packaging:
I'm talking about actual application writers that want to make a package of their application for Linux. And I've seen this firsthand with the other project I've been involved with, which is my divelog application.
Obviously Linus is talking about Subsurface.
We make binaries for Windows and OS X.
Both bundle not only the application itself, but also the required Qt libraries that the application needs to run. Also included are dependency libraries like libssh2.1.dylib
and libzip.2.dylib
.
We basically don't make binaries for Linux. Why? Because binaries for Linux desktop applications is a major f*ing pain in the ass. Right. You don't make binaries for Linux. You make binaries for Fedora 19, Fedora 20, maybe there's even like RHEL 5 from ten years ago, you make binaries for debian stable.
So why not use the same approach as on Windows and OS X, namely, treat the base operating system as a platform on top of which we run the application we care about. This means that we have to bundle the application with all their dependencies that are not part of the base operating system. Welcome application bundles.
Or actually you don't make binaries for debian stable because debian stable has libraries that are so old that anything that was built in the last century doesn't work. But you might make binaries for debian... whatever the codename is for unstable. And even that is a major pain because (...) debian has those rules that you are supposed to use shared libraries. Right.
This is why binaries going into an AppImage should be built against the oldest still-supported LTS or Enterprise distributions.
And if you don't use shared libraries, getting your package in, like, is just painful.
"Getting your package in" means that the distribution accepts the package as part of the base operating system. For an application, that might not be desired at all. As long as we can package the application in a way that it seamlessly runs on top of the base operating system.
But using shared libraries is not an option when the libraries are experimental and the libraries are used by two people and one of them is crazy, so every other day some ABI breaks.
One simple way to achieve this is to bundle private copies of the libraries in question with the application that uses them. Preferably in a way that does not interfere with anything else that is running on the base operating system. Note that this does not have to be true for all libraries; core libraries that are matured, have stable interfaces and can reasonably expected to be present in all distributions do not necessarily have to be bundled with the application.
So you actually want to just compile one binary and have it work. Preferably forever. And preferably across all Linux distributions.
That is actually possible, as long as you stay away from any distribution-specific packaging, and as long as you do not use a too recent build system. The same will probably be true for Windows and OS X - if you compile on OS X 10.11 then I would not expect the resulting build products to run on OS X 10.5.
And I actually think distributions have done a horribly, horribly bad job.
Distributions are all about building the base operating system. But I don't think distributions are a good way to get applications. Rather, I would prefer to get the latest versions of applications directly from the people who write them. And this is already a reality for software like Google Chrome, Eclipse, Arduino and other applications. Who uses the (mostly outdated and changed) versions that are part of the distributions? Probably most people don't.
One of the things that I do on the kernel - and I have to fight this every single release and I think it's sad - we have one rule in the kernel, one rule: we don't break userspace. (...) People break userspace, I get really, really angry. (...)
Excellent. Thank you for this policy! This is why I can still run the Mosaic browser from over a decade ago on modern Linux-based operating systems. (I tried and it works.)
And then all the distributions come in and they screw it all up. Because they break binary compatibility left and right.
Luckily, binaries built on older distributions tend to still work on newer distributions. At least that has been my experience over the last decade with building application bundles using AppImageKit, and before that, klik.
They update glibc and everything breaks. (...)
There is a way around this, although not many people actually care to use the workaround (yet).
So that's my rant. And that's what I really fundamentally think needs to change for Linux to work on the desktop because you can't have applications writers to do fifteen billion different versions.
AppImage to the rescue!
Running an AppImage mounts the filesystem image and transparently runs the contained application. So the usage of an AppImage normally should equal the usage of the application contained in it. However, there is special functionality, as described here. If an AppImage you have received does not support these options, ask the author of the AppImage to recreate it using the latest appimagetool
(or linuxdeployqt
).
If you invoke an AppImage built with a recent version of AppImageKit with one of these special command line arguments, then the AppImage will behave differently:
--appimage-help
prints the help options--appimage-offset
prints the offset at which the embedded filesystem image starts, and then exits. This is useful in case you would like to loop-mount the filesystem image using the mount -o loop,offset=...
command--appimage-extract
extracts the contents from the embedded filesystem image, then exits. This is useful if you are using an AppImage on a system on which FUSE is not available--appimage-mount
mounts the embedded filesystem image and prints the mount point, then waits until it is killed. This is useful if you would like to inspect the contents of an AppImage without executing the contained payload application--appimage-version
prints the version of AppImageKit, then exits. This is useful if you would like to file issues--appimage-updateinformation
prints the update information embedded into the AppImage, then exits. This is useful for debugging binary delta updates--appimage-signature
prints the digital signature embedded into the AppImage, then exits. This is useful for debugging binary delta updates. If you would like to validate the embedded signature, you should use the validate
command line tool that is part of AppImageKitNormally the application contained inside an AppImage will store its configuration files wherever it normally stores them (most frequently somewhere inside $HOME
). If you invoke an AppImage built with a recent version of AppImageKit and have one of these special directories in place, then the configuration files will be stored alongside the AppImage. This can be useful for portable use cases, e.g., carrying an AppImage on a USB stick, along with its data.
.home
, then $HOME
will automatically be set to it before executing the payload application.config
, then $XDG_CONFIG_HOME
will automatically be set to it before executing the payload applicationExample: Imagine you want to use the Leafpad text editor, but carry its settings around with the executable. You can do the following:
# Download Leafpad AppImage and make it executable wget -c "https://bintray.com/probono/AppImages/download_file?file_path=Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage" -O Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage chmod a+x Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage # Create a directory with the same name as the AppImage plus the ".config" extension # in the same directory as the AppImage mkdir Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config # Run Leafpad, change some setting (e.g., change the default font size) then close Leafpad ./Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage # Now, check where the settings were written: linux@linux:~> find Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config (...) Leafpad-0.8.18.1.glibc2.4-x86_64.AppImage.config/leafpad/leafpadrc
Note that the file leafpadrc
was written in the directory we have created before.
appimagetool
is used to generate an AppImage from an existing AppDir
. Higher-level tools such as linuxdeployqt
use it internally. A precompiled version can be found on GitHub Releases.
wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
chmod a+x appimagetool-x86_64.AppImage
Usage in a nutshell, assuming that you already have an AppDir in place:
./appimagetool-x86_64.AppImage some.AppDir
Detailed usage:
Usage:
appimagetool [OPTION...] SOURCE [DESTINATION] - Generate, extract, and inspect AppImages
Help Options:
-h, --help Show help options
Application Options:
-l, --list List files in SOURCE AppImage
-u, --updateinformation Embed update information STRING; if zsyncmake 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 for mksquashfs, in addition to .appimageignore.
--runtime-file Runtime file to use
--sign-key Key ID to use for gpg[2] signatures
--sign-args Extra arguments to use when signing with gpg[2]
If you want to generate an AppImage manually, you can:
mksquashfs Your.AppDir Your.squashfs -root-owned -noappend
cat runtime >> Your.AppImage
cat Your.squashfs >> Your.AppImage
chmod a+x Your.AppImage
NOTE: The AppImage project supplies binaries that application developers can use. These binaries are built using the CentOS 6 Docker on Travis CI build system in this repository. As an application developer, you do not have to use the build system. You only have to use the build systems when contributing to AppImageKit, when needing another architecture than x86_64
, or when trying to reproduce our binaries.
Our build system is based on Docker. To build your own binaries, please install Docker first. Then, follow the following steps:
git clone --single-branch --recursive https://github.com/AppImage/AppImageKit
cd AppImageKit/
bash ci/build.sh
This will create the binaries in a directory called out/
.
Please note: It is not recommended nor supported to build AppImageKit on any newer build system than the oldest still-supported versions of major distributions for reasons outlined here. Currently we are targeting CentOS 6.x and Ubuntu 14.04 as build systems and we are not interested to build AppImageKit on newer versions anytime soon. Binaries built on those systems will run just fine on newer (later) target systems
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合 参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号