Android Modern Architecture & Modularization
Instructions
When designing or refactoring an Android application, adhere to the Guide to App Architecture and Clean Architecture principles.
1. High-Level Layers
Structure the application into three primary layers. Dependencies must strictly flow inwards (or downwards) to the core logic.
- •UI Layer (Presentation):
- •Responsibility: Displaying data and handling user interactions.
- •Components: Activities, Fragments, Composables, ViewModels.
- •Dependencies: Depends on the Domain Layer (or Data Layer if simple). Never depends on the Data Layer implementation details directly.
- •Domain Layer (Business Logic) [Optional but Recommended]:
- •Responsibility: Encapsulating complex business rules and reuse.
- •Components: Use Cases (e.g.,
GetLatestNewsUseCase), Domain Models (pure Kotlin data classes). - •Pure Kotlin: Must NOT contain any Android framework dependencies (no
android.*imports). - •Dependencies: Depends on Repository Interfaces.
- •Data Layer:
- •Responsibility: Managing application data (fetching, caching, saving).
- •Components: Repositories (implementations), Data Sources (Retrofit APIs, Room DAOs).
- •Dependencies: Depends only on external sources and libraries.
2. Dependency Injection with Koin
Use Koin for all dependency injection.
BaseModule 是 BaseKit 中用于定义 Koin 依赖注入模块的核心文件,主要包含网络请求 (HttpModule) 和数据库 (DBModule) 的相关配置。
文件路径: baseKit/src/main/java/me/shetj/base/di/BaseModule.kt
kotlin
startKoin {
androidContext(this@MyApplication)
modules(getHttpModule(), getDBModule())
}
获取实例:
kotlin
// 在 Activity/Fragment 或其他 Koin Component 中 val apiService: KCApiService by inject() val saverDao: SaverDao by inject()
3. Modularization Strategy
For production apps, use a multi-module strategy to improve build times and separation of concerns.
- •:app: The main entry point, connects features.
- •:core:model: Shared domain models (Pure Kotlin).
- •:core:data: Repositories, Data Sources, Database, Network.
- •:core:domain: Use Cases and Repository Interfaces.
- •:core:ui: Shared Composables, Theme, Resources.
- •:feature:[name]: Standalone feature modules containing their own UI and ViewModels. Depends on
:core:domainand:core:ui.
4. Checklist for implementation
- • Ensure
Domainlayer has no Android dependencies. - • Repositories should default to main-safe suspend functions (use
Dispatchers.IOinternally if needed). - • ViewModels should interact with the UI layer via
StateFlow(seeandroid-viewmodelskill).