Android Code Review Excellence 🧐🛡️
A rigorous framework for AI agents and developers to perform high-quality, professional Android code reviews.
⚡ When to Use
- PR Review: Analyzing a Pull Request for logic, style, and regressions.
- Pre-commit Audit: Self-checking code before pushing.
- Architectural Check: Ensuring new features follow the established team patterns.
- Security Audit: Spotting sensitive data exposure or insecure networking.
- Performance Audit: Detecting potential memory leaks or UI jank.
🏗️ Review Checklist
1. Architecture & Design
- Clean Architecture: Is logic properly separated into Domain/Data/Presentation?
- State Flow: Does the ViewModel expose
StateFlow? Is state properly hoisted? - Dependency Injection: Are dependencies injected via Hilt/Koin? No manual
new Class()for dependencies. - Manifest Scaffolding: Are required permissions (like
INTERNETfor Coil/Retrofit) actually defined? Is the@HiltAndroidAppclass correctly designated inAndroidManifest.xmlviaandroid:name? - Type-Safe Navigation: Is the app using Compose
NavHostwith Kotlin Serialization (type-safe routes) instead of anti-pattern manual state swapping? - Modularity: Is the code placed in the correct module?
2. Jetpack Compose (UI)
- Recomposition: Are there expensive calculations inside
@Composable? Useremember. - Previews: Does the new component have
@Previewfor light/dark mode and accessibility? - Stability: Are domain models marked
@Stableor@Immutable? - Material 3: Is the code using the theme's
MaterialTheme.colorSchemeinstead of hardcoded hex values? - Theme Bridge: If XML resources are used (e.g.
res/), is the Material Components XML Bridge correctly set up in themes?
3. Stability & Networking
- Error Handling: Are network calls wrapped in
Resultortry/catchwith proper UI feedback? - Coroutine Scopes: Use
viewModelScopefor ViewModels andlifecycleScopefor Fragments/Activities. - Flow Lifecycle: Is
collectAsStateWithLifecycle()used instead of basecollectAsState()? (Critical for avoiding resource leaks when the app goes into the background). - Room TypeConverters: If caching domain models with complex definitions (e.g.
LocalDateTime,List<String>), did you verify a@TypeConverteris written and registered on the Database? ROOM WILL CRASH without this.
4. Performance & Memory
- Memory Leaks: Are there references to
Contextheld in long-lived objects? - Lazy Lists: Are
keyparameters provided foritems()inLazyColumn/LazyRow? - Heavy Work: Is heavy computation moved to
Dispatchers.Default?
5. Security & Privacy
- Sensitive Data: Ensure NO passwords, keys, or PII are logged or stored in plain text.
- Networking: Is all communication over HTTPS? No
cleartextTrafficallowed. - Permissions: Is the app requesting minimum necessary permissions?
📜 Reviewer Best Practices
- The "Why", Not Just the "What": Explain the reasoning behind a request (e.g., "Use
rememberhere to prevent re-calculating on every frame"). - Prioritize: Distinguish between "Critical" (security, crashes) and "Nitpick" (formatting, naming).
- Compliment: Acknowledge good code, elegant solutions, and clear documentation.
🧪 Verification Commands (For Agents)
Check Lint
./gradlew lintDebug
Check Style
./gradlew ktlintCheck
Run Logic Tests
./gradlew testDebugUnitTest