FlutterでLinuxアプリをビルドする。
2021/06/15,
Flutterに興味があります。
今年の3月にiOS, Androidアプリを作成するフレームワークFlutterがバージョン2となりました。 FlutterのサポートがAndroid、iOSだけでなく、Webもサポート対象となり、Flutterを利用できるシーンが増えてきています。さらにWindows,Mac,Linuxのデスクトップアプリもベータサポートとなっています。
私は普段使いのOSがLinuxなので、マルチプラットフォーム対応のプログラミング言語がでてくるのは歓迎です。
今回はFlutterでLinuxアプリを作成できる環境を構築してみます。
行なっていることは公式ドキュメントのGet the Flutter SDKとBuild and release a Linux app to the Snap Storeやっているだけです。
Flutterの環境構築
flutterのSDKはsnapパッケージとして提供されています。
$ sudo snap install flutter --classicビルドに必要なライブラリをインストールします。
$ sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-devFlutterのLinuxデスクトップサポートを有効にする
FlutterのLinuxデスクトップサポートを有効にします。
$ flutter config --enable-linux-desktopデバイス一覧にlinuxの項目が追加されます。
$ flutter devices
2 connected devices:
Linux (desktop) • linux • linux-x64 • Linux
Chrome (web) • chrome • web-javascript • Google Chrome 91.0.4472.101Linux対応プロジェクトを作成する
Flutterのプロジェクト作成時、--platformを指定することで対象とするプラットフォームを指定できます。
$ flutter create --platforms=linux super-cool-appsuper-cool-appはプロジェクト名です。名前はご自由に。同名のディレクトリにFlutterのコードが生成されます
プロジェクトにLinux対応を追加する
もし既存プロジェクトに開発対象のプラットフォームを追加する場合、既存プロジェクトのディレクトリを指定します。
$ flutter create --platforms=linux .※上記はFlutterプロジェクトにいる時のコマンドです。
起動する
プロジェクトが作成できたので実行してましょう。
起動時にデバイスのオプションをlinuxと指定するとLinuxアプリケーションとして起動できます。
$ flutter run -d linuxビルドする
ビルド時にプラットフォームを指定することでlinuxデスクトップアプリが作成できます。
$ flutter build linux --releaseビルドの成果物がbuild/linux/x64/release/bundle/に出力されます。もしソフトウェアを配布する場合、bundleフォルダに存在するファイルをすべて含めてください。
snapでパッケージング
Linuxでソフトウェアの配布形式はsnap, deb, rpm, pacman, AppImageなど多岐に渡ります。
FlutterのLinuxサポーターはUbuntuを開発しているCanonicalです。Canonicalがsnapを開発しているためか、Flutterのパッケージング方法はsnapが推されています。
よってsnap形式のパッケージを作成します。
必要ソフトのインストール
snapパッケージを作成するために必要なツールをインストールします。
$ sudo snap install snapcraft --classic
$ sudo snap install multipass --classicsnapcraftがパッケージングソフトです。multipassはCUIベースの仮想マシン管理ソフトです。
snapcraftはパッケージ作成時に仮想環境を作成します。ビルド環境を隔離することで環境に依存しないパッケージを作成します。そのため仮想マシン管理ソフトのmultipassが必要になるのです。
snapcraft.yamlを作成
snapパッケージの設定ファイルsnap/snapcraft.yamlを作成します。
name: super-cool-app
version: 0.1.0
summary: Super Cool App
description: Super Cool App that does everything!
confinement: strict
base: core18
grade: stable
apps:
super-cool-app:
command: super_cool_app
extensions: [flutter-master] # Where "master" defines which Flutter channel to use for the build
plugs:
- network
parts:
super-cool-app:
source: .
plugin: flutter
flutter-target: lib/main.dart # The main entry-point file of the applicationsnapパッケージを作成します。プロジェクトディレクトリで以下のコマンドを実行してください。
$ snapcraftsnapパッケージの作成にはかなり時間がかかりますのでゆっくり待ちましょう
作成に成功するとsuper-cool-app_0.1.0_amd64.snapパッケージがプロジェクト直下に生成されます。
インストールする場合以下のコマンドでインストールできます。snapstore以外からインストールするので--dangerousオプションが必要です。
$sudo snap install ./super-cool-app_0.1.0_amd64.snap --dangerous ビルドが失敗する場合、buildディレクトリを削除するなどしてください。
$ rm -rf build
$ snapcraft clean
$ snapcraftsnapの作成については以下の記事が詳しく書かれています。
Linuxビルドしてみてわかったこと
Ubuntu 20.04で簡単に開発してみました。
ウィンドウバーが点滅する
$ flutter run -d linux上記コマンドでビルドすることなく実行すると、ウィンドウのメニューバーが点滅したり、表示が消えてしまったりしてしまいました。
$ flutter build linux 上記コマンドでビルドしたものはウィンドウのメニューバーに関する問題は確認できませんでした。
開発するときは気になりますが、ビルドしてしまえば問題ありません。
Snapパッケージの日本語入力の問題
Linuxのデスクトップサーバーの実装としてX11とWaylandがあります。X11は以前から使われておりますが設計が古くなっているので、新実装のWaylandに各ディストリビューションは移行しつつあります。
私の利用しているディストリビューションはUbuntu 20.04です。ログイン時にX11とWaylandを切り替えることができます。使用IMEはiBusです。
snapパッケージを作成しインストールすると、X11セッションでは日本語を入力できました。しかしWaylandセッションでは日本語を入力できませんでした。
Flutterの問題というよりもsnapの問題だと思うのですが、現状Wayland環境でsnapアプリの日本語入力は難しそうです。
まとめ
- FlutterでLinuxアプリケーションを作成できる
- snapパッケージで配布する場合、日本語入力が問題になりそう。
ここまで読んで頂きありがとうございました。

