AppImageを自前で作る方法
はじめに
本記事ではAppImageを自前で作る方法について初歩的な箇所を記載します。
AppImageとは、Linuxで単一のファイルに自己完結的にアプリをバンドルできる仕様です。
デスクトップアプリがメインのイメージですが、CLIツールでもなんでもバンドルできます。事例としては、ImageMagickがAppImage版を配布しており、Linuxで使う場合は便利です。
ElectronやTauriのようなデスクトップフレームワークではAppImageへのバンドル環境が備わっていますが、本記事の内容を理解すると自前でも「自作ツールや、他の人の作ったツールなどをバンドルしてLinuxマシンで管理しやすくしたい」「アプリを配布しやすくしたい」って時などにアプリバンドルが出来るようになります。
…と言っても本記事では初歩的なことだけを記載しますが(私も現時点で深くまで理解っている訳では無いです)、日本語記事…と言うよりそもそも実践している人自体が少なさそうなので、よかったら参考にしてみてください。
Step1. AppDirを作る
AppImageを作成する為に必要なことの殆どは、「AppDir
と呼ばれるROX Desktop由来のディレクトリ構造を自身のアプリケーションに適用して配置すること」です。
注意点としては、特にAppRun
にchmod
などを使って必ず実行・読取権限を付与すると良いと思います。意外と実行時、上手くいかないこととかがあるので注意すべきかもしれない箇所で、おまじないとしてやっとくと良いでしょう。
以下に重要なファイル名(例)を記載します。
名称 | 内容 |
---|---|
AppRun |
実行されるメインファイルを指します。AppRun という名前が重要で、シェルスクリプトでも例えばusr/bin/myapp へのシンボリックリンクでも良いです |
myapp.desktop |
デスクトップファイルです。freedesktop仕様に合わせて記載します。通常AppImageを使う時にこれがどうということは基本ない気がしますが、ソフトウェアによっては恐らくこれを参照・抽出して情報等を判別します。本来の基本的な役割は、例えばGNOMEだとMacで言うLaunchpad的なスタートメニューに表示したりするための設定ファイルです。実際にはusr/share/applications/myapp.desktop などへのシンボリックリンクになってることが一般的かと思われます。 |
myapp.png |
デスクトップアイコンです。GNOMEなどでのアプリアイコンを表示するのに使います。一般に、256x256 のpng であることがポイントです。下記の.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