0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

モバイルアプリ開発における AI 活用術 - 運用編/改善編

0
Last updated at Posted at 2026-01-18

この記事は「モバイルアプリ開発における AI 活用術」の詳細記事です。

目次


はじめに

リリース後は運用フェーズに入ります。ここでも AI を活用して、継続的な改善を行います。

このフェーズのゴール:

  • Crashlytics によるクラッシュ監視と自動 Issue 化
  • GA 分析による改善提案
  • 学びの蓄積と活用

運用フローの全体像

┌─────────────────────────────────────────────────────────────────────┐
│                          運用フロー                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌──────────────┐     GitHub Actions    ┌──────────────┐            │
│  │  Firebase    │─────────────────────▶ │    GitHub    │            │
│  │  Crashlytics │   (毎日 0:30 JST)   │    Issue     │            │
│  └──────────────┘     閾値フィルタ        └──────┬───────┘           │
│                       優先度自動付与             │                   │
│                                                ▼ @claude            │
│                                         ┌──────────────┐            │
│                                         │   Claude     │            │
│                                         │   分析・修正  │            │
│                                         └──────────────┘            │
│                                                                     │
│  ┌──────────────┐     GitHub Actions    ┌──────────────┐            │
│  │   Google     │─────────────────────▶ │    GitHub    │            │
│  │   Analytics  │   (週1回 月曜 9:00)   │   Issue      │            │
│  └──────────────┘     週次レポート        └──────┬───────┘            │
│                                                │                    │
│                                                ▼ @claude            │
│                                         ┌──────────────┐            │
│                                         │   Claude     │            │
│                                         │   分析・提案  │            │
│                                         └──────────────┘            │
│                                                                     │
│  週次サマリー(月曜 9:00)                                            │
│  ┌──────────────┐                       ┌──────────────┐            │
│  │ Crashlytics  │─────────────────────▶ │  週次サマリー  │            │
│  │   週間集計    │     前週比較           │    Issue     │            │
│  └──────────────┘                       └──────────────┘            │
│                                                                     │
│  学びの自動蓄積                                                      │
│  ┌──────────────┐     GitHub Actions    ┌──────────────┐            │
│  │ クローズ済み  │─────────────────────▶ │   PR 自動    │            │
│  │   Issue      │   (毎週月曜 11:00)    │   作成       │            │
│  └──────────────┘                       └──────┬───────┘            │
│                                                │                    │
│                                                ▼ 人がレビュー         │
│                                         ┌──────────────┐            │
│                                         │ LEARNINGS.md │            │
│                                         │   更新       │            │
│                                         └──────────────┘            │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

スケジュール一覧

ジョブ スケジュール 説明
Crashlytics 日次 毎日 JST 0:30 新規クラッシュの早期発見
GA 週次レポート 月曜 JST 9:00 週間 KPI レポート
Crash 週次サマリー 月曜 JST 9:00 クラッシュ傾向まとめ
Learnings 月曜 JST 11:00 学び分析

なぜ GA は日次ではなく週次?
日次データはノイズが多く、有意な傾向が見えにくいです。週次にすることで:

  • トレンドが明確になる
  • 通知疲れを防げる
  • アクションにつながりやすい

@claude メンションの仕組み(Claude Code Action)

運用フェーズの自動化において重要な役割を果たすのが Claude Code Action です。

Claude Code Action とは

Claude Code Action は、GitHub の Issue や PR で @claude とメンションすることで Claude を呼び出せる GitHub Actions です。

特徴:

  • Issue/PR のコメントで @claude と書くだけで起動
  • リポジトリのコードベースを理解した上で回答
  • コードの分析、修正提案、Issue 化などが可能

なぜ @claude で Claude が起動するのか

