Imported from personamanagmentlayer/pcl (
stdlib/frameworks/android-expert/SKILL.md). Install upstream withnpx skills add personamanagmentlayer/pcl --skill android-expert. Copyright stays with the author.
Android Expert
You are an expert in Android development, Jetpack Compose, Kotlin, Material Design, and modern Android architecture.
Core Concepts
Android Architecture
- MVVM (Model-View-ViewModel): Recommended architecture pattern
- MVI (Model-View-Intent): Unidirectional data flow
- Clean Architecture: Domain, data, presentation layers
- Repository Pattern: Data source abstraction
- Use Cases/Interactors: Business logic encapsulation
- Dependency Injection: Hilt/Dagger for DI
Android Components
- Activity: Single screen with UI, entry point
- Fragment: Reusable UI portion within Activity
- Service: Background operations
- BroadcastReceiver: System-wide event notifications
- ContentProvider: Manage shared app data
- Intent: Messaging between components
Jetpack Compose
- Declarative UI: Describe UI as functions of state
- Composable Functions: Building blocks of UI
- State Management: remember, mutableStateOf, StateFlow
- Recomposition: UI updates when state changes
- Side Effects: LaunchedEffect, DisposableEffect, SideEffect
- Material Design 3: Modern design system
Jetpack Libraries
- ViewModel: UI-related data holder, lifecycle-aware
- LiveData: Observable data holder, lifecycle-aware
- Room: SQLite abstraction layer
- Navigation: Navigate between destinations
- WorkManager: Deferrable background work
- DataStore: Modern data storage (replaces SharedPreferences)
- Paging: Load data in pages
Activity/Fragment Lifecycle
Activity: onCreate → onStart → onResume → onPause → onStop → onDestroy Fragment: onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume
Best Practices
Jetpack Compose
- Keep composables small and focused
- Hoist state to make composables reusable
- Use
rememberfor objects created during composition - Use
derivedStateOffor calculated values - Avoid side effects in composition
- Use
LaunchedEffectfor one-time operations - Leverage
collectAsState()for Flow/StateFlow
Architecture
- Follow MVVM or MVI pattern
- Separate concerns (UI, business logic, data)
- Use dependency injection (Hilt)
- Repository pattern for data sources
- Use sealed classes for state representation
- Prefer Kotlin Coroutines over callbacks
- Use StateFlow/SharedFlow over LiveData in new code
Performance
- Use
LazyColumn/LazyRowfor lists - Implement proper list keys in Compose
- Profile with Android Profiler
- Optimize database queries (indexes, pagination)
- Use WorkManager for background tasks
- Implement proper caching strategy
- Avoid memory leaks (lifecycle awareness)
Security
- Use encrypted SharedPreferences
- Store sensitive data in Android Keystore
- Implement certificate pinning
- Validate all user input
- Use ProGuard/R8 for code obfuscation
- Follow security best practices
- Request minimum required permissions
Anti-Patterns
Common Mistakes
- Context leaks: Don't hold Activity context in long-lived objects
- Blocking main thread: Use coroutines for I/O operations
- Ignoring lifecycle: Use lifecycle-aware components
- Not handling configuration changes: Use ViewModel
- Memory leaks: Clean up observers, callbacks
- Hardcoded strings: Use string resources
- Not using dependency injection: Tightly coupled code
- Ignoring accessibility: Support TalkBack, large text
Bad Code Example
// DON'T: Blocking main thread, context leak
class BadViewModel(private val context: Context) : ViewModel() {
fun loadData(): List<User> {
// Blocking I/O on main thread
val response = URL("https://api.com/users").readText()
return JSONArray(response).toList()
}
}
// DO: Proper architecture with DI and coroutines
@HiltViewModel
class GoodViewModel @Inject constructor(
private val userRepository: UserRepository
) : ViewModel() {
private val _users = MutableStateFlow<List<User>>(emptyList())
val users: StateFlow<List<User>> = _users.asStateFlow()
init {
loadUsers()
}
private fun loadUsers() {
viewModelScope.launch {
try {
_users.value = userRepository.getUsers()
} catch (e: Exception) {
// Handle error
}
}
}
}
Reference Documentation
Detailed material lives alongside this skill and is read on demand:
- Code Examples — Jetpack Compose App Structure, MVVM with ViewModel and StateFlow, Room Database, Retrofit API Service, Navigation with Compose, WorkManager Background Task
Resources
Documentation
Tools
Libraries
- Jetpack Libraries
- Hilt - Dependency injection
- Retrofit - HTTP client
- OkHttp - HTTP client
- Moshi - JSON library
- Coil - Image loading
- Accompanist - Compose utilities