关于 android-development
面向 Android 应用开发的技能,依据 Google 官方架构指导和 NowInAndroid 参考应用中的做法。它提供模块划分、Compose 界面、数据层、Gradle 配置与测试方面的参考,适用于新建项目和功能开发。
主要功能
- 01按功能划分模块
- 02采用 UI、Domain、Data 分层
- 03提供 Jetpack Compose 模式
- 04指导 Gradle 与构建配置
- 05涵盖测试和离线优先设计
适用场景
- 01按参考结构创建 Android 项目
- 02为新功能建立 API 与实现模块
- 03实现 Compose 屏幕和 ViewModel
- 04配置数据层与测试方式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dpconde/ claude-android-skill --skill android-development安装后在 Claude Code 中输入/android-development确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.gitignoreLICENSEREADME.mdassets/templates/settings.gradle.kts.templatelibs.versions.toml.templatereferences/compose-patterns.mdarchitecture.mdmodularization.mdgradle-setup.mdtesting.mdscripts/generate_feature.py详细介绍
Android 开发
按照 Google 的官方架构指南构建 Android 应用,参考 NowInAndroid 示例应用。
快速参考
| 任务 | 参考文件 |
|---|---|
| 项目结构与模块 | modularization.md |
| 架构层(UI、Domain、Data) | architecture.md |
| Jetpack Compose 模式 | compose-patterns.md |
| Gradle 与构建配置 | gradle-setup.md |
| 测试方法 | testing.md |
工作流决策树
创建新项目?
→ 阅读 modularization.md 了解项目结构
→ 使用 assets/templates/ 中的模板
添加新功能?
→ 创建包含 api 和 impl 子模块的功能模块
→ 遵循 architecture.md 中的模式
构建 UI 屏幕? → 阅读 compose-patterns.md → 创建 Screen + ViewModel + UiState
设置数据层? → 阅读 architecture.md 中的数据层部分 → 创建 Repository + DataSource + DAO
核心原则
- 离线优先:本地数据库是事实来源,与远程端同步
- 单向数据流:事件向下流动,数据向上流动
- 响应式流:使用 Kotlin Flow 暴露所有数据
- 按功能模块化:每个功能都独立封装,边界清晰
- 设计上易于测试:使用接口和测试替身,不使用模拟库
架构层
┌─────────────────────────────────────────┐
│ UI Layer │
│ (Compose Screens + ViewModels) │
├─────────────────────────────────────────┤
│ Domain Layer │
│ (Use Cases - optional, for reuse) │
├─────────────────────────────────────────┤
│ Data Layer │
│ (Repositories + DataSources) │
└─────────────────────────────────────────┘
模块类型
app/ # App module - navigation, scaffolding
feature/
├── featurename/
│ ├── api/ # Navigation keys (public)
│ └── impl/ # Screen, ViewModel, DI (internal)
core/
├── data/ # Repositories
├── database/ # Room DAOs, entities
├── network/ # Retrofit, API models
├── model/ # Domain models (pure Kotlin)
├── common/ # Shared utilities
├── ui/ # Reusable Compose components
├── designsystem/ # Theme, icons, base components
├── datastore/ # Preferences storage
└── testing/ # Test utilities
创建新功能
- 创建带有导航键的
feature:myfeature:api模块 - 创建
feature:myfeature:impl模块,其中包含:MyFeatureScreen.kt- 可组合 UIMyFeatureViewModel.kt- 状态持有者MyFeatureUiState.kt- 表示各状态的密封接口MyFeatureNavigation.kt- 导航设置MyFeatureModule.kt- Hilt DI 模块
标准文件模式
ViewModel 模式
@HiltViewModel
class MyFeatureViewModel @Inject constructor(
private val myRepository: MyRepository,
) : ViewModel() {
val uiState: StateFlow<MyFeatureUiState> = myRepository
.getData()
.map { data -> MyFeatureUiState.Success(data) }
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = MyFeatureUiState.Loading,
)
fun onAction(action: MyFeatureAction) {
when (action) {
is MyFeatureAction.ItemClicked -> handleItemClick(action.id)
}
}
}
UiState 模式
sealed interface MyFeatureUiState {
data object Loading : MyFeatureUiState
data class Success(val items: List<Item>) : MyFeatureUiState
data class Error(val message: String) : MyFeatureUiState
}
Screen 模式
@Composable
internal fun MyFeatureRoute(
onNavigateToDetail: (String) -> Unit,
viewModel: MyFeatureViewModel = hiltViewModel(),
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
MyFeatureScreen(
uiState = uiState,
onAction = viewModel::onAction,
onNavigateToDetail = onNavigateToDetail,
)
}
@Composable
internal fun MyFeatureScreen(
uiState: MyFeatureUiState,
onAction: (MyFeatureAction) -> Unit,
onNavigateToDetail: (String) -> Unit,
) {
when (uiState) {
is MyFeatureUiState.Loading -> LoadingIndicator()
is MyFeatureUiState.Success -> ContentList(uiState.items, onAction)
is MyFeatureUiState.Error -> ErrorMessage(uiState.message)
}
}
Repository 模式
interface MyRepository {
fun getData(): Flow<List<MyModel>>
suspend fun updateItem(id: String, data: MyModel)
}
internal class OfflineFirstMyRepository @Inject constructor(
private val localDataSource: MyDao,
private val networkDataSource: MyNetworkApi,
) : MyRepository {
override fun getData(): Flow<List<MyModel>> =
localDataSource.getAll().map { entities ->
entities.map { it.toModel() }
}
override suspend fun updateItem(id: String, data: MyModel) {
localDataSource.upsert(data.toEntity())
}
}
关键依赖项
// Gradle version catalog (libs.versions.toml)
[versions]
kotlin = "1.9.x"
compose-bom = "2024.x.x"
hilt = "2.48"
room = "2.6.x"
coroutines = "1.7.x"
[libraries]
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
构建配置
在 build-logic/ 中使用约定插件以统一配置:
AndroidApplicationConventionPlugin- 应用模块AndroidLibraryConventionPlugin- 库模块AndroidFeatureConventionPlugin- 功能模块AndroidComposeConventionPlugin- Compose 设置AndroidHiltConventionPlugin- Hilt 设置
完整构建配置请参阅 gradle-setup.md。
评论
支持 Markdown