# 技術スタック (Tech Stack)

## 概要 (Overview)

MiniTIAS は Flutter を用いたモバイルアプリケーションである．撮影の中核（Camera2 / `DngCreator` / 画素統計）を Android ネイティブで実装しているため，当面は **Android 専用** とする．iOS へ展開する場合は撮影パイプラインの再実装が必要になる．

## 試験端末 (Test Device)

| 項目 | 値 |
| --- | --- |
| 端末名 | AQUOS sense3（SH-02M） |
| OS | Android 9 Pie（Android 10 にアップデート可能） |
| インカメラ | 800 万画素 |
| RAM / ROM | 4GB / 64GB |

## フレームワーク・言語 (Framework & Language)

| 要素 | 選定 | 理由 |
| --- | --- | --- |
| フレームワーク | Flutter（最新 stable） | 将来的なクロスプラットフォーム対応のため |
| 言語 | Dart | Flutter の標準言語 |
| 対象 OS | Android | 試験端末が Android のため．初期は Android のみ |
| minSdkVersion | `flutter.minSdkVersion`（`android/app/build.gradle.kts` が参照する Flutter 規定値） | AQUOS sense3（API 28）で動作確認済み |

## 主要パッケージ (Key Packages)

| パッケージ | 用途 | 備考 |
| --- | --- | --- |
| `camera` | インカメラのライブプレビュー | フレーミング用．撮影本体は Camera2 ネイティブ実装 |
| `permission_handler` | カメラ・ストレージの権限管理 | Android の実行時権限リクエスト |
| `provider` | 状態管理 | Flutter 公式推奨．シンプルかつ拡張しやすい |
| `screen_brightness` | 画面の輝度制御 | アタッチメント装着時の明るさ調整に使用 |
| `shared_preferences` | 設定の永続化 | シャッター音 ON/OFF などの保存に使用 |

※ パッケージバージョンは環境構築時に最新 stable を採用し，`pubspec.yaml` で管理する．

### ネイティブ実装（Android / Kotlin）

撮影・画像変換・カメラ診断は Dart パッケージではなく Android ネイティブで実装する（`RawCapturePlugin.kt`，MethodChannel 経由）．

| 処理 | 実装 |
| --- | --- |
| 定量モード撮影（RAW） | Camera2 API フルマニュアル制御 + `DngCreator` で DNG 出力 |
| 画像変換 | YUV→JPEG（プレビュー保存），YUV→非圧縮 PNG（旧通常モード） |
| 画素統計・Hot pixel map | RAW から Kotlin で算出し meta.json に格納 |
| カメラ診断 | `CameraCharacteristics` を読み出して JSON 化 |

> 当初は `image` パッケージで PNG エンコードしていたが，速度の問題からネイティブへ移行した（経緯は [docs/PROGRESS.md](../PROGRESS.md) を参照）．

### 共有ストレージ保存 (Shared Storage)

画像の保存先は `Pictures/MiniTIAS/`（Android 共有ストレージ）とする．DNG をネイティブ側で直接書き込み（`FileOutputStream`），保存後に `MediaScannerConnection.scanFile`（MethodChannel `scanFile`）で MediaStore に登録する方式を採用した．大容量 DNG の MethodChannel 転送を避けるため，ファイル書き込みは Kotlin 側で完結させ，Dart へはパスのみ返す．

### 状態管理 (State Management)

`provider` パッケージを使用する．画面数が少なくシンプルな構成のため，大規模な状態管理ライブラリは導入しない．

### 静的解析 (Static Analysis)

Dart 標準のリンター（`analysis_options.yaml`）を使用する．Flutter プロジェクト作成時に生成されるデフォルト設定をベースとし，プロジェクト固有のルール追加は規約整備フェーズで定義する．

## 役割分担 (Role Distribution)

| 処理 | 実行場所 | 備考 |
| --- | --- | --- |
| 撮影・ライブプレビュー | スマホ（Flutter アプリ） | インカメラ使用 |
| 画像保存（DNG + meta.json + preview.jpg） | スマホ（ネイティブ Camera2） | 共有ストレージに保存 |
| データ転送 | USB 接続（adb pull 推奨） | 大容量 DNG は MTP で不整合リスクあり |
| キャリブレーション | PC | カラーバーを用いた色補正 |
| 色変換・解析 | PC | L\*a\*b\* 変換，色差計算等 |

## 開発環境 (Development Environment)

| 要素 | 選定 | 備考 |
| --- | --- | --- |
| IDE | VS Code | Flutter / Dart 拡張機能を使用 |
| Flutter SDK | 最新 stable | Dart SDK 同梱 |
| Android SDK | Android Studio 経由で導入 | ビルドツール・エミュレータを含む |
| JDK | Flutter 推奨バージョン | Android ビルドに必要 |
| ADB | Android SDK 同梱 | USB 経由の実機デバッグに使用 |
| バージョン管理 | Git + GitHub | `gh` CLI で PR 管理 |
| CI/CD | 初期段階では導入しない | — |

### VS Code 拡張機能 (VS Code Extensions)

| 拡張機能 | 用途 |
| --- | --- |
| Flutter | Flutter 開発統合（ビルド，デバッグ，ホットリロード等） |
| Dart | Dart 言語サポート（補完，解析，フォーマット等） |

### 環境の再現性 (Environment Reproducibility)

別の PC への移行を容易にするため，以下の方針で環境をコード化する．

**リポジトリで Git 管理するもの:**

| ファイル | 役割 |
| --- | --- |
| `pubspec.yaml` | Dart パッケージとバージョンの管理 |
| `.vscode/extensions.json` | 推奨 VS Code 拡張機能の定義 |
| `.vscode/settings.json` | プロジェクト固有の VS Code 設定 |

**SDK のインストール自動化:**

- Windows パッケージマネージャー（Scoop）を使用し，セットアップスクリプトで SDK 類を一括インストールする
- 対象: Flutter SDK，Android Studio，Git，GitHub CLI 等
- スクリプトはリポジトリに含め，`ENV_02_環境構築手順.md` で手順を説明する

**環境セットアップの流れ:**

1. `git clone` でリポジトリを取得
2. セットアップスクリプトを実行（SDK 一括インストール）
3. `flutter doctor` で環境の過不足を確認
4. VS Code が推奨拡張機能のインストールを提案

※ 詳細な環境構築手順は `ENV_02_環境構築手順.md` に記載する．
