Flutterアプリ開発の自動化（ビルド@コンテナ、エミュレータ@ホスト） 1. ホスト準備

## 全体の方針
### やりたいこと
* **スマホアプリ開発を効率的にしたい** → Flutter を採用
* **商用利用も無料で行いたい** → Android Studio は使わず CLI ベースに
* **ホスト環境を汚したくない・開発メンバーで開発環境を統一したい** → コンテナ（Docker / Podman）を利用

### 方針
* **ホストには必要最低限のものだけをインストール**
* **Flutter SDK + Android SDK** を含んだ**コンテナ**を用意し、

### 環境
* macOS Sequoia ver. 15.4.1

![スクリーンショット 2025-06-21 1.14.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982238/bdb2bbeb-47d4-41bf-b515-b761d891f66c.png)


---

## 1. ホスト準備の手順
### Java JDK 21 のインストール

```bash
  echo "📦 Downloading OpenJDK 21 (Adoptium) for $PLATFORM..."

  JDK_URL="https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.1%2B12/OpenJDK21U-jdk_x64_mac_hotspot_21.0.1_12.tar.gz"
  
  TEMP_DIR=$(mktemp -d)
  ARCHIVE_PATH="$TEMP_DIR/jdk21.tar.gz"

  curl -L -o "$ARCHIVE_PATH" "$JDK_URL"
  tar -xzf "$ARCHIVE_PATH" -C "$TEMP_DIR"
  JDK_DIR=$(find "$TEMP_DIR" -type d -name "jdk-21*" | head -n 1)

  mkdir -p "$HOME/java"
  mv "$JDK_DIR" "$HOME/java/"
  echo "✅ JDK installed to $HOME/java/"
```

* Android SDK の CLI には Java が必要。
* 今回は、JDK 21 を Adoptium からダウンロード・展開。

### Java の存在確認と PATH 設定

```bash
JAVA_DIR=$(find "$HOME/java" -type d -name "jdk-21*" 2>/dev/null | head -n 1)
JAVA_HOME="$JAVA_DIR/Contents/Home"
export JAVA_HOME
export PATH="$JAVA_HOME/bin:$PATH"

# Java 実行可能ファイルが存在しない場合はダウンロードして再設定
if [[ ! -x "$JAVA_HOME/bin/java" ]]; then
  install_openjdk_21
  JAVA_DIR=$(find "$HOME/java" -type d -name "jdk-21*" | head -n 1)
  JAVA_HOME="$JAVA_DIR/Contents/Home"
  export JAVA_HOME
  export PATH="$JAVA_HOME/bin:$PATH"
fi
```

* `JAVA_HOME` と `PATH` を動的に設定することで `sdkmanager` や `emulator` の利用を可能に。

### Android SDK の CLI ツール確認と導入

```bash
SDK_DIR="$ANDROID_SDK_ROOT"
CMDLINE_TOOLS_DIR="$SDK_DIR/cmdline-tools/latest"
export PATH="$JAVA_HOME/bin:$CMDLINE_TOOLS_DIR/bin:$SDK_DIR/platform-tools:$PATH"

# sdkmanager が無い場合は cmdline-tools をダウンロード
if [[ ! -x "$CMDLINE_TOOLS_DIR/bin/sdkmanager" ]]; then
  mkdir -p "$SDK_DIR/cmdline-tools"
  cd "$SDK_DIR/cmdline-tools"
  
  PLATFORM_TAG="mac"
  
  curl -L -o cmdline-tools.zip "https://dl.google.com/android/repository/commandlinetools-${PLATFORM_TAG}-11076708_latest.zip"
  unzip -q cmdline-tools.zip && rm cmdline-tools.zip
  mv cmdline-tools latest
  cd -
fi
```

* Android SDK の `cmdline-tools` ディレクトリの存在確認。
* 無ければ Google 公式から zip をダウンロードし、自動展開。
* 環境変数 `PATH` に必要な bin を追加。

:::note info
**Android SDK（Software Development Kit）**
- Googleが提供するAndroidアプリ開発用のツール群セット。FlutterがAndroidアプリとしてビルド・実行するために必要。
- FlutterはAndroid Studioなしでも動作するが、その場合でもAndroid SDKのCLIツールがないとビルド・テスト・デプロイができない。

[*Android SDK Overview*](https://developer.android.com/studio?hl=ja)
:::

### sdkmanager によるライセンス承諾と必要モジュールのインストール

```bash
yes | sdkmanager --licenses

sdkmanager \
  "platform-tools" \
  "emulator" \
  "platforms;android-33" \
  "system-images;android-33;google_apis;x86_64"

echo "✅ Initialization complete."
```

* Android SDK の CLI 利用にはライセンス承諾が必須 → `yes |` で自動化。
* Flutter のビルド・テスト・実機実行に必要な構成（emulator、platform-tools、system-images など）を一括導入。

:::note info
**sdkmanager（Android SDK Package Manager）**
- Android SDKに含まれるCLIツール。SDKの構成要素（emulatorやplatform-toolsなど）を管理・導入するためのユーティリティ。
- GUIなしでSDKを管理するにはこのツールが必須。Flutterのflutter doctorでもsdkmanagerの存在確認が行われる。

[*sdkmanager documentation*](https://developer.android.com/tools/sdkmanager?hl=ja)
:::

### adb の存在確認とホストへの導入

```bash
if ! command -v adb &> /dev/null; then
  echo "❌ adb not found on host. Installing platform-tools (adb)..."

  UNZIP_DIR="$HOME/android-sdk-host"

  HOST_PLATFORM="darwin"

  mkdir -p "$UNZIP_DIR"
  PLATFORM_TOOLS_ZIP="platform-tools-latest-${HOST_PLATFORM}.zip"
  DOWNLOAD_URL="https://dl.google.com/android/repository/${PLATFORM_TOOLS_ZIP}"

  echo "📦 Downloading platform-tools for $HOST_PLATFORM from $DOWNLOAD_URL..."
  curl -L -o "$UNZIP_DIR/$PLATFORM_TOOLS_ZIP" "$DOWNLOAD_URL"

  echo "📦 Extracting platform-tools..."
  unzip -qo "$UNZIP_DIR/$PLATFORM_TOOLS_ZIP" -d "$UNZIP_DIR"

  echo "✅ platform-tools extracted to $UNZIP_DIR/platform-tools"
  echo "👉 Add the following to your shell profile to use adb:"
  echo "   export PATH=\"$UNZIP_DIR/platform-tools:\$PATH\""

  export PATH="$UNZIP_DIR/platform-tools:$PATH"

  echo "📢 Current adb version:"
  adb version

else
  echo "✅ adb found: $(which adb)"
  adb version
fi
```

* Flutter から実機やエミュレータへアクセスするには `adb` が必要。
* `adb` がホストに無い場合、Google 公式から `platform-tools` をダウンロードして導入。
* 自動的に `PATH` を通し、その場で `adb version` を確認できるようにします。

:::note info
**adb（Android Debug Bridge）**
- Android実機やエミュレータと接続して、アプリのインストール、ログ確認、デバッグ操作などを行うCLIツール。
- Flutterの`flutter run`や`flutter install`は内部的にadbを使ってデバイスにアクセス。adbがないとFlutter開発が実機やエミュレータで進められない。

[*adb documentation*](https://developer.android.com/tools/adb?hl=ja)
:::

---
## 次回予定
2. Flutterアプリをビルドするコンテナの構築