【Linuxユーザーへ贈る】Flatpakではじめる新しいGUIアプリ体験

:::note warn
私個人の話で恐縮ですが、「[ギークハウス新宿](https://geejuku.tokyo/)」というエンジニア中心のシェアハウスの運営に関わっています。

[勉強会・懇親会等のイベント](https://geejuku.connpass.com/)を開催しております。内見等興味ある方はお気軽に[こちら](https://x.com/geejuku)までご連絡ください。
:::

# Flatpakって何？ モダンなLinux GUIアプリ配布の救世主！

この記事では、LinuxでのGUIアプリの新しいパッケージングシステムとして近年注目を集めているFlatpakについて語っていこうと思います。

---

## Flatpakの魔法のような特徴

Flatpakの特徴を説明します。

---

### 1. **どのLinuxディストリビューションでも動く！**

Ubuntu、Fedora、Arch linuxなどディストリビューションに関係なく、Flatpak形式であれば同じパッケージがどこでも動くような仕様になっています。

似たものにUbuntuの開発元であるCanonicalが開発しているSnapというパッケージングシステムがあります。こちらも基本的にはFlatpakと同じ思想で作られていますが、GUIアプリだけでななくCUIアプリもターゲットとしている点が異なります。

個人的な印象では2024年時点ではGUIアプリに限るとFlatpakの方がLinuxコミュニティにより広く受け入れられている印象です。

---

### 2. **セキュリティがバッチリ！**

アプリを安全なサンドボックスで動かすので、ホストマシンを汚染しません。

Dockerコンテナと同じようなものですが、Dockerコンテナほど厳密に環境が切り離されているわけではなく、ホストマシンのファイルシステムやネットワークには権限を個別に付与することでアクセスできるようになっています。

---

### 3. **依存関係？もう怖くない！**

Linuxでパッケージをインストールするというと、aptやdnf、pacmanなどのディストリビューションごとのパッケージマネージャーを使ってインストールするのが普通だと思います。

CLIアプリであればこれで問題ないことが多いのですが、GUIアプリとなると少し話が変わってきます。というのもGUIアプリは依存パッケージの数が多く、依存パッケージのバージョンが衝突してしまうという問題が起きがちです。

例えば、「A」というGUIアプリをインストールするときは依存パッケージ「c」のバージョン1.0が必要であるのに対し、「B」というGUIアプリをインストールするときは依存パッケージ「c」のバージョン2.0が必要であるといったケースが起きることがあります。この場合どちらかのアプリはインストールを諦めないといけません。

Flatpakの場合、アプリごとにサンドボックス環境が分離されて、必要なライブラリはサンドボックス環境ごとにすべて同梱されるため、依存関係の衝突を気にする必要がなくなります。その代わり、１つのパッケージのサイズが大きくなってしまいがちという問題点はあります。

---

## Flatpakが生まれた経緯

---

### プロジェクトの始まり
Red Hat の開発者であるAlexander Larssonが、これまでのLinux GUIアプリケーションの課題を解決するために2013年にxdg-appプロジェクトを開始し、2015年にFlatpakに改名しました。

---

### 主な目標

- クロスディストリビューション対応
- セキュアなアプリケーション実行環境
- 簡単なパッケージングとパッケージ配布

---

### 技術的なブレイクスルー

- OSTree: 効率的なファイルシステム管理
- Bubblewrap: サンドボックセキュリティ
- D-Bus: 安全なプロセス間通信

---

### 現在の成果
現在では、GNOMEコミュニティや多くのLinuxディストリビューションに採用され、アプリケーション配布の新しい標準として急速に成長しています。

Flatpakは、Linuxエコシステムの壁を取り払い、より統一され、セキュアで使いやすいデスクトップ環境の実現を目指しているのです。

---

## Flatpak化された有名アプリケーション

多くの人気アプリがFlatpak形式で提供されています。

Flatpak自体はOSSプロジェクトであり、基本的にオープンソースソフトウェアがパッケージングの対象ですが、バイナリ形式にも対応しているため、プロプライエタリーなソフトウェアもパッケージング可能です。

例えば

- **VSCode**: マイクロソフトの人気コードエディタ
- **Spotify**: 音楽ストリーミングサービス
- **Slack**: ビジネスコミュニケーションツール
- **Discord**: チャットプラットフォーム
- **GIMP**: 画像編集ソフト
- **Firefox**: Mozillaの人気ブラウザ

といったアプリが[Flathub](https://flathub.org/ja)からインストール可能です。

FlathubはFlatpakのデファクトのアプリストアで、WindowsでいえばMicrosoft Store、MacでいえばApp Storeに相当するものです。

---

## Flatpakのインストール＆Flatpakアプリの実行

---

### 1. Flatpakをインストール

Flatpakはディストリビューションのパッケージマネージャーを使ってインストールします。

Ubuntu/Debianの場合だと

```shell
# Flatpakをインストール
sudo apt install flatpak
```

---

### 2. Flathubを登録

先述のFlathubを登録してアプリをコマンドラインからインストールできるようにします。

Ubuntu/Debianの場合だと

```shell
# FlatHubを追加
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
```

その他のディストリビューションでのインストール方法は[こちら](https://flatpak.org/setup/)を参考にしてください。

---

### アプリのインストール例

では実際にアプリをインストールしてみましょう。ここでは例としてSpotifyを挙げます。

[Flathub](https://flathub.org/ja)にアクセスして、検索欄に「Spotify」と入力して検索結果からSpotifyをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173746/4500a443-e335-e730-9e5b-84e7f70a4061.png)

上記ページが開くので、画面右上の「インストール」ボタンの隣にあるプルダウンリストを開くと、インストールコマンドと実行コマンドが表示されます。これをコピーして、ターミナルにペースト入力します。

```shell
# Spotifyをインストール
flatpak install flathub com.spotify.Client

# Spotifyを実行
flatpak run com.spotify.Client
```

アプリのインストール後、メニューバーにアイコンが登録されるので、それをクリックしても実行可能です。

基本的にFlathubからアプリを検索すればいいですが、下記のようにコマンドラインから検索すこともできます。

```shell
flatpak search spotify
```

---

## Flathubへのアプリ公開方法

次に、Flathubにアプリを公開する方法について説明します。

[Flathub App Submission](https://docs.flathub.org/docs/for-app-authors/submission/) のガイドラインに従うことで、Flathubにアプリを公開することができます。

手順を見ればわかると思いますが、アプリを公開するにはGithubのアカウントが必須です。

---

### 1. Flathubレポジトリをフォーク
[flathub/flathub](https://github.com/flathub/flathub)をフォークします。

---

### 2. `new-pr`から新しいブランチを作成

`new-pr`という中身が空のブランチがあるので、そこから公開したいアプリ用の新しいブランチを作成します。

---

### 3. Flatpakマニフェストを作成

Flatpakマニフェストはビルド手順が書かれたファイルでこのファイルは必須になります。ファイル形式はYAMLかJsonのどちらかから選べます（YAMLがおすすめです）。

Flathubレポジトリの[Pull Requests](https://github.com/flathub/flathub/pulls)に実際の例がたくさんあるので、参考するといいでしょう。結構クセがあるので、慣れるには時間がかかると思います。

---

### 4. **Flatpakのローカルでのビルド確認**

FlatpakパッケージをビルドするにはFlatpak Builderが必要になります。これはFlatpakでインストール可能です。

```shell
flatpak install -y flathub org.flatpak.Builder
```

FlatpakパッケージをFlatpak Builderでビルドするには下記のようなコマンドを実行すればOKです。
```shell
flatpak run org.flatpak.Builder --force-clean --sandbox --user --install --install-deps-from=flathub --ccache --mirror-screenshots-url=https://dl.flathub.org/media/ --repo=repo builddir <マニフェストファイルのパス>
```

ビルドが成功した場合、ローカルマシンにアプリがインストールされるので、挙動に問題ないかテストしましょう。

---

### 5. **Flathubへのプルリクエスト**
ローカルでのテストに問題がなかったら、PRを出しましょう。

PRがマージされるとアプリが数時間後にFlathubに公開されます。

ここまでの手順ではマニフェストファイルしか言及しませんでしたが、実際には他にも下記のファイルが必要です。詳細は参考ドキュメントを読んでください。

- メタデータファイル（`*.metainfo.xml`）
- デスクトップファイル（`*.desktop`）

---

## 参考ドキュメント

- [Flatpak公式ドキュメント](https://flatpak.org/documentation/)
- [Flathub](https://flathub.org/)
- [Flatpak GitHub](https://github.com/flatpak/flatpak)
- [Flathub App Submission Guide](https://docs.flathub.org/docs/for-app-authors/submission/)

---

## 最後に

Flatpakは、Linux GUIアプリ配布の未来を変えるマジックのようなテクノロジーです。面倒な環境依存から解放され、もっと楽しくアプリを使いましょう！

まだFlatpakを使ったことない人、今すぐ試してみてください！きっと新しい世界が広がると思います😊

**_Happy Flatpaking!_** 🎉🐧