Ubuntu20.04でGTK/GDK と Flutter Engine を自前でビルドして使用する方法

# はじめに

Flutterアプリケーションのデバッグ時にGTK/GDK と Flutter Engine を自前でビルドしてログを取ってみようという話になり、試していたところ色々と詰まったので備忘録として手順を残しておきます。

# 前提条件

* OS: Ubuntu20.04
* CPU: Intel Core-i7 13700
* depot toolがインストール済みであること
    * インストールしていない場合は[こちら](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up)の手順に従ってインストールしてください

# 手順

## 1. GTK/GDKのビルド

以下のコマンドでGTKのビルドに必要な依存関係をインストールします

```
sudo apt update
sudo apt install -y build-essential meson ninja-build libglib2.0-dev libcairo2-dev libpango1.0-dev libgdk-pixbuf2.0-dev libatk1.0-dev libepoxy-dev libx11-dev libxi-dev libxext-dev libxrandr-dev libxcursor-dev libxdamage-dev libxcomposite-dev libxinerama-dev libxfixes-dev libwayland-dev libxkbcommon-dev wayland-protocols libdbus-1-dev libgirepository1.0-dev libegl1-mesa-dev libfontconfig1-dev libfreetype6-dev libharfbuzz-dev libfribidi-dev libxrender-dev libx11-xcb-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libxkbcommon-x11-dev libgtk-3-dev gtk-doc-tools gobject-introspection
```

以下のコマンドでインストールされているGTKのバージョンを確認します([参考](https://askubuntu.com/questions/78377/is-there-a-way-to-know-which-gtk-version-is-installed-using-the-command-line))。

```
dpkg -l "*gtk-3.0*" | grep ii
```

実行すると以下のような出力が得られ、下記の場合だとバージョンは3.24.20であることがわかります。

```
ii  gir1.2-gtk-3.0:amd64 3.24.20-0ubuntu1.2 amd64        GTK graphical user interface library -- gir bindings
ii  libgtk-3-0:amd64     3.24.20-0ubuntu1.2 amd64        GTK graphical user interface library
ii  libgtk-3-bin         3.24.20-0ubuntu1.2 amd64        programs for the GTK graphical user interface library
ii  libgtk-3-common      3.24.20-0ubuntu1.2 all          common files for the GTK graphical user interface library
ii  libgtk-3-dev:amd64   3.24.20-0ubuntu1.2 amd64        development files for the GTK library
```

以下のコマンドでGTKをcloneし、GTKのバージョンを確認して得られたバージョンにcheckoutします

```
git clone https://github.com/GNOME/gtk
cd gtk
git checkout 3.24.20
```

以下のコマンドでGTKをビルドします。
<ユーザー名>の部分は適宜書き換えてください。

```
meson setup build
cd build
meson setup --prefix=/home/<ユーザー名>/.local --buildtype=debug --reconfigure
ninja install
```

## 2. Flutter Engineのビルド

以下のコマンドでFlutter Engineのビルドに必要な依存関係をインストールします。

```
sudo apt update
sudo apt install -y curl unzip clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev xz-utils libasound2-dev libpulse-dev libudev-dev libglu1-mesa-dev mesa-common-dev
sudo apt-get install --reinstall libxxf86vm-dev
```

以下のコマンドで現在使用しているFlutterのバージョンを確認します。

```
flutter --version
```

実行すると以下のような出力が得られ、下記の場合だとバージョンは3.24.1であることがわかります。

```
Flutter 3.24.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 5874a72aa4 (4 weeks ago) • 2024-08-20 16:46:00 -0500
Engine • revision c9b9d5780d
Tools • Dart 3.5.1 • DevTools 2.37.2
```

以下のコマンドで作業用ディレクトリを作成しその中に入ります。
```
mkdir ~/flutter-engine && cd ~/flutter-engine
```

`.gclient`を以下のように手動で作成します。

```
nano .gclient
```

```py
solutions = [
  {
    "name": "src/flutter",
    "url": "https://github.com/flutter/engine.git",
    "deps_file": "DEPS",
    "managed": False,
    "custom_deps": {},
  },
]
```

以下のコマンドでFlutter Engineのソースコードをfetchします。
「3.24.1」の部分は適宜現在使用しているFlutterのバージョンに変えてください。

```
gclient sync --revision src/flutter@3.24.1
```

以下のコマンドで`PKG_CONFIG_PATH`を設定し先にビルドしたGTK/GDKを参照できるようにします。
<ユーザー名>の部分は適宜書き換えてください。

```
export PKG_CONFIG_PATH=/home/<ユーザー名>/.local/lib/x86_64-linux-gnu/pkgconfig:/lib/x86_64-linux-gnu/pkgconfig
```

以下のコマンドでビルドします。

```
cd ~/flutter-engine/src
./flutter/tools/gn --unoptimized --no-goma --target-sysroot=/
ninja -C out/host_debug_unopt
```

## 3.デバッグ対象のFlutterアプリケーションの起動

デバッグ対象のFlutterアプリケーションのディレクトリに移動したあと以下のコマンドを実行します。

```
LD_LIBRARY_PATH=/home/<ユーザー名>/.local/lib/x86_64-linux-gnu flutter run --local-engine-src-path ~/flutter-engine/src/ --local-engine host_debug_unopt --local-engine-host host_debug_unopt -v
```

# 教訓

Chat GPT Plusは課金しておくと幸せになれる。