sony/flutter-embedded-linux を使ってみた Raspberry Pi 4 (arm64) 編

あらすじ

github.com

上記のリポジトリRaspberry Pi 4 (aarch64) 向けにビルドして、DRMで実行します。 flutter-embedded-linuxlibflutter_engine.so を使いますが、プラットフォーム毎にビルドしないといけません。ただし、いまのところ Raspberry Pi 4 本体ではビルドできなさそうだったので、linux-x64 をホストにしてクロスビルドします。

Raspberry pi (セットアップ~ engine バージョン取得)

libflutter_engine.so を作成するために一旦flutterをインストールして、その中の engine.version ファイルの中身を取得します。

セットアップ

  • SDカードにイメージを焼いておく。今回使用したイメージは ubuntu-20.04.2-preinstalled-server-arm64+raspi.img です。

  • SDカードをRaspberry PI に挿して起動するとログインを求められます。 ubuntu / ubuntu でログイン可能です。

  • パッケージをアップデートして、必要なパッケージをインストールします。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y unzip
$ sudo apt install -y clang cmake build-essential pkg-config libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev
  • flutter をセットアップして engine.version を表示します。
$ git clone https://github.com/flutter/flutter
$ sudo mv flutter /opt/
$ export PATH=$PATH:/opt/flutter/bin
$ flutter config --enable-linux-desktop
$ flutter doctor
$ cat /opt/flutter/bin/internal/engine.version

ここで取得できるバージョンを .gclient で使用します。 2021年5月22日 17:00 現在、 3fa3eb3a60e0dd741da98fe117977e7e2059042f でした。

ホスト(セットアップ~libflutter_engine.so作成)

今のところ、Raspberry PI では libflutter_engine.so を作成できない(やり方がわからない)ので、linux-x64ベースのホストPCで作成します。今回はバーチャルマシンにubuntu-20.04をインストールしてその中で作成します。今回使用した ubuntu のイメージは ubuntu-20.04.2.0-desktop-amd64.iso です。

  • パッケージをアップデートして、必要なパッケージをインストールします。
$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt install -y git curl vim virtualenv python2
$ sudo apt install -y clang cmake build-essential pkg-config libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev
  • .glient を作成します。 engine.version のバージョンを url に指定します。
solutions = [
  {
    "managed": False,
    "name": "src/flutter",
    "url": "https://github.com/flutter/engine.git@3fa3eb3a60e0dd741da98fe117977e7e2059042f",
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]
  • libflutter_engine.so を作成します。途中の ./flutter/tools/gnGOMA usage was specified but can't be found, falling back to local builds. Set the GOMA_DIR environment variable to fix GOMA. とか出るけど、無視して進めます。
$ gclient sync
$ cd src
$ ./flutter/tools/gn --target-os linux --linux-cpu arm64 --runtime-mode release --embedder-for-target --disable-desktop-embeddings
$ ninja -C out/linux_release_arm64

ssh の設定 と libflutter_engine.so の転送

Raspberry PI

ssh サーバーをインストールします。

$ sudo apt -y install ssh
$ sudo systemctl start ssh
$ ip addr

ホスト

libflutter_engine.so を転送します

$ scp ~/src/out/linux_release_arm64/libflutter_engine.so ubuntu@<raspberry_ipのIPアドレス>:/home/ubuntu/

flutter-embedded-linux をビルド (DRM編)

$ cd
$ sudo apt install libdrm-dev libgbm-dev libinput-dev libudev-dev libsystemd-dev 
$ git clone https://github.com/sony/flutter-embedded-linux
$ cd flutter-embedded-linux
$ mkdir build
$ cd build
$ cmake -DUSER_PROJECT_PATH=examples/flutter-drm-gbm-backend ..
$ cp ~/libflutter_engine.so .
$ cmake --build .

flutter-drm-gbm-backend の実行

flutter サンプルアプリを作成

$ sudo apt -y install ninja-build libgtk-3-dev
$ flutter create sample
$ cd sample/
$ flutter build linux
$ cd ..

ubuntu 20.04 server は DRM がデフォルトで機能していないようです。 /boot/firmware/usercfg.txt に以下の行を追記します。

dtoverlay=vc4-fkms-v3d

そのあといったん再起動した後、以下のコマンドを実行します。

$ cd flutter-embedded-linux/build
$ sudo LD_LIBRARY_PATH=. ./flutter-drm-gbm-backend --bundle=./sample/build/linux/arm64/release/bundle/

これで、画面上いっぱいに flutter アプリが表示されたはずです。

以上!

参考資料

RaspberryPi3B+にUbuntu 20.04 LTS (Server)の64bit版をインストール - Qiita

Bug #1896164 “Raspberry Pi 4 GPU is disabled by default - no KMS...” : Bugs : linux-firmware-raspi2 package : Ubuntu