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 あり | gradlew と gradle/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 命名規則
| タイプ | 規則 | 例 |
|---|---|---|
| クラス/インターフェース | PascalCase | UserRepository, MainActivity |
| 関数/変数 | camelCase | getUserName(), isLoading |
| 定数 | SCREAMING_SNAKE | MAX_RETRY_COUNT |
| パッケージ | 小文字 | com.example.myapp |
| Composable | PascalCase | @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.Main | View、State、LiveData を更新 |
| ネットワークリクエスト | Dispatchers.IO | HTTP 呼び出し、API リクエスト |
| ファイル I/O | Dispatchers.IO | ローカルストレージ、データベース操作 |
| 計算集約的 | Dispatchers.Default | JSON パース、ソート、暗号化 |
正しい使用方法:
// 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-mdpi | 48x48 | ベースライン |
| mipmap-hdpi | 72x72 | 1.5倍 |
| mipmap-xhdpi | 96x96 | 2倍 |
| mipmap-xxhdpi | 144x144 | 3倍 |
| mipmap-xxxhdpi | 192x192 | 4倍 |
推奨: 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 invocations | Composable コンテキストエラー | 呼び出し側も @Composable であることを確認 |
Duplicate class | 依存関係の競合 | ./gradlew dependencies で調査 |
AAPT: error | リソースファイルエラー | XML 構文とリソース参照を確認 |
6.2 修正のベストプラクティス
- 完全なエラーメッセージを最初に読む: ファイルと行番号を特定する
- 最近の変更を確認: 通常は最新の変更に問題がある
- クリーン ビルド:
./gradlew clean assembleDebug - 依存関係バージョンを確認: バージョン競合が原因の場合が多い
- 必要に応じて依存関係をリフレッシュ: キャッシュをクリアして再ビルド
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 グリッドシステム
| トークン | 値 | 用途 |
|---|---|---|
| xs | 4dp | アイコンパディング |
| sm | 8dp | タイト間隔 |
| md | 16dp | デフォルトパディング |
| lg | 24dp | セクション間隔 |
| xl | 32dp | 大きなギャップ |
| xxl | 48dp | 画面マージン |
タイポグラフィスケール (概要)
| カテゴリ | サイズ |
|---|---|
| Display | 57sp, 45sp, 36sp |
| Headline | 32sp, 28sp, 24sp |
| Title | 22sp, 16sp, 14sp |
| Body | 16sp, 14sp, 12sp |
| Label | 14sp, 12sp, 11sp |
アニメーション期間
| タイプ | 期間 |
|---|---|
| マイクロ (リップル) | 50-100ms |
| 短 (シンプル) | 100-200ms |
| 中 (展開/折りたたみ) | 200-300ms |
| 長 (複雑) | 300-500ms |
コンポーネント寸法
| コンポーネント | 高さ | 最小幅 |
|---|---|---|
| ボタン | 40dp | 64dp |
| FAB | 56dp | 56dp |
| テキストフィールド | 56dp | 280dp |
| アプリバー | 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 テスト依存関係
テスト依存関係を追加する前に、プロジェクトの既存バージョンを検査して競合を避けてください:
gradle/libs.versions.tomlを確認 — 存在する場合、プロジェクトのバージョンカタログスタイルを使用してテスト依存関係を追加- 既存の
build.gradle.ktsですでに固定されている依存関係バージョンを確認 - 以下の表を使用してバージョンファミリーを一致させる
バージョン整合ルール:
| テスト依存関係 | 整合させるべき対象 | 確認方法 |
|---|---|---|
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-junit4とui-test-manifestは明示的なバージョンを必要としません — BOM がそれらを管理します。
android ブロック内で Robolectric リソースサポートを有効にします:
android {
testOptions {
unitTests.isIncludeAndroidResources = true // Robolectric に必須
}
}
8.2 レイヤー別テスト
| レイヤー | 場所 | 実行環境 | 速度 | 用途 |
|---|---|---|---|---|
| ユニット (JUnit) | src/test/ | JVM | ~ms | ViewModel、repo、mapper、validator |
| ユニット + Robolectric | src/test/ | JVM + シミュレーション Android | ~100ms | Context、リソース、SharedPrefs が必要なコード |
| Compose UI (ローカル) | src/test/ | JVM + Robolectric | ~100ms | Composable のレンダリング & インタラクション |
| Espresso | src/androidTest/ | デバイス/エミュレータ | ~秒 | View ベースの UI フロー、Intent、DB インテグレーション |
| Compose UI (デバイス) | src/androidTest/ | デバイス/エミュレータ | ~秒 | 完全な Compose UI フロー、実際のレンダリング |
| UI Automator | src/androidTest/ | デバイス/エミュレータ | ~秒 | システムダイアログ、通知、マルチアプリ |
| Managed Device | src/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
関連スキル
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」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
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」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。