キオスク端末の開発で、Raspberry Pi 4にElectronを載せて「メモリ不足」でクラッシュさせた経験はないだろうか?あるいは、PythonのTkinterで「Windows 95のようなUI」しか作れず絶望したことは?私はある。だからこそ断言する。組み込みLinuxにおけるGUIの正解は、もはやFlutter一択だ。本記事では、X11やWaylandといった重いウィンドウシステムをバイパスし、Direct Rendering Manager (DRM) を叩いて60FPSを叩き出す「本番運用レベル」の実装方法を共有する。
なぜデスクトップLinux版ではなく「Embedder」なのか
通常の flutter run -d linux は、GTKウィンドウ内で動作する。これは開発には便利だが、リソースが限られたRaspberry Piでのキオスク運用には無駄が多すぎる。デスクトップ環境(GNOMEやPixel)自体のオーバーヘッドがあるからだ。
我々が目指すのは、OS起動直後にアプリだけが立ち上がる「ベアメタルに近い」構成だ。そこで採用するのが flutter-pi という軽量Embedderだ。これはLinuxのDRM/KMSサブシステムを直接使用し、GPUアクセラレーションをフルに活用する。
Linuxカーネルが提供する、画面描画を直接制御する仕組み。X11サーバーやWaylandコンポジタを経由しないため、レイテンシが極小になり、メモリ消費も劇的に削減できる。
実装:Raspberry Pi Lite OSからFlutterを起動する
前提として、GUIのない「Raspberry Pi OS Lite (64-bit)」を使用する。デスクトップ版は不要だ。メモリを食うだけだ。
1. 開発環境(ホストPC)のセットアップ
Raspberry Pi上でビルドするのは時間がかかりすぎる。ホストPC(Mac/Linux)でクロスコンパイルし、生成物を転送するフローを構築する。
# flutter-pi専用のツールをインストール(Dart製)
dart pub global activate flutter_pi_tool
# パスを通す(~/.bashrc等に追記)
export PATH="$PATH":"$HOME/.pub-cache/bin"
2. ビルド設定の修正
CPUアーキテクチャを指定してビルドする。通常の flutter build linux ではなく、以下を使用する。
# ARM64向けにリリースビルド(デバッグモードは遅いので注意)
flutter-pi-tool build --arch=arm64 --cpu=pi4 --release
# ビルド成果物は build/flutter_pi/release/ に生成される
3. Raspberry Pi側のセットアップ
Pi側にはランタイムエンジンのみをインストールする。以下のコマンドはPiのターミナルで実行する。
# 依存関係のインストール
sudo apt update && sudo apt install -y \
libgl1-mesa-dri \
libgles2-mesa \
libdrm2 \
libgbm1 \
fonts-noto \
libinput-bin
# flutter-pi(エンジン)のインストール
# ※最新版はGitHubのReleaseページからdebパッケージを落とすのが確実だが、
# ここでは簡易的にビルド済みの取得例を示す
wget https://github.com/ardera/flutter-pi/releases/latest/download/flutter-pi_release_arm64.deb
sudo dpkg -i flutter-pi_release_arm64.deb
4. デプロイと実行
ホストPCからPiへ、ビルドしたアセットを転送する。
# ホストPCにて実行
scp -r build/flutter_pi/release/* pi@:/home/pi/my_kiosk_app/
そして、Pi側で実行する。
# Raspberry Piにて実行(DRMモード)
flutter-pi --release /home/pi/my_kiosk_app/
本番運用:完全無人化(Kiosk Mode)の設定
電源を入れたら勝手にアプリが立ち上がり、再起動しても復帰する。これがkioskの要件だ。systemdサービスを作成して制御する。
/etc/systemd/system/kiosk.service を作成する。
[Unit]
Description=Flutter Kiosk Service
After=network.target systemd-user-sessions.service plymouth-quit-wait.service
Requires=network.target
[Service]
Type=simple
User=pi
Group=pi
# カーソルを消す場合は -c オプションを追加していたが最新版ではconfigで制御推奨
ExecStart=/usr/bin/flutter-pi --release /home/pi/my_kiosk_app/
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
サービスを有効化する。
sudo systemctl enable kiosk.service
sudo systemctl start kiosk.service
パフォーマンス比較:Raspberry Pi 4 (2GB)
| フレームワーク | アイドル時RAM | 起動時間 | FPS (アニメーション) |
|---|---|---|---|
| Flutter (flutter-pi) | ~65 MB | ~2秒 | 58-60 FPS |
| Electron | ~450 MB | ~12秒 | 25-40 FPS |
| Python (Tkinter) | ~40 MB | ~1秒 | N/A (描画不可) |
結論
Raspberry Piを用いた組み込み開発において、Electronは「甘え」であり、Qtは「高コスト(学習・ライセンス的意味で)」だ。Flutterと軽量Embedderの組み合わせは、Web開発のスピード感でネイティブ並みのパフォーマンスを実現できる唯一の解だ。
もし画面が回転して表示される場合は、/boot/config.txt の dtoverlay=vc4-kms-v3d を確認し、Flutter側ではなくディスプレイ設定側で回転させるのが定石だ。ハードウェアの制約に悩まされる時間は終わりだ。今すぐそのPiを再利用可能な高性能端末に変えよう。
Post a Comment