# バッチ設計書 45-build-android-rootfs.sh

## 概要

本ドキュメントは、Android用rootfs構築スクリプト（build-android-rootfs.sh）の設計仕様を記載したものです。このスクリプトは、.NETランタイムをAndroidプラットフォーム向けにクロスコンパイルするために必要なツールチェーンとsysrootを構築します。

### 本バッチの処理概要

このバッチは、Android NDK（Native Development Kit）をダウンロードし、Termuxリポジトリから追加の依存パッケージを取得して、Androidプラットフォーム向けのクロスコンパイル環境を自動的に構築します。

**業務上の目的・背景**：.NETはAndroidプラットフォームでも動作するランタイムを提供しています。Androidアプリケーションに.NETを組み込むためには、Android固有のツールチェーンとライブラリを使用してネイティブコードをビルドする必要があります。このスクリプトにより、開発者やCI/CDシステムは一貫した方法でAndroid向けのビルド環境を構築できます。

**バッチの実行タイミング**：Android向けの.NETランタイムをビルドする前に実行されます。CI/CDパイプラインの初期段階、またはローカル開発環境の構築時に手動で実行されます。

**主要な処理内容**：
1. コマンドライン引数の解析（アーキテクチャ、APIレベル、NDKバージョン）
2. Android NDKのダウンロードと展開
3. LLDBのダウンロードと展開
4. Termuxリポジトリから依存パッケージ（libicu、openssl、krb5等）のダウンロード
5. パッケージをNDKのsysrootにコピー
6. プラットフォーム情報ファイル（android_platform）の生成

**前後の処理との関連**：構築されたツールチェーンは.NETのビルドスクリプト（build.sh）でROOTFS_DIRとして使用されます。

**影響範囲**：.tools/android-rootfs/ディレクトリにNDKとsysrootが構築されます。数GBのディスク容量を使用します。

## バッチ種別

クロスコンパイル環境構築 / Android NDKセットアップ

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（Android向けビルド環境が必要な場合） |
| 実行時刻 | 手動実行またはCI/CDパイプライン内 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行 / CI/CDパイプライン |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| wgetコマンド | NDKおよびパッケージダウンロード用 |
| unzipコマンド | zipファイル展開用 |
| dpkgコマンド | Termuxパッケージ（.deb）展開用 |
| インターネット接続 | dl.google.com、packages.termux.devへのアクセス |
| 十分なディスク容量 | NDK展開に数GB必要 |

### 実行可否判定

- サポートされていないアーキテクチャが指定された場合は警告を出力（ただしエラー終了はしない）
- 既にNDKがインストール済みの場合はダウンロードをスキップ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| BuildArch | string | No | arm64 | ターゲットアーキテクチャ（arm64, arm） |
| ApiLevel | number | No | 28 | AndroidのAPIレベル |
| --ndk | string | No | r21 | Android NDKのバージョン |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Android NDK | ZIP | https://dl.google.com/android/repository/ |
| LLDB | ZIP | https://dl.google.com/android/repository/ |
| Termuxパッケージ | .deb | https://packages.termux.dev/termux-main-21/ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| .tools/android-rootfs/android-ndk-{version} | ディレクトリ | Android NDK |
| .tools/android-rootfs/lldb | ディレクトリ | LLDBデバッガ |
| android_platform | テキスト | RID情報ファイル |
| 標準出力 | テキスト | 進捗メッセージとビルドコマンド例 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | android_platform |
| 出力先 | $__ToolchainDir/$__SysRoot/ |
| 文字コード | UTF-8 |
| 内容形式 | RID=android.{ApiLevel}-{arch} |

## 処理フロー

### 処理シーケンス

```
1. コマンドライン引数の解析
   └─ アーキテクチャ、APIレベル、NDKバージョンを解析
2. 環境変数の確認
   └─ TOOLCHAIN_DIR、NDK_DIRのカスタム設定確認
3. NDKのダウンロード（未インストールの場合）
   └─ dl.google.comからzipをダウンロード・展開
4. LLDBのダウンロード（未インストールの場合）
   └─ dl.google.comからzipをダウンロード・展開
5. Termuxパッケージのダウンロード
   └─ libicu, libandroid-glob, liblzma, krb5, opensslを取得
6. パッケージの展開とコピー
   └─ dpkg -xで展開、NDKのsysrootにコピー
7. プラットフォームファイルの生成
   └─ android_platformにRIDを書き込み
8. ビルドコマンドの表示
   └─ build.shの実行例を出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[引数解析]
    B --> C[設定情報表示]
    C --> D{NDK存在?}
    D -->|なし| E[NDKダウンロード・展開]
    D -->|あり| F{LLDB存在?}
    E --> F
    F -->|なし| G[LLDBダウンロード・展開]
    F -->|あり| H[Termuxパッケージ取得]
    G --> H
    H --> I[パッケージ展開・コピー]
    I --> J[android_platform生成]
    J --> K[ビルドコマンド表示]
    K --> L[正常終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | - | - | このバッチはデータベース操作を行いません |

### テーブル別操作詳細

このバッチはデータベース操作を行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非0 | ダウンロードエラー | NDK/パッケージのダウンロード失敗 | ネットワーク接続を確認し再実行 |
| 非0 | 展開エラー | unzip/dpkgの失敗 | ディスク容量を確認し再実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

1. エラーメッセージを確認
2. ディスク容量を確認（NDKは数GB必要）
3. ネットワーク接続を確認
4. .tools/android-rootfsディレクトリを削除して再実行

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | NDK 1件 + パッケージ数件 |
| 目標処理時間 | 数分〜十数分（ネットワーク速度に依存） |
| メモリ使用量上限 | 特になし |
| ディスク使用量 | 数GB（NDK展開後） |

## 排他制御

同一の出力ディレクトリに対して同時実行しないでください。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 情報ログ | 開始時 | APIレベル、アーキテクチャ、NDKバージョン、パス情報 |
| 進捗ログ | ダウンロード時 | "Downloading the NDK into..." / "Downloading LLDB into..." |
| 進捗ログ | パッケージ取得時 | "Download dependencies..." / "Working on: {path}" |
| 情報ログ | 終了時 | ビルドコマンド例 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDパイプラインの失敗通知 |

## 備考

- サポートされるアーキテクチャ：
  - arm64: aarch64-linux-android
  - arm: arm-linux-androideabi
- デフォルトAPIレベル28は、glob(3)をサポートする最小バージョン（arm64の最小は21だが、glob対応は28から）
- NDKバージョン: r21またはr22は旧フォルダ構造、それ以降は新フォルダ構造を使用
- Termuxパッケージを使用して以下の依存関係を取得：
  - libicu: 国際化ライブラリ
  - libandroid-glob: glob関数の実装
  - liblzma: LZMA圧縮ライブラリ
  - krb5: Kerberos認証
  - openssl: 暗号化ライブラリ
- 環境変数でカスタマイズ可能：
  - TOOLCHAIN_DIR: ツールチェーンの出力先
  - NDK_DIR: 既存のNDKインストール場所
- スクリプト終了時にビルドコマンド例が表示されます