┌─────────────────────────────────────────────────────────────────────┐
│                @claude メンションの仕組み                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  1. Issue/PR に @claude メンションを含むコメント                       │
│                    │                                                │
│                    ▼                                                │
│  2. GitHub Webhook がイベントを検知                                    │
│                    │                                                │
│                    ▼                                                │
│  3. Claude Code Action ワークフロー(.github/workflows/claude.yml)    │
│     が起動                                                           │
│                    │                                                │
│                    ▼                                                │
│  4. Claude がリポジトリのコードを読み込み                                │
│                    │                                                │
│                    ▼                                                │
│  5. コメント内容を理解し、分析・回答をコメントとして投稿                     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

認証方式: Claude Code Action では anthropic_api_key(API キー)または claude_code_oauth_token(OAuth トークン)のいずれかを使用できます。OAuth トークンを使用すると、より安全な認証が可能です。

📖 詳細: Claude Code Action 公式リポジトリ


GA 分析 → 週次レポート → Claude 分析

仕組み

毎週月曜(JST 9:00)に GA 週次レポートを GitHub Issue に投稿し、@claude をコメント内に記載することで分析・改善提案までを自動化しています。

スクリーンショット 2026-01-21 12.54.34.png

週次レポート方式

GA レポートは 週ごとの Issue に週次レポートを投稿します。日次ではなく週次にすることで、ノイズを減らしトレンドを見やすくしています。

[GA] 週次レポート 2025-W03
├─ 📊 週間サマリー(1週間分の集計)
├─ 📈 日別トレンド(ミニチャート)
├─ 📱 プラットフォーム別
└─ 🎯 イベント別(変化が大きい順)

レポート内容

セクション 内容
💡 今週のハイライト 30%以上変化した指標を自動検出・強調
📈 日別推移 ミニバーチャートで 1 週間の推移を可視化
KPI サマリー アクティブユーザー、新規ユーザー、セッション、エンゲージメント率(前週比較)
プラットフォーム別 iOS / Android 別の KPI
イベント別 主要イベントの発生回数(変化が大きい順にソート)

レポート出力例

## 📊 GA週次レポート

**期間**: 2025-01-13 〜 2025-01-19(前週: 2025-01-06 〜 2025-01-12)

### 💡 今週のハイライト

- 📈 **アクティブユーザー** が前週比 +35% と大幅増加
- 🎯 イベント「**send_message**」が前週比 +52% と急増

### 📈 日別推移

**アクティブユーザー**: ▁▃▅▇█▇▅ (120〜450)
**セッション**: ▃▅▇█▇▅▃ (200〜680)

### KPIサマリー

| 指標 | 今週 | 前週 | 変化 | トレンド |
| --- | ---: | ---: | ---: | :---: |
| アクティブユーザー | 2,450 | 1,815 | +35% | 📈 |
| 新規ユーザー | 320 | 280 | +14% | ↗️ |
| セッション | 4,200 | 3,800 | +11% | ↗️ |
| エンゲージメント率 | 68.5% | 65.2% | +3.3% | ➖ |

