| name | claude-android-ninja |
| description | Build Android apps with Kotlin, Jetpack Compose, MVVM, Hilt, Room 3 (KSP, SQLiteDriver, Flow/suspend DAOs), and multi-module architecture. Triggers on requests to create Android projects, modules, screens, ViewModels, repositories, or Android architecture questions. Not for iOS, Flutter, React Native, KMP-only shared code without an Android app module, or backend-only APIs with no Android client. |
| compatibility | JDK 17+. Android Studio with Android SDK installed. Network access for Gradle dependency downloads. Version pins in assets/templates follow the repo catalog; align AGP/Kotlin/KSP with the user project before applying upgrades. |
| license | Apache-2.0 |
| metadata | {"author":"DrJacky","version":"1.0.0","documentation":"https://github.com/Drjacky/claude-android-ninja","tags":["android","kotlin","compose","mvvm","hilt","room","room3","datastore","paging","gradle","mobile"]} |
Android Kotlin Compose Development
Route tasks through the Quick Reference table and Workflow Decision Tree; open linked references/ files only for the active task.
Quick Reference
| Task | Reference File |
|---|
| Project structure & modules | modularization.md |
| Architecture layers, (Domain, Data, UI, Common, ...) | architecture.md |
| Compose patterns, Material motion, animation, modifiers, stability | compose-patterns.md |
Paging 3 + Room + network (RemoteMediator, remote keys, initialize) | compose-patterns.md |
| Accessibility, TalkBack, label copy, live regions, Espresso a11y checks | android-accessibility.md |
| Notifications, foreground services, media-style notifications, PiP, sharesheet | android-notifications.md |
Media: API 37 background playback (MediaSessionService, FGS), picking, FileProvider, sharesheet routing | android-media.md |
| Data sync & offline-first patterns | android-data-sync.md |
| Material 3 theming, spacing tokens, category fit, dynamic colors | android-theming.md |
| Navigation3, adaptive navigation, large-screen quality tiers | android-navigation.md |
| Kotlin patterns, View lifecycle interop | kotlin-patterns.md |
| Coroutine patterns | coroutines-patterns.md |
| Gradle, product flavors, BuildConfig, build performance | gradle-setup.md |
| Play CI/CD: AAB, tracks, signing boundaries, rollout, upload automation | android-ci-cd.md |
| Testing approach | testing.md |
| Pre-release UI states (empty, loading, error, offline, permissions, session loss) | testing.md |
| Internationalization & localization | android-i18n.md |
| Icons, adaptive launcher specs, custom drawing | android-graphics.md |
| Runtime permissions | android-permissions.md |
| Kotlin delegation patterns | kotlin-delegation.md |
| Crash reporting | crashlytics.md |
| StrictMode guardrails | android-strictmode.md |
| Multi-module dependencies | dependencies.md |
| Code quality (Detekt) | code-quality.md |
| Code coverage (JaCoCo) | android-code-coverage.md |
Security, Play Integrity (Standard/Classic), server decode, requestHash/nonce, tiered policy, remediation; Credential Manager; local root checks as supplementary | android-security.md |
| Design patterns | design-patterns.md |
| Performance, Play Vitals, Play Developer Reporting API (CI vitals), startup, recomposition, jank, battery, Perfetto / system traces | android-performance.md |
| Debugging, Logcat levels, ANR, Gradle error patterns, R8, memory leaks | android-debugging.md |
| ADB device targeting, install or launch smoke, UIAutomator black-box checks | testing.md |
| Migration guides (XML, RxJava, Navigation, Compose, Room 2ā3, Android 17 / API 37, 16 KB native, Compose-XML interop) | migration.md; 16 KB page size; Compose-XML interop |
Examples
Greenfield Android app with convention plugins
User goal: new repo matching the skill stack.
Actions: copy assets/settings.gradle.kts.template, assets/libs.versions.toml.template, assets/convention/ into build-logic/ per assets/convention/QUICK_REFERENCE.md; wire includeBuild("build-logic"); read modularization.md and gradle-setup.md.
Result: root + app + core modules with version catalog and convention plugins applied.
New feature screen (Compose + ViewModel)
User goal: one new flow in a feature module.
Actions: modularization.md for module naming and dependency direction; compose-patterns.md for Screen, state, effects; kotlin-patterns.md + coroutines-patterns.md for StateFlow / events; architecture.md for domain vs data boundaries.
Result: feature module with Screen composable, ViewModel, UiState, and DI aligned to existing graphs.
Offline-first list with Room 3 and remote API
User goal: cached list + network refresh.
Actions: compose-patterns.md for Paging 3 + RemoteMediator; architecture.md for repository placement; Room 3 + SQLiteDriver per Workflow Decision Tree database bullets and migration.md if upgrading.
Result: single source of truth in Room, UI driven by PagingData or equivalent pattern from the guide.
Target SDK / compile SDK bump (e.g. API 37)
User goal: migrate toolchain and platform requirements.
Actions: walk migration.md; pin AGP/Kotlin/KSP using gradle-setup.md and dependencies.md; cross-check edge-to-edge, media, security sections linked from the Workflow Decision Tree for API 37.
Result: compileSdk / targetSdk raised with manifest, Gradle, and feature code adjusted per the migration doc.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|
| Gradle sync fails, plugin not found, or version catalog errors | Missing google() / mavenCentral(), wrong plugin id, or catalog alias drift | gradle-setup.md for repositories, plugins, and catalog wiring; align with assets/libs.versions.toml.template when bootstrapping |
| KSP errors on Room, or Room 3 builder rejects missing driver | Room 3 expects setDriver(BundledSQLiteDriver()) (or project equivalent) per convention | migration.md; module layout in modularization.md; DAO patterns in architecture.md |
| Compose runtime warnings about unstable / skippable recompositions | Unstable parameter types or state held incorrectly | compose-patterns.md stability sections; android-performance.md Compose recomposition; kotlin-patterns.md for immutable models |
Release build crashes, ClassNotFoundException, or missing R8 rules | Shrinking removed reflective or JNI entry points | gradle-setup.md R8 keep-rules audit; android-debugging.md for stack traces and mapping files |
| ANR or jank claims without evidence | Main-thread or measurement assumptions | android-performance.md before changing architecture; android-debugging.md for ANR traces |
Workflow Decision Tree
Creating a new project?
ā Start with assets/settings.gradle.kts.template for settings and module includes
ā Start with assets/libs.versions.toml.template for the version catalog
ā Copy all files from assets/convention/ to build-logic/convention/src/main/kotlin/
ā Create build-logic/settings.gradle.kts (see assets/convention/QUICK_REFERENCE.md)
ā Add includeBuild("build-logic") to root settings.gradle.kts
ā Add plugin entries to gradle/libs.versions.toml (see assets/convention/QUICK_REFERENCE.md)
ā Copy assets/proguard-rules.pro.template to app/proguard-rules.pro
ā Read modularization.md for structure and module types
ā Use gradle-setup.md for build files and build logic
Configuring Gradle/build files?
ā Use gradle-setup.md for module build.gradle.kts patterns
ā Use gradle-setup.md ā "Build Performance" for optimization workflow, diagnostics, and bottleneck troubleshooting
ā Copy convention plugins from assets/convention/ to build-logic/ in your project
ā See assets/convention/QUICK_REFERENCE.md for setup instructions and examples
ā Copy assets/proguard-rules.pro.template to app/proguard-rules.pro for R8 rules
Setting up code quality / Detekt?
ā Use code-quality.md for Detekt convention plugin setup
ā Start from assets/detekt.yml.template for rules and enable Compose rules
Adding or updating dependencies?
ā Follow dependencies.md
ā Update assets/libs.versions.toml.template if the dependency is missing
Adding a new feature/module?
ā Follow module naming in modularization.md
ā Implement Presentation in the feature module
ā Follow dependency flow: Feature ā Core/Domain ā Core/Data
Building UI screens/components?
ā Read compose-patterns.md for screen architecture, state, components, modifiers
ā Use compose-patterns.md -> State Management -> "Loading and refresh UX" for stable layout during loads and refreshes (avoid full-screen spinners that wipe context)
ā Use android-theming.md for Material 3 colors, typography, and shapes
ā Always align Kotlin code with kotlin-patterns.md
ā Create Screen + ViewModel + UiState in the feature module
ā Use shared components from core/ui when possible
Handling State and Events?
ā Use StateFlow for state; Channel + receiveAsFlow() for strict one-shot UI commands; SharedFlow for multicast or replay-intended events (see coroutines-patterns.md)
ā Survive process death with SavedStateHandle (see compose-patterns.md)
Setting up app theme (colors, typography, shapes)?
ā Follow android-theming.md for Material 3 theming and dynamic colors
ā Use semantic color roles from MaterialTheme.colorScheme (never hardcoded colors); pair every fill with its on* partner - see Color Pairing Rules
ā Declare the full M3 color set in Color.kt (surface containers, dim/bright, *Fixed/*FixedDim) so dynamic color and contrast variants stay consistent - see Full Color Role Reference and Surface Container Hierarchy
ā Express depth via container tone first, shadows only for components that float over arbitrary content - see Tonal Elevation vs Shadows
ā Use outline for interactive borders/focus, outlineVariant for decorative dividers - see outline vs outlineVariant
ā Support light/dark themes with user preference toggle
ā Enable dynamic color (Material You) for API 31+, harmonize brand/extended colors against primary - see Brand Color Harmonization
ā Honor the system contrast slider on Android 14+ (API 34) by shipping Medium/High-contrast scheme variants and reading UiModeManager.getContrast() - see User Contrast Preference
ā For region-local palette overrides (destructive scopes, on-media toolbars), use a nested MaterialTheme with colorScheme.copy(...) - see Scoped Themes
ā Pick Card / OutlinedCard / ElevatedCard by surface separation, not importance, and override shapes at the token level - see Card Variants and Component Shape Defaults
Writing any Kotlin code?
ā Always follow kotlin-patterns.md
ā Ensure practices align with architecture.md, modularization.md, and compose-patterns.md
Setting up data/domain layers?
ā Read architecture.md
ā Hilt @Binds, scopes, and DI anti-patterns: architecture.md -> Domain Layer -> "Dependency Injection Setup"
ā Create Repository interfaces in core/domain
ā Create implementations in core/data using Room 3/Retrofit/DataStore
ā Use DataStore for simple key-value pairs, Room 3 for complex relational data (suspend / Flow DAOs, SQLiteDriver)
Implementing Lists and Scrolling?
ā Use LazyColumn/LazyRow with stable keys and contentType (see compose-patterns.md)
ā For large datasets, use Paging 3 (see compose-patterns.md -> "Paging 3")
ā For Room-backed grids with a remote API, use RemoteMediator (compose-patterns.md)
Handling Navigation?
ā Use Navigation3 for adaptive navigation (see android-navigation.md)
ā Avoid navigation anti-patterns (see android-navigation.md -> "Navigation Anti-Patterns")
Optimizing Performance?
ā Follow the Performance Checklist in android-performance.md
ā If the user asks for automated Play Console vitals (CI/Slack, no Play Console UI), use android-performance.md ā Optional: Play Vitals observability (Play Developer Reporting API)
ā Use BasicTextField2 for high-frequency text input
Auditing battery drain or stuck wake locks?
ā Use android-performance.md ā "Excessive partial wake locks (Play Vitals core metric)" for the threshold (>2 hr cumulative non-exempt per session, >5% of sessions over 28 days, enforced March 2026), the use-case-to-substitute matrix, sensor batching, and stuck-worker diagnosis
ā Required: UIDT API for user-initiated transfers; WorkManager + WorkInfo.stopReason for syncs; manual wake lock acquired only after packet arrival on sockets
ā Forbidden: a manual wake lock alongside FusedLocationProviderClient callbacks, MediaSessionService audio, or any system API that already wakes the CPU
Testing?
ā Read testing.md for testing philosophy and patterns
ā Use Turbine for testing Flow emissions (see testing.md -> "Testing Flow Emissions with Turbine")
ā Create Repository interfaces in core/domain
ā Implement Repository in core/data
ā Create DataSource + DAO in core/data
Implementing offline-first or data synchronization?
ā Follow android-data-sync.md for sync strategies, conflict resolution, and cache invalidation
ā Use Room 3 as single source of truth with sync metadata (syncStatus, lastModified)
ā Schedule background sync with WorkManager
ā Monitor network state before syncing
Setting up navigation?
ā Follow android-navigation.md for Navigation3 architecture, state management, and adaptive navigation
ā See modularization.md for feature module navigation components (Destination, Navigator, Graph)
ā Configure navigation graph in the app module
ā Use feature navigation destinations and navigator interfaces
Setting up deep links, App Links, Digital Asset Links, verification, Dynamic App Links, or custom schemes?
ā Read android-navigation.md ā "Deep Links" for NavKey parsing, synthetic back stack, manifest filters, assetlinks.json, verification, DomainVerificationManager, Dynamic App Links (API 35), custom schemes, troubleshooting
ā Use testing.md ā "Testing Deep Links" for am start, pm set-app-links / pm verify-app-links --re-verify / pm get-app-links / dumpsys package d, Digital Asset Links REST (append return_relation_extensions=true for dynamic rules), custom-scheme launch semantics, and instrumented onNewIntent tests
ā Required: Play Console ā Release ā Setup ā App signing ā uppercase SHA-256 in assetlinks.json; deep-link Activity android:exported="true", android:launchMode="singleTask", onNewIntent + setIntent; android:autoVerify="true" only on HTTPS intent-filters
ā Forbidden: security-critical flows on custom URI schemes - use HTTPS App Links
Adding tests?
ā Use testing.md for patterns and examples
ā Use testing.md for empty, loading, error, offline, permission-denied, and session-loss routing before tightening coverage
ā Use testing.md when choosing Compose Preview Screenshot Testing vs Roborazzi for visual regression
ā Use testing.md ā "Screenshot Testing" for Compose Preview Screenshot Testing setup
ā Keep test doubles in core/testing
Handling runtime permissions?
ā Follow android-permissions.md for manifest declarations and Compose permission patterns
ā Request permissions contextually and handle "Don't ask again" flows
ā For Photo Picker, document contracts, FileProvider, URI grants, and sharesheet routing, use android-media.md and android-media.md ā Sharing media and files
Showing notifications or foreground services?
ā Use android-notifications.md for notification channels, styles, actions, and foreground services
ā Check POST_NOTIFICATIONS permission on API 33+ before showing notifications
ā Create notification channels at app startup (required for API 26+)
Playing audio or video in the background (target SDK 37)?
ā Use android-media.md ā "Background media playback hardening (API 37)" for MediaSessionService, mediaPlayback foreground service type, and MediaSession lifecycle
ā Required: declare FOREGROUND_SERVICE_MEDIA_PLAYBACK and android:foregroundServiceType="mediaPlayback"; build a MediaSession around a Media3 Player; release session and player in onDestroy(); stop the service on Player.STATE_ENDED
ā Forbidden: standalone MediaPlayer / AudioTrack / raw ExoPlayer background playback without a MediaSession; requestAudioFocus() from a service with no session; manual wake locks alongside MediaSessionService
Sharing logic across ViewModels or avoiding base classes?
ā Use delegation via interfaces as described in kotlin-delegation.md
ā Prefer small, injected delegates for validation, analytics, or feature flags
Adding crash reporting / monitoring?
ā Follow crashlytics.md for provider-agnostic interfaces and module placement
ā Use DI bindings to swap between Firebase Crashlytics or Sentry
Enabling StrictMode guardrails?
ā Follow android-strictmode.md for app-level setup and Compose compiler diagnostics
ā Use Sentry/Firebase init from crashlytics.md to ship StrictMode logs
Choosing design patterns for a new feature, business logic, or system?
ā Use design-patterns.md for Android-focused pattern guidance
ā Align with architecture.md and modularization.md
Measuring performance regressions or startup/jank?
ā Use android-performance.md for Macrobenchmark, Baseline Profiles, and ProfileInstaller setup
ā Keep benchmark module aligned with benchmark build type in gradle-setup.md
ā If the user explicitly requests to investigate jank or add custom trace points, use android-performance.md for System Tracing (androidx.tracing) setup
ā For trace-backed debugging rules (what to require from the user, what not to infer without artifacts), use android-performance.md
Setting up app initialization or splash screen?
ā Follow android-performance.md ā "App Startup & Initialization" for App Startup library, lazy init, and splash screen
ā Avoid ContentProvider-based auto-initialization - use Initializer interface instead
ā Use installSplashScreen() with setKeepOnScreenCondition for loading state
ā Migrate windowBackground-only splash, dedicated SplashActivity, or Android 12+ double-splash issues via migration.md ā Legacy splash to Splash Screen API
Adding icons, images, or custom graphics?
ā Use android-graphics.md for Material Symbols icons and custom drawing
ā Download icons via Iconify API or Google Fonts (avoid deprecated Icons.Default.* library)
ā Use Modifier.drawWithContent, drawBehind, or drawWithCache for custom graphics
Creating custom UI effects (glow, shadows, gradients)?
ā Check android-graphics.md for Canvas drawing, BlendMode, and Palette API patterns
ā Use rememberInfiniteTransition for animated effects
Ensuring accessibility compliance (TalkBack, touch targets, color contrast)?
ā Follow android-accessibility.md for semantic properties and WCAG guidelines
ā Provide contentDescription for all icons and images
ā Ensure 48dp Ć 48dp minimum touch targets
ā Test with TalkBack and Accessibility Scanner
Working with images and color extraction?
ā Use android-graphics.md ā "Image Loading with Coil3" for AsyncImage, SubcomposeAsyncImage, rememberAsyncImagePainter, and Hilt ImageLoader setup
ā Use android-graphics.md for Palette API and color extraction
Implementing complex coroutine flows or background work?
ā Follow coroutines-patterns.md for structured concurrency patterns
ā Use appropriate dispatchers (IO, Default, Main) and proper cancellation handling
ā Prefer StateFlow (and SharedFlow where appropriate) over Channel for observable state; use Channel for one-shot commands as in coroutines-patterns.md
ā Use callbackFlow to wrap Android callback APIs (connectivity, sensors, location) into Flow
ā Use suspendCancellableCoroutine for one-shot callbacks (Play Services tasks, biometrics)
ā Use combine() to merge multiple Flows in ViewModels, shareIn to share expensive upstream
ā Handle backpressure with buffer, conflate, debounce, or sample
Need to share behavior across multiple classes?
ā Use kotlin-delegation.md for interface delegation patterns
ā Avoid base classes; prefer composition with delegated interfaces
ā Examples: Analytics, FormValidator, CrashReporter
Refactoring existing code or improving architecture?
ā Review architecture.md for layer responsibilities
ā Read architecture.md -> "Cross-cutting anti-patterns (quick reference)" for common layering mistakes
ā Check design-patterns.md for applicable patterns
ā Follow kotlin-patterns.md for Kotlin-specific improvements
ā Ensure compliance with modularization.md dependency rules
Debugging crashes, ANRs, or obfuscated stack traces?
ā Follow android-debugging.md for Logcat, ANR traces, and Compose recomposition debugging
ā Use android-debugging.md for R8 mapping files and manual de-obfuscation
Proposing install, cold start, or black-box smoke driven by ADB or UIAutomator?
ā Use testing.md for device targeting, am start, logcat smoke, and instrumented UIAutomator skeletons
ā Use testing.md for am start deep-link matrices and pm verify-app-links when the task is link verification, not generic launch
Auditing R8 keep rules / fixing release size or release-only crashes?
ā Use gradle-setup.md ā "R8 Keep-Rules Audit" for the redundant-library list, impact hierarchy, subsuming-rule detection, reflection-narrowing playbook, and AGP 9 default-optimization re-audit
Going edge-to-edge / fixing IME, insets, or system-bar bugs?
ā Use compose-patterns.md ā "Edge-to-Edge (Mandatory on API 36)" for IME insets (fitInside(WindowInsetsRulers.Ime.current) vs imePadding() ordering and double-padding pitfalls), system-bar appearance/contrast (isAppearanceLight*Bars, isNavigationBarContrastEnforced), NavigationSuiteScaffold / pane-scaffold inset handling, full-screen Dialog decorFitsSystemWindows, StatusBarProtection scrim, and the per-Activity edge-to-edge checklist
ā At target SDK 37, add IME visibility-after-rotation handling in the same guide's #### IME (soft keyboard) insets block
ā Manifest must set android:windowSoftInputMode="adjustResize" for any Activity hosting text input
Debugging performance issues or memory leaks?
ā Enable android-strictmode.md for development builds
ā Use android-performance.md for profiling and benchmarking
ā For ANR, jank, or main-thread claims without measurements, follow android-performance.md before concluding cause
ā Use android-debugging.md for LeakCanary and heap dump analysis
ā Check coroutines-patterns.md for coroutine cancellation patterns
Setting up CI/CD or code quality checks?
ā Use android-ci-cd.md for Play-bound AAB, tracks, signing boundaries, staged rollout, and upload automation routing
ā Use code-quality.md for Detekt baseline and CI integration
ā Use gradle-setup.md for build cache and convention plugins
ā Use testing.md for test organization and coverage
Handling sensitive data or privacy concerns?
ā Follow crashlytics.md for data scrubbing patterns
ā Use android-permissions.md for proper permission justification
ā Check android-strictmode.md for detecting cleartext network traffic
Migrating legacy code (LiveData, Fragments, Accompanist, RxJava, Room 2.x)?
ā Use migration.md for all migration paths (including Room 2.x ā Room 3)
ā Use migration.md ā Compose-XML interop (hardening) when ComposeView / AndroidView share a screen with XML or focus-sensitive Views
ā Follow architecture.md for MVVM patterns
Migrating to target SDK 37 (Android 17)?
ā Walk migration.md ā Android 17 (API 37) Migration top to bottom, then open each cross-link inside that section for full rules
ā Ship JNI or bundled .so files: align ELF segments and Play 16 KB page-size checks per migration.md ā 16 KB memory page size
ā Required: catalog compileSdk / targetSdk 37; pin agp, Gradle wrapper, kotlin, and ksp only after ./gradlew help succeeds per gradle-setup.md and dependencies.md; cleartext, loopback, CT, and explicit URI grants per android-security.md; adaptive large-screen layouts, adjustResize on the launcher Activity, and IME-after-rotation per compose-patterns.md; background audio/video via android-media.md; Robolectric rules per testing.md ā Robolectric and SDK 37 (Android 17) only when JVM tests use RobolectricTestRunner
ā Forbidden: production-wide cleartext without domain-scoped Network Security Config; cross-process loopback without the API 37 permission where the platform requires it; background MediaPlayer / AudioTrack / raw ExoPlayer without Media3 MediaSessionService + mediaPlayback FGS + MediaSession; Robolectric releases older than 4.13 on current JDKs; ACTION_SEND (and similar) intents that attach content URIs without explicit FLAG_GRANT_READ_URI_PERMISSION or FLAG_GRANT_WRITE_URI_PERMISSION
ā com.android.tools.build:gradle HTTP 404: catalog agp is not published on google() yet; pick a published AGP that supports compileSdk 37 per gradle-setup.md ā AGP version pin
ā MissingValueException / unresolved providers on compile*JavaWithJavac: isolate JaCoCo Tier 2 (ScopedArtifacts combined report) per android-code-coverage.md before chasing Kotlin or KSP bumps
Adding Compose animations?
ā Use compose-patterns.md ā "Animation" for AnimatedVisibility, AnimatedContent, animate*AsState, Animatable, shared elements
ā Use graphicsLayer for GPU-accelerated transforms (no recomposition)
ā Always provide label parameter for Layout Inspector debugging
Using side effects (LaunchedEffect, DisposableEffect)?
ā Use compose-patterns.md ā "Side Effects" for effect selection guide
ā LaunchedEffect(key) for state-driven coroutines, rememberCoroutineScope for event-driven
ā DisposableEffect for listener/resource cleanup, always include onDispose
ā LifecycleResumeEffect for onResume/onPause work (camera, media), LifecycleStartEffect for onStart/onStop (location, sensors)
Working with Modifier ordering or custom modifiers?
ā Use compose-patterns.md ā "Modifiers" for chain ordering rules and patterns
ā Use Modifier.Node for custom modifiers (not deprecated Modifier.composed)
ā Order: size ā padding ā drawing ā interaction
Migrating from Accompanist or deprecated Compose APIs?
ā Use migration.md for Accompanist, Compose API, Material, Edge-to-Edge, and Room upgrades
ā See compose-patterns.md ā "Deprecated Patterns & Migrations" for a summary list
Optimizing Compose recomposition or stability?
ā Use compose-patterns.md for @Immutable/@Stable annotations
ā Use android-performance.md ā "Compose Recomposition Performance" for three phases, deferred state reads, Strong Skipping Mode
ā Check gradle-setup.md for Compose Compiler metrics and stability reports
ā Use kotlin-patterns.md for immutable data structures
Working with databases (Room 3)?
ā Define DAOs and entities in core/database per modularization.md; use androidx.room3, KSP, and setDriver(BundledSQLiteDriver()) on the builder (see app.android.room convention)
ā Use testing.md for in-memory database testing and Room 3 migration tests
ā Follow architecture.md for repository patterns
ā Upgrading from Room 2.x: migration.md ā Room 2.x to Room 3
Need internationalization/localization (i18n/l10n)?
ā Use android-i18n.md for string resources, plurals, and RTL support
ā Follow compose-patterns.md for RTL-aware Compose layouts
ā Use testing.md for locale-specific testing
Implementing network calls (Retrofit)?
ā Use architecture.md ā "Network Layer Setup" for Retrofit service interfaces, Hilt NetworkModule, and AuthInterceptor
ā Define API interfaces in core/network per modularization.md
ā Follow dependencies.md for Retrofit, OkHttp, and serialization setup
ā Handle errors with generic Result<T> from kotlin-patterns.md
Creating custom lint rules or code checks?
ā Use code-quality.md for Detekt custom rules
ā Follow gradle-setup.md for convention plugin setup
ā Check android-strictmode.md for runtime checks
Need code coverage reporting?
ā Use android-code-coverage.md for JaCoCo setup
ā Follow testing.md for test strategies
ā Check gradle-setup.md for convention plugin integration
Implementing security features (encryption, biometrics, pinning)?
ā Use android-security.md for comprehensive security guide
ā Follow android-permissions.md for runtime permissions
ā Check crashlytics.md for PII scrubbing and data privacy
Implementing fraud-resistant or high-value flows (payments, session bootstrap, integrity-gated APIs)?
ā Read android-security.md: Device trust and abuse resistance, Play Integrity API (prerequisites, Standard vs Classic, server checklist, errors, remediation), Root and Emulator Detection (how this fits next to Play Integrity), Security Checklist
ā If Cloud Console / Play Console enablement or the Google Cloud project number is missing, list the missing prerequisites (see that guide) and stop before wiring client code