WSL2 環境で Flutter の開発環境を作成する

# Flutterとは
Flutterは、単一のコードで複数のプラットフォーム上で動作可能なアプリケーションが作成可能なオープンソースフレームワークです。執筆時点でiOS・Android・Windows・macOS・Linux・Webのアプリケーションが作成可能です。
->[公式サイト](https://flutter.dev/)

# 環境と前提
 - Windows 11 Pro 23H2
 - WSL2 (Ubuntu 22.04)

本来は[公式のインストール手順](https://docs.flutter.dev/get-started/install/linux/android)に沿って作業をするのが一番ですが、今回は「Windows環境を汚さない」「WSLのコマンドラインで完結する」を目指して手順を再構成しています。
本記事のゴールは「WSL環境で開発したFlutterアプリをAndroidスマホ実機で(デバッグモードで)起動する」ところまでです。
なお、今回はAndroid Studio のエディタおよびAndroid エミュレータの環境構築は対象としません。
また、WSL環境は[この](https://qiita.com/smzn1222/items/31d074be4a258c51d59c)手順に沿って作成したまっさらな状態を前提とします。既存環境でも大きく変わらないと思いますが、環境の状態次第では一部手順が異なる可能性があるのでご注意ください。

# インストール手順
## 1. Ubuntu 前準備
パッケージの最新化と`unzip`のインストール。
```bash:WSL(ubuntu)
$ sudo apt update -q && sudo apt upgrade -yq
$ sudo apt install -yq unzip
```

## 2. JDK インストール
java のバージョンは、後続でインストールする Andoroid SDK が要求するバージョンとそろえる必要がある。今回は java17。
```bash:WSL(ubuntu)
$ sudo apt install openjdk-17-jdk -yq

# パスを環境変数へ追加
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
$ export PATH=$PATH:$JAVA_HOME/bin

# 起動時にパスが通るよう設定
$ echo export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 >> ~/.bashrc
$ echo export PATH=\$PATH:\$JAVA_HOME/bin >> ~/.bashrc

# シェル再起動 (任意)
$ exec $SHELL -l
```
未確認だが、恐らく`java-17-openjdk-amd64`はの名称はバージョンやCPUなどによって異なる。確認してから作業すると良い。

## 3. Android SDK インストール
[Android Studioの ダウンロードページ](https://developer.android.com/studio?hl=ja#downloads)から、Linux コマンドライン用ツールのダウンロードのURLを取得する。
![AndroidSDK1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/ec63599e-51c7-1a39-9472-74693c5c70b0.png)
![AndroidSDK2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/0e92d72d-4613-af9d-b6f9-66ebe3b68e6f.png)

取得したURLを用いて、Android SDK を取得する。ダウンロード先のURLは上記で取得したものに読み替える。
```bash:WSL(ubuntu)
# 展開先のディレクトリ作成
$ mkdir -p ~/Android/SDK/cmdline-tools

# ダウンロード & 解凍
$ wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip?hl=ja -O latest.zip
$ unzip latest.zip
$ mv cmdline-tools ~/Android/SDK/cmdline-tools/latest
$ rm -rf latest.zip

# パスを環境変数へ追加
$ export ANDROID_HOME=$HOME/Android/SDK
$ export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
$ export PATH=$PATH:$ANDROID_HOME/build-tools    # ビルトツールは別途パスへ追加必要

# 起動時にパスが通るよう設定
$ echo export ANDROID_HOME=\$HOME/Android/SDK >> ~/.bashrc
$ echo export PATH=\$PATH:\$ANDROID_HOME/cmdline-tools/latest/bin >> ~/.bashrc
$ echo export PATH=\$PATH:\$ANDROID_HOME/build-tools >> ~/.bashrc

# シェル再起動 (任意)
$ exec $SHELL -l
```

次に Platform Tools をインストールする。開発したアプリをスマホにインストールするのに必要なツール群らしい。
```bash:WSL(ubuntu)
$ sdkmanager --install "platform-tools"

# 同じくパス設定
$ export PATH=$PATH:$ANDROID_HOME/platform-tools
$ echo export PATH=\$PATH:\$ANDROID_HOME/platform-tools >> ~/.bashrc
$ exec $SHELL -l

# adb を実行してインストール確認 (正しくバージョンが表示されれば OK)
$ adb --version
```

最後に、ライセンスを確認し同意しておく。
```bash:WSL(ubuntu)
$ sdkmanager --licenses
```

## 4. Flutter インストール
[公式インストール手順](https://docs.flutter.dev/get-started/install/linux/android?tab=download)から Android SDK のときと同様に URL を取得してダウンロード・インストールする。
![Flutter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/e0a469af-923b-ddcd-15ac-ff5250437da3.png)


```bash:WSL(ubuntu)
$ wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.19.6-stable.tar.xz
$ tar xf flutter_linux_3.19.6-stable.tar.xz
$ rm flutter_linux_3.19.6-stable.tar.xz

# 同じくパス設定
$ export FLUTTER_ROOT=$HOME/flutter
$ export PATH=$PATH:$FLUTTER_ROOT/bin
$ echo export FLUTTER_ROOT=\$HOME/flutter >> ~/.bashrc
$ echo export PATH=\$PATH:\$FLUTTER_ROOT/bin >> ~/.bashrc
$ exec $SHELL -l

# インストール確認 (正しくバージョンが表示されれば OK)
flutter --version
```

Linux 用アプリビルト用ツール群インストール（任意）
```bash:WSL(ubuntu)
$ sudo apt install -yq clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev
```

以上でFlutterのインストールは完了。`flutter doctor`というコマンドを実行することで、インストール状況の診断が可能。

# Flutter プロジェクトの準備とビルド (Web アプリ)
任意の空のディレクトリでvscodeを起動。
```bash:WSL(ubuntu)
$ cd ~
$ mkdir flutter_sample
$ cd flutter_sample
$ code .
```

Flutter の拡張機能をインストール。
![vscode1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/0740f0c2-362f-9d80-ee78-ac555bef1e5f.png)

コマンドパレットから Flutter プロジェクトを作成。
![vscode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/02b74808-078b-b2eb-cc3a-838b2911056a.png)

`Application`を選択。
![vscode3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/aa8b8aeb-1be3-2d6f-c9fc-58ec7ff0c937.png)

プロジェクトを配置する親ディレクトリを設定。
![vscode4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/2b06c63d-0ef4-156c-df63-a72b52ed93ae.png)

プロジェクト名を設定。
![vscode5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/e6ceafde-73cf-ddc5-6d4d-1b4a56033d83.png)

するとプロジェクトのディレクトリをルートとした状態でvscodeが再起動する。<br>
Web Server に設定する。
![vscode6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/c3e6a16c-3daa-ab50-0cef-ef91c3901f21.png)

F5 でデバッグモードで起動。

ビルドが完了すると、デフォルトのブラウザ（Google Chrome推奨）が起動する。以下では Google Chrome の利用を前提とする。

初回起動時には、Dart Debug Extension の拡張機能のインストールを促されるはず。2回目以降はまず真っ白な画面が起動するので、拡張機能から Dart Debug Extension を選択し、「OPEN DEVTOOLS」を押下する。
![chrome1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/2eb817e2-8e6e-df1b-8950-73bd0dc50634.png)
![chrome2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/d057024f-37b2-92a4-f0e3-a44b83d1ef6f.png)

すると、ブラウザ上でアプリケーションが起動する。
![chrome3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/4242f69d-f451-677e-7a41-f57551854954.png)

Flutter はホットリロードに対応しているので、デバッグモードで起動している状態でソースを編集・保存すると、起動中のアプリケーションに即時反映される。

# Android アプリのビルド
ここからはAndroid スマートフォン実機で開発者モード（開発者向けオプション）を用いる。
さらに、同一ネットワーク上に端末が接続されていれば、物理的なケーブル等が不要な「ワイヤレスデバッグ」を利用する。これはAndroid 11 以降でないと利用できないので注意。
10 以前でもUSBケーブルを用いて接続することは可能だが、この方法は「Windows 環境を汚さない」という前提に反するので、ここでは割愛する。
また、詳細な操作方法は各スマートフォンのメーカー・バージョンごとに異なる可能性があるので注意。執筆時点ではXiaomi の Redmi 12 5G 、 Android 14 を用いて検証しており、以降の記述もこちらの操作方法に則る。
## 1. 実機の開発者モードを準備
まず、Android の開発者向けオプションを有効にする。設定から「デバイス情報」を開き、「OS バージョン」を何回か連続でタップすると有効化される。
![android1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/2fed1727-f3cb-e718-64b8-da0def6e894a.png)

次に、設定の「追加設定」->「開発者向けオプション」の「デバッグ」から「USB デバッグ」・「USB 経由でインストール」・「USB デバッグ(セキュリティ設定)」を有効にする。
![android2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/b4e72f34-fde6-8ae6-87ed-7751e0d1daa0.png)

## 2. WSL 環境と実機の接続(ワイヤレスデバッグ)
「開発者向けオプション」の「デバッグ」の「ワイヤレスデバッグ」を開く。
![android3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/39c212c6-54d4-6dd9-115d-4c0c11f94d7f.png)

ワイヤレスデバッグを有効にし、「IP アドレスとポート」に記載のある IP アドレス・ポート番号をメモ。さらに、「ペア設定コードによるデバイスのペア設定」を押下し、ペア設定コード・ IP アドレス・ポート番号もメモする。
![android4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/414f7c50-73c5-582b-2e3e-43179f09a7ba.png)

まず、Android とペアリングする。「ペア設定コードによるデバイスのペア設定」の方でメモしたコード・番号を用いて、下記コマンドを実行。
```bash:WSL(ubuntu)
$ adb pair 192.168.XXX.YYY:AAAAA
Enter pairing code: ZZZZZZ
```
`Successfully paired to ~`と表示されればOK。
ペアリングが完了したら接続するコマンドを実行する。今度は「IP アドレスとポート」の方でメモした番号を用いる。
```bash:WSL(ubuntu)
$ adb connect 192.168.XXX.YYY:BBBBB
```
`connected to ~`と表示されればOK。
`flutter devices` コマンドで接続されているデバイス一覧を見ることが可能。その中に自分のデバイスが表示されていればOK。

## 3. アプリのデバッグ
接続完了後 vscode に戻ると、Android 端末を選択できるようになっているので、同様に F5 で起動する。パッケージのインストールが走るので初回は結構時間がかかる。
![vscode7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/c07e3a0a-8b65-9419-3dba-92519df77723.png)

実機側で下図のように起動すればOK。こちらもホットリロードに対応しているので、変更が即反映される。
![android5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782700/a91536c3-dd0f-f3f8-176b-d478c64e2cf9.png)

# 参考サイト
- [WSL2でFlutter環境をできるだけクリーンに構築する(えみ)](https://qiita.com/suruseas/items/42d5d9c5beffa6ebdd78)
- [WSL 2 の Ubuntu 22.04 で Flutter 3 のクリーンな開発環境を作る](https://mseeeen.msen.jp/wsl-flutter-3-hello-world/)