Open4

WSL2上にFlutter開発専用の環境を構築する

angeartangeart

環境

windows
Windows 11 Home 10.0.22000
wsl2
Distributor ID: Ubuntu
Description:    Ubuntu 20.04
Release:        20.04
Codename:       focal

前準備

後々Snapを利用してFlutter SDKをインストールするのだが、場合によっては環境自体が壊れることがあるので先にSnapを正常に動かせるようにしておく

bash
sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

snap version

https://github.com/microsoft/WSL/issues/5126#issuecomment-653715201

この際aptを使うと、/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic linkと怒られるので以下の方法で対処しておく

  1. /etc/wsl.confに以下を追記
wsl.conf
[automount]
ldconfig = false
  1. 以下を叩く
bash
sudo mkdir /usr/lib/wsl/lib2
sudo ln -s /usr/lib/wsl/lib/* /usr/lib/wsl/lib2

sudo sed -i -e 's|^/usr/lib/wsl/lib|/usr/lib/wsl/lib2|' /etc/ld.so.conf.d/ld.wsl.conf

手順

  1. https://cloud-images.ubuntu.com/focal/current/ から focal-server-cloudimg-amd64-wsl.rootfs.tar.gz をWindows上の好きな箇所にダウンロード
  2. powershellを開いて以下のようにimportする
powershell
wsl --import flutter-dev <wsl環境を作成する場所> <rootfsファイル> --version 2
  1. 仮想環境起動
powershell
wsl -d flutter-env
  1. ユーザー作成
bash
useradd -m -s $(which bash) <username>
passwd <username>
usermod -G sudo <username>
cat << EOF > /etc/wsl.conf
[user]
default=<username>
EOF
  1. 一旦WSLから抜けて再起動
bash
exit
powershell
wsl -t flutter-env
wsl -d flutter-env
angeartangeart

WSLからエミュレーターを取り扱いたいのでAndroid SDKを導入する

  1. CommandLineToolsのダウンロード
    https://developer.android.com/studio#command-tools からWindows上にダウンロード
  2. AndroidSDKのインストールに必要な最低限のツールを入れる
bash
sudo apt install -y lib32z1 default-jdk git unzip zip
  1. AndroidSDKを入れる
bash
cd $(mktemp -d)
unzip <ダウンロードしたCommandLintTools>
mkdir -p ~/sdk/android/cmdline-tools
mv cmdline-tools tools
mv tools ~/sdk/android/cmdline-tools
  1. .bashrcに以下を追記
.bashrc
# Android
export ANDROID_SDK_ROOT=$HOME/sdk/android
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools:$PATH
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/lib:$PATH
export PATH=$ANDROID_SDK_ROOT/platform-tools:$PATH
export PATH=$ANDROID_SDK_ROOT/emulator:$PATH

# Java
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
  1. sdkmanagerからSDKをインストール
bash
cd ~
source .bashrc
sdkmanager --version
# 2021/01現在は6になる
sdkmanager --list
# 2021/01現在では32まで使えるが31を選択する
# build-toolsはhttps://developer.android.com/studio/releases/build-tools?hl=ja参照
sdkmanager --install "system-images;android-31;google_apis;x86_64" "platform-tools" "platforms;android-31" "build-tools;30.0.2"
sdkmanager --install "cmdline-tools;latest"
sdkmanager --update
sdkmanager --list | sed -e '/^$/q'
# ライセンス規約をいろいろ問われるので答える
sdkmanager --licenses
  1. 何故かplatform-toolsが重複しているので後から入ったほうを採用する
bash
rm -rf ./sdk/android/platform-tools
mv ./sdk/android/platform-tools-2/ ./sdk/android/platform-tools/
angeartangeart

Flutter SDKを入れる

bash
sudo snap install flutter --classic
flutter --version # 初回のインストールが走る
flutter config --android-sdk $ANDROID_SDK_ROOT

ここでsnapがエラーを吐く時は、再度前述のとおりsnapdを起動させると良い

angeartangeart

エミュレーターを入れる

bash
cd ~
curl -s "https://get.sdkman.io" | bash
source .sdkman/bin/sdkman-init.sh
sdk v # 5.13.1
sdk install gradle 7.3.3
gradle -v
echo "no" | avdmanager --verbose create avd --force --name "generic_11" --package "system-images;android-31;google_apis;x86_64" --tag "google_apis" --abi "x86_64"

~/.android/avd/generic_11.avd/config.iniの以下の項目を変更

config.ini
skin.name=1080x1920
hw.lcd.density=480
hw.keyboard=yes

エミュレーターが作成されていることを確認する

bash
emulator -list-avds