🐿️

AppImageを自前で作る方法

2025/01/12に公開

はじめに

本記事ではAppImageを自前で作る方法について初歩的な箇所を記載します。

AppImageとは、Linuxで単一のファイルに自己完結的にアプリをバンドルできる仕様です。

デスクトップアプリがメインのイメージですが、CLIツールでもなんでもバンドルできます。事例としては、ImageMagickがAppImage版を配布しており、Linuxで使う場合は便利です。

ElectronやTauriのようなデスクトップフレームワークではAppImageへのバンドル環境が備わっていますが、本記事の内容を理解すると自前でも「自作ツールや、他の人の作ったツールなどをバンドルしてLinuxマシンで管理しやすくしたい」「アプリを配布しやすくしたい」って時などにアプリバンドルが出来るようになります。

…と言っても本記事では初歩的なことだけを記載しますが(私も現時点で深くまで理解っている訳では無いです)、日本語記事…と言うよりそもそも実践している人自体が少なさそうなので、よかったら参考にしてみてください。

Step1. AppDirを作る

AppImageを作成する為に必要なことの殆どは、「AppDirと呼ばれるROX Desktop由来のディレクトリ構造を自身のアプリケーションに適用して配置すること」です。

注意点としては、特にAppRunchmodなどを使って必ず実行・読取権限を付与すると良いと思います。意外と実行時、上手くいかないこととかがあるので注意すべきかもしれない箇所で、おまじないとしてやっとくと良いでしょう。

以下に重要なファイル名(例)を記載します。

名称 内容
AppRun 実行されるメインファイルを指します。AppRunという名前が重要で、シェルスクリプトでも例えばusr/bin/myappへのシンボリックリンクでも良いです
myapp.desktop デスクトップファイルです。freedesktop仕様に合わせて記載します。通常AppImageを使う時にこれがどうということは基本ない気がしますが、ソフトウェアによっては恐らくこれを参照・抽出して情報等を判別します。本来の基本的な役割は、例えばGNOMEだとMacで言うLaunchpad的なスタートメニューに表示したりするための設定ファイルです。実際にはusr/share/applications/myapp.desktopなどへのシンボリックリンクになってることが一般的かと思われます。
myapp.png デスクトップアイコンです。GNOMEなどでのアプリアイコンを表示するのに使います。一般に、256x256pngであることがポイントです。下記の.DirIconもそうなのでややこしいですが、これ自体もまたusr/share/icons/hicolor/256x256/app/icons.pngなどへのシンボリックリンクになっていることが一般的かと思われます。
.DirIcon デスクトップアイコンです。myapp.pngと等価ですが、AppRunと同種の重要な意味を持ちます。基本的にはこのファイルは多くのツールでmyapp.pngへのシンボリックリンクで生成されます
usr リソースフォルダです。usr/bin, usr/lib, usr/shareフォルダがあることが一般的かと思われます

以下に簡単な一例を示します。

./myapp_aarch64.AppDir
├── AppRun -> usr/bin/myapp
├── myapp.desktop -> usr/share/applications/myapp.desktop
├── myapp.png -> usr/share/icons/256x256/app/myapp.png
├── .DirIcon -> myapp.png
└── usr
    ├── bin
    │   └── myapp
    ├── lib
    │   └── myapp.so
    └── share
        ├── applications
        │   └── myapp.desktop
        └── icons
            ├── 16x16
            │   └── app
            ├── 32x32
            │   └── app
            ├── 48x48
            │   └── app
            ├── 64x64
            │   └── app
            ├── 128x128
            │   └── app
            ├── 256x256
            │   └── app
            │       └── myapp.png
            └── 512x512
                └── app

AppRunのシェルスクリプト

AppRunをシェルスクリプトで記載する場合の事例を示します。
表に記載している通り、シンボリックリンクでも対応できますが、シェルスクリプトでも対応できるので私が個人的に試していた例を示します。

#!/bin/bash

SELF=$(readlink -f "$0")
HERE=${SELF%/*}

export LD_LIBRARY_PATH="$HERE/usr/lib:$LD_LIBRARY_PATH"

EXEC="${HERE}/usr/bin/TestApp"

exec "${EXEC}" "$@"

step2. linuxdeployを実行してAppImageを作成する

上記を作成したらあとはビルドするだけです。

AppImageを作成するツールはいくつかありますが、一例として手っ取り早いのがlinuxdeployかと思います。これは要約すると「オプション引数を指定することで上記のAppDirをいい感じに生成し、最終的にAppImageを吐くツール」です。

AppImageを実行可能な環境で、リリースページからダウンロードして好きな所またはPATHの通った場所に配置して実行します。

コマンド例を以下に示します。基本的には以下をやるだけで実行マシンのアーキテクチャに合わせたAppImageが出力されます。

linuxdeploy-x86_64.AppImage \
                --appdir ./myapp_aarch64.AppDir \
                --executable ./bin/foo \
                --desktop-file ./applications/foo.desktop \
                --library ./lib/foo.so \
                --icon-file ./icon/icon.png \
                --output appimage

参考リソース

Discussion