このディレクトリには、タスク管理アプリのAndroid向けネイティブモバイルアプリケーション(Kotlin + Jetpack Compose)が含まれています。
Kotlin と Jetpack Compose を使用したネイティブAndroidアプリです。
機能は ui/ フォルダのWebアプリと同じです:
- タスク一覧の表示と管理
- タスクの作成・編集・削除
- 認証機能(ログイン・登録)
- Supabase バックエンドとの連携
- 言語: Kotlin
- UIフレームワーク: Jetpack Compose
- アーキテクチャ: MVVM + Repository パターン
- 依存性注入: Hilt
- ネットワーク: Supabase Kotlin SDK + Ktor
- 非同期処理: Kotlin Coroutines + Flow
- ナビゲーション: Navigation Compose
- Android Studio Hedgehog (2023.1.1) 以上
- JDK 17 以上
- Android SDK (API Level 24-34)
- Kotlin 1.9.20 以上
Supabase の設定が必要です。以下の方法で環境変数を設定してください:
android/local.properties ファイルに以下を追加:
SUPABASE_URL=your-supabase-url
SUPABASE_ANON_KEY=your-supabase-anon-key以下の環境変数を設定:
export SUPABASE_URL="your-supabase-url"
export SUPABASE_ANON_KEY="your-supabase-anon-key"- Android Studio を起動
- "Open" を選択
android/ディレクトリを選択
Android Studio が自動的に Gradle Sync を開始します。 初回は依存関係のダウンロードに時間がかかります。
上記の「環境変数」セクションを参照して、Supabase の設定を行ってください。
- Android Studio の "Device Manager" を開く
- "Create Device" をクリック
- 任意のデバイスを選択(推奨: Pixel 6, API 34)
- エミュレーターを起動
- 設定 アプリを開く
- デバイス情報 または 端末情報 を選択
- ビルド番号 を7回連続でタップ
- 「デベロッパーになりました」というメッセージが表示される
- 設定 > システム > 開発者向けオプション を開く
- USB デバッグ をオンにする
- 確認ダイアログで OK をタップ
- USB ケーブルでAndroidデバイスをコンピューターに接続
- デバイスに「USB デバッグを許可しますか?」というダイアログが表示される
- このコンピューターを常に許可する にチェックを入れて OK をタップ
コマンドラインで以下を実行して、デバイスが認識されているか確認:
adb devices以下のように表示されれば成功:
List of devices attached
ABC123456789 device
注意:
- デバイスが表示されない場合は、USB ケーブルを変更するか、USBモードを「ファイル転送」に変更してみてください
- Windows の場合、デバイスのUSBドライバーのインストールが必要な場合があります
Android Studio の "Run" ボタン(
./gradlew installDebug実機でアプリをテストすることで、実際のユーザー体験を確認できます。
Android Studio で実行する際:
- ツールバーのデバイス選択ドロップダウンをクリック
- 接続されている実機を選択(エミュレーターと実機が両方表示されます)
- "Run" ボタンをクリック
# 接続されているデバイスを確認
adb devices
# デバッグ版をインストール
./gradlew installDebug
# 特定のデバイスにインストール(複数接続時)
adb -s DEVICE_ID install app/build/outputs/apk/debug/app-debug.apkAndroid Studio の Logcat タブで、実機からのログをリアルタイムで確認できます:
- Logcat タブを開く
- デバイスを選択
- フィルターを設定(例:
tag:TaskManagementやpackage:com.tryjunie.tasks)
コマンドラインから:
# すべてのログを表示
adb logcat
# アプリのログのみ表示
adb logcat | grep "com.tryjunie.tasks"
# クラッシュレポートを確認
adb logcat | grep "AndroidRuntime"USB ケーブルなしでデバッグできます:
- デバイスで 設定 > 開発者向けオプション > ワイヤレス デバッグ をオンにする
- ペア設定コードによるデバイスのペア設定 をタップ
- コンピューターで以下を実行:
adb pair IP_ADDRESS:PORT
# 表示されたペアリングコードを入力
adb connect IP_ADDRESS:PORTこれで、USB ケーブルなしでデバッグできます。
実機でのパフォーマンスを確認:
Android Studio の Profiler を使用:
- View > Tool Windows > Profiler
- 実機を選択
- Memory をクリックしてメモリ使用量を監視
Supabase への通信を確認:
- Profiler > Network タブ
- API 呼び出しの時間とデータサイズを確認
- Profiler > CPU タブ
- UI のレンダリングやバックグラウンド処理の負荷を確認
実機でテストすることで、以下のような問題を発見できます:
- ネットワーク接続: Wi-Fi やモバイルデータでの動作
- バッテリー消費: バックグラウンドでの電力使用
- 画面サイズ: 様々な解像度での表示
- OS バージョン: 古いバージョンでの互換性
- パフォーマンス: 低スペックデバイスでの動作
可能であれば、以下のような異なる特性のデバイスでテストすることを推奨します:
- 低スペック端末: メモリやCPUが限られたデバイス
- 高解像度端末: 大画面や高DPIディスプレイ
- 古いOS: サポート対象の最小APIレベル(API 24)
- メーカー別: Samsung、Xiaomi、OPPOなど、カスタムUIを持つデバイス
Google の Firebase Test Lab を使用すると、クラウド上の実機で自動テストができます:
- Firebase Console でプロジェクトを作成
- APK をアップロード
- テスト対象のデバイスとOS バージョンを選択
- テストを実行
android/
├── app/
│ ├── src/
│ │ └── main/
│ │ ├── java/com/tryjunie/tasks/
│ │ │ ├── MainActivity.kt # メインアクティビティ
│ │ │ ├── TaskManagementApplication.kt # Application クラス
│ │ │ ├── data/ # データ層
│ │ │ │ ├── AuthRepository.kt # 認証リポジトリ
│ │ │ │ └── TaskRepository.kt # タスクリポジトリ
│ │ │ ├── di/ # 依存性注入
│ │ │ │ └── AppModule.kt # Hilt モジュール
│ │ │ ├── domain/ # ドメイン層
│ │ │ │ ├── Task.kt # タスクモデル
│ │ │ │ └── User.kt # ユーザーモデル
│ │ │ └── ui/ # UI 層
│ │ │ ├── TaskManagementApp.kt # アプリナビゲーション
│ │ │ ├── screens/ # 画面
│ │ │ │ ├── LoginScreen.kt # ログイン画面
│ │ │ │ └── TaskListScreen.kt # タスク一覧画面
│ │ │ ├── theme/ # テーマ
│ │ │ │ ├── Color.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ └── Type.kt
│ │ │ └── viewmodels/ # ViewModel
│ │ │ ├── AuthViewModel.kt
│ │ │ └── TaskListViewModel.kt
│ │ ├── res/ # リソース
│ │ │ └── values/
│ │ │ ├── strings.xml # 文字列リソース
│ │ │ ├── colors.xml # 色リソース
│ │ │ └── themes.xml # テーマ
│ │ └── AndroidManifest.xml # マニフェスト
│ ├── build.gradle.kts # アプリレベル Gradle
│ └── proguard-rules.pro # ProGuard ルール
├── build.gradle.kts # プロジェクトレベル Gradle
├── settings.gradle.kts # Gradle 設定
├── gradle.properties # Gradle プロパティ
└── README.md # このファイル
# Debug ビルド
./gradlew assembleDebug
# Release ビルド
./gradlew assembleRelease# ユニットテストを実行
./gradlew test
# インストルメンテッドテストを実行
./gradlew connectedAndroidTest./gradlew clean- Kotlin ファイルを編集
- Android Studio が自動的にビルド
- "Run" で実行して変更を確認
Compose の @Preview アノテーションを使用して、Android Studio 内でUIをプレビューできます:
@Preview
@Composable
fun TaskItemPreview() {
TaskManagementTheme {
TaskItem(...)
}
}問題: Gradle Sync が失敗する 解決策:
- Android Studio を最新版に更新
- JDK 17 が正しくインストールされているか確認
./gradlew cleanを実行してキャッシュをクリア
問題: Supabase の設定エラー 解決策:
local.propertiesまたは環境変数が正しく設定されているか確認- ビルドを再実行(
./gradlew --refresh-dependencies)
問題: アプリがクラッシュする 解決策:
- Logcat を確認してエラーメッセージを確認
- Supabase の URL と Key が正しいか確認
- ネットワーク接続を確認
問題: タスクが表示されない 解決策:
- Supabase でデータが正しく保存されているか確認
- 認証が成功しているか確認
- Logcat でネットワークエラーを確認
- タスクの編集機能
- タスクのドラッグ&ドロップ並び替え
- カテゴリ管理
- タスクタイマー機能
- インテグレーションキー管理
- ダークモード対応の改善
- オフライン対応(Room DB)
リリース版のアプリを作成する前に、以下が必要です:
- キーストアファイル: アプリに署名するための証明書
- Google Play Console アカウント: Google Play にアプリを公開する場合
- アプリアイコン: 適切なサイズのランチャーアイコン
- プライバシーポリシー: Google Play で必須
初回のみ、キーストアを作成する必要があります:
- Build > Generate Signed Bundle / APK を選択
- Android App Bundle または APK を選択し、Next
- Create new... をクリック
- 以下の情報を入力:
- Key store path: キーストアの保存場所(例:
~/keystores/tryjunie-release.jks) - Password: 安全なパスワード(必ず記録してください)
- Alias: キーのエイリアス(例:
tryjunie-key) - Key password: キーのパスワード
- Validity (years): 25年以上を推奨
- Certificate: 組織情報(最低限、名前を入力)
- Key store path: キーストアの保存場所(例:
- OK をクリックしてキーストアを作成
keytool -genkey -v -keystore ~/keystores/tryjunie-release.jks \
-alias tryjunie-key -keyalg RSA -keysize 2048 -validity 10000重要: キーストアファイルとパスワードは絶対に失わないでください。これらがないとアプリの更新ができなくなります。
android/app/build.gradle.kts に署名設定を追加(または keystore.properties ファイルを作成):
android/keystore.properties ファイルを作成:
storePassword=your-store-password
keyPassword=your-key-password
keyAlias=tryjunie-key
storeFile=/path/to/tryjunie-release.jks.gitignore に keystore.properties を追加して、Git にコミットしないようにします。
環境変数を設定:
export KEYSTORE_PASSWORD=your-store-password
export KEY_PASSWORD=your-key-password
export KEY_ALIAS=tryjunie-key
export KEYSTORE_FILE=/path/to/tryjunie-release.jksGoogle Play に公開する場合は AAB 形式が推奨されます:
./gradlew bundleRelease生成されたファイル: app/build/outputs/bundle/release/app-release.aab
直接配布する場合や、Google Play 以外のストアに公開する場合:
./gradlew assembleRelease生成されたファイル: app/build/outputs/apk/release/app-release.apk
- Build > Generate Signed Bundle / APK
- Android App Bundle を選択し、Next
- キーストア情報を入力
- release ビルドバリアントを選択
- Finish をクリック
リリースビルドを実機でテストします:
# APK をインストール
adb install app/build/outputs/apk/release/app-release.apk
# または bundletool を使用して AAB をテスト
bundletool build-apks --bundle=app/build/outputs/bundle/release/app-release.aab \
--output=app.apks --ks=/path/to/keystore.jks \
--ks-key-alias=tryjunie-key
bundletool install-apks --apks=app.apks- Google Play Console にアクセス
- 新しいアプリを作成
- 以下の情報を入力:
- アプリ名
- デフォルト言語
- アプリの種類(アプリまたはゲーム)
- 無料/有料
以下の情報が必要です:
- アプリアイコン: 512 x 512 px(PNG)
- スクリーンショット:
- 携帯電話: 最低2枚(最大8枚)
- 7インチタブレット(オプション)
- 10インチタブレット(オプション)
- 短い説明: 80文字以内
- 詳しい説明: 4000文字以内
- カテゴリ: アプリのカテゴリを選択
- 連絡先情報: メールアドレス
- プライバシーポリシー: URL(必須)
アプリのコンテンツに関する質問票に回答し、レーティングを取得します。
- 対象年齢層を設定
- 広告の有無を申告
- データの取り扱いに関する情報を提供
- 製品版 > リリース > 新しいリリースを作成 を選択
- AAB ファイルをアップロード
- リリースノートを入力(各言語)
- 審査に送信 をクリック
審査には通常1~3日かかります。
新しいバージョンをリリースする際は、app/build.gradle.kts を更新:
defaultConfig {
versionCode = 2 // 前回より大きい整数
versionName = "1.1.0" // セマンティックバージョニング
}Google Play では、リリースを段階的に公開できます:
- 初期公開率を設定(例: 5%、10%、20%)
- クラッシュレートやユーザーフィードバックを監視
- 問題がなければ段階的に公開率を上げる
- 最終的に100%に到達
- キーストアファイルを安全に保管
- ProGuard/R8 で難読化を有効化(本番用)
- デバッグログを無効化
- すべてのテストが通過
- 実機で動作確認
- スクリーンショットを準備
- プライバシーポリシーを準備
- リリースノートを作成
- バージョンコードを更新
問題: 「キーストアが見つかりません」エラー
解決策: keystore.properties のパスが正しいか確認。絶対パスを使用することを推奨。
問題: Google Play で「重複する APK」エラー
解決策: versionCode を前のバージョンより大きい値に更新。
問題: アプリがリリースビルドでクラッシュする
解決策: ProGuard ルールを確認。必要なクラスが難読化されていないか確認(proguard-rules.pro)。
このプロジェクトはプライベートであり、特定のライセンスの下で配布されていません。