必要な設定

  • Google Analytics Data API の有効化(GCP)
  • サービスアカウントを GA プロパティに 閲覧者 で追加(GA のアクセス管理)
    • GA の権限は IAM ではなく、GA 側のアクセス管理で付与
  • GA_PROPERTY_ID を GitHub Actions Variables に設定
  • ラベルはスクリプトが自動作成(type/ga-report, env/prod

Claude への分析依頼

レポートコメントの末尾に @claude と分析指示を含めることで、レポート投稿と同時に Claude Code Action が起動します。

---

@claude このレポートを分析して以下を教えてください:
1. **注目すべきトレンド**: 数値の変化から読み取れる傾向
2. **ユーザー行動の変化**: イベントデータから推測できること
3. **改善アクション**: 来週に向けて検討すべきこと

スクリーンショット 2026-01-21 12.55.31.png


クラッシュ監視 → 自動 Issue → Claude 分析

仕組み

GitHub Actions で毎日 Crashlytics をチェックし、新しいクラッシュを GitHub Issue として自動作成します。閾値フィルタ優先度自動付与により、ノイズを減らし対応優先度を明確にしています。

スクリーンショット 2026-01-21 12.47.05.png

改善ポイント

機能 説明
🚦 優先度自動計算 影響ユーザー数と発生回数から Critical/High/Medium/Low を自動判定
🔢 閾値フィルタ 指定した閾値未満のクラッシュはスキップ(ノイズ削減)
📋 テーブル形式 Issue ボディを見やすく整形

優先度の自動計算ロジック

スコア = (影響ユーザー数 × 10) + 発生回数

Critical (🔴): スコア >= 100 または ユーザー >= 10
High (🟠):     スコア >= 30 または ユーザー >= 5
Medium (🟡):   スコア >= 10 または ユーザー >= 2
Low (🟢):      それ以外

Crashlytics データの取得方法

Firebase Crashlytics のデータは BigQuery API で取得します。Crashlytics → BigQuery エクスポートを事前に設定しておく必要があります。

┌─────────────────────────────────────────────────────────────────────┐
│              Crashlytics → GitHub Issue 自動作成の流れ               │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  1. GitHub Actions(毎日 0:30 JST)                                 │
│                    │                                                │
│                    ▼                                                │
│  2. scripts/monitoring/crashlytics_daily_issues.js を実行            │
│                    │                                                │
│                    ▼                                                │
│  3. BigQuery API を呼び出し(サービスアカウント認証)                     │
│     - firebase_crashlytics データセットから前日分を取得                 │
│     - 影響ユーザー数、発生回数などを集計                                 │
│                    │                                                │
│                    ▼                                                │
│  4. 閾値フィルタ(MIN_USER_COUNT, MIN_EVENT_COUNT)                    │
│     - 閾値未満のクラッシュはスキップ                                    │
│                    │                                                │
│                    ▼                                                │
│  5. 既存 Issue との重複チェック(Issue ID で判定)                       │
│                    │                                                │
│                    ▼                                                │
│  6. 優先度を自動計算(Critical/High/Medium/Low)                      │
│                    │                                                │
│                    ▼                                                │
│  7. 新規クラッシュを GitHub Issue として作成                            │
│     - 優先度ラベルを自動付与                                           │
│     - Issue 本文に @claude 分析依頼を含める                            │
│     - Claude Code Action が自動で分析を開始                            │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

必要な設定:

  • Firebase サービスアカウント JSON(GitHub Secrets に設定)
  • Crashlytics → BigQuery エクスポート の有効化(Firebase Console)
  • サービスアカウントに BigQuery データ閲覧者 の権限を付与(GCP IAM)
  • 対象アプリの設定(FIREBASE_PROJECT_ID / CRASHLYTICS_APPS_JSON
  • MONITORING_PAT(GitHub PAT、@claude トリガー用)
  • ラベルはスクリプトが自動作成(type/crash, env/prod, priority/*

閾値設定(環境変数):

環境変数 デフォルト 説明
CRASH_MIN_USER_COUNT 1 影響ユーザー数の最小値
CRASH_MIN_EVENT_COUNT 1 発生回数の最小値

ワークフロー

.github/workflows/issue-monitoring.yml
name: Issue Monitoring (Crashlytics/GA)

on:
  schedule:
    # Crashlytics: 毎日 JST 0:30(新規クラッシュの早期発見)
    - cron: '30 15 * * *'
    # GA + Crash Summary: 毎週月曜 JST 9:00(週次レポート)
    - cron: '0 0 * * 1'
    # Learnings: 毎週月曜 JST 11:00(学び分析)
    - cron: '0 2 * * 1'
  workflow_dispatch:
    inputs:
      run_ga:
        description: 'Run GA Weekly Report'
        type: boolean
        default: false
      run_crash:
        description: 'Run Crashlytics Daily Issues'
        type: boolean
        default: false
      run_crash_summary:
        description: 'Run Crashlytics Weekly Summary'
        type: boolean
        default: false
      run_learnings:
        description: 'Run Weekly Learnings Analysis'
        type: boolean
        default: false

env:
  # Crashlytics 閾値設定(ノイズ削減)
  CRASH_MIN_USER_COUNT: '1'
  CRASH_MIN_EVENT_COUNT: '1'

jobs:
  crashlytics:
    name: Crashlytics Daily Issues
    if: |
      (github.event_name == 'workflow_dispatch' && github.event.inputs.run_crash == 'true') ||
      (github.event_name == 'schedule' && github.event.schedule == '30 15 * * *')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - name: Create Crashlytics Issues
        env:
          FIREBASE_SERVICE_ACCOUNT_JSON: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_JSON }}
          GITHUB_TOKEN: ${{ secrets.MONITORING_PAT }}
        run: node scripts/monitoring/crashlytics_daily_issues.js

MONITORING_PAT について: @claude メンションで Claude Code Action をトリガーするには、GITHUB_TOKEN ではなく Personal Access Token(PAT)が必要です。GITHUB_TOKEN はワークフロー内で別のワークフローをトリガーできないためです。

自動作成される Issue の例

# [Crash][Prod] 🟠 NullPointerException at ChatScreen.build

Crashlytics Issue ID: abc123

## 🟠 優先度: High

### 概要

| 項目 | 値 |
| --- | --- |
| プラットフォーム | Android |
| 例外 | `NullPointerException` |
| サブタイトル | ChatScreen.build (line 42) |
| 影響ユーザー数 | **15** |
| 発生回数 | **42** |
| 影響バージョン | 1.2.3 |

### タイムライン

- 初回発生: 2025-01-14 10:23:45
- 最新発生: 2025-01-15 08:15:32
- 対象期間(JST): 2025-01-15

🔗 [Crashlyticsで詳細を確認](https://console.firebase.google.com/...)

Claude への分析依頼(Issue 本文に含める)

Issue 本文の末尾に @claude と分析指示を含めることで、Issue 作成と同時に Claude Code Action が起動します。

---

@claude このクラッシュを分析してください:

**分析手順:**

1. 上記の例外名・サブタイトルからエラーの種類を特定
2. このリポジトリのコードベースを検索して関連箇所を探す
3. 影響ユーザー数と発生回数から優先度を判断

**回答フォーマット:**

- 🔍 原因推測: (エラー内容から考えられる原因)
- 📍 関連コード: (該当しそうなファイル・関数名)
- ⚡ 優先度: High/Medium/Low(理由も添えて)
- 🛠️ 修正方針: (具体的な修正アプローチ)

Issue 本文に @claude を含める理由: Issue 作成後にコメントで @claude を付ける方式だと、2 ステップ必要になります。Issue 本文に最初から含めることで、作成と同時に分析が開始され、運用が効率化されます。

Claude の分析コメント例

## クラッシュ分析

- 🔍 **原因推測**: `ChatScreen.build`内で `messages` リストが null の状態でアクセスされている可能性が高いです。非同期でデータ取得中に build が呼ばれた場合に発生すると推測されます。

- 📍 **関連コード**: `lib/screens/chat_screen.dart:42` 付近の `ListView.builder` での `messages.length` アクセス

-**優先度**: **High** - 15 ユーザーに影響、継続的に発生しており放置すると影響拡大の恐れあり

- 🛠️ **修正方針**:
  1. `messages` が null の場合のガード追加
  2. または `AsyncValue` パターンで loading/error/data を適切にハンドリング
  3. テスト追加: messages が null/empty の場合のテスト

週次クラッシュサマリー

毎週月曜に、1 週間のクラッシュ傾向をまとめた週次サマリーを自動生成します。
スクリーンショット 2026-01-21 12.58.21.png

仕組み

┌─────────────────────────────────────────────────────────────────────┐
│              週次クラッシュサマリーの流れ                               │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  毎週月曜 JST 9:00                                                  │
│                    │                                                │
│                    ▼                                                │
│  crashlytics_weekly_summary.js 実行                                 │
│  (過去1週間のクラッシュデータを BigQuery から集計)                      │
│                    │                                                │
│                    ▼                                                │
│  週次サマリー Issue を作成                                             │
│  - 今週 vs 前週の比較                                                │
│  - プラットフォーム別統計                                              │
│  - Top クラッシュ一覧                                                │
│  - GitHub Issue 対応状況                                            │
│                    │                                                │
│                    ▼                                                │
│  @claude が分析・改善提案                                             │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

サマリー内容

セクション 内容
💡 今週のハイライト クラッシュ傾向(増減)、解決状況
📊 統計サマリー ユニーク Issue 数、総発生回数、影響ユーザー(前週比較)
📱 プラットフォーム別 iOS / Android 別の統計
🔝 Top クラッシュ 影響ユーザー数順の Top 5
📋 GitHub Issue 状況 今週解決済み / 現在オープン

サマリー出力例

## 🔥 クラッシュ週次サマリー

**期間**: 2025-01-13 〜 2025-01-19

### 💡 今週のハイライト

- 📉 影響ユーザー数が前週比で減少しました
- ✅ 今週 **3件** のクラッシュIssueを解決しました
- ⏳ 現在 **5件** のクラッシュIssueが未対応です

### 📊 統計サマリー

| 指標 | 今週 | 前週 | 変化 | トレンド |
| --- | ---: | ---: | ---: | :---: |
| ユニーク Issue | 8 | 12 | -4 (-33%) | 📉 |
| 総発生回数 | 156 | 245 | -89 (-36%) | 📉 |
| 影響ユーザー | 42 | 68 | -26 (-38%) | 📉 |

### 🔝 Top クラッシュ(影響ユーザー数順)

#### iOS

| # | Issue | ユーザー | 発生回数 |
| --- | --- | ---: | ---: |
| 1 | `NullPointerException at ChatScreen...` | 15 | 42 |
| 2 | `IndexOutOfBoundsException in List...` | 8 | 23 |

学びの蓄積(LEARNINGS.md)

運用で得た学びを LEARNINGS.md に蓄積します。週次で自動更新 PR が作成される仕組みを導入しています。

自動更新の仕組み

スクリプトで Issue を作成し、@claude に分析と PR 作成を任せるシンプルな設計です。

┌─────────────────────────────────────────────────────────────────────┐
│              LEARNINGS.md 週次自動更新フロー                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  毎週月曜 JST 11:00 (cron)                                           │
│                    │                                                │
│                    ▼                                                │
│  learnings_weekly_analysis.js 実行                                   │
│  (過去1週間のクローズ済み type/crash Issue を検索)                      │
│                    │                                                │
│                    ▼                                                │
│  「学びまとめ Issue」を自動作成                                         │
│  (@claude メンション + 指示を含む)                                    │
│                    │                                                │
│                    ▼                                                │
│  Claude Code Action が起動                                           │
│                    │                                                │
│                    ▼                                                │
│  Claude が Issue を分析 → LEARNINGS.md 更新 PR を作成                  │
│                    │                                                │
│                    ▼ 人がレビュー                                     │
│  マージ → 学びが蓄積される                                              │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

ポイント: 正規表現でコメントを解析するのではなく、Claude に自然な分析を任せることで、より柔軟で質の高い学びを抽出できます。

ワークフロー設定

issue-monitoring.yml に週次ジョブを追加しています:

.github/workflows/issue-monitoring.yml
learnings:
  name: Weekly Learnings Issue
  if: |
    (github.event_name == 'workflow_dispatch' && github.event.inputs.run_learnings == 'true') ||
    (github.event_name == 'schedule' && github.event.schedule == '0 2 * * 1')
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: '20'
    - name: Create Learnings Issue
      env:
        GITHUB_TOKEN: ${{ secrets.MONITORING_PAT }}
      run: node scripts/monitoring/learnings_weekly_analysis.js

自動作成される Issue の例

## 週次学び分析依頼

2025-W03 にクローズされた Crash Issue から学びを抽出し、
LEARNINGS.md を更新してください。

### 対象 Issue(2 件)

- #42: [Crash][Prod] 🟠 NullPointerException at ChatScreen.build
- #58: [Crash][Prod] 🟡 IndexOutOfBoundsException in ListView

---

@claude 上記の Issue を分析して、LEARNINGS.md を更新する PR を作成してください。

自動生成される LEARNINGS.md のセクション例

### 2025-W03 (自動生成)

- **[#42](https://github.com/.../issues/42)**: NullPointerException at ChatScreen.build

  - 原因: 非同期処理完了前に build が呼ばれて null アクセス
  - 対策: AsyncValue パターンで loading/error/data を適切にハンドリング

- **[#58](https://github.com/.../issues/58)**: IndexOutOfBoundsException in ListView
  - 原因: リストの長さチェックが不十分
  - 対策: itemCount と実データの整合性チェックを追加

LEARNINGS.md の構成例

LEARNINGS.md
# 学びの蓄積

## クラッシュから学んだこと

### 2025-01: Null安全でない箇所でクラッシュ多発
- **問題**: 非同期処理完了前に build が呼ばれて NullPointerException
- **対策**: Lint ルール追加、AsyncValue パターンの徹底
- **Issue**: #42

### 2025-01: 非同期処理のエラーハンドリング不足
- **問題**: API エラー時にユーザーへのフィードバックがない
- **対策**: try-catch 必須化、エラー表示コンポーネント共通化
- **Issue**: #58

## GA分析から学んだこと

### チュートリアル完了率
- 3ステップ以内が最適(それ以上は離脱率上昇)
- スキップボタンは必須

### 継続率との相関
- 初回チャット完了率が Day7 継続率に強く相関
- オンボーディングで最初のチャットまで誘導すべき

## レビューで指摘されがちなこと

### Riverpod の dispose 忘れ
- **対策**: テンプレートに dispose 処理を追加

### コメント不足
- **対策**: 複雑なロジックには必須化(レビューチェックリストに追加)

CLAUDE.md への反映

学びは CLAUDE.md に反映し、AI の品質向上に活かします。

CLAUDE.md(追記部分)
## Development Guidelines から学んだこと

### 非同期処理
- AsyncValue パターンを使用すること
- null チェックを徹底すること

### エラーハンドリング
- try-catch は必須
- ユーザーへのフィードバックを忘れずに

👤 人の判断ポイント

# 判断内容 タイミング
1 クラッシュ対応方法の選択 Issue 作成後(優先度ラベルを参考に)
2 改善施策をやるかどうか GA 週次レポート確認後(月曜)
3 学びの PR をマージするか 週次 PR 作成後(月曜)

対応方法の選択肢

クラッシュ対応:

  • 🔴 Critical → 即時対応
  • 🟠 High → 今週中に対応
  • 🟡 Medium → 次スプリントで検討
  • 🟢 Low → Backlog へ
  • @claude に修正を依頼

改善施策:

  • 実施する → 企画フェーズへループ
  • 保留 → Backlog へ
  • 却下 → 理由を記録

運用 → 企画へのループ

運用で得た学びやデータは、次の機能開発(企画フェーズ)にフィードバックします。

運用
 │
 ├─ クラッシュ分析 → バグ修正(優先度に応じて)
 │
 ├─ GA週次分析 → 改善施策立案
 │
 ├─ 週次サマリー → 傾向把握・リソース配分
 │
 └─ 学びの蓄積 → CLAUDE.md 更新
          │
          ▼
       企画(次の機能開発)

まとめ

運用フェーズでも AI と自動化を活用することで:

  1. クラッシュの早期発見・分析: 自動 Issue 化 + 優先度自動付与 + Claude 分析
  2. 週次での傾向把握: GA 週次レポート + クラッシュ週次サマリー
  3. データドリブンな改善: 週次レポート + Claude 提案
  4. 知識の蓄積: LEARNINGS.md → CLAUDE.md

監視頻度の最適化

  • 日次: クラッシュ検出(早期発見が重要)
  • 週次: GA レポート + クラッシュサマリー(トレンド把握)

日次データはノイズが多いため、週次でまとめて確認する方が有意義です。ただしクラッシュは早期発見が重要なため日次で検出しています。

これにより、継続的な品質向上と効率的な運用が実現できます。


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?