Agent Skills by ALSEL
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 0品質スコア 50/100

android-native-dev

Android ネイティブアプリの開発および UI デザインに関するガイドです。Material Design 3、Kotlin/Compose による開発、プロジェクト設定、アクセシビリティ、ビルドのトラブルシューティングを網羅しています。Android ネイティブアプリ開発を始める前に必ず参照してください。

description の原文を見る

Android native application development and UI design guide. Covers Material Design 3, Kotlin/Compose development, project configuration, accessibility, and build troubleshooting. Read this before Android native application development.

SKILL.md 本文

1. プロジェクト シナリオ評価

開発を開始する前に、現在のプロジェクト状態を評価します:

シナリオ特徴アプローチ
空のディレクトリファイルがない完全な初期化が必要です。Gradle Wrapper を含む
Gradle Wrapper ありgradlewgradle/wrapper/ が存在./gradlew を直接ビルドに使用
Android Studio プロジェクト完全なプロジェクト構造、ラッパーがない場合ありラッパーを確認し、必要に応じて gradle wrapper を実行
不完全なプロジェクト部分的なファイルがある欠落したファイルを確認し、設定を完了

主な原則

  • ビジネスロジックを書く前に、./gradlew assembleDebug が成功することを確認する
  • gradle.properties がない場合は、まずそれを作成し AndroidX を設定する

1.1 必須ファイル チェックリスト

MyApp/
├── gradle.properties          # AndroidX と他の設定を設定
├── settings.gradle.kts
├── build.gradle.kts           # ルートレベル
├── gradle/wrapper/
│   └── gradle-wrapper.properties
├── app/
│   ├── build.gradle.kts       # モジュールレベル
│   └── src/main/
│       ├── AndroidManifest.xml
│       ├── java/com/example/myapp/
│       │   └── MainActivity.kt
│       └── res/
│           ├── values/
│           │   ├── strings.xml
│           │   ├── colors.xml
│           │   └── themes.xml
│           └── mipmap-*/       # アプリアイコン

2. プロジェクト設定

2.1 gradle.properties

# 必須設定
android.useAndroidX=true
android.enableJetifier=true

# ビルド最適化
org.gradle.parallel=true
kotlin.code.style=official

# JVM メモリ設定 (プロジェクトサイズに基づいて調整)
# 小規模プロジェクト: 2048m、中規模: 4096m、大規模: 8192m以上
# org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8

注意: ビルド中に OutOfMemoryError が発生した場合は、-Xmx の値を増やしてください。依存関係が多い大規模プロジェクトでは、8GB 以上が必要な場合があります。

2.2 依存関係の宣言基準

dependencies {
    // BOM を使用して Compose バージョンを管理
    implementation(platform("androidx.compose:compose-bom:2024.02.00"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.material3:material3")
    
    // Activity & ViewModel
    implementation("androidx.activity:activity-compose:1.8.2")
    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")
}

2.3 ビルド バリアント & プロダクト フレーバー

プロダクト フレーバーを使用すると、アプリの異なるバージョン (無料版/有料版、開発環境/ステージング環境/本番環境など) を作成できます。

app/build.gradle.kts での設定

android {
    // フレーバー次元を定義
    flavorDimensions += "environment"
    
    productFlavors {
        create("dev") {
            dimension = "environment"
            applicationIdSuffix = ".dev"
            versionNameSuffix = "-dev"
            
            // フレーバーごとに異なる設定値
            buildConfigField("String", "API_BASE_URL", "\"https://dev-api.example.com\"")
            buildConfigField("Boolean", "ENABLE_LOGGING", "true")
            
            // 異なるリソース
            resValue("string", "app_name", "MyApp Dev")
        }
        
        create("staging") {
            dimension = "environment"
            applicationIdSuffix = ".staging"
            versionNameSuffix = "-staging"
            
            buildConfigField("String", "API_BASE_URL", "\"https://staging-api.example.com\"")
            buildConfigField("Boolean", "ENABLE_LOGGING", "true")
            resValue("string", "app_name", "MyApp Staging")
        }
        
        create("prod") {
            dimension = "environment"
            // 本番環境はサフィックスなし
            
            buildConfigField("String", "API_BASE_URL", "\"https://api.example.com\"")
            buildConfigField("Boolean", "ENABLE_LOGGING", "false")
            resValue("string", "app_name", "MyApp")
        }
    }
    
    buildTypes {
        debug {
            isDebuggable = true
            isMinifyEnabled = false
        }
        release {
            isDebuggable = false
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

ビルド バリアント命名: {flavor}{BuildType} → 例:devDebug, prodRelease

Gradle ビルド コマンド

# 利用可能なビルド バリアントをすべて一覧表示
./gradlew tasks --group="build"

# 特定のバリアント (フレーバー + ビルドタイプ) をビルド
./gradlew assembleDevDebug        # Dev フレーバー、Debug ビルド
./gradlew assembleStagingDebug    # Staging フレーバー、Debug ビルド
./gradlew assembleProdRelease     # Prod フレーバー、Release ビルド

# 特定のフレーバーのすべてのバリアントをビルド
./gradlew assembleDev             # すべての Dev バリアント (debug + release)
./gradlew assembleProd            # すべての Prod バリアント

# 特定のビルドタイプのすべてのバリアントをビルド
./gradlew assembleDebug           # すべてのフレーバー、Debug ビルド
./gradlew assembleRelease         # すべてのフレーバー、Release ビルド

# 特定のバリアントをデバイスにインストール
./gradlew installDevDebug
./gradlew installProdRelease

# ビルドとインストールを 1 つのコマンドで実行
./gradlew installDevDebug && adb shell am start -n com.example.myapp.dev/.MainActivity

コードから BuildConfig にアクセス

注意: AGP 8.0 以降、BuildConfig はデフォルトで生成されなくなりました。build.gradle.kts で明示的に有効にする必要があります:

android {
    buildFeatures {
        buildConfig = true
    }
}
// コードでビルド設定値を使用
val apiUrl = BuildConfig.API_BASE_URL
val isLoggingEnabled = BuildConfig.ENABLE_LOGGING

if (BuildConfig.DEBUG) {
    // デバッグのみのコード
}

フレーバー固有のソース セット

app/src/
├── main/           # すべてのフレーバー向けの共有コード
├── dev/            # Dev のみのコードとリソース
│   ├── java/
│   └── res/
├── staging/        # Staging のみのコードとリソース
├── prod/           # Prod のみのコードとリソース
├── debug/          # Debug ビルドタイプのコード
└── release/        # Release ビルドタイプのコード

複数のフレーバー次元 (例:環境 + ティア):

android {
    flavorDimensions += listOf("environment", "tier")
    
    productFlavors {
        create("dev") { dimension = "environment" }
        create("prod") { dimension = "environment" }
        
        create("free") { dimension = "tier" }
        create("paid") { dimension = "tier" }
    }
}
// 結果: devFreeDebug, devPaidDebug, prodFreeRelease など

3. Kotlin 開発基準

3.1 命名規則

タイプ規則
クラス/インターフェースPascalCaseUserRepository, MainActivity
関数/変数camelCasegetUserName(), isLoading
定数SCREAMING_SNAKEMAX_RETRY_COUNT
パッケージ小文字com.example.myapp
ComposablePascalCase@Composable fun UserCard()

3.2 コード基準 (重要)

Null セーフティ

// ❌ 回避: Non-null アサーション !! (クラッシュの可能性)
val name = user!!.name

// ✅ 推奨: セーフコール + デフォルト値
val name = user?.name ?: "Unknown"

// ✅ 推奨: let の処理
user?.let { processUser(it) }

例外処理

// ❌ 回避: ビジネスレイヤーでランダムな try-catch で例外を飲み込む
fun loadData() {
    try {
        val data = api.fetch()
    } catch (e: Exception) {
        // 例外を飲み込み、デバッグが難しい
    }
}

// ✅ 推奨: 例外を伝播させ、適切なレイヤーで処理
suspend fun loadData(): Result<Data> {
    return try {
        Result.success(api.fetch())
    } catch (e: Exception) {
        Result.failure(e)  // ラップして返す、呼び出し側で決定
    }
}

// ✅ 推奨: ViewModel で統一処理
viewModelScope.launch {
    runCatching { repository.loadData() }
        .onSuccess { _uiState.value = UiState.Success(it) }
        .onFailure { _uiState.value = UiState.Error(it.message) }
}

3.3 スレッド制御 & コルーチン (重要)

スレッド選択の原則

操作タイプスレッド説明
UI 更新Dispatchers.MainView、State、LiveData を更新
ネットワークリクエストDispatchers.IOHTTP 呼び出し、API リクエスト
ファイル I/ODispatchers.IOローカルストレージ、データベース操作
計算集約的Dispatchers.DefaultJSON パース、ソート、暗号化

正しい使用方法

// ViewModel 内
viewModelScope.launch {
    // デフォルト Main スレッド、UI State を更新可能
    _uiState.value = UiState.Loading
    
    // IO スレッドに切り替えてネットワークリクエスト
    val result = withContext(Dispatchers.IO) {
        repository.fetchData()
    }
    
    // 自動的に Main スレッドに戻り、UI を更新
    _uiState.value = UiState.Success(result)
}

// Repository (suspend 関数は main-safe であるべき)
suspend fun fetchData(): Data = withContext(Dispatchers.IO) {
    api.getData()
}

一般的な間違い

// ❌ 間違い: IO スレッドで UI を更新
viewModelScope.launch(Dispatchers.IO) {
    val data = api.fetch()
    _uiState.value = data  // クラッシュ、または警告!
}

// ❌ 間違い: Main スレッドで時間がかかる操作を実行
viewModelScope.launch {
    val data = api.fetch()  // Main スレッドをブロック! ANR
}

// ✅ 正しい: IO でフェッチ、Main で更新
viewModelScope.launch {
    val data = withContext(Dispatchers.IO) { api.fetch() }
    _uiState.value = data
}

3.4 可視性ルール

// デフォルトは public、必要に応じて明示的に宣言
class UserRepository {           // public
    private val cache = mutableMapOf<String, User>()  // クラス内のみ可視
    internal fun clearCache() {} // モジュール内のみ可視
}

// data class プロパティはデフォルトで public、モジュール間での使用に注意
data class User(
    val id: String,       // public
    val name: String
)

3.5 一般的な構文の落とし穴

// ❌ 間違い: 初期化されていない lateinit にアクセス
class MyViewModel : ViewModel() {
    lateinit var data: String
    fun process() = data.length  // クラッシュの可能性
}

// ✅ 正しい: nullable または デフォルト値を使用
class MyViewModel : ViewModel() {
    var data: String? = null
    fun process() = data?.length ?: 0
}

// ❌ 間違い: ラムダ内で return を使用
list.forEach { item ->
    if (item.isEmpty()) return  // 外側の関数から返る!
}

// ✅ 正しい: return@forEach を使用
list.forEach { item ->
    if (item.isEmpty()) return@forEach
}

3.6 サーバーレスポンス データクラス フィールドは Nullable であること

// ❌ 間違い: フィールドが non-null で宣言 (サーバーが返さない場合がある)
data class UserResponse(
    val id: String = "",
    val name: String = "",
    val avatar: String = ""
)

// ✅ 正しい: すべてのフィールドが nullable
data class UserResponse(
    @SerializedName("id")
    val id: String? = null,
    @SerializedName("name")
    val name: String? = null,
    @SerializedName("avatar")
    val avatar: String? = null
)

3.7 ライフサイクル リソース管理

// ❌ 間違い: Observer を追加するだけで削除しない
class MyView : View {
    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        activity?.lifecycle?.addObserver(this)
    }
    // メモリリーク!
}

// ✅ 正しい: 追加と削除をペアで実行
class MyView : View {
    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        activity?.lifecycle?.addObserver(this)
    }

    override fun onDetachedFromWindow() {
        activity?.lifecycle?.removeObserver(this)
        super.onDetachedFromWindow()
    }
}

3.8 ログレベルの使用

import android.util.Log

// Info: 通常フローの主要チェックポイント
Log.i(TAG, "loadData: started, userId = $userId")

// Warning: 異常だが回復可能な状況
Log.w(TAG, "loadData: cache miss, fallback to network")

// Error: 失敗/エラー状況
Log.e(TAG, "loadData failed: ${error.message}")
レベルユースケース
i (Info)通常フロー、メソッドエントリ、主要パラメータ
w (Warning)回復可能な例外、フォールバック処理、null の返却
e (Error)リクエスト失敗、キャッチされた例外、回復不可能なエラー

4. Jetpack Compose 基準

4.1 @Composable コンテキスト ルール

// ❌ 間違い: Non-Composable 関数から Composable を呼び出し
fun showError(message: String) {
    Text(message)  // コンパイルエラー!
}

// ✅ 正しい: @Composable として マーク
@Composable
fun ErrorMessage(message: String) {
    Text(message)
}

// ❌ 間違い: LaunchedEffect の外で suspend を使用
@Composable
fun MyScreen() {
    val data = fetchData()  // エラー!
}

// ✅ 正しい: LaunchedEffect を使用
@Composable
fun MyScreen() {
    var data by remember { mutableStateOf<Data?>(null) }
    LaunchedEffect(Unit) {
        data = fetchData()
    }
}

4.2 状態管理

// 基本的な State
var count by remember { mutableStateOf(0) }

// 導出 State (冗長な計算を避ける)
val isEven by remember { derivedStateOf { count % 2 == 0 } }

// 再コンポーズ間で永続化 (スクロール位置など)
val scrollState = rememberScrollState()

// ViewModel 内の State
class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow(UiState())
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()
}

4.3 Compose の一般的な間違い

// ❌ 間違い: Composable 内でオブジェクトを作成 (再コンポーズのたびに作成される)
@Composable
fun MyScreen() {
    val viewModel = MyViewModel()  // 間違い!
}

// ✅ 正しい: viewModel() または remember を使用
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    // ...
}

5. リソース & アイコン

5.1 アプリアイコン要件

複数の解像度でアイコンを提供する必要があります:

ディレクトリサイズ目的
mipmap-mdpi48x48ベースライン
mipmap-hdpi72x721.5倍
mipmap-xhdpi96x962倍
mipmap-xxhdpi144x1443倍
mipmap-xxxhdpi192x1924倍

推奨: Adaptive Icon を使用 (Android 8+):

<!-- res/mipmap-anydpi-v26/ic_launcher.xml -->
<adaptive-icon>
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

5.2 リソース命名規則

タイププリフィックス
レイアウトlayout_layout_main.xml
画像ic_, img_, bg_ic_user.png
color_color_primary
文字列なしapp_name, btn_submit

5.3 Android 予約名を回避 (重要)

変数名、リソース ID、色、アイコン、XML 要素は Android の予約語やシステムリソース名を使用してはいけません。予約名を使用するとビルドエラーまたはリソースの競合が発生します。

回避すべき一般的な予約名

カテゴリ予約名 (使用しないでください)
background, foreground, transparent, white, black
アイコン/ドローアブルicon, logo, image, drawable
ビューview, text, button, layout, container
属性id, name, type, style, theme, color
システムapp, android, content, data, action

<!-- ❌ 間違い: 予約名を使用 -->
<color name="background">#FFFFFF</color>
<color name="icon">#000000</color>

<!-- ✅ 正しい: プリフィックスを追加するか、具体的な命名 -->
<color name="app_background">#FFFFFF</color>
<color name="icon_primary">#000000</color>
// ❌ 間違い: 変数名がシステムと競合
val icon = R.drawable.my_icon
val background = Color.White

// ✅ 正しい: 説明的な名前を使用
val appIcon = R.drawable.my_icon
val screenBackground = Color.White
<!-- ❌ 間違い: ドローアブル名が競合 -->
<ImageView android:src="@drawable/icon" />

<!-- ✅ 正しい: プリフィックスを追加 -->
<ImageView android:src="@drawable/ic_home" />

6. ビルドエラー診断 & 修正

6.1 一般的なエラー クイックリファレンス

エラーキーワード原因修正
Unresolved referenceインポート不足または未定義インポートを確認、依存関係を確認
Type mismatch型の互換性なしパラメータの型を確認、変換を追加
Cannot access可視性の問題public/private/internal を確認
@Composable invocationsComposable コンテキストエラー呼び出し側も @Composable であることを確認
Duplicate class依存関係の競合./gradlew dependencies で調査
AAPT: errorリソースファイルエラーXML 構文とリソース参照を確認

6.2 修正のベストプラクティス

  1. 完全なエラーメッセージを最初に読む: ファイルと行番号を特定する
  2. 最近の変更を確認: 通常は最新の変更に問題がある
  3. クリーン ビルド: ./gradlew clean assembleDebug
  4. 依存関係バージョンを確認: バージョン競合が原因の場合が多い
  5. 必要に応じて依存関係をリフレッシュ: キャッシュをクリアして再ビルド

6.3 デバッグコマンド

# クリーンとビルド
./gradlew clean assembleDebug

# 依存関係ツリーを表示 (競合を調査)
./gradlew :app:dependencies

# 詳細なエラーを表示
./gradlew assembleDebug --stacktrace

# 依存関係をリフレッシュ
./gradlew --refresh-dependencies

7. Material Design 3 ガイドライン

Android UI ファイルが Material Design 3 ガイドラインと Android ベストプラクティスに準拠しているかを確認してください。

デザイン哲学

M3 コア原則

原則説明
パーソナルユーザーの選択と壁紙に基づいた動的な色
適応的すべての画面サイズとフォームファクタに対応
表現力豊か個性的な大胆な色とタイポグラフィ
アクセシブルすべてのユーザーを対象とした包括的なデザイン

M3 Expressive (最新)

最新の進化は、感情駆動型の UX を通じて追加されます:

  • 充実した動的な色
  • 直感的なモーション物理学
  • 適応的なコンポーネント
  • 柔軟なタイポグラフィ
  • 対比するシェイプ (35 個の新しいシェイプオプション)

アプリスタイル選択

重要な決定: ビジュアルスタイルをアプリカテゴリとターゲットオーディエンスに合わせる。

アプリカテゴリビジュアルスタイル主要特性
ユーティリティ/ツールミニマリスト清潔、効率的、中立的な色
金融/銀行プロフェッショナル トラスト保守的な色、セキュリティ重視
健康/ウェルネス落ち着き & 自然柔らかい色、有機的なシェイプ
キッズ (3-5)楽しい シンプル明るい色、大きなタッチターゲット (56dp+)
キッズ (6-12)楽しい & エンゲージング鮮やかな色、ゲーム化されたフィードバック
ソーシャル/エンターテインメント表現力豊かブランド駆動型、ジェスチャーが豊富
生産性清潔 & フォーカスミニマル、高いコントラスト
Eコマースコンバーション重視明確な CTA、スキャン可能

詳細なスタイルプロファイルは、デザインスタイルガイド を参照してください。

クイックリファレンス: 主要仕様

色のコントラスト要件

要素最小比率
本文テキスト4.5:1
大きなテキスト (18sp+)3:1
UI コンポーネント3:1

タッチターゲット

タイプサイズ
最小48 × 48dp
推奨 (主要アクション)56 × 56dp
キッズアプリ56dp+
ターゲット間の間隔最小 8dp

8dp グリッドシステム

トークン用途
xs4dpアイコンパディング
sm8dpタイト間隔
md16dpデフォルトパディング
lg24dpセクション間隔
xl32dp大きなギャップ
xxl48dp画面マージン

タイポグラフィスケール (概要)

カテゴリサイズ
Display57sp, 45sp, 36sp
Headline32sp, 28sp, 24sp
Title22sp, 16sp, 14sp
Body16sp, 14sp, 12sp
Label14sp, 12sp, 11sp

アニメーション期間

タイプ期間
マイクロ (リップル)50-100ms
短 (シンプル)100-200ms
中 (展開/折りたたみ)200-300ms
長 (複雑)300-500ms

コンポーネント寸法

コンポーネント高さ最小幅
ボタン40dp64dp
FAB56dp56dp
テキストフィールド56dp280dp
アプリバー64dp-
ボトムナビゲーション80dp-

アンチパターン (回避必須)

UI アンチパターン

  • ボトムナビゲーションに 5 個以上のアイテム
  • 同じ画面上に複数の FAB
  • 48dp より小さいタッチターゲット
  • 一貫性のない間隔 (8dp の倍数以外)
  • ダークテーマサポートの欠落
  • コントラストチェックなしで背景上のテキスト

パフォーマンス アンチパターン

  • プログレスインジケータなしで起動時間 > 2 秒
  • フレームレート < 60 FPS (フレームあたり > 16ms)
  • クラッシュレート > 1.09% (Google Play の閾値)
  • ANR レート > 0.47% (Google Play の閾値)

アクセシビリティ アンチパターン

  • インタラクティブ要素の contentDescription の欠落
  • ラベルのシステム要素タイプ (例:「Save ボタン」ではなく「Save」)
  • キッズアプリ内の複雑なジェスチャー
  • 非読者向けのテキストのみボタン

レビューチェックリスト

  • 8dp 間隔グリッドへの準拠
  • 最小 48dp タッチターゲット
  • 適切なタイポグラフィスケールの使用
  • 色のコントラスト準拠 (テキストは 4.5:1+)
  • ダークテーマサポート
  • すべてのインタラクティブ要素に contentDescription
  • 起動時間 < 2 秒またはプログレス表示
  • ビジュアルスタイルがアプリカテゴリに一致

デザインリファレンス

トピックリファレンス
色、タイポグラフィ、間隔、シェイプビジュアルデザイン
アニメーション & トランジションモーションシステム
アクセシビリティガイドラインアクセシビリティ
大型画面とフォルダブル適応型スクリーン
Android Vitals & パフォーマンスパフォーマンス & 安定性
プライバシー & セキュリティプライバシー & セキュリティ
オーディオ、ビデオ、通知機能要件
カテゴリ別アプリスタイルデザインスタイルガイド

8. テスト

注意: ユーザーがテストを明示的にリクエストしたときにのみテスト依存関係を追加してください。

よくテストされた Android アプリは階層化されたテストを使用します:ロジック向けの高速なローカルユニットテスト、UI とインテグレーション向けのインストルメンテーションテスト、そして Gradle Managed Devices を使用してエミュレータを再現可能に実行します。これは CI を含むあらゆるマシンで実行できます。

8.1 テスト依存関係

テスト依存関係を追加する前に、プロジェクトの既存バージョンを検査して競合を避けてください:

  1. gradle/libs.versions.toml を確認 — 存在する場合、プロジェクトのバージョンカタログスタイルを使用してテスト依存関係を追加
  2. 既存の build.gradle.kts ですでに固定されている依存関係バージョンを確認
  3. 以下の表を使用してバージョンファミリーを一致させる

バージョン整合ルール

テスト依存関係整合させるべき対象確認方法
kotlinx-coroutines-testプロジェクトの kotlinx-coroutines-core バージョンビルドファイルまたはバージョンカタログで kotlinx-coroutines を検索
compose-ui-test-junit4プロジェクトの Compose BOM または compose-compilerビルドファイルで compose-bom または compose.compiler を検索
espresso-*すべての Espresso アーティファクトは同じバージョンを使用する必要があるビルドファイルで espresso を検索
androidx.test:runner, rules, ext:junit互換性のある AndroidX Test バージョンビルドファイルで androidx.test を検索
mockkプロジェクトの Kotlin バージョンをサポートする必要があるルートの build.gradle.kts またはバージョンカタログで kotlin バージョンを確認

依存関係リファレンス — 必要なグループのみを追加:

dependencies {
    // --- ローカルユニットテスト (src/test/) ---
    testImplementation("junit:junit:<version>")                          // 4.13.2+
    testImplementation("org.robolectric:robolectric:<version>")          // 4.16.1+
    testImplementation("io.mockk:mockk:<version>")                      // Kotlin バージョンに一致
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:<version>")  // coroutines-core に一致
    testImplementation("androidx.arch.core:core-testing:<version>")      // LiveData の InstantTaskExecutorRule
    testImplementation("app.cash.turbine:turbine:<version>")             // Flow/StateFlow テスト

    // --- インストルメンテーションテスト (src/androidTest/) ---
    androidTestImplementation("androidx.test.ext:junit:<version>")
    androidTestImplementation("androidx.test:runner:<version>")
    androidTestImplementation("androidx.test:rules:<version>")
    androidTestImplementation("androidx.test.espresso:espresso-core:<version>")
    androidTestImplementation("androidx.test.espresso:espresso-contrib:<version>")   // RecyclerView、Drawer
    androidTestImplementation("androidx.test.espresso:espresso-intents:<version>")   // Intent 検証
    androidTestImplementation("androidx.test.espresso:espresso-idling-resource:<version>")
    androidTestImplementation("androidx.test.uiautomator:uiautomator:<version>")

    // --- Compose UI テスト (プロジェクトが Compose を使用する場合のみ) ---
    androidTestImplementation("androidx.compose.ui:ui-test-junit4")      // Compose BOM のバージョン
    debugImplementation("androidx.compose.ui:ui-test-manifest")          // createComposeRule に必須
}

注意: プロジェクトが Compose BOM を使用する場合、ui-test-junit4ui-test-manifest は明示的なバージョンを必要としません — BOM がそれらを管理します。

android ブロック内で Robolectric リソースサポートを有効にします:

android {
    testOptions {
        unitTests.isIncludeAndroidResources = true  // Robolectric に必須
    }
}

8.2 レイヤー別テスト

レイヤー場所実行環境速度用途
ユニット (JUnit)src/test/JVM~msViewModel、repo、mapper、validator
ユニット + Robolectricsrc/test/JVM + シミュレーション Android~100msContext、リソース、SharedPrefs が必要なコード
Compose UI (ローカル)src/test/JVM + Robolectric~100msComposable のレンダリング & インタラクション
Espressosrc/androidTest/デバイス/エミュレータ~秒View ベースの UI フロー、Intent、DB インテグレーション
Compose UI (デバイス)src/androidTest/デバイス/エミュレータ~秒完全な Compose UI フロー、実際のレンダリング
UI Automatorsrc/androidTest/デバイス/エミュレータ~秒システムダイアログ、通知、マルチアプリ
Managed Devicesrc/androidTest/Gradle 管理の AVD~分 (初回)CI、複数 API レベルでのマトリックステスト

詳細な例、コードパターン、Gradle Managed Device 設定については、テスト を参照してください。

8.3 テストコマンド

# ローカルユニットテスト (高速、エミュレータ不要)
./gradlew test                          # すべてのモジュール
./gradlew :app:testDebugUnitTest        # app モジュール、debug バリアント

# 単一テストクラス
./gradlew :app:testDebugUnitTest --tests "com.example.myapp.CounterViewModelTest"

# インストルメンテーションテスト (デバイスまたは managed device が必要)
./gradlew connectedDebugAndroidTest     # 接続されたデバイス上
./gradlew pixel6Api34DebugAndroidTest   # managed device 上

# 両方を一緒に実行
./gradlew test connectedDebugAndroidTest

# カバレッジレポート (JaCoCo) を使用したテスト
./gradlew testDebugUnitTest jacocoTestReport

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
minimax-ai
リポジトリ
minimax-ai/skills
ライセンス
MIT
最終更新
不明

Source: https://github.com/minimax-ai/skills / ライセンス: MIT

関連スキル

汎用デザイン・クリエイティブ⭐ リポ 1,739

nano-banana-2

inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」

by openakita
汎用デザイン・クリエイティブ⭐ リポ 815

octocode-slides

洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。

by bgauryy
汎用デザイン・クリエイティブ⭐ リポ 482

gpt-image2-ppt

OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。

by JuneYaooo
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 299

nano-banana

Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。

by majiayu000
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 299

oiloil-ui-ux-guide

モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。

by majiayu000
Anthropic Claudeデザイン・クリエイティブ⭐ リポ 299

axiom-hig-ref

Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。

by majiayu000
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: minimax-ai · minimax-ai/skills · ライセンス: MIT