@
manbudezhu 搭骨架的时候一个例子
[ ] `settings.gradle.kts` include `:app`, `:core`, `:feature:auth`
- [ ] `gradle/libs.versions.toml` 包含 kotlin, coroutines, hilt, retrofit, okhttp, kotlinx-serialization, timber, coil, voyager, detekt, mockk, turbine, junit5
- [ ] 根 `build.gradle.kts` 声明 kotlin-serialization 插件 `apply false`
- [ ] 根 `subprojects {}` 统一 apply detekt + 配置 Android Lint
- [ ] `config/detekt/detekt.yml` 存在
- [ ] `:core` 的 `AppConfig` 是 `@Singleton`,`NetworkModule` 注入 `AppConfig` 而非硬编码配置值
- [ ] `:core` 的 `AppLogger` object 封装 Timber
- [ ] `:core` 的 `NetworkModule` 是 `@Module @
InstallIn(SingletonComponent::class)`
- [ ] `:core` 的 `AppTab` interface 存在
- [ ] `:core` 的 `AppTheme` composable 使用 `MaterialTheme`
- [ ] `StreamingApp.kt` 标注 `@HiltAndroidApp`
- [ ] `MainActivity.kt` 标注 `@AndroidEntryPoint`,含 Voyager `Navigator`
- [ ] `AndroidManifest.xml` 含 `INTERNET` 权限、`android:exported="true"` + MAIN/LAUNCHER
- [ ] `:feature:auth` 的 `LoginScreen` 含邮箱+密码输入框+登录按钮
- [ ] `:feature:auth` 的 `build.gradle.kts` 不依赖任何 `:feature:*`
- [ ] `LoginViewModelTest.kt` 使用 JUnit 5 + Turbine
- [ ] `./gradlew assembleDebug` 通过
- [ ] `./gradlew detekt` 通过