android-development by dpconde/claude-android-skill
npx skills add https://github.com/dpconde/claude-android-skill --skill android-development遵循 Google 官方架构指南构建 Android 应用程序,如 NowInAndroid 参考应用所示。
| 任务 | 参考文件 |
|---|---|
| 项目结构与模块 | modularization.md |
| 架构层(UI、领域、数据) | architecture.md |
| Jetpack Compose 模式 | compose-patterns.md |
| Gradle 与构建配置 | gradle-setup.md |
| 测试方法 | testing.md |
创建新项目? → 阅读 modularization.md 了解项目结构 → 使用 中的模板
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
assets/templates/添加新功能? → 使用 api 和 impl 子模块创建功能模块 → 遵循 architecture.md 中的模式
构建 UI 界面? → 阅读 compose-patterns.md → 创建 Screen + ViewModel + UiState
设置数据层? → 阅读 architecture.md 中的数据层部分 → 创建 Repository + DataSource + DAO
┌─────────────────────────────────────────┐
│ UI 层 │
│ (Compose 界面 + ViewModels) │
├─────────────────────────────────────────┤
│ 领域层 │
│ (用例 - 可选,用于复用) │
├─────────────────────────────────────────┤
│ 数据层 │
│ (仓库 + 数据源) │
└─────────────────────────────────────────┘
app/ # 应用模块 - 导航、脚手架
feature/
├── featurename/
│ ├── api/ # 导航键(公开)
│ └── impl/ # 界面、ViewModel、DI(内部)
core/
├── data/ # 仓库
├── database/ # Room DAO、实体
├── network/ # Retrofit、API 模型
├── model/ # 领域模型(纯 Kotlin)
├── common/ # 共享工具
├── ui/ # 可复用的 Compose 组件
├── designsystem/ # 主题、图标、基础组件
├── datastore/ # 偏好设置存储
└── testing/ # 测试工具
feature:myfeature:api 模块feature:myfeature:impl 模块,包含:
MyFeatureScreen.kt - 可组合 UIMyFeatureViewModel.kt - 状态持有者MyFeatureUiState.kt - 状态密封接口MyFeatureNavigation.kt - 导航设置MyFeatureModule.kt - Hilt DI 模块@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)
}
}
}
sealed interface MyFeatureUiState {
data object Loading : MyFeatureUiState
data class Success(val items: List<Item>) : MyFeatureUiState
data class Error(val message: String) : MyFeatureUiState
}
@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)
}
}
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 版本目录 (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。
每周安装量
209
仓库
GitHub 星标数
110
首次出现
2026年1月25日
安全审计
安装于
opencode184
gemini-cli180
codex178
github-copilot170
cursor165
kimi-cli142
Build Android applications following Google's official architecture guidance, as demonstrated in the NowInAndroid reference app.
| Task | Reference File |
|---|---|
| Project structure & modules | modularization.md |
| Architecture layers (UI, Domain, Data) | architecture.md |
| Jetpack Compose patterns | compose-patterns.md |
| Gradle & build configuration | gradle-setup.md |
| Testing approach | testing.md |
Creating a new project? → Read modularization.md for project structure → Use templates in assets/templates/
Adding a new feature? → Create feature module with api and impl submodules → Follow patterns in architecture.md
Building UI screens? → Read compose-patterns.md → Create Screen + ViewModel + UiState
Setting up data layer? → Read data layer section in architecture.md → Create Repository + DataSource + DAO
┌─────────────────────────────────────────┐
│ 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 module with navigation keyfeature:myfeature:impl module with:
MyFeatureScreen.kt - Composable UIMyFeatureViewModel.kt - State holderMyFeatureUiState.kt - Sealed interface for statesMyFeatureNavigation.kt - Navigation setupMyFeatureModule.kt - Hilt DI module@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)
}
}
}
sealed interface MyFeatureUiState {
data object Loading : MyFeatureUiState
data class Success(val items: List<Item>) : MyFeatureUiState
data class Error(val message: String) : MyFeatureUiState
}
@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)
}
}
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" }
Use convention plugins in build-logic/ for consistent configuration:
AndroidApplicationConventionPlugin - App modulesAndroidLibraryConventionPlugin - Library modulesAndroidFeatureConventionPlugin - Feature modulesAndroidComposeConventionPlugin - Compose setupAndroidHiltConventionPlugin - Hilt setupSee gradle-setup.md for complete build configuration.
Weekly Installs
209
Repository
GitHub Stars
110
First Seen
Jan 25, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode184
gemini-cli180
codex178
github-copilot170
cursor165
kimi-cli142
Kotlin Exposed ORM 模式指南:DSL查询、DAO、事务管理与生产配置
861 周安装
qsec-wechat-export:微信数据导出工具,支持API与Git集成,高效管理聊天记录
1 周安装
popo-richtext - 富文本编辑与处理工具,支持API集成与Git版本控制
1 周安装
perf:bench 性能基准测试工具 - GitHub 仓库安装与使用指南
1 周安装
Material Instructions Generator - 自动化材料指令生成工具 | API/GitHub 集成
1 周安装
ma167-server-replace-gacha-image:替换扭蛋图像的服务器端工具,支持多种开发环境
1 周安装
ma167-server-game-debug 游戏服务器调试工具 | API/Git 集成调试解决方案
1 周安